Mysql(二)Mysql的组复制

    xiaoxiao2022-07-14  154

    Mysql的组复制

    (一)在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;

    注意: 1.如果在START GROUP_REPLICATION;时出现以下报错,ERROR 3092 (HY000): The server is not configured properly to be an active member of the group. Please see more details on error log.,可能的原因是因为uuid发生了改变 2.如果在START GROUP_REPLICATION;时出现以下报错,ERROR 3096 (HY000): The START GROUP_REPLICATION command failed as there was an error when initializing the group communication layer.可能的原因是因为配置文件中的loose-group_replication_local_address写错

    (二)在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 server3

    2.在server2中将安装包传给server3

    [root@server2 ~]# ls [root@server2 ~]# scp * root@172.25.66.3:

    3.在server3中安装这些包

    [root@server3 ~]# ls [root@server3 ~]# yum install * -y

    4.编辑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;

    ## 超级注意: 我做了这个实验快20次,其主要的错误在uuid设置有错,我使用的是uuidgen查看其uuid,后来发现其总在发生改变,故一直报错,还有一个问题就是配置文件中的错误,配置文件中的错误有时候写错了,但是再次执行时会发现已经无法成功了,我在想,可能和重启mysqld服务的有关,因为mysqld服务重启后,会生成文件,而且大部分会覆盖。

    (四)终极测试: 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;
    最新回复(0)