MySQL 高可用MGR(二) 搭建
关于 MySQL 的安装和初始化这里就说了,可以借鉴 mysql8 安装 (opens new window),官网教程 (opens new window)。这里只阐述 MGR 的配置,高可用使用的是 keepalived,安装可查阅我这篇博客。 (opens new window)
# 数据库环境
官方说至少三个 mysql 实例,但我测试两个也可以。
ip | 节点名称 | server-id | UUID |
---|---|---|---|
10.240.30.101 | node101 | 101 | 7dc79cb4-e0a3-4561-955c-fe374dc59a16 |
10.240.30.102 | node102 | 102 | 7dc79cb4-e0a3-4561-955c-fe374dc59a16 |
10.240.30.103 | node103 | 103 | 7dc79cb4-e0a3-4561-955c-fe374dc59a16 |
节点名称可以使用:hostname 命令查看,可以再 /etc/hostname 里改,然后重启
server-id:可以随便设置但要唯一
UUID:这个 ID 必须一致
重要提示: 主机名不可以相同
# 所有节点配置 HOST
vim /etc/hosts
加入如下:
10.240.30.101 node101
10.240.30.102 node102
10.240.30.103 node103
2
3
# 修改 My.cnf 配置文件
在 101 节点,/etc/my.cnf 修改
[mysqld]
####################################################################### 组复制基础要求 #########################################################
# 禁用引擎引擎,mgr只允许使用innodb,为了防止错误提前设置
disabled_storage_engines="MyISAM,BLACKHOLE,FEDERATED,ARCHIVE,MEMORY"
# 开启GTID,必须开启
gtid_mode=ON
# 强制GTID的一致性
enforce_gtid_consistency=ON
# server-id必须是唯一的
server-id = 102
# 加密方式
default_authentication_plugin=mysql_native_password
######################################################################## binlog 配置 #######################################################
# binlog格式,MGR要求必须是ROW,不过就算不是MGR,也最好用row
binlog_format=row
# binlog校验规则,5.6之后的高版本是CRC32(包括8.0.20),低版本都是NONE,但是MGR要求使用NONE
binlog_checksum=NONE
log_bin=binlog
# 因为集群会在故障恢复时互相检查binlog的数据,
## 所以需要记录下集群内其他服务器发过来已经执行过的binlog,按GTID来区分是否执行过.默认关闭。
## 如果从下还有从,建议打开。
log-slave-updates=1
# 基于安全的考虑,MGR集群要求复制模式要改成slave记录到表中,不然就报错
master_info_repository=TABLE
# 同上配套
relay_log_info_repository=TABLE
# 记录事务的算法,官网建议设置该参数使用 XXHASH64 算法
transaction_write_set_extraction = XXHASH64
# MGR使用乐观锁,所以官网建议隔离级别是RC,减少锁粒度
# transaction_isolation=READ-COMMITTED
####################################################################### 组复制设置 ########################################################
# 将组复制插件添加到服务器在启动时加载的插件列表中。在生产部署中,这比手动安装插件更好
plugin_load_add='group_replication.so'
# 告诉插件将其加入或创建的组命名为“ aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaaaa”
# 必须是有效的UUID。在二进制日志中为组复制事件设置GTID时在内部使用此UUID。您可以SELECT UUID()用来生成UUID
group_replication_group_name='7dc79cb4-e0a3-4561-955c-fe374dc59a16'
# 变量以off指示插件在服务器启动时不自动启动操作。这在设置组复制时很重要,因为它可确保您可以在手动启动插件之前配置服务器。
## 配置成员后,您可以设置 group_replication_start_on_boot 为,on以便在服务器启动时自动启动组复制
group_replication_start_on_boot=off
#本地MGR的IP地址和端口,host:port,是MGR的端口,不是数据库的端口
group_replication_local_address='node101:33081'
#需要接受本MGR实例控制的服务器IP地址和端口,是MGR的端口,不是数据库的端口
group_replication_group_seeds='node101:33081,node102:33081,node103:33081'
#开启引导模式,添加组成员,用于第一次搭建MGR或重建MGR的时候使用,只需要在集群内的其中一台开启,
group_replication_bootstrap_group=OFF
# IP地址白名单,默认只添加127.0.0.1,不会允许来自外部主机的连接,按需安全设置
#group_replication_ip_whitelist = '127.0.0.1/8,10.240.30.100,10.240.30.102,192.168.200.89'
# 是否启动单主模式,如果启动,则本实例是主库,提供读写,其他实例仅提供读,如果为off就是多主模式了
#group_replication_single_primary_mode=off
# 多主模式下,强制检查每一个实例是否允许该操作,如果单主,可以关闭
#group_replication_enforce_update_everywhere_checks=off
# 兼容加入组
#group_replication_allow_local_disjoint_gtids_join=ON
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
其他节点只需要修改 server-id 、group_replication_local_address 的值。
重要提示: group_replication_group_name 一样会报错,所以要修改 member_id。可以在主和从里用如下语句查到 member_id 是一样的:
SELECT * FROM performance_schema.replication_group_members
只需要修改 datadir 下的 auto.cnf 文件里的 uuid。把各 uuid 改成不一样就可以正常加入组,并正常的复制。
# 端口防火墙
所有节点允许此端口进行访问
/sbin/iptables -I INPUT -p tcp --dport 33081 -j ACCEPT
setenforce 0
# 登录 mysql 并配置
登录成功之后,安装插件,如果配置使声明如下
plugin_load_add='group_replication.so'
则可以跳过 install 步骤。
mysql> install PLUGIN group_replication SONAME 'group_replication.so';
Query OK, 0 rows affected (0.08 sec)
2
查看所有插件,并查找我们的插件是否正确安装。
mysql> show plugins;
+---------------------------------+----------+--------------------+----------------------+---------+
| Name | Status | Type | Library | License |
+---------------------------------+----------+--------------------+----------------------+---------+
| group_replication | ACTIVE | GROUP REPLICATION | group_replication.so | GPL |
+---------------------------------+----------+--------------------+----------------------+---------+
45 rows in set (0.00 sec)
2
3
4
5
6
7
8
配置账号,每个节点都要进行配置。
# 关闭binlog,使得创建用户不记录到binlog中
SET SQL_LOG_BIN=0;
# 创建复制用户
CREATE USER repl@'%' IDENTIFIED BY 'repl';
# 授权
GRANT REPLICATION SLAVE ON *.* TO repl@'%';
GRANT BACKUP_ADMIN ON *.* TO repl@'%';
# 更新
FLUSH PRIVILEGES;
# 开启binlog
SET SQL_LOG_BIN=1;
# 授权 使用 group_replication_recovery 复制通道的给定凭证。
CHANGE MASTER TO MASTER_USER='repl', MASTER_PASSWORD='repl' FOR CHANNEL 'group_replication_recovery';
2
3
4
5
6
7
8
9
10
11
12
13
# 启动 MGR 单主模式
主操作
mysql> SET GLOBAL group_replication_bootstrap_group=ON;
mysql> START GROUP_REPLICATION;
mysql> SET GLOBAL group_replication_bootstrap_group=OFF;
2
3
从操作
清除可能不必要的一些日志
mysql> RESET MASTER;
mysql> START GROUP_REPLICATION;
查询状态
mysql> SELECT * FROM performance_schema.replication_group_members;
+---------------------------+--------------------------------------+-------------+-------------+--------------+-------------+----------------+
| CHANNEL_NAME | MEMBER_ID | MEMBER_HOST | MEMBER_PORT | MEMBER_STATE | MEMBER_ROLE | MEMBER_VERSION |
+---------------------------+--------------------------------------+-------------+-------------+--------------+-------------+----------------+
| group_replication_applier | 751841e9-143d-11eb-8e6a-000c29a85d54 | node102 | 3306 | ONLINE | SECONDARY | 8.0.22 |
| group_replication_applier | 751841e9-143d-11eb-8e6a-000c29a85d55 | node101 | 3306 | ONLINE | PRIMARY | 8.0.22 |
+---------------------------+--------------------------------------+-------------+-------------+--------------+-------------+----------------+
2 rows in set (0.00 sec)
2
3
4
5
6
7
8
9
set global read_only=0,在关闭从得时候所有操作都是 只读的,使用该语句可以关闭只读。所有从库只能做为只读库存在。
如果说出现了密码问题,可以使用如下步骤操作,该方式是在当初没有指定密码插件的时候,而已经生成的复制用户。
# 关闭日志
SET SQL_LOG_BIN=0;
# 关闭只读模式
SET GLOBAL READ_ONLY=0;
# 指定修改密码的加密方式并修改
ALTER USER 'repl'@'%' IDENTIFIED WITH mysql_native_password BY 'repl';
# 更新
FLUSH PRIVILEGES;
# 开启日志
SET SQL_LOG_BIN=1;
# 主主复制
先停止主和从,先停从后停主
mysql> stop GROUP_REPLICATION;
Query OK, 0 rows affected (4.36 sec)
2
# 101 主启动设置
设置单主模式参数为 off
mysql> set GLOBAL group_replication_single_primary_mode=off;
Query OK, 0 rows affected (0.00 sec)
2
该参数设置为 ON,则禁用了在多主模式下一些可能产生未知数据冲突的操作
mysql> set GLOBAL group_replication_enforce_update_everywhere_checks=ON;
Query OK, 0 rows affected (0.00 sec)
2
设置为第一个准备启动 MGR(bootstrap)的节点
mysql> set GLOBAL group_replication_bootstrap_group=ON;
Query OK, 0 rows affected (0.00 sec)
2
启动复制
mysql> START GROUP_REPLICATION;
Query OK, 0 rows affected (2.37 sec)
2
为了防止后续由于意外再启动另外一个复制组,关闭 bootstrap 参数
mysql> set GLOBAL group_replication_bootstrap_group=OFF;
Query OK, 0 rows affected (0.00 sec)
2
# 102 主启动设置
mysql> set GLOBAL group_replication_single_primary_mode=off;
Query OK, 0 rows affected (0.00 sec)
2
mysql> set GLOBAL group_replication_enforce_update_everywhere_checks=ON;
Query OK, 0 rows affected (0.00 sec)
2
mysql> START GROUP_REPLICATION;
Query OK, 0 rows affected (3.55 sec)
2
# 查询状态
mysql> SELECT * FROM performance_schema.replication_group_members;
+---------------------------+--------------------------------------+-------------+-------------+--------------+-------------+----------------+
| CHANNEL_NAME | MEMBER_ID | MEMBER_HOST | MEMBER_PORT | MEMBER_STATE | MEMBER_ROLE | MEMBER_VERSION |
+---------------------------+--------------------------------------+-------------+-------------+--------------+-------------+----------------+
| group_replication_applier | 751841e9-143d-11eb-8e6a-000c29a85d54 | node102 | 3306 | ONLINE | PRIMARY | 8.0.22 |
| group_replication_applier | 751841e9-143d-11eb-8e6a-000c29a85d55 | node101 | 3306 | ONLINE | PRIMARY | 8.0.22 |
+---------------------------+--------------------------------------+-------------+-------------+--------------+-------------+----------------+
2 rows in set (0.00 sec)
2
3
4
5
6
7
8
102 如果重启,需要再次使用 sql 语句,加入到组。
关于 mysql 高可用看下一篇文章