半同步复制原理图
#半同步启动需要主从两端都需要加载安装各自对应的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