MySQL集群技术 4.高可用之组复制 (MGR)

MGR简介

MySQL Group Replication(简称 MGR )是 MySQL 官方于 2016 年 12 月推出的一个全新的高可用与高扩 展的解决方案

组复制是 MySQL 5.7.17 版本出现的新特性,它提供了高可用、高扩展、高可靠的 MySQL 集群服务

MySQL 组复制分单主模式和多主模式,传统的 mysql 复制技术仅解决了数据同步的问题,

MGR 对属于同一组的服务器自动进行协调。对于要提交的事务,组成员必须就全局事务序列中给定事务 的顺序达成一致

提交或回滚事务由每个服务器单独完成,但所有服务器都必须做出相同的决定

如果存在网络分区,导致成员无法达成事先定义的分割策略,则在解决此问题之前系统不会继续进行, 这是一种内置的自动裂脑保护机制

MGR 由组通信系统( Group Communication System,GCS ) 协议支持

该系统提供故障检测机制、组成员服务以及安全且有序的消息传递

组复制流程

首先我们将多个节点共同组成一个复制组,在执行读写(RW)事务的时候,需要通过一致性协议层 (Consensus 层)的同意,也就是读写事务想要进行提交,必须要经过组里"大多数人"(对应 Node 节 点)的同意,大多数指的是同意的节点数量需要大于 (N/2+1),这样才可以进行提交,而不是原发起 方一个说了算。而针对只读(RO)事务则不需要经过组内同意,直接 提交 即可

注意:节点数量不能超过 9 台,最少需要3台

组复制单主和多主模式

single-primary mode(单写或单主模式)

单写模式 group 内只有一台节点可写可读,其他节点只可以读。当主服务器失败时,会自动选择新的主 服务器,

multi-primary mode(多写或多主模式)

组内的所有机器都是 primary 节点,同时可以进行读写操作,并且数据是最终一致的。

手动还原方式

cpp 复制代码
[root@mysql ~]# systemctl stop mysqld.service
[root@mysql ~]# rm -rf /data/mysql/*
[root@mysql ~]# vim /etc/my.cnf
#不同主机server-id一定要根据实际情况做相应改变
server-id=10|20|30
#加入以上内容


[root@mysql ~]# mysqld --initialize --user=mysql

#设置所有mysql节点的解析

cpp 复制代码
[root@mysql-node1 ~]# cat > /etc/hosts <<EOF
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
172.25.254.10     mysql-node1
172.25.254.20     mysql-node2
172.25.254.30     mysql-node3
cpp 复制代码
[root@mysql-node1 ~]# vim   /etc/my.cnf 
plugin_load_add='group_replication.so'
group_replication_group_name="aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa"
group_replication_start_on_boot=off
group_replication_local_address="172.25.254.10:33061"   #其他两台主机一定要根据ip进行修改
group_replication_group_seeds="172.25.254.10:33061,172.25.254.20:33061,172.25.254.30:33061"
group_replication_bootstrap_group=off
group_replication_single_primary_mode=OFF

#加入以上内容,之前的内容不要删除

#配置组复制-在首台主机中

cpp 复制代码
[root@mysql ~]# systemctl restart mysqld.service
[root@mysql ~]# mysql -uroot -p'3QTXag.ZxJqP'  #登录数据库,密码
#在mysqld --user=mysql --initialize 这个命令随机生成
mysql> alter user root@localhost identified by '123';
Query OK, 0 rows affected (0.01 sec)

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

mysql> CREATE USER rpl_user@'%' IDENTIFIED BY '123';
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> GRANT CONNECTION_ADMIN ON *.* TO rpl_user@'%';
Query OK, 0 rows affected (0.00 sec)

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

mysql> GRANT GROUP_REPLICATION_STREAM 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 REPLICATION SOURCE TO SOURCE_USER='rpl_user', SOURCE_PASSWORD='123' FOR CHANNEL 'group_replication_recovery';
Query OK, 0 rows affected, 2 warnings (0.01 sec)

mysql> show PLUGINS;
| group_replication               | ACTIVE   | GROUP REPLICATION  | group_replication.so | GPL     |
cpp 复制代码
mysql> SET GLOBAL group_replication_bootstrap_group=ON;
Query OK, 0 rows affected (0.00 sec)

mysql>  START GROUP_REPLICATION USER='rpl_user', PASSWORD='123';
Query OK, 0 rows affected (1.08 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;

#配置组复制在其余mysql-2 . mysql-3 主机中

cpp 复制代码
root@mysql-2 ~]# systemctl restart mysqld.service
[root@mysql-2 ~]# mysql -uroot -p'1p6hw1i8FG-9'
mysql> alter user root@localhost identified   by '123';
Query OK, 0 rows affected (0.01 sec)

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

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

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

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

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

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

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

mysql> CHANGE REPLICATION SOURCE TO SOURCE_USER='rpl_user',SOURCE_PASSWORD='123' FOR CHANNEL 'group_replication_recovery';
Query OK, 0 rows affected, 2 warnings (0.01 sec)

mysql> START GROUP_REPLICATION USER='rpl_user', PASSWORD='123';
ERROR 3092 (HY000): The server is not configured properly to be an active member of the group. Please see more details on error log.
mysql> reset master;
Query OK, 0 rows affected, 1 warning (0.02 sec)

mysql> START GROUP_REPLICATION USER='rpl_user', PASSWORD='123';
Query OK, 0 rows affected (9.22 sec)

mysql> SELECT * FROM performance_schema.replication_group_members;
mysql> alter user root@localhost identified   by '123';
Query OK, 0 rows affected (0.00 sec)

测试

cpp 复制代码
#在mysql-3 中建立xiao 这个表
mysql> create database xiao;
Query OK, 1 row affected (0.01 sec)

#在mysql-1 中是否有xiao这个表,有的话就成功了。
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
| xiao               |
+--------------------+

#主要是能够再三个主机上写入并读取就行,因为我们前面的实验都是在10主机上写入,其他主机上只能读取,这个实验的话就可以在所有主机都能够写入与读取操作!!!

相关推荐
阿pin1 小时前
Android随笔-SurfaceFlinger
android·surfaceflinger
洋不写bug1 小时前
JavaComparable、Comparator、Cloneable接口解析,深拷贝浅拷贝详细解析
android·java·开发语言
小孔龙2 小时前
Android 应用间 UI 刷新与合成
android
XiaoLeisj3 小时前
Kotlin Flow:冷流收集、并行订阅、emit 推送、delay 延迟、collect 全量收集与 collectLatest 的实时数据处理
android·kotlin·android jetpack·协程·flow
Android-Flutter4 小时前
android jetpack 详解
android·kotlin
三8444 小时前
文件上传基础
android
天空之城--5 小时前
Android Flutter行业最新动态与实用参考(2026年8月第2周)
android·flutter
三少爷的鞋5 小时前
预防远大于治理:Android 架构指南
android