MySQL主从复制

MySQL主从复制的工作原理

MySQL主从复制_第1张图片

主开启二进制日志

从开启中继日志(binlog)

1.主库数据更新写入二进制日志

2.从库开启io线程向主库请求二进制日志事件

3.主库为每个io线程开启dump线程向从库发送二进制日志事件

4.从库保存二进制日志事件到中继日志

5.从库开启SQL线程读取中继日志中的二进制事件并解析成sql语句进行重放/逐一执行。

MySQL的复制类型

1)STATEMENT:基于语句的复制(mysql默认采用基于语句的复制,执行效率高)

2)ROW:基于行的复制。

3)MIXED:混合类型的复制(默认采用基于语句复制,一旦发现无法精确复制时,就会采用基于行复制。

搭建 MySQL主从复制

实验准备

1台主数据库,两台从数据库

主:192.168.116.60

从1:192.168.116.70

从2:192.168.116.80

1、Mysql主从服务器时间同步

systemctl status ntpd          #检查ntpd服务是否开启
systemctl enable --now ntpd    #设置永久并立即开启ntpd服务


vim /etc/ntp.conf 
将第8行注释,并复制到下一行
restrict default nomodify         #客户端不可以修改时间参数,但可以同步时间服务器


将22-25行注释,在下面添加时间同步:
server ntp.aliyun.com iburst      #阿里云的服务器
server timel.aliyun.com iburst

systemctl restart ntpd          #重启ntpd服务
netstat -lntup | grep ntpd      #查看ntpd端口


date                            #查看当前时间
ntpq -p                         #查看当前ntp服务器状态


切到从服务器里
ntpdate 192.168.116.60          #跟主服务器做同步
crontab -e                      #创建计划任务
*/30 * * * *  /usr/sbin/ntpdate 192.168.116.60 &> /dev/null
crontab -l                      #检查计划任务

MySQL主从复制_第2张图片

MySQL主从复制_第3张图片MySQL主从复制_第4张图片

 

MySQL主从复制_第5张图片

 2、做主从复制

----主服务器的mysql配置-----

vim /etc/my.cnf
server-id=1
log-bin=mysql_bin			#添加,主服务器开启二进制日志
binlog_format=mixed         #设置复制类型

配置完后重启
systemctl restart mysqld


给服务器做授权
grant replication slave on *.* to 'myslave'@'192.168.116.%' identified by '123456';
flush privileges;
show master status\G        #查看当前状态

MySQL主从复制_第6张图片

MySQL主从复制_第7张图片

 ----从服务器的mysql配置----

vim /etc/my.cnf
server-id = 2
relay-log=relay-log-bin
relay-log-index=relay-log-bin.index
innodb_buffer_pool_size=2048M


------------------------------------------------
server-id = 2		                #修改,注意id与主的不同,两个从的id也要不同
relay-log=relay-log-bin		        #开启中继日志,从主服务器上同步日志文件记录到本地
relay-log-index=relay-log-bin.index	#定义中继日志文件的位置和名称,一般和relay-log在同一目录


systemctl restart mysqld            #重启mysqld服务

mysql
change master to master_host='192.168.116.60',master_user='myslave',master_password='123456',master_log_file='mysql-bin.000003',master_log_pos=154;

#配置同步,注意 master_log_file 和 master_log_pos 的值要与主机查询的一致

start slave;           #刷新
show slave status\G;   #查看bin-log日志通道连接状态
		

MySQL主从复制_第8张图片

 ----从2服务器的mysql配置----

vim /etc/my.cnf
server-id = 3
relay-log=relay-log-bin
relay-log-index=relay-log-bin.index
innodb_buffer_pool_size=2048M


systemctl restart mysqld          #重启服务

mysql

change master to master_host='192.168.116.60',master_user='myslave',master_password='123456',master_log_file='mysql-bin.000003',master_log_pos=154;

mysql> start slave;


mysql> show slave status\G;

3、 测试主从复制

在主服务器新建一个cxk的库

MySQL主从复制_第9张图片

MySQL主从复制_第10张图片

MySQL主从复制_第11张图片

MySQL主从复制延迟问题

1、master服务器高并发,形成大量事务

2、网络延迟

3、主从硬件设备导致 (cpu主频、内存io、硬盘io)

4、是同步复制、而不是异步复制

解决方案

从库优化Mysql参数。比如增大innodb_buffer_pool_size,让更多操作在Mysql内存中完成,减少磁盘操作。 从库使用高性能主机。包括cpu强悍、内存加大。避免使用虚拟云主机,使用物理主机,这样提升了i/o方面性。 从库使用SSD磁盘 网络优化,避免跨机房实现同步

如何判断主从复制延迟

主从复制的几个同步模式

异步模式

mysql默认模式,效率最快,安全性最差

全同步模式

安全性最好,性能最差

半同步模式

介于二者之间,安全性和性能最均衡,一般情况下都会选择

如何配置半同步模式

//主数据库配置
vim /etc/my.cnf				#在 [mysqld] 区域添加下面内容
......
plugin-load=rpl_semi_sync_master=semisync_master.so			#加载mysql半同步复制的插件
rpl_semi_sync_master_enabled=ON								#或者设置为"1",即开启半同步复制功能
rpl-semi-sync-master-timeout=1000							#超时时间为1000ms,即1s

systemctl restart mysqld


//从数据库配置
vim /etc/my.cnf	
......
plugin-load=rpl_semi_sync_slave=semisync_slave.so
rpl_semi_sync_slave_enabled=ON

systemctl restart mysqld

面试题

问:主从为何会从半同步模式变成异步模式

答:在半同步复制时,从库的响应时间超过了主库的响应时间,会自动降为异步模式

问:如何让主从恢复半同步复制模式

答:当 master dump 线程发送完一个事务的所有事件之后,如果在 rpl_semi_sync_master_timeout 内,收到了从库的响应, 则主从又重新恢复为半同步复制。

了解 ack collector thread

5.7 版本的半同步复制中,独立出一个 ack collector thread ,专门用于接收 slave 的反馈信息。这样 master 上有两个线程独立工作,可以同时发送 binlog 到 slave ,和接收 slave 的反馈,达成并行。

你可能感兴趣的:(mysql,数据库)