mysql的半同步复制和组复制

本篇博客承接上一篇,安装配置请看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查看数据是否同步就可以了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值