(一)在server1中配置和测试 配置: 1.在server1和server2中将mysqld关掉,并删除之前的数据文件,保持实验环境纯洁(在删除前查看uuid,此时查看uuid的原因是因为旧的uuid不会产生影响) 在server1上的操作:
[root@server1 mysql]# systemctl stop mysqld [root@server1 mysql]# cat auto.cnf [root@server1 mysql]# rm -rf *2.在server1中编辑mysql配置文件并开启mysqld服务
[root@server1 mysql]# vim /etc/my.cnf [root@server1 mysql]# systemctl start mysqld [root@server1 mysql]# systemctl restart mysqld配置文件中的内容如下:
server_id=1 gtid_mode=ON enforce_gtid_consistency=ON master_info_repository=TABLE relay_log_info_repository=TABLE binlog_checksum=NONE log_slave_updates=ON log_bin=binlog binlog_format=ROW transaction_write_set_extraction=XXHASH64 ##指示server必须为每个事务收集写集合,并使用XXHASH64哈希算法将其编码为散列 loose-group_replication_group_name="4ba0b05b-72dd-11e9-b543-5254008312d1" ##告知插件,正在加入或创建的组要命名,一般写uuid loose-group_replication_start_on_boot=off ##指示插件在server启动时不自动启动组复制 loose-group_replication_local_address= "172.25.66.1:24901" ##告诉插件使用IP地址本地主机,端口24601用于接收来自组中其他成员的传入连接 loose-group_replication_group_seeds= "172.25.66.1:24901,172.25.66.2:24901,172.25.66.3:24901" loose-group_replication_bootstrap_group=off ##配置是否自动引导组 loose-group_replication_ip_whitelist="127.0.0.1,172.25.66.0/24" ##用户白名单 loose-group_replication_enforce_update_everywhere_checks=ON ##多主模式下为多主更新启用或禁用严格一致性检查 loose-group_replication_single_primary_mode=OFF ##设置组自动选择一个server来处理读/写工作3.在server1上查看密码并修改密码
#过滤初始密码,此处密码在最后面 [root@server1 mysql]# grep password /var/log/mysqld.log [root@server1 mysql]# mysql -p mysql> alter user root@localhost identified by 'Bgg+2019';4.在server1上启动组复制
mysql> show databases; mysql> SET SQL_LOG_BIN=0; #禁用二进制日至 mysql> CREATE USER rpl_user@'%' IDENTIFIED BY 'Bgg+2019'; #创建用户 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='Bgg+2019' FOR CHANNEL 'group_replication_recovery'; #当配置了用户,使用CHANGE MASTER TO语句将服务器为下一次需要从其他成员恢复状态时使SET SQL_LOG_BIN=0;用group_replication_recovery复制通道的给定凭证,发出以下命令,用创建用户时直接使用的值替换rpl_user和密码 mysql> INSTALL PLUGIN group_replication SONAME 'group_replication.so'; #安装组插件 mysql> SHOW PLUGINS; mysql> SET GLOBAL group_replication_bootstrap_group=ON; #master上要先打开,等打开组复制之后再开启(slave上不用进行) mysql> START GROUP_REPLICATION; #打开组复制 mysql> SET GLOBAL group_replication_bootstrap_group=OFF;5.在server1上创建库后创建表,并插入数据
mysql> CREATE DATABASE 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;测试: 在server1上查看状态,发现此时的状态是ONLINE,说明成功
mysql> SELECT * FROM performance_schema.replication_group_members;(二)在server2中配置和测试 1.清空之前的环境
[root@server2 ~]# systemctl stop mysqld [root@server2 ~]# cd /var/lib/mysql [root@server2 mysql]# ls [root@server2 mysql]# rm -rf *2.编辑mysql配置文件并开启服务
[root@server2 ~]# vim /etc/my.cnf [root@server2 ~]# systemctl start mysqld配置文件的内容如下:
server_id=2 ##更改id gtid_mode=ON enforce_gtid_consistency=ON master_info_repository=TABLE relay_log_info_repository=TABLE binlog_checksum=NONE log_slave_updates=ON log_bin=binlog binlog_format=ROW transaction_write_set_extraction=XXHASH64 loose-group_replication_group_name="4ba0b05b-72dd-11e9-b543-5254008312d1" #三个主机的uuid一样 loose-group_replication_start_on_boot=off loose-group_replication_local_address= "172.25.66.2:24901" #将ip更改为本机ip loose-group_replication_group_seeds= "172.25.66.1:24901,172.25.66.2:24901,172.25.66.3:24901" loose-group_replication_bootstrap_group=off loose-group_replication_ip_whitelist="127.0.0.1,172.25.66.0/24" loose-group_replication_enforce_update_everywhere_checks=ON loose-group_replication_single_primary_mode=OFF注意: 此处的gtid_mode=ON得加上,否则后面会出问题
3.查看server2的mysql密码并修改
[root@server2 ~]# grep password /var/log/mysqld.log [root@server2 ~]# mysql -p mysql> alter user root@localhost identified by 'Bgg+2019';4.在server2上启动组复制
mysql> show databases; mysql> SET SQL_LOG_BIN=0; mysql> CREATE USER rpl_user@'%' IDENTIFIED BY 'Bgg+2019'; 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='Bgg+2019' 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;测试: 1.在server1中查看server3的状态是否是ONLINE,如果不是,说明配置文件有错(极大可能性是因为uuid)
mysql> SELECT * FROM performance_schema.replication_group_members;2.在server3中查看之前在server1中插入的数据,发现可以查看,说明成功
mysql> show databases; mysql> USE test; mysql> select * from t1;USE test;(三)在server2中配置并测试: 配置: 1.重新建立一个快照server3
[root@foundation66 ~]# cd /var/lib/libvirt/images/ [root@foundation66 images]# qemu-img create -f qcow2 -b gege.qcow2 server32.在server2中将安装包传给server3
[root@server2 ~]# ls [root@server2 ~]# scp * root@172.25.66.3:3.在server3中安装这些包
[root@server3 ~]# ls [root@server3 ~]# yum install * -y4.编辑mysql配置文件并开启服务(因为server3是新的虚拟机,所以不需要清除数据文件)
[root@server3 ~]# vim /etc/my.cnf [root@server3 ~]# systemctl start mysqld配置文件中的内容如下:
server_id=3 ##更改id gtid_mode=ON enforce_gtid_consistency=ON master_info_repository=TABLE relay_log_info_repository=TABLE binlog_checksum=NONE log_slave_updates=ON log_bin=binlog binlog_format=ROW transaction_write_set_extraction=XXHASH64 loose-group_replication_group_name="4ba0b05b-72dd-11e9-b543-5254008312d1" #三个主机的uuid一样 loose-group_replication_start_on_boot=off loose-group_replication_local_address= "172.25.66.3:24901" #将ip更改为本机ip loose-group_replication_group_seeds= "172.25.66.1:24901,172.25.66.2:24901,172.25.66.3:24901" loose-group_replication_bootstrap_group=off loose-group_replication_ip_whitelist="127.0.0.1,172.25.66.0/24" loose-group_replication_enforce_update_everywhere_checks=ON loose-group_replication_single_primary_mode=OFF注意: 这里可以重启mysqld服务,也可以不重启,但是建议重启服务,因为重启主要是查看配置文件中是否有错误
5.查看server3的mysql密码并修改
[root@server3 ~]# grep password /var/log/mysqld.log [root@server3 ~]# mysql -p Enter password: #此处输入的是上面查看时的初始密码 mysql> alter user root@localhost identified by 'Bgg+2019';4.在server2上启动组复制
mysql> show databases; mysql> SET SQL_LOG_BIN=0; mysql> CREATE USER rpl_user@'%' IDENTIFIED BY 'Bgg+2019'; 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='Bgg+2019' 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;测试: 1.在server1中查看server3的状态是否是ONLINE,如果不是,说明配置文件有错(极大可能性是因为uuid)
mysql> SELECT * FROM performance_schema.replication_group_members;2.在server3中查看之前在server1中插入的数据,发现可以查看,说明成功
mysql> show databases; mysql> USE test; mysql> select * from t1;(四)终极测试: 1.在server2中插入数据(2,‘alice’)
mysql> insert into t1 values (2,'alice'); mysql> select * from t1;2.在server1和server3中都可以直接查看到 在server1中查看:
mysql> USE test; mysql> select * from t1;在server3中查看:
mysql> select * from t1;3.在server3中插入数据(3,‘coco’)
mysql> insert into t1 values (3,'coco'); mysql> select * from t1;4.在server1和server3中都可以直接查看到 在server1中查看:
mysql> select * from t1;在server2中查看:
mysql> select * from t1;(五)mysql中出现问题 1.删除数据库中的数据删除的是哪个数据????? (1)删除的数据不是/etc/my.cnf的数据
#进入数据库的数据目录下(此时没有关闭数据库) [root@server3 ~]# cd /var/lib/mysql #查看数据库中的目录下的文件 [root@server3 mysql]# ls #删除数据库下的所有内容 [root@server3 mysql]# rm -rf * #再次查看/etc/my.cnf时,发现没有少任何内容,(应该是不会变得,因为虽然是mysqld的配置文件,但是两者的路径是不同的) [root@server3 mysql]# vim /etc/my.cnf #重新启动mysqld服务,会出现报错,此报错应该是之前操作不当,即删除数据时必须关闭mysqld [root@server3 mysql]# systemctl restart mysqld #关闭mysqld [root@server3 mysql]# systemctl stop mysqld #再次查看内容时,会发现少了一部分内容 [root@server3 mysql]# ls #删除所有数据 [root@server3 mysql]# rm -rf * #查看mysqld配置文件,发现没有少任何内容 [root@server3 mysql]# vim /etc/my.cnf #开启mysqld服务,没有报错 [root@server3 mysql]# systemctl start mysqld #重启启动mysqld服务,没有报错 [root@server3 mysql]# systemctl restart mysqld #查看mysqld配置文件,没有少任何内容 [root@server3 mysql]# vim /etc/my.cnf(2)在server1查看server3的状态时,发现没有server3(这个原因是因为mysqld服务关闭过,所以没有)
mysql> SELECT * FROM performance_schema.replication_group_members;(3)真正删除数据的地方:
#在server3中使用之前的密码(Bgg+2019)进入,发现无法进入 [root@server3 mysql]# mysql -p #查看初始密码并进行修改,之后开启组复制 [root@server3 mysql]# grep password /var/log/mysqld.log [root@server3 mysql]# mysql -p Enter password: #这里的初始密码应该使用最新的,即时间离你最近的显示的密码 mysql> alter user root@localhost identified by 'Bgg+2019'; #此时查看数据时发现没有任何在server1或server2上的数据 mysql> show databases; #接下来便开启了漫漫的开启组复制的道路,会发现所有内容都不会出现错误(此处的错误指的是用户已经存在阿,下载的东西已经成功下载阿),所以此处以及用户密码便是删除数据的真正地方 mysql> SET SQL_LOG_BIN=0; mysql> CREATE USER rpl_user@'%' IDENTIFIED BY 'Bgg+2019'; 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='Bgg+2019' 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;(4)再次在server1中查看,发现先开始可能会出现RECOVERING 报错,但再次查看server3的状态时,会发现状态变为ONLINE。(注意:如果报错一直是RECOVERING,一个原因是命令有错(例如:可能把密码写错了),另外一个原因是配置文件有错。但是,请相信,如果一直出现这个错误,说明你的实验是失败的,也无法形成组复制。
mysql> SELECT * FROM performance_schema.replication_group_members; mysql> SELECT * FROM performance_schema.replication_group_members;2.关于uuidgen和cat auto.cnf 如果我做了20遍实验的话,可能有以下的原因都在于我写的是uuidgen,会发现使用uuidgen这个命令时,其uuid是会发生改变的(这与其路径无关),如果从头到尾一遍都不错,那么有可能会成功,但是我试了18遍,换了n个uuid,都没有成功,说明mysql中的数据变化是相当厉害的。所以,在最后,我使用了查看文件获取uuid,此时会发现,uuid是不发生改变的。但是在使用这个uuid时,要注意,不要使用当下的,最好使用之前的(查看到uuid后,将其数据文件删除并重启服务,重启服务后便生成了一个新的uuid)。这也可能是使用uuidgen出现问题的原因。反正如果对uuidgen不是很熟悉,建议还是慎用,否则会花费很长时间。
[root@server3 mysql]# uuidgen [root@server3 mysql]# uuidgen [root@server3 mysql]# uuidgen [root@server3 mysql]# cd [root@server3 ~]# uuidgen [root@server3 ~]# uuidgen [root@server3 ~]# cd /var/lib/mysql [root@server3 mysql]# cat auto.cnf [root@server3 mysql]# cat auto.cnf [root@server3 mysql]# cat auto.cnf==3.以下两者内容应该是可以替换的,两者所表现出来的效果是差不多的 ==
set global group_replication_allow_local_disjoint_gtids_join=on; = reset master;