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 然后开启组复制