MariaDB半同步复制
1.主从复制原理
MySQL的二进制日志(binglog)会记录所有对数据库进行更改的操作,也就是说只要是会对数据库产生修改的操作都会被记录到二进制日志中去.记录二进制日志的主要目的有两方面:a.恢复;b.复制.
当MySQL的Master节点的数据有更改的时候,Master会主动通知Slave,让Slave主动来Master获取二进制日志,于是Slave开启一个I/O thread,向Master请求二进制日志中记录的语句;Master将二进制日志中记录的语句发给Slave,Slave则将这些语句存到中继日志中,进而从中继日志中读取一句,执行一句,直到所有的语句被执行完.将SQL语句从中继日志中读取出来,再一一执行的进程叫做SQL thread;将这些语句执行完之后,从节点的数据就和主节点的数据相同了,这就是所谓的MySQL主从复制.
由MySQL的主从复制原理可知:
Master节点必须开启二进制日志功能; Slave节点必须开启中继日志功能; Slave节点需关闭二进制日志功能(默认不配置即可); Master和Slave节点需要配置不同的server-id; Slave节点需连接到Master节点.
2.半同步复制介绍
默认情况下,MySQL 5.5/5.6/5.7和MariaDB 10.0/10.1的复制功能都是异步的,异步复制的情况下可以提供最佳的性能.但是如果从节点没有接收到主节点发送过来的binlog日志时,会造成主从节点的数据不一致,甚至在恢复时造成数据丢失.
为了解决异步复制的数据丢失的问题,MySQL 5.5引入一种半同步复制模式,该模式可以让从节点接收完主节点发送的binlog日志文件并写入自己的中继日志之后,给主节点一个反馈,告诉对方已经接收完毕,这时主库线程才返回给当前session告知操作完成.当出现超时情况时,主节点会暂时切换到异步复制模式,直到至少有一个设置为半同步复制模式的从节点收到信息为止.
半同步复制模式必须在主从节点同时启用,否则主节点默认使用异步复制模式.
3.部署
10.0.0.21 MariaDB-21
10.0.0.22 MariaDB-22
cat /etc/yum.repos.d/mariadb.repo [mariadb] name=MariaDB baseurl=http://mirrors.ustc.edu.cn/mariadb/yum/10.2/centos7-amd64/ gpgkey=http://mirrors.ustc.edu.cn/mariadb/yum/RPM-GPG-KEY-MariaDB gpgcheck=1 yum -y install MariaDB-server MariaDB-client # 已经包含半同步复制插件 find /usr/ -name semisync* /usr/lib64/mysql/plugin/semisync_master.so /usr/lib64/mysql/plugin/semisync_slave.so systemctl start mariadb # 除了将密码改为mariadb123456,其余步骤都按Y /usr/bin/mysql_secure_installation # 在Master和Slave首次启动时,安装插件,开启半同步复制 # 在10.0.0.21上安装master插件 install plugin rpl_semi_sync_master soname 'semisync_master.so'; set global rpl_semi_sync_master_enabled =1; # 在10.0.0.22上安装slave插件 install plugin rpl_semi_sync_slave soname 'semisync_slave.so'; set global rpl_semi_sync_slave_enabled = 1; # 在10.0.0.21上授权用户,repluser用于复制数据 grant replication slave,replication client on *.* to 'repluser'@'10.0.0.%' identified by 'repluser123456'; flush privileges;
初次加载插件后,MySQL会将该插件记录到系统表mysql.plugin中,下次启动系统则会自动加载该插件
# 主节点配置文件 cat /etc/my.cnf.d/server.cnf [mysqld] skip_name_resolve = ON innodb_file_per_table = ON server-id = 21 log-bin = master-bin log-bin-index = master-bin.index rpl_semi_sync_master_enabled = 1 rpl_semi_sync_master_timeout = 1000 # 从节点配置文件 cat /etc/my.cnf.d/server.cnf [mysqld] skip_name_resolve = ON innodb_file_per_table = ON server_id = 22 relay_log = slave_relay_bin relay_log_index = slave_relay_bin.index rpl_semi_sync_slave_enabled = 1
修改完配置文件之后,两台mariadb重启一下
systemctl restart mariadb.service # 查看10.0.0.21上的Position位置 show master status\G File: master-bin.000001 Position: 329 # 在10.0.0.22上show status like '%semi%';发现是OFF,执行change master,开启同步 change master to master_host='10.0.0.21',master_user='repluser', master_password='repluser123456',master_log_file='master-bin.000001',master_log_pos=329; start slave;
4.测试
在10.0.0.21上执行下面两条命令
show variables like '%semi%'; rpl_semi_sync_master_enabled ON rpl_semi_sync_master_timeout 1000 rpl_semi_sync_master_trace_level 32 rpl_semi_sync_master_wait_no_slave ON rpl_semi_sync_master_wait_point AFTER_COMMIT
1秒=1000毫秒(ms)
Rpl_semi_sync_master_enabled=ON 表示开启半同步复制
Rpl_semi_sync_master_timeout=1000 默认1000毫秒,即超过1秒时,将切换为异步复制,可将此值设置为5000
Rpl_semi_sync_master_wait_no_slave 表示是否允许master每个事物都要等待slave接收确认,默认为ON
Rpl_semi_sync_master_trace_level=32 表示用于开启半同步复制时的调试级别,默认32
show status like '%semi%'; Rpl_semi_sync_master_clients 1 Rpl_semi_sync_master_no_tx 0 Rpl_semi_sync_master_status ON Rpl_semi_sync_master_yes_tx 0
Rpl_semi_sync_master_status 表示主服务器使用是异步还是半同步复制
Rpl_semi_sync_master_client 表示从服务器有多少个配置成半同步复制
Rpl_semi_sync_master_yes_tx 表示从服务器确认成功提交的数量
Rpl_semi_sync_master_no_tx 表示从服务器确认失败提交的数量
模拟slave挂掉,master等待1s仍没接收到反馈信号,则转为异步复制模式,继续执行
a.首先同步创建数据库testdb; b.slave执行stop slave;关闭主从复制; c.master在testdb数据库中创建表create table student(id int,name varchar(20)); 没接收到反馈信号,等待1秒后继续执行; d.master在数据库中再创建subject,不需要等待反馈,直接执行,因为反馈超时,master已切换到异步复制模式; e.slave执行start slave,数据开始同步,反馈给master,master切换为半同步复制.
rpl_semi_sync_master_wait_point=AFTER_SYNC比AFTER_COMMIT要好,在参考的第三篇博客中有写原因
半同步复制:https://www.cnblogs.com/phpstudy2015-6/p/6525275.html
半同步复制较详细:https://blog.csdn.net/jiangshouzhuang/article/details/62461883