欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

高性能MYSQL—MySQL的组复制

程序员文章站 2024-03-20 22:53:34
...

高性能MYSQL—MySQL的组复制

1.组复制模型

  • 组复制模型

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

  • 单主模型

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

  • 多主模型

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

2.组复制原理

复制组由多个 server成员构成,并且组中的每个 server 成员可以独立地执行事务。但所有读写(RW)事务只有在冲突检测成功后才会提交。只读(RO)事务不需要在冲突检测,可以立即提交。

换句话说,对于任何 RW 事务,提交操作并不是由始发 server 单向决定的,而是由组来决定是否提交。准确地说,在始发 server 上,当事务准备好提交时,该 server 会广播写入值(已改变的行)和对应的写入集(已更新的行的唯一标识符)。然后会为该事务建立一个全局的顺序。最终,这意味着所有 server 成员以相同的顺序接收同一组事务。因此,所有 server 成员以相同的顺序应用相同的更改,以确保组内一致。

组复制使您能够根据在一组 server 中复制系统的状态来创建具有冗余的容错系统。因此,只要它不是全部或多数 server 发生故障,即使有一些 server 故障,系统仍然可用,最多只是性能和可伸缩性降低,但它仍然可用。server 故障是孤立并且独立的。它们由组成员服务来监控,组成员服务依赖于分布式故障检测系统,其能够在任何 server 自愿地或由于意外停止而离开组时发出信号。

总之,MySQL 组复制提供了高可用性,高弹性,可靠的 MySQL 服务。

3.实现组复制

让serevr 1server2 server3成为一个组,一起对外提供服务。实现多主模式,serevr1和server2和server3都可以写和读,只要一个上面写,其他两台都会同步数据。

实验环境:

server1  主数据库  172.25.70.1
server2  从库1   172.25.70.2
server3  从库2  172.25.70.3

关闭3台主机的防火墙和selinux 

serevr1的配置(组复制发起者)

1 还原之前做过的实验(还原成新的mysql):

systemctl stop mysqld
cd /var/lib/mysql
cat auto.cnf  #观察server1上mysql的uuid

rm -fr * #还原mysql

高性能MYSQL—MySQL的组复制

2 编辑mysql配置文件:

vim /etc/my.cnf

写入
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
plugin_load_add='group_replication.so'
transaction_write_set_extraction=XXHASH64	#指示Server必须为每个事务收集写集合,并使用XXHASH64哈希算法将其编码为散列
group_replication_group_name="e8019272-6291-11ea-a895-525400d62055"	#告知插件,正在加入或创建的组要命名,一般写UUID
group_replication_start_on_boot=off	#指示插件在 server 启动时不自动启动组复制
group_replication_local_address= "172.25.70.1:33061"	#告诉插件使用 IP 地址 本地主机,端口33061用于接受来自组中其他成员的传入连接。
group_replication_group_seeds= "172.25.70.1:33061,172.25.70.2:33061,172.25.70.3:33061"
group_replication_bootstrap_group=off	#配置是否自动引导组
loose-group_replication_ip_whitelist="127.0.0.1,172.25.70.0/24"	#用户白名单
loose-group_replication_enforce_update_everywhere_checks=ON	#多主模式下为多主更新启用或禁用严格一致性检查
loose-group_replication_single_primary_mode=OFF	#设置组自动选择一个 server 来处理读/写工作

高性能MYSQL—MySQL的组复制

3 打开服务、过滤密码、安全初始化:

systemctl start mysqld
cat /var/log/mysqld.log | grep password
mysql_secure_installation 

4 启动组复制:

mysql> SET SQL_LOG_BIN=0;	#禁用二进制日志

mysql> CREATE USER aaa@qq.com'%' IDENTIFIED BY 'Yang+0216';	#创建用户

mysql> GRANT REPLICATION SLAVE ON *.* TO aaa@qq.com'%';	#加用户权限

mysql> FLUSH PRIVILEGES;	#刷新数据

mysql> SET SQL_LOG_BIN=1;	#启用二进制日志

mysql> CHANGE MASTER TO MASTER_USER='rpl_user', MASTER_PASSWORD='Yang+0216' FOR CHANNEL 'group_replication_recovery';

mysql> INSTALL PLUGIN group_replication SONAME 'group_replication.so';	#安装组复制插件(因为配置文件已经写过此参数,所以报错)
ERROR 1125 (HY000): Function 'group_replication' already exists

mysql> SHOW PLUGINS;

mysql> SET GLOBAL group_replication_bootstrap_group=ON;	#先打开,等打开组复制之后再开启

mysql> START GROUP_REPLICATION;	#打开组复制

mysql> SET GLOBAL group_replication_bootstrap_group=OFF;

mysql> SELECT * FROM performance_schema.replication_group_members;	#查看状态,显示ONLINE则开启成功

高性能MYSQL—MySQL的组复制
高性能MYSQL—MySQL的组复制

server2:

1 还原之前做过的实验:

systemctl stop mysqld
cd /var/lib/mysql
rm -fr *

2 编辑mysql配置文件:

vim /etc/my.cnf

与发起节点只有些微不同
修改:
server_id=2

group_replication_local_address= "172.25.70.2:33061"

3 打开服务、过滤密码、安全初始化:

systemctl start mysqld
cat /var/log/mysqld.log | grep password
mysql_secure_installation 

4 配置组复制:

mysql> SET SQL_LOG_BIN=0;

mysql> CREATE USER aaa@qq.com'%' IDENTIFIED BY 'Yang+0216';

mysql> GRANT REPLICATION SLAVE ON *.* TO aaa@qq.com'%';

mysql> FLUSH PRIVILEGES;

mysql> SET SQL_LOG_BIN=1;

mysql> CHANGE MASTER TO MASTER_USER='rpl_user', MASTER_PASSWORD='Yang+0216' FOR CHANNEL 'group_replication_recovery';

mysql> set global group_replication_allow_local_disjoint_gtids_join=on;

mysql> START GROUP_REPLICATION;

5 在server1上查看状态:

mysql> SELECT * FROM performance_schema.replication_group_members;

高性能MYSQL—MySQL的组复制

server3

1 还原之前做过的实验:

systemctl stop mysqld
cd /var/lib/mysql
rm -fr *

2 编辑mysql配置文件

vim /etc/my.cnf

与发起节点只有些微不同
修改:
server_id=3

group_replication_local_address= "172.25.70.3:33061"

3 打开服务、过滤密码、安全初始化:

systemctl start mysqld
cat /var/log/mysqld.log | grep password
mysql_secure_installation 

4 配置组复制:

mysql> SET SQL_LOG_BIN=0;

mysql> CREATE USER aaa@qq.com'%' IDENTIFIED BY 'Yang+0216';

mysql> GRANT REPLICATION SLAVE ON *.* TO aaa@qq.com'%';

mysql> FLUSH PRIVILEGES;

mysql> SET SQL_LOG_BIN=1;

mysql> CHANGE MASTER TO MASTER_USER='rpl_user', MASTER_PASSWORD='Yang+0216' FOR CHANNEL 'group_replication_recovery';

mysql> set global group_replication_allow_local_disjoint_gtids_join=on;

mysql> START GROUP_REPLICATION;

5 在server1上查看状态:

mysql> SELECT * FROM performance_schema.replication_group_members;

高性能MYSQL—MySQL的组复制

测试:

1 在server2创建新表:

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;

高性能MYSQL—MySQL的组复制
2 在server1和server3中都可以看到插入的信息:

mysql> use test;

mysql> SELECT * FROM t1;

高性能MYSQL—MySQL的组复制
3 在server1中插入信息:

mysql> INSERT INTO t1 VALUES (2, 'KK');

mysql> SELECT * FROM t1;

高性能MYSQL—MySQL的组复制
在server2和server3中可看到最新信息
高性能MYSQL—MySQL的组复制
4 在server3中插入信息:

mysql> INSERT INTO t1 VALUES (3, 'ZZ');

mysql> SELECT * FROM t1;

高性能MYSQL—MySQL的组复制
在server1和server2中看到最新信息
高性能MYSQL—MySQL的组复制

相关标签: 企业实战