mysql的组复制(全同步复制)

简介:

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

在这里插入图片描述

  • 单主模型和多主模型

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

  • 单主模型:从复制组中众多个MySQL节点中自动选举一个master节点,只有master节点可以写,其他节点自动设置为read only。当master节点故障时,会自动选举一个新的master节点,选举成功后,它将设置为可写,其他slave将指向这个新的master。

  • 多主模型:复制组中的任何一个节点都可以写,因此没有master和slave的概念,只要突然故障的节点数量不太多,这个多主模型就能继续可用。

单主模式下配置组复制

实验环境:
server1 172.25.254.1 master
server2 172.25.254.2 slave
server3 172.25.254.3 slave

主库:

  • 将mysql关掉,然后把文件都删掉,保持实验环境纯净
  • 如果之前没有做过其他的mysql实验,就可不用做这一步骤
    [root@server1 ~]# systemctl stop mysqld
    [root@server1 ~]# cd /var/lib/mysql
    [root@server1 mysql]# ls
    auto.cnf         ib_buffer_pool  mysql-bin.000001  performance_schema  sys
    ca-key.pem       ibdata1         mysql-bin.000002  private_key.pem     westos
    ca.pem           ib_logfile0     mysql-bin.000003  public_key.pem
    client-cert.pem  ib_logfile1     mysql-bin.000004  server-cert.pem
    client-key.pem   mysql           mysql-bin.index   server-key.pem
    [root@server1 mysql]# rm -fr *
  • 生成UUID
[root@server2 mysql]# uuidgen
0d40d1dd-67fe-4872-abbe-f4d3474e8dfa
  • 编辑mysql配置文件
[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  
 ......  
 40 transaction_write_set_extraction=XXHASH64
#指示Server必须为每个事务收集写集合,并使用XXHASH64哈希算法将其编码为散列   
41 loose-group_replication_group_name="0d40d1dd-67fe-4872-abbe-f4d3474e8dfa"
##告知插件,正在加入或创建的组要命名,一般写UUID 
42 loose-group_replication_start_on_boot=off #设置为Server启动时不自动启动组复制  
43 loose-group_replication_local_address= "172.25.254.1:24901" #本机IP ,端口 24901 用于接受来自组中其他成员的传入连接。

44 loosegroup_replication_group_seeds="172.25.254.1:24901,172.25.254.2:24901,172.25.254.3:24901" 45 loose-group_replication_bootstrap_group=off #配置是否自动引导组
46 loose-group_replication_enforce_update_everywhere_checks=ON   #多主模式下为多主更新启用或禁用严格一致性检查 
47 loose-group_replication_single_primary_mode=OFF  #设置组自动选择一个 server 来处理读/写工作。

在这里插入图片描述

  • 重启mysqld
    [root@server1 mysql]# systemctl restart mysqld
  • 启动组复制
[root@server3 mysql]# mysql -p 
Enter password: ##初始化密码 
mysql> alter user root@localhost identified by 'Wsp+123ld'; ##修改密码 
Query OK, 0 rows affected (0.02 sec) 
mysql> show databases; 

mysql> SET SQL_LOG_BIN=0;    #禁用二进制日志
mysql> CREATE USER rpl_user@'%' IDENTIFIED BY 'Wsp+123ld';	#创建用户
mysql> GRANT REPLICATION SLAVE ON *.* TO rpl_user@'%';  ##加用户权限
mysql> FLUSH PRIVILEGES;     ##刷洗数据
mysql> SET SQL_LOG_BIN=1;    #启用二进制日志

##一旦配置了用户,使用CHANGE MASTER TO语句将服务器配置为在下一次需要从其他成员恢复状态时使用group_replication_recovery复制通道的给定凭证。发出以下命令,用创建用户时使用的值替换rpl_user和密码。
mysql> CHANGE MASTER TO MASTER_USER='rpl_user', MASTER_PASSWORD='Wsp+123ld' FOR CHANNEL 'group_replication_recovery';
mysql> INSTALL PLUGIN group_replication SONAME 'group_replication.so';    #安装组复制插件
mysql> SET GLOBAL group_replication_bootstrap_group=ON;  ##master上要先打开,等打开组复制之后再开启(slave上不用进行)
mysql> START GROUP_REPLICATION;     ##打开组复制
mysql> SET GLOBAL group_replication_bootstrap_group=OFF;
查看状态,显示ONLINE则开启成功

从库:

  • 编辑配置文件
vim /etc/my.cnf
server_id=2
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="310640be-663e-4929-b0f6-3c4c57b570b5"
loose-group_replication_start_on_boot=off
loose-group_replication_local_address= "172.25.254.1:24901"
loose-group_replication_group_seeds= "172.25.254.1:24901,172.25.254.2:24901,172.25.254.3:24901"
loose-group_replication_bootstrap_group=off
loose-group_replication_ip_whitelist="127.0.0.1,172.25.0.0/24"
loose-group_replication_enforce_update_everywhere_checks=ON
loose-group_replication_single_primary_mode=OFF
  • 开启myql,过滤密码,登录修改密码,进行配置
SET SQL_LOG_BIN=0;

CREATE USER rpl_user@'%' IDENTIFIED BY 'password';

GRANT REPLICATION SLAVE ON *.* TO rpl_user@'%';

SET SQL_LOG_BIN=1;

CHANGE MASTER TO MASTER_USER='rpl_user', MASTER_PASSWORD='password' \\
FOR CHANNEL 'group_replication_recovery';

INSTALL PLUGIN group_replication SONAME 'group_replication.so';	

START GROUP_REPLICATION;

猜你喜欢

转载自blog.csdn.net/weixin_43273168/article/details/90018649