Mysql的主从全同步复制(组复制)

1. 全同步的解释:(Fully synchronous replication)

1、逻辑上

指当主库执行完一个事务,所有的从库都执行了该事务才返回给客户端。因为需要等待所有从库执行完该事务才能返回,所以全同步复制的性能必然会收到严重的影响。

2、技术上

当主库提交事务之后,所有的从库节点必须收到、APPLY并且提交这些事务,然后主库线程才能继续做后续操作。但缺点是,主库完成一个事务的时间会被拉长,性能降低。

2. 全同步的实现

三个节点:172.25.33.1(发起组复制,只能由一个节点执行)
172.25.33.2    172.25.33.3
在进行操作之前,先查看server1的uuid,因为之后在server1的配置文件中,要写server1的uuid,然后在server1和server2中删掉之前的数据 ,server1和server2中做安全初始化重设密码登陆。最后server3安装mysql,同样进行安全初始化登陆。

(1)查看server1的uuid
[root@server1 mysql]# cat /var/lib/mysql/auto.cnf 
[auto]
server-uuid=db6e25ff-b049-11e9-84f5-525400ca9499

(2)在server1和server2中删掉之前的数据,保证数据一致
[root@server1 ~]# systemctl stop mysqld
[root@server1 ~]# cd /var/lib/mysql
[root@server1 mysql]# ls
auto.cnf         ibdata1           mysql-bin.000002    private_key.pem
ca-key.pem       ib_logfile0       mysql-bin.000003    public_key.pem
ca.pem           ib_logfile1       mysql-bin.index     server-cert.pem
client-cert.pem  ibtmp1            mysql.sock          server-key.pem
client-key.pem   mysql             mysql.sock.lock     sys
ib_buffer_pool   mysql-bin.000001  performance_schema  westos
[root@server1 mysql]# rm -fr *
[root@server1 ~]# systemctl start mysqld


(3)server3安装mysql

(4)server1 server2 sever3 都进行安全初始化登陆

 cat /var/log/mysqld.log | grep password
 mysql_secure_installation 

在这里插入图片描述<1>修改三个节点的配置文件

vim /etc/my.cnf
systemctl restart mysqld

在这里插入图片描述在这里插入图片描述在这里插入图片描述<2>server1的操作:

mysql> SET SQL_LOG_BIN=0;
mysql> CREATE USER rpl_user@'%' IDENTIFIED BY 'Liuyan&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='Liuyan&123'  FOR CHANNEL 'group_replication_recovery';

mysql> INSTALL PLUGIN group_replication SONAME 'group_replication.so';    ##下载插件
mysql> SET GLOBAL group_replication_bootstrap_group=ON;     ##激活全复制,只能在server1上做
 mysql>START GROUP_REPLICATION;
mysql> SET GLOBAL group_replication_bootstrap_group=OFF;    #激活后开启组复制之后关闭

mysql> SELECT * FROM performance_schema.replication_group_members;
+---------------------------+--------------------------------------+-------------+-------------+--------------+
| CHANNEL_NAME              | MEMBER_ID                            | MEMBER_HOST | MEMBER_PORT | MEMBER_STATE |
+---------------------------+--------------------------------------+-------------+-------------+--------------+
| group_replication_applier | 15e9f6b3-b0b8-11e9-ac1d-5254003bfd24 | server1     |        3306 | ONLINE       |
+---------------------------+--------------------------------------+-------------+-------------+--------------+
1 row in set (0.00 sec)

mysql> CREATE DATABASE test;         ##创建了test数据库
mysql> USE test;
mysql> CREATE TABLE t1 (c1 INT PRIMARY KEY, c2 TEXT NOT NULL);
mysql> INSERT INTO t1 VALUES (1, 'Luis');
mysql> SELECT * FROM t1;
+----+------+
| c1 | c2   |
+----+------+
|  1 | Luis |
+----+------+

在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述<2>server2和server3的操作一致,和server1操作的区别只在与于不执行SET GLOBAL group_replication_bootstrap_group=ON;

mysql> SET SQL_LOG_BIN=0;			##停止复制开始操作,不然会导致数据不同步
mysql> CREATE USER rpl_user@'%' IDENTIFIED BY 'Liuyan&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='Liuyan&123' FOR CHANNEL 'group_replication_recovery';
mysql> INSTALL PLUGIN group_replication SONAME 'group_replication.so';		##安装模块
set global group_replication_allow_local_disjoint_gtids_join=on; 	##因为在server1上已经建立了一张表
mysql> START GROUP_REPLICATION;											##开启组服务
mysql> SELECT * FROM performance_schema.replication_group_members;		##查看节点状态

在这里插入图片描述在server3执行完操作后,三个节点全部加入成功,组复制操作成功:
在这里插入图片描述进行测试,任意库建立数据,其他库都应该可以看到
在这里插入图片描述在这里插入图片描述在这里插入图片描述备注:可能出现的问题及解决方法:
(1)问题一:无法开启组复制
问题可能出在uuid上,发起的组复制的uuid和每个节点的uuid都必须不一样

(2)当节点加入后显示为recoverying时,(数据不一致)怎么解决:

一般都是数据不同步的问题,首先备份主节点上的内容 然后导入到从节点

cd /var/lib/mysql
mysqldump -all-databases --single-transaction --routines 
--events --host=127.0.0.1 --port=3306 --user=root --password=Liuyan&123 > dbdump.db

mv dbdump.db /root

scp dbdump.db server2:/root
scp dbdump.db server3:/root

导入的时候 将从节点 先关数据库 删掉全部数据 然后开启数据库

在server2上导入:mysql -p < dbdump.db

但是,从节点显示必须事物表为空才行 
所以 reset master;reset slvae;
然后再进行导入 就可以导入成功 保证节点存储内容一致,在从节点reset master;reset slvae;
会清空从节点和主节点的日志信息 

在从节点上进行组复制的操作,然后change master ,开启组复制

总结:先在从节点 reset master; reset slave;然后导入主库的东西 然后change master 然后开启组复制

发布了168 篇原创文章 · 获赞 1 · 访问量 2984

猜你喜欢

转载自blog.csdn.net/yrx420909/article/details/104415959