MySQL主从复制与读写分离

  • 什么是读写分离?
  • 为什么要读写分离呢?
  • 什么时候要读写分离?
  • 主从复制与读写分离
  • mysq支持的复制类型
  • 主从复制的工作过程
    • MySQL主从复制延迟
  • MySQL主从复制实操
    • MySQL配置操作环境
    • 搭建MySQL主从复制
      • Mysql主从服务器时间同步
        • 主服务器设置
        • 从服务器设置
    • 主服务器的mysql配置
    • 从服务器的mysql配置
    • 测试主从复制
      • 主服务器
      • 从服务器
  • MySQL读写分离原理
  • 目前较为常见的MySQL读写分离分为以下两种
    • 基于程序代码内部实现
    • 基于中间代理层实现
  • 读写分离环境配置
    • 搭建MySQL读写分离
      • 安装Java环境
      • 安装Amoeba软件
    • 配置Amoeba读写分离,两个Slave读负载均衡
    • 再回到amoeba服务器配置amoeba服务
    • 客户端测试读写分离
      • 在客户端服务器上测试
      • 在主服务器上
      • 在两台从服务器上

什么是读写分离?

读写分离,基本的原理是让主数据库处理事务性增、改、删操作( INSERT、UPDATE、DELETE),而从数据库处理SELECT查询操作。数据库复制被用来把事务性操作导致的变更同步到集群中的从数据库。

为什么要读写分离呢?

因为数据库的“写”( 写10000条数据可能要3分钟)操作是比较耗时的。
但是数据库的"读”(读10000条数据可能只要5秒钟)。
所以读写分离,解决的是,数据库的写入,影响了查询的效率。

什么时候要读写分离?

数据库不一定要读写分离,如果程序使用数据库较多时,而更新少,查询多的情况下会考虑使用。利用数据库主从同步,再通过读写分离可以分担数据库压力,提高性能。

主从复制与读写分离

在实际的生产环境中,对数据库的读和写都在同一个数据库服务器中,是不能满足实际需求的。无论是在安全性、高可用性还是高并发等各个方面都是完全不能满足实际需求的。因此,通过主从复制的方式来同步数据,再通过读写分离来提升数据库的并发负载能力。有点类似于rsync,但是不同的是rsync是对磁盘文件做备份,而mysql主 从复制是对数据库中的数据、语句做备份。

mysq支持的复制类型

(1) STATEMENT: 基于语句的复制。在服务器上执行sq1语句,在从服务器上执行同样的语句,mysq1默认采用基于语句的复制,执行效率高。
(2)ROW:基于行的复制。把改变的内容复制过去,而不是把命令在从服务器上执行一遍。
(3)MIXED:混合类型的复制。默认采用基于语句的复制,一旦发现基于语句无法精确复制时,就会采用基于行的复制。

主从复制的工作过程

(1)在每个事务更新数据完成之前,Master 在二进制日志(Binary log) 记录这些改变。写入二进制日志完成后,Master通知存储引擎提交事务。
(2) Slave将Master 的复制到其中继日志(Relay log)。首先slave 开始一个工作线程(I/0),I/0线程在Master上打开一个普通的连接,然后开始Binlog dump process。Binlog dump process 从Master的二进制日志中读取事件,如果已经跟上Master, 它会睡眠并等待Master 产生新的事件,I/0线程将这些事件写入中继日志。
(3) SQL slave thread ( SQL从线程)处理该过程的最后一步,SQL线程从中继日志读取事件,并重放其中的事件而更新Slave 数据,使其与Master中的数据一致,只要该线程与I/0线程保持一致,中继日志通常会位于OS缓存中,所以中继日志的开销很小。
复制过程有一个很重要的限制,即复制在Slave. 上是串行化的,也就是说Master.上的并行更新操作不能在Slave上并行操作。

MySQL主从复制延迟

1.master服务器高并发,形成大量事务
2、网络延迟
3、主从硬件设备导致
cpu主频、内存io、硬盘io
4、本来就不是同步复制、而是异步复制
从库优化Mysql参数。比如增大innodb_ buffer_ pool_ size, 让更多操作在Mysql内存中完成,减少磁盘操作。
从库使用高性能主机。包括cpu强悍、内存加大。避免使用虚拟云主机,使用物理主机,这样提升了i/o方面性。
从库使用SSD磁盘
网络优化,避免跨机房实现同步

MySQL主从复制实操

MySQL配置操作环境

服务器 操作系统 ip 所用配置
Master 服务器 CentOS7 192.168.154.30 mysql 5.7
Slave1 服务器 CentOS7 192.168.154.40 mysql 5.7
Slave2 服务器 CentOS7 192.168.154.50 mysql 5.7
systemctl stop firewalld
systemctl disable fi rewalld
setenforce 0

搭建MySQL主从复制

Mysql主从服务器时间同步

主服务器设置

yum install ntp -y
vim /etc/ntp.conf末尾添加
server 127.127.154.0            #设置本地是时钟源,注意修改网段
fudge 127.127.154.0 stratum 8       #设置时间层级为8 ( 限制在15内)
service ntpd start



从服务器设置

yum install ntp ntpdate -y
service ntpd start
/usr/sbin/ntpdate 192.168.154.30    #和master服务器进行时间同步
crontab -e
*/30 * * * * /usr/sbin/ntpdate 192.168.154.30systemctl status crond.service



主服务器的mysql配置

vim /etc/my.cnf
server-id = 11
log-bin=master-bin #添加,主服务器开启二进制日志
binlog_format=MIXED
log-slave-updates=true #添加,允许从服务器更新二进制日志
systemctl restart mysqld
mysql -u root -pabc123
GRANT REPLICATION SLAVE ON *.* TO 'myslave'@'192.168.154.%' IDENTIFIED BY '123456';      #给从服务器授权
FLUSH PRIVILEGES;
show master status\G


#File 列显示日志名,Position 列显示偏移量

从服务器的mysql配置

vim /etc/my.cnf
server-id = 20     #修改,注意id与Master的不同,两个Slave的id也要不同
relay-log=relay-log-bin        #添加,开启中继日志,从主服务器上同步日志文件记录到本地
relay-log-index=slave-relay-bin.index  #添加,定义中继日志文件的位置和名称systemctl restart mysqld


mysql -u root -pabc123
CHANGE master to master_host='192.168.154.30' ,master_user='myslave',master_password='123456',master_log_file='master-bin.000001',master_log_pos=604;
#配置同步,注意master_log_file和master_log pos的值要与Master查询的一致
start slave;    #启动同步,如有报错执行reset slave;
show slave status\G #查看Slave 状态确保Io和SQL线程都是Yes,代表同步正常。
Slave_Io_Running: Yes   #负责与主机的io通信
Slave_SQL_Running: Yes  #负责自己的slave mysql进程


#一般Slave_IO_Running: No的可能性:
1、网络不通.
2、my.cnf配置有问题;
3、密码、file文件名、pos偏移量不对
4、防火墙没有关闭

测试主从复制

主服务器

CREATE DATABASE fa;
use fa;
create table fsn(id int(10),name char(10),sex char(1));
insert into fsn (id,name,sex) values(1,'saber','女');
select * from fsn;

从服务器

use fa;
select * from fsn;
或
select * from fa.fsn;

MySQL读写分离原理

读写分离就是只在主服务器上写,只在从服务器上读。基本的原理是让主数据库处理事务性查询,而从数据库处理select查询。数据库复制被用来把主数据库上事务性查询导致的变更同步到集群中的从数据库。

目前较为常见的MySQL读写分离分为以下两种

基于程序代码内部实现

在代码中根据select、 insert 进行路由分类,这类方法也是目前生产环境应用最广泛的。
优点是性能较好,因为在程序代码中实现,不需要增加额外的设备为硬件开支;缺点是需要开发人员来实现,运维人员无从下手
但是并不是所有的应用都适合在程序代码中实现读写分离,像一些大型复杂的Java应用,如果在程序代码中实现读写分离对代码改动就较大。

基于中间代理层实现

代理一般位于客户端和服务器之间,代理服务器接到客户端请求后通过判断后转发到后端数据库,有以下代表性程序。
(1) MySQL-Proxy。MySQL-Proxy为MySQL 开源项目,通过其自带的lua脚本进行SQL判断。
(2) Atlas。 是由奇虎360的Web平台部基础架构团队开发维护的一个 基于MySQL协议的数据中间层项目。它是在mysql -proxy0.8.2版本的基础上,对其进行了优化,增加了一些新的功能特性。360 内部使用Atlas运行的mysql业务,每天承载的读写请求数达几十亿条。支持事物以及存储过程。
(3) Amoeba。由陈思儒开发,作者曾就职于阿里巴巴。该程序由Java语言进行开发,阿里巴巴将其用于生产环境。但是它不支持事务和存储过程。
由于使用MySQL Proxy需要写大量的Lua脚本,这些Lua并不是现成的,而是需要自己去写。这对于并不熟悉MySQL Proxy
内置变量和MySQLProtocol的人来说是非常困难的。
Amoeba是–个非常容易使用、可移植性非常强的软件。因此它在生产环境中被广泛应用于数据库的代理层。

读写分离环境配置

服务器 系统 ip 使用的数据库
Master 服务器 CentOS7 192.168.154.30 mysql5.7
Slave1 服务器 CentOS7 192.168.154.40 mysql5.7
Slave2 服务器 CentOS7 192.168.154.50 mysql5.7
Amoeba 服务器 CentOS7 192.168.154.70 jdk1.6、Amoeba
客户端服务器 CentOS7 192.168.154.60 mysql
systemctl stop firewalld
systemctl disable fi rewalld
setenforce 0

搭建MySQL读写分离

安装Java环境

因为Amoeba 基于是jdk1.5开发的,所以官方推荐使用jdk1.5或1.6版本,高版本不建议使用。

cd /opt/
cp jdk-6u14-linux-x64.bin /usr/local/
cd /usr/local/
chmod +x jdk-6u14-linux-x64.bin
./jdk-6u14-linux-x64.bin按yes,按enter
mv jdk1.6.0_14/ /usr/local/jdk1.6

vim /etc/profile
export JAVA_HOME=/usr/local/jdk1.6
export CLASSPATH=$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/jre/lib
export PATH=$JAVA_HOME/lib:$JAVA_HOME/jre/bin/:$PATH:$HOME/bin
export AMOEBA_HOME=/usr/local/amoeba
export PATH=$PATH:$AMOEBA_HOME/bin
source /etc/profile
java -version


安装Amoeba软件

mkdir /usr/local/amoeba
tar zxvf amoeba-mysql-binary-2.2.0.tar.gz -C /usr/local/amoeba/
chmod -R 755 /usr/local/amoeba/
/usr/local/amoeba/bin/amoeba
//如显示amoebastartIstop说明安装成功


配置Amoeba读写分离,两个Slave读负载均衡

#先在Master、Slave1、Slave2的mysql上开放权限给Amoeba访问
grant all on *.* to test@'192.168.154.%' identified by 'abc123';

再回到amoeba服务器配置amoeba服务

cd /usr/local/amoeba/conf/
cp amoeba.xml amoeba.xml.bak
vim amoeba.xml
#修改amoeba配置文件30行
<property name="user">amoeba</ property>
32行
<property name="password"> 123456</property>115行
<property name="defaultPool">master</property>117-去掉注释
<property name="writePool">master</property>
<property name="readPool">slaves</property>

cp dbServers.xml dbServers.xml.bak
vim dbServers.xml
#修改数据库配置文件23行--注释掉 作用:默认进入test库以防mysq1中没有test库时,会报错
<!-- <property name="schema">test</property> -->26--修改
<property name="user">amoeba</property>28-30--去掉注释
<property name="password">123456</property>

45--修改, 设置主服务器的名Master
<dbServer name="master" parent="abstractServer">48--修改,设置主服务器的地址
<property name="ipAddress">192.168.154.30</ property>52--修改, 设置从服务器的名slave1
<dbServer name="slave1" parent="abstractServer">55--修改,设置从服务器1的地址
<property name="ipAddress">192.168.154.40</property>58--复制上面6行粘贴,设置从服务器2的名slave2和地址
<dbServer name="slave2" parent=" abstractServer">
<property name="ipAddress">192.168.154.50</property>65行--修改
<dbServer name="slaves" virtual="true ">71行--修改
<property name="poolNames">slave1, slave2</property>

/usr/local/amoeba/bin/amoeba start&
#启动Amoeba软件,按ctrl+c 返回
netstat -anpt| grep java
#查看8066端口是否开启,默认端口为TCP 8066

客户端测试读写分离

yum install -y mariadb-server mariadh
systemctl start mariadb.service

在客户端服务器上测试

mysql -u amoeba -p123456 -h 192.168.154.70 -P8066
/ /通过amoeba服务器代理访问mysql,在通过客户端连接mysq1后写入的数据只有主服务会记录,然后同步给从服务器

在主服务器上

create database test;
use test;
create table test(id int(10),name varchar(10),address varchar(20));

在两台从服务器上

stop slave;  #关闭同步
use test;

//在slave1上

insert into test values('1','saber','this_is_slave1');insert into test values('4','carstr','this_is_slave1');

//在slave2上

insert into test values('2','archer','this_is_slave2');insert into test values('5','berserker','this_is_slave1');

//在主服务器上

insert into test values('3','lancer','this_is_master');insert into test values('6','beast','this_is_slave1');

//在客户端服务器上

use test;
select * from test;客户端会分别向slave1和slave2读取数据,显示的只有在两个从服务器上添加的数据,没有在主服务器上添加的数据
insert into test values('7','rider','this_is_client');//只有主服务器上有此数据
//在两个从服务器上执行start slave;即可实现同步在主服务器上添加的数据
start slave;



如何进行MySQL主从复制与读写分离的配置相关推荐

  1. mysql主从复制、读写分离到数据库水平拆分及库表散列

    文章转载自http://blog.csdn.net/sd4422739/article/details/49514981 web项目最原始的情况是一台服务器只能连接一个mysql服务器(c3p0只能配 ...

  2. MySQL主从复制与读写分离配置及实操

    MySQL主从复制与读写分离 一.MySQL主从复制 1.复制类型 2.工作过程 二.MySQL读写分离 1.定义 2.存在意义 3.作用时间 4.原理 5.类型 基于程序代码内部实现 基于中间代理层 ...

  3. 【MySQL】Spring Boot项目基于Sharding-JDBC和MySQL主从复制实现读写分离(8千字详细教程)

    目录 前言 一. 介绍 二. 主从复制 1. 原理 2. 克隆从机 3. 克隆从机大坑 4. 远程登陆 5. 主机配置 6. 从机配置 7. 主机:建立账户并授权 8. 从机:配置需要复制的主机 9. ...

  4. 运维之道 | Mysql主从复制+mycat读写分离

    运维之道 | Mysql主从复制 + Mycat读写分离 1.什么是读写分离 读写分离,基本的原理是让主数据库处理事务性增.删.改操作(INSERT.UPDATE.DROP),而从数据库处理SELEC ...

  5. 【数据库七】搭建MySQL主从复制和读写分离详解

    详解搭建搭建MySQL主从复制和读写分离 1.案例实施:搭建MySQL主从复制 1.1 主节点数据库(CentOS 7-5) 1.2 从节点数据库(CentOS 7-6) 1.3 从节点数据库(Cen ...

  6. mysql主从读写Windows_Windows操作系统下的MySQL主从复制及读写分离

    一.主服务器(master)配置 1.修改MySQL配置文件my.ini [mysqld] log-bin=mysql-bin log-bin-index=mysql-bin.index server ...

  7. e盘是否具有读写权限_轻松搭建MySQL主从复制、读写分离(双机热备)

    主从复制: 当mysql数据库的数据量太大的时候,查询数据就很吃力了,无论怎么优化都会产生瓶颈,这时我们需要增加服务器设备来实现分布式数据库,实现多机热备份,要想实现多机的热备,首先要了解主从数据库服 ...

  8. mysql双机热备 读写分离_轻松搭建MySQL主从复制、读写分离(双机热备)

    主从复制: 当mysql数据库的数据量太大的时候,查询数据就很吃力了,无论怎么优化都会产生瓶颈,这时我们需要增加服务器设备来实现分布式数据库,实现多机热备份,要想实现多机的热备,首先要了解主从数据库服 ...

  9. amoeba实现mysql主从读写分离_利用Amoeba实现MySQL主从复制和读写分离

    在实际生产环境中,如果对数据库的读和写都在同一个数据库服务器中操作,无论是在安全性.高可用性,还是高并发等各个方面都是完全不能满足实际需求的,因此,一般来说都是通过主从复制(Master-Slave) ...

最新文章

  1. 安卓开发必备知识体系:安卓篇
  2. 操作系统笔记(六)调度
  3. RSA 前段加密 java 后台解密 已调试通过
  4. idea自动下载gradle_如何在IDEA中下载Gradle项目的依赖源?
  5. idea svn 的使用----转载,挺好的
  6. CentosOS 7: 创建Nginx+Https网站
  7. 2018-10-09 星期二
  8. 接口文档神器---Swagger注解使用与实例
  9. 如何登录锐捷设备(业务软件篇)
  10. 二次元壁纸 | 心情烦躁?换上喜欢的手机壁纸
  11. matlab将z域变为s域,时域、S域、Z域转换
  12. Manjaro第二天
  13. python定量城市研究_Python定量城市研究实战
  14. 手机管理应用研究【4】—— 手机加速篇
  15. iPhone14也将支持拍月亮了,然而这可能是技术工程师的功劳
  16. 深入浅出图神经网络~卷积神经网络(上)
  17. bismark 识别甲基化位点-比对篇
  18. 商务办公软件应用与实践【2】
  19. 电路交换(Circuit Switching)
  20. 一文搞懂BN、LN、IN、GN的区别

热门文章

  1. 如何用revit打不开服务器文件,Revit教程 | Revit打开文件错误(文件已损坏)
  2. HTML小米英雄区的分类,《王者荣耀》英雄分类介绍 六种类型各有奇效
  3. 拉格朗日乘数法 对y的偏导数的推导 (有点牵强,作为理解吧)
  4. 李开复:我的大学生活琐忆
  5. [野狐行网游研究][三期四期][8.25更新]
  6. iptv和宽带双线合一
  7. 结束php语句的正确方法是,结束 PHP 语句的正确方法是?
  8. [机缘参悟-73]:深度思考:心智提升的七个阶段
  9. pytest05、fixture
  10. java中转换英语日期为常用格式,例:Jun 20, 2014 8:56:14 PM;