Linux运维——MySQL多组复制

组复制原理:

组复制是一种可用于实现容错系统的技术。 复制组是一个通过消息传递相互交互的 server 集群。
通信层提供了原子消息(atomic message)和完全有序信息交互等保障机制。 这些是非常强大的功能,我们可以据此架构设计更高级的数据库复制解决方案。
MySQL 组复制以这些功能和架构为基础,实现了基于复制协议的多主更新。
复制组由多个 server成员构成,并且组中的每个 server 成员可以独立地执行事务。但所有读写(RW)事务只有在冲突检测成功后才会提交。只读(RO)事务不需要在冲突检测,可以立即提交。换句话说,对于任何 RW 事务,提交操作并不是由始发 server 单向决定的,而是由组来决定是否提交。准确地说,在始发 server 上,当事务准备好提交时,该 server 会广播写入值(已改变的行)和对应的写入集(已更新的行的唯一标识符)。然后会为该事务建立一个全局的顺序。最终,这意味着所有 server 成员以相同的顺序接收同一组事务。因此,所有 server 成员以相同的顺序应用相同的更改,以确保组内一致。
在不同 server 上并发执行的事务可能存在冲突。 根据组复制的冲突检测机制,对两个不同的并发事务的写集合进行检测。如在不同的 server 成员执行两个更新同一行的并发事务,则会出现冲突。排在最前面的事务可以在所有 server 成员上提交,第二个事务在源 server 上回滚,并在组中的其他 server 上删除。 这就是分布式的先提交当选规则。
 

在单主模式下部署组复制

组中的每个 server 实例可以在独立的物理机器上运行,也可以在同一台机器上运行。 如何在一台物理机上创建具有三个 MySQL Server 实例的复制组。这意味着需要三个数据目录,每个 server 实例一个,每个实例都需要单独配置。
组架构
                      

 

 

【server1】主机设置

1.组复制 server 设置

[root@server1 ~]# systemctl stop mysqld
[root@server1 ~]# cd /var/lib/mysql
[root@server1 mysql]# rm -fr *
[root@server1 mysql]# ls
[root@foundation19 kiosk]# uuidgen
350e456f-ddf7-43e1-93b1-71e10ee5c84c

2.复制框架,组复制设置

[root@server1 mysql]# vim /etc/my.cnf
 29 server-id=1
 30 gtid_mode=ON
 31 enforce_gtid_consistency=ON
 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   
#指示Server必须为每个事务收集写集合,并使用XXHASH64哈希算法将其编码为散列
 40 loose-group_replication_group_name="350e456f-ddf7-43e1-93b1-71e10ee5c84c"   #自己生成的唯一uuid
 41 loose-group_replication_start_on_boot=off    #设置为Server启动时不自动启动组复制
 42 loose-group_replication_local_address="172.25.19.1:24901"     #本机IP
 43 loose-group_replication_group_seeds="172.25.19.1:24901,172.25.19.2:24901,172.25.19.3:24901"   ##组内所有成员,最多9个
 44 loose-group_replication_bootstrap_group=off                #配置是否自动引导组
 45 loose-group_replication_single_primary_mode=off       #设置组自动选择一个 server 来处理读/写工作。
 46 loose-group_replication_enforce_update_everwhere_checks=on   #多主模式下为多主更新启用或禁用严格一致性检查
 47 loose_group_replication_ip_whitelist="127.0.0.1/8,172.25.19.0/24"     #加入白名单
[root@server1 mysql]# systemctl start mysqld
[root@server1 mysql]# grep password /var/log/mysqld.log

3.启动组复制

[root@server1 mysql]# mysql -p
Enter password:
mysql> SET SQL_LOG_BIN=0;                    #以下操作不写入日志
mysql> ALTER USER root@localhost identified by 'Redhat-1';   #更改密码
mysql> GRANT REPLICATION SLAVE ON *.* TO rpl_user@'%' IDENTIFIED BY 'Redhat-1'; #创建用户rpl_use
mysql> FLUSH PRIVILEGES;   #生效
mysql> SET SQL_LOG_BIN=1;  #以下操作写入日志
mysql> CHANGE MASTER TO MASTER_USER='rpl_user',MASTER_PASSWORD='Redhat-1' FOR CHANNEL 'group_replication_recovery';      #将 rpl_user 和 rpl_pass 替换为创建用户时使用的值
mysql> INSTALL PLUGIN group_replication SONAME 'group_replication.so';   #安装组复制插件
mysql> show plugins;    #检查插件是否安插成功
mysql> SET GLOBAL group_replication_bootstrap_group=ON;   ##只有第一个需要此步
mysql> START GROUP_REPLICATION;    开启
mysql> SET GLOBAL group_replication_bootstrap_group=OFF;   ##只有第一个需要此步

【server2】主机设置

[root@server2 ~]# systemctl stop mysqld
[root@server2 ~]# cd /var/lib/mysql
[root@server2 mysql]# rm -fr *
[root@server2 mysql]# ls
[root@server2 mysql]# vim /etc/my.cnf

[root@server2 mysql]# systemctl start mysqld
[root@server2 mysql]# grep password /var/log/mysqld.log  ###查看初始密码
[root@server2 mysql]# mysql -p
Enter password:
mysql> SET SQL_LOG_BIN=0;
mysql> ALTER USER root@localhost identified by 'Redhat-1';
mysql> GRANT REPLICATION SLAVE ON *.* TO rpl_user@'%' IDENTIFIED BY 'Redhat-1';
mysql> FLUSH PRIVILEGES;
mysql> SET SQL_LOG_BIN=1;
mysql> CHANGE MASTER TO MASTER_USER='rpl_user',MASTER_PASSWORD='Redhat-1' FOR CHANNEL 'group_replication_recovery';
mysql> INSTALL PLUGIN group_replication SONAME 'group_replication.so';
mysql> show plugins;
mysql> START GROUP_REPLICATION;
mysql> SELECT * FROM performance_schema.replication_group_members;

[server3]

[root@server3 ~]# systemctl stop mysqld
[root@server3 ~]# cd /var/lib/mysql
[root@server3 mysql]# rm -fr *
[root@server3 mysql]# ls
[root@server3 mysql]# vim /etc/my.cnf
[root@server3 mysql]# systemctl start mysqld
[root@server3 mysql]# grep password /var/log/mysqld.log
[root@server3 mysql]# mysql -p
Enter password:
mysql> SET SQL_LOG_BIN=0;
mysql> ALTER USER root@localhost identified by 'Redhat-1';
mysql> GRANT REPLICATION SLAVE ON *.* TO rpl_user@'%' IDENTIFIED BY 'Redhat-1';
mysql> FLUSH PRIVILEGES;
mysql> SET SQL_LOG_BIN=1;
mysql> CHANGE MASTER TO MASTER_USER='rpl_user',MASTER_PASSWORD='Redhat-1' FOR CHANNEL 'group_replication_recovery';
mysql> INSTALL PLUGIN group_replication SONAME 'group_replication.so';
mysql> show plugins;
mysql> START GROUP_REPLICATION;
mysql> SELECT * FROM performance_schema.replication_group_members;

测试:
【server1】建库、key值不能重复

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;


【server3】可以看到server1更改,再插入数据

mysql> use test
mysql> select * from t1;


mysql> INSERT INTO t1 VALUES (2,'haha');
mysql> select * from t1;

【server2】可以看到server1、server3更改

mysql> use test
mysql> SELECT * FROM t1;

配置过程常见的错误:
1.来源IP没有在白名单列表中,所以连接拒绝
2.没有配置同步账号跟密码,使用的是空密码进行同步。 需要为复制通道group_replication_recovery设置同步信息:CHANGE MASTER TO MASTER_USER=’mysqlsync’, MASTER_PASSWORD=’mysqlsync_password’ FOR CHANNEL ‘group_replication_recovery’;
3.删除validate_password密码验证插件。

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值