MySQL的组复制

组复制是基于分布式一致性协议Paxos实现数据最终一致性的MySQL插件,通过这种插件可以实现弹性、高可用、容错复制拓扑结构。

MySQL组复制提供分布式状态机复制,在服务器之间具有强协调。当数据库服务器是属于同一组时,组复制机制可以自动协调它们。该组可以在具有自动选择新主库功能的单主模式下操作,这种情况下一个组只有主节点才可以做写操作。或者,对于更高级的用户,该组可以以多主模式部署,即多个节点都可以做写操作,即使它们是同时发过来的写请求。不过这种情况下,应用层会有部分额外的限制。

MySQL组复制是MySQL 5.7.17开始引入的新功能,为主从复制实现高可用功能。它支持单主模型和多主模型两种工作方式(默认是单主模型)。

  • 单主模型:从复制组中众多个MySQL节点中自动选举一个master节点,只有master节点可以写,其他节点自动设置为read only。当master节点故障时,会自动选举一个新的master节点,选举成功后,它将设置为可写,其他slave将指向这个新的master。
  • 多主模型:复制组中的任何一个节点都可以写,因此没有master和slave的概念,只要突然故障的节点数量不太多,这个多主模型就能继续可用。
    在这里插入图片描述
    我们将server1到server3设置为Master1到Master3

1. 恢复环境,更改配置文件

master1:

[root@server1 ~]# systemctl stop mysqld
[root@server1 ~]# cd /var/lib/mysql
[root@server1 mysql]# ls
auto.cnf         master.info         redhat
ca-key.pem       mysql               relay-log.info
ca.pem           mysql-bin.000001    server1-relay-bin.000001
client-cert.pem  mysql-bin.000002    server1-relay-bin.000002
client-key.pem   mysql-bin.000003    server1-relay-bin.index
ib_buffer_pool   mysql-bin.index     server-cert.pem
ibdata1          performance_schema  server-key.pem
ib_logfile0      private_key.pem     sys
ib_logfile1      public_key.pem
[root@server1 mysql]# rm -rf *
[root@server1 mysql]# ps ax | grep mysqld
 6048 pts/0    S+     0:00 grep --color=auto mysqld

[root@server1 mysql]# uuidgen			##随机生成UUID
ddf795db-90d4-4a0d-9a8f-3ec3ace25a50

更改配置文件:

 29 server-id=1
 30 gtid_mode=ON
 31 enforce-gtid-consistency=true
 32 master_info_repository=TABLE
 33 relay_log_info_repository=TABLE
 34 binlog_checksum=NONE		#关闭binlog校验
 35 log_slave_updates=ON
 36 log_bin=binlog
 37 binlog_format=ROW		#组复制依赖基于行的复制格式
 38 
 39 transaction_write_set_extraction=XXHASH64
 40 loose-group_replication_group_name="ddf795db-90d4-4a0d-9a8f-3ec3ace25a50"		#使用上面生成的
 41 loose-group_replication_start_on_boot=off
 42 loose-group_replication_local_address= "172.25.80.3:24901"
 43 loose-group_replication_group_seeds= "172.25.80.1:24901,172.    25.80.2:24901,172.25.80.3:24901"
 44 loose-group_replication_bootstrap_group=off		##插件是否自动引导,这个选项一般都要off掉,只需要由发起组复制的节点开启,并只启动一次,如果是on,下次再启动时,会生成一个同名的组,可能会发生脑裂
 45 loose-group_replication_ip_whitelist="127.0.0.1,172.25.80.0/    24"
 46 loose-group_replication_enforce_update_everywhere_checks=ON
 47 loose-group_replication_single_primary_mode=OFF		#后两行是开启多主模式的参数

在这里插入图片描述

2.server1启动mysql,修改安全设定

[root@server1 mysql]# grep password /var/log/mysqld.log 
[root@server1 mysql]# mysql -p
mysql> alter user root@localhost identified by 'Redhat1.';		#更改root用户的密码
Query OK, 0 rows affected (0.04 sec)

mysql> SET SQL_LOG_BIN=0;		#关闭二进制日志,防止传到其他server上
Query OK, 0 rows affected (0.00 sec)

mysql> CREATE USER rpl_user@'%' IDENTIFIED BY 'Redhat1.';		#创建用户用于复制
Query OK, 0 rows affected (0.00 sec)

mysql> GRANT REPLICATION SLAVE ON *.* TO rpl_user@'%';		#给所有库的所有表
Query OK, 0 rows affected (0.00 sec)

mysql> FLUSH PRIVILEGES;		#刷新授权表
Query OK, 0 rows affected (0.00 sec)

mysql> SET SQL_LOG_BIN=1;		##开启日志
Query OK, 0 rows affected (0.00 sec)

mysql> CHANGE MASTER TO MASTER_USER='rpl_user', MASTER_PASSWORD='Redhat1.' FOR CHANNEL 'group_replication_recovery';
Query OK, 0 rows affected, 2 warnings (0.14 sec)

mysql> INSTALL PLUGIN group_replication SONAME 'group_replication.so';		#添加组复制的插件
Query OK, 0 rows affected (0.04 sec)

mysql> SHOW PLUGINS;		##查看插件

mysql> SET GLOBAL group_replication_bootstrap_group=ON;		##组复制发起节点开启这个参数
Query OK, 0 rows affected (0.00 sec)

mysql> START GROUP_REPLICATION;
Query OK, 0 rows affected (2.23 sec)

mysql> SET GLOBAL group_replication_bootstrap_group=OFF;
Query OK, 0 rows affected (0.00 sec)

mysql> SELECT * FROM performance_schema.replication_group_members;		##查看server1是否online
+---------------------------+--------------------------------------+-------------+-------------+--------------+
| CHANNEL_NAME              | MEMBER_ID                            | MEMBER_HOST | MEMBER_PORT | MEMBER_STATE |
+---------------------------+--------------------------------------+-------------+-------------+--------------+
| group_replication_applier | 376250ff-7331-11e9-bc63-525400ccaaa5 | server1     |        3306 | ONLINE       |
+---------------------------+--------------------------------------+-------------+-------------+--------------+
1 row in set (0.00 sec)

3.添加server2到组内

1.关闭server2的mysql,删除信息,修改配置文件

[root@server2 mysql]# systemctl stop mysqld
[root@server2 mysql]# rm -rf *
[root@server2 mysql]# ls
[root@server2 mysql]# vim /etc/my.cnf
 29 server-id=2
 30 gtid_mode=ON
 31 enforce-gtid-consistency=true
 32 master_info_repository=TABLE
 33 relay_log_info_repository=TABLE
 34 binlog_checksum=NONE
 35 log_slave_updates=ON
 36 log_bin=binlog
 37 binlog_format=ROW
 38 
 39 transaction_write_set_extraction=XXHASH64
 40 loose-group_replication_group_name="2956bfe4-7319-11e9-b4d6-    525400b84aa9"
 41 loose-group_replication_start_on_boot=off
 42 loose-group_replication_local_address= "172.25.80.2:24901"
 43 loose-group_replication_group_seeds= "172.25.80.1:24901,172.    25.80.2:24901,172.25.80.3:24901"
 44 loose-group_replication_bootstrap_group=off
 45 loose-group_replication_ip_whitelist="127.0.0.1,172.25.80.0/    24"
 46 loose-group_replication_enforce_update_everywhere_checks=ON
 47 loose-group_replication_single_primary_mode=OFF 

在这里插入图片描述

2.server2启动mysqld,修改安全设定

[root@server2 mysql]# systemctl start  mysqld
[root@server2 mysql]# grep password /var/log/mysqld.log 
[root@server2 mysql]# mysql -p

mysql> alter user root@localhost identified by 'Redhat1.';
Query OK, 0 rows affected (0.03 sec)

mysql> SET SQL_LOG_BIN=0;
Query OK, 0 rows affected (0.00 sec)

mysql> CREATE USER rpl_user@'%' IDENTIFIED BY 'Redhat1.';
Query OK, 0 rows affected (0.00 sec)

mysql> GRANT REPLICATION SLAVE ON *.* TO rpl_user@'%';
Query OK, 0 rows affected (0.00 sec)

mysql> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.00 sec)

mysql> SET SQL_LOG_BIN=1;
Query OK, 0 rows affected (0.00 sec)

mysql> CHANGE MASTER TO MASTER_USER='rpl_user', MASTER_PASSWORD='Redhat1.' FOR CHANNEL 'group_replication_recovery';
Query OK, 0 rows affected, 2 warnings (0.12 sec)

mysql> INSTALL PLUGIN group_replication SONAME 'group_replication.so';
Query OK, 0 rows affected (0.03 sec)

mysql> set global group_replication_allow_local_disjoint_gtids_join=on;
Query OK, 0 rows affected, 1 warning (0.00 sec)

mysql> START GROUP_REPLICATION;
Query OK, 0 rows affected, 1 warning (5.97 sec)

在这里插入图片描述

3.在server1上查看是否添加成功

mysql> SELECT * FROM performance_schema.replication_group_members;
+---------------------------+--------------------------------------+-------------+-------------+--------------+
| CHANNEL_NAME              | MEMBER_ID                            | MEMBER_HOST | MEMBER_PORT | MEMBER_STATE |
+---------------------------+--------------------------------------+-------------+-------------+--------------+
| group_replication_applier | 2f414643-7333-11e9-a4d7-525400b84aa9 | server2     |        3306 | ONLINE       |
| group_replication_applier | 376250ff-7331-11e9-bc63-525400ccaaa5 | server1     |        3306 | ONLINE       |
+---------------------------+--------------------------------------+-------------+-------------+--------------+
2 rows in set (0.00 sec)

4.server3与server2的配置步骤相同

配置文件 有差异如下:

[root@server3 ~]# vim /etc/my.cnf
 29 server-id=3
 30 gtid_mode=ON
 31 enforce-gtid-consistency=true
 32 master_info_repository=TABLE
 33 relay_log_info_repository=TABLE
 34 binlog_checksum=NONE
 35 log_slave_updates=ON
 36 log_bin=binlog
 37 binlog_format=ROW
 38 
 39 transaction_write_set_extraction=XXHASH64
 40 loose-group_replication_group_name="2956bfe4-7319-11e9-b4d6-    525400b84aa9"
 41 loose-group_replication_start_on_boot=off
 42 loose-group_replication_local_address= "172.25.80.3:24901"
 43 loose-group_replication_group_seeds= "172.25.80.1:24901,172.    25.80.2:24901,172.25.80.3:24901"
 44 loose-group_replication_bootstrap_group=off
 45 loose-group_replication_ip_whitelist="127.0.0.1,172.25.80.0/    24"
 46 loose-group_replication_enforce_update_everywhere_checks=ON

5.添加完成后,在server1上验证是否添加成功

mysql> SELECT * FROM performance_schema.replication_group_members;
+---------------------------+--------------------------------------+-------------+-------------+--------------+
| CHANNEL_NAME              | MEMBER_ID                            | MEMBER_HOST | MEMBER_PORT | MEMBER_STATE |
+---------------------------+--------------------------------------+-------------+-------------+--------------+
| group_replication_applier | 2f414643-7333-11e9-a4d7-525400b84aa9 | server2     |        3306 | ONLINE       |
| group_replication_applier | 376250ff-7331-11e9-bc63-525400ccaaa5 | server1     |        3306 | ONLINE       |
| group_replication_applier | 7089ab88-7334-11e9-ab9f-525400cb2505 | server3     |        3306 | ONLINE       |
+---------------------------+--------------------------------------+-------------+-------------+--------------+
3 rows in set (0.00 sec)

4.测试

在server1上:

mysql> CREATE DATABASE redhat;
Query OK, 1 row affected (0.04 sec)

mysql> USE redhat;
Database changed
mysql> CREATE TABLE t1 (c1 INT PRIMARY KEY, c2 TEXT NOT NULL);
Query OK, 0 rows affected (0.15 sec)

mysql> INSERT INTO 
Display all 763 possibilities? (y or n) 
mysql> INSERT INTO t1 VALUES (1,'USER1');
Query OK, 1 row affected (0.08 sec)

mysql> SELECT * FROM t1;
+----+-------+
| c1 | c2    |
+----+-------+
|  1 | USER1 |
+----+-------+
1 row in set (0.00 sec)

在server2上

mysql> SELECT * FROM redhat.t1;
+----+-------+
| c1 | c2    |
+----+-------+
|  1 | USER1 |
+----+-------+
1 row in set (0.00 sec)

在server2上:

mysql> SELECT * FROM redhat.t1;
+----+-------+
| c1 | c2    |
+----+-------+
|  1 | USER1 |
+----+-------+
1 row in set (0.00 sec)

组复制完成

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值