MySQL 半同步复制模式的实现

半同步复制原理图



#半同步启动需要主从两端都需要加载安装各自对应的semi模块,从库端支持半同步功能的数量至少一台;主库端当一个事务成功提交后,并不及时反馈给前端用户,该线程会被临时block,等待由从库端返回确认该条事务也同时成功写入到relay log中的receipt(回执确认),这时主库线程才返回给当前session告知操作完成,半同步复制并不关心在从库一端该事务是否都被执行并被提交完成。



模式实现


   1、半同步复制条件


一主一从
#实现主从复制
 两个插件
#主服务器安装rpl_semi_sync_maste
#从服务器安装rpl_semi_sync_slave


  2、环境搭建(虚拟机)            

 服务器   版本 IP地址
 主服务器MariaDB-5.5.36 192.168.1.120
 从服务器MariaDB-5.5.36
192.168.1.121


   3、实现主从复制


    3.1 主服务器安装MariaDB并配置

此处不再赘述请参考我的博客MariaDB编译安装
#http://jungege.blog.51cto.com/4102814/1394924


     配置主服务器



编辑主配置文件
#vim  /etc/my.cnf
log-bin=/mydata/binlogs/master-bin   设置二进制日志路径及名称
binlog_format=mixed  设置二进制日志存储格式为混合模式
Server-id    =100    设置Server-id
#mkdir -pv /mydata/binlogs 创建二进制日志目录
#chown -R mysql.mysql /mydata/binlogs 设置属主属组
#server mysqld restart


授权用户
mysql> grant relication slave,replication client on *.* to ‘rplpass‘@‘192.168.%.%‘ identified by ‘rplpass‘;
mysql> flush privileges; 重读授权表



查看主服务器状态
mysql > show master status;



    3.2 从服务器安装MariaDB并配置


#由于使用的是Vmvare,将主服务器克隆一份做从服务器,如此一来主从服务器的数据都是从0开始。
关于Vmvare如何克隆有疑问的同学请查阅资料


    从服务器配置    

#vim /etc/my.cnf
注释掉以下两行
log-bin=mysql-bin     二进制日志文件
binlog_format=mixed   二进制日志文件存储格式
添加如下行
server-id   = 200     设置server-id  
relay-log=/mydata/relaylogs/relay-bin  设置中继日志
#本次我们做的为一主一从服务器复制,从服务器不需要二进制日志,需要中继日志


    连接主服务器并启动


mysql > change master to master_host=‘192.168.1.120‘,master_user=‘rpluser‘,master_password=‘rplpass‘,master_log_file=‘master-bin.000003‘,master_log_pos=245;
mysql > start slave;  启动从服务器复制线程
mysql > show slave status; 查看从服务器状态




  4、半同步复制的实现


    4.1 主服务器配置


安装插件
mysql > install plugin rpl_semi_sync_master soname ‘semisync_master.so‘
查看全局变量
mysql > show global variables like ‘%semi%‘;



    设置主服务器的半同步复制全局变量


mysql > set global rpl_semi_sync_master_enabled=ON;   开启半同步复制
mysql > set global rpl_semi_sync_master_timeout=10000; 设置为10秒



   4.2 设置从服务器



安装semi插件
mysql > install plugin rpl_semi_sync_slave soname ‘semisync_slav.so‘;
设置从服务器半同步复制全局变量
mysql > set global rpl_semi_sync_slave_enabled=ON; 开启半同步复制
mysql > stop slave io_thread;  关闭io线程
mysql > start slave io_thread; 开启io线程


   4.3 查看主从服务器半同步复制状态


     主服务器状态

mysql > show global status like ‘%semi%‘;



     从服务器状态


mysql > show global status like ‘%semi%‘;


  5、数据半同步复制测试



#主服务器创建数据库
mysql > create database SEMI;
mysql > show databases;  查看数据库




#从服务器查看数据同步情况
mysql > show databases;


     数据同步完成后,我们再次来查看一下主服务器的半同步复制状态


mysql > show global status like ‘%semi%‘;




总结:
#MySQL半同步复制已经时间,不论一主一从,还是一主多从模型,其原理相同
拓展:
半同步复制使MHA更加完美
#半同步可以最大程度的保障主服务器MySQL执行过的语句被成功复制到从服务器MySQL的relay log中;而当主库发生故障时,使从库的状态更接近主库,保持最小的数据差异。基于半同步这个特点,可以将其与MHA一起使用,当主库故障,故障自动切换被触发,在这个过程中MHA需要比较主库与从库日志差异,由于半同步的特点,差异日志会尽可能的少,那么MHA在进行判断比较、差异生成、拷贝直至最后的差异应用,这一系列的时间消耗都会得到缩减,这样MHA的切换时间就相应减少,数据库故障可以快速恢复。



   个人水平有限,如有错误及不详尽指出请指出!            

本文出自 “西风瘦猪” 博客,请务必保留此出处http://jungege.blog.51cto.com/4102814/1396276

MySQL 半同步复制模式的实现,古老的榕树,5-wow.com

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。