本篇博客承接上一篇,安装配置请看mysql的主从复制(异步复制)
半同步复制
半同步复制的作用
MySQL通过复制(Replication)实现存储系统的高可用。相比异步复制,半同步复制牺牲了一定的性能,提升了主备之间数据的一致性。异步复制即是master数据库把binlog日志发送给slave数据库,然后就没有了然后了。
默认情况下,MySQL的复制是异步的,主库执行完Commit提交操作后,在主库写入BInlog后即可成功返回给客户端,无需等待BInlog传给从 库。当在主库上写入一个事务并提交成功,而从库尚未得到主库推送的Binlog时,主库宕机了,从而从库可能损失该事务,造成主从库的不一致。
为了解决这个问题,MySQL引入了半同步复制。半同步复制保证了主库上的每一个Binlog都能可靠的复制到从库上,主库在每次事务提交时,并不及时反 馈给前端用户,而是等待其中一个从库也接收到Binlog并成功写入中继日志后,主库才返回Commit操作成功给客户端。此时,至少有两份日志记录,一 份在主库的Binlog上,另一份在至少一个从库的中继日志上,从而保证了数据的完整性。
搭建步骤
前提:
主库:
server1 :172.25.62.1
从库:
server2:172.25.62.2
在主库server1
1.在主库server1安装插件,激活插件
mysql> INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';
安装插件。
mysql> SELECT PLUGIN_NAME, PLUGIN_STATUS FROM INFORMATION_SCHEMA.PLUGINS WHERE PLUGIN_NAME LIKE '%semi%';
查看插件信息。
mysql> SET GLOBAL rpl_semi_sync_master_enabled =1;
激活插件。
2.查看信息
mysql> show status like '%rpl%';
可以看到半同步打开。
mysql> show variables like '%rpl%';
在从库server2
1.在从库server2安装插件,激活插件
INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';
安装插件。
mysql> SET GLOBAL rpl_semi_sync_slave_enabled =1;
激活插件。
mysql> STOP SLAVE IO_THREAD;
mysql> START SLAVE IO_THREAD;
重启io线程。
2.查看信息
mysql> show variables like '%rpl%';
半同步打开。
测试:
将从库server2的IO线程关闭
mysql> STOP SLAVE IO_THREAD;
主库sersver1添加信息,插入信息的时候会等待10秒,如果没接收到就不等待,此时从库会缺少添加的数据。
此时,在从库server2查看。
添加的信息没有同步,半同步关闭。
mysql> START SLAVE IO_THREAD;
mysql> select * from usertb;
重新打开io线程,数据就同步成功了。
组复制
组复制(Group Replication):基于Paxos算法实现分布式数据复制的强一致性。只要大多数机器存活就能保证系统可用。相比半同步复制,Group Replication的数据一致性和系统可用性更高。
搭建步骤:
本次实验还要主备一台新的虚拟机server3,安装好mysql并进行初始化,用server1做组复制的发起点。
在server1:
1.删除myqsl信息,重新初始化
首先,先查看一下uuid,下面修改文件需要用到。
[root@server3 ~]# rm -rf /var/lib/mysql/*
删除信息。
2.修改配置文件
[root@server1 mysql]# vim /etc/my.cnf
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
server_id=1
gtid_mode=ON
enforce_gtid_consistency=ON
master_info_repository=TABLE
relay_log_info_repository=TABLE
binlog_checksum=NONE #关闭binlog校验
log_slave_updates=ON
log_bin=binlog
binlog_format=ROW #组复制依赖基于行的复制格式
transaction_write_set_extraction=XXHASH64
loose-group_replication_group_name="1eb74915-719b-11e9-843b-52540055922f" ##在/var/lib/mysql/auto.cnf中查看
loose-group_replication_start_on_boot=off
loose-group_replication_local_address= "172.25.62.1:24901"
loose-group_replication_group_seeds= "172.25.62.1:24901,172.25.62.2:24901,172.25.62.3:24901"
loose-group_replication_bootstrap_group=off ##查看插件是否自动引导,这个选项一般都要off掉,只需要由发起组复制的节点开启,并只启动一次,如果是on,下次再启动时,会生成一个同名的组,可能会发生脑裂
loose-group_replication_ip_whitelist="127.0.0.1,172.25.26.0/24"
loose-group_replication_enforce_update_everywhere_checks=ON
loose-group_replication_single_primary_mode=OFF #后两行是开启多主模式的参数
3.开启mysql,进行初始化,进行设置
[root@server1 mysql]# systemctl start mysqld
[root@server1 mysql]# cat /var/log/mysqld.log | grep password
开启mysql,查看密码
[root@server1 mysql]# mysql_secure_installation
初始化。
[root@server1 mysql]# mysql -p
登陆。
mysql> SET SQL_LOG_BIN=0; #关闭二进制日志,防止传到其他server上
mysql> CREATE USER rpl_user@'%' IDENTIFIED BY 'Hang+123';
mysql> GRANT REPLICATION SLAVE ON *.* TO rpl_user@'%';
mysql> FLUSH PRIVILEGES;
mysql> SET SQL_LOG_BIN=1; ##开启日志
mysql> CHANGE MASTER TO MASTER_USER='rpl_user', MASTER_PASSWORD='Hang+123' FOR CHANNEL 'group_replication_recovery';
mysql> INSTALL PLUGIN group_replication SONAME 'group_replication.so'; ##安装插件
mysql> SHOW PLUGINS;
查看插件。
mysql> SET GLOBAL group_replication_bootstrap_group=ON; ##组复制发起节点开启这个参数
mysql> START GROUP_REPLICATION;
mysql> SET GLOBAL group_replication_bootstrap_group=OFF;
开启组复制。
mysql> SELECT * FROM performance_schema.replication_group_members;
查看组内成员,现在只有server1,接下来要把server2和server3加入组内。
在server2:
在server进行操作和server差不多,在启动mysql前完全一样,修改配置文件,只不过文件中的ip地址之类的要改一下。
[root@server2 ~]# vim /etc/my.cnf
29 server_id=2
30 gtid_mode=ON
31
32 enforce_gtid_consistency=ON
33 master_info_repository=TABLE
34 relay_log_info_repository=TABLE
35 binlog_checksum=NONE
36 log_slave_updates=ON
37 log_bin=binlog
38 binlog_format=ROW
39
40 transaction_write_set_extraction=XXHASH64
41 loose-group_replication_group_name="1eb74915-719b-11e9-843b-52540055922f"
42 loose-group_replication_start_on_boot=off
43 loose-group_replication_local_address= "172.25.62.2:24901"
44 loose-group_replication_group_seeds= "172.25.62.1:24901,172.25.62.2:24901,172.25.62.3:24901"
45 loose-group_replication_bootstrap_group=off
46 loose-group_replication_ip_whitelist="127.0.0.1,172.25.62.0/24"
47 loose-group_replication_enforce_update_everywhere_checks=ON
48 loose-group_replication_single_primary_mode=OFF
和server1不同的是, server_id=2,本地ip也要进行修改: loose-group_replication_local_address= “172.25.62.2:24901”。
之后就可以打开mysql进行配置了。
mysql> SET SQL_LOG_BIN=0;
mysql> CREATE USER rpl_user@'%' IDENTIFIED BY 'Hang+123'; ##密码
mysql> GRANT REPLICATION SLAVE ON *.* TO rpl_user@'%';
mysql> FLUSH PRIVILEGES;
mysql> SET SQL_LOG_BIN=1;
mysql> CHANGE MASTER TO MASTER_USER='rpl_user', MASTER_PASSWORD='Hang+123' FOR CHANNEL 'group_replication_recovery';
mysql> INSTALL PLUGIN group_replication SONAME 'group_replication.so';
mysql> set global group_replication_allow_local_disjoint_gtids_join=on;
mysql> START GROUP_REPLICATION;
开启组复制,将server2添加入组。
在server1中查看:
mysql> SELECT * FROM performance_schema.replication_group_members;
可以发现server2添加入组内。
server3添加入组的内容和server2完全一致,这里就不在重复。
将server3添加入组后在server1查看:
mysql> SELECT * FROM performance_schema.replication_group_members;
+---------------------------+--------------------------------------+-------------+-------------+--------------+
| CHANNEL_NAME | MEMBER_ID | MEMBER_HOST | MEMBER_PORT | MEMBER_STATE |
+---------------------------+--------------------------------------+-------------+-------------+--------------+
| group_replication_applier | 1e54c13e-6cac-11e9-934f-5254008df731 | server2 | 3306 | ONLINE |
| group_replication_applier | 59deed78-6cad-11e9-993e-525400fc55e2 | server3 | 3306 | ONLINE |
| group_replication_applier | 8e34e3bd-6caa-11e9-940b-52540098eeea | server1 | 3306 | ONLINE |
+---------------------------+--------------------------------------+-------------+------------
会查看到这样的状态,之后在server1节点写入数据,在server2和server3查看数据是否同步就可以了。