技术博客 技术博客
  • JAVA
  • 仓颉
  • 设计模式
  • 人工智能
  • Spring
  • Mybatis
  • Maven
  • Git
  • Kafka
  • RabbitMQ
  • RocketMQ
  • Redis
  • Zookeeper
  • Nginx
  • 数据库套件
  • MySQL
  • Elasticsearch
  • MongoDB
  • Hadoop
  • ClickHouse
  • Hbase
  • Hive
  • Flink
  • Flume
  • SQLite
  • linux
  • Docker
  • Jenkins
  • Kubernetes
  • 工具
  • 前端
  • AI
GitHub (opens new window)
  • JAVA
  • 仓颉
  • 设计模式
  • 人工智能
  • Spring
  • Mybatis
  • Maven
  • Git
  • Kafka
  • RabbitMQ
  • RocketMQ
  • Redis
  • Zookeeper
  • Nginx
  • 数据库套件
  • MySQL
  • Elasticsearch
  • MongoDB
  • Hadoop
  • ClickHouse
  • Hbase
  • Hive
  • Flink
  • Flume
  • SQLite
  • linux
  • Docker
  • Jenkins
  • Kubernetes
  • 工具
  • 前端
  • AI
GitHub (opens new window)
  • mysql

    • MySQL 问题汇总
    • MySQL 索引介绍
    • MySQL 锁介绍
    • MySQL 索引优化工具 explain
    • MySQL 主从复制(GTID)
    • MySQL 8安装
    • MySQL 8.x新特性总结
    • MySQL UDF以及新类型JSON
    • MySQL 高可用MGR(一) 理论
    • MySQL 高可用MGR(二) 搭建
      • 数据库环境
      • 所有节点配置HOST
      • 修改My.cnf配置文件
      • 端口防火墙
      • 登录mysql并配置
      • 启动MGR单主模式
      • 主主复制
        • 101主启动设置
        • 102主启动设置
        • 查询状态
    • MySQL 高可用MGR(三) 测试
  • Elasticsearch

    • ES 7.8.0(一) 入门介绍
    • ES 7.8.0(二) 读、写和写索引流程以及文档分析过程
    • ES 7.8.0(三) 文档冲突
  • mongodb

    • mongodb
  • hadoop

    • Hadoop 伪分布式及集群
    • Hadoop 指令
    • Hadoop 读写流程详解
    • Hadoop SpringBoot集成
    • Hadoop MapReduce机制
    • Hadoop YARN
    • Hadoop MapReduce配置和编写job及数据倾斜的解决
    • Hadoop MapReduce自定义格式输入输出
  • clickhouse

    • ClickHouse 介绍及安装
    • ClickHouse 数据类型
    • ClickHouse 表引擎
    • ClickHouse SQL操作
    • ClickHouse 副本配置
    • ClickHouse 分片与集群部署
    • ClickHouse Explain及建表优化
    • ClickHouse 语法优化规则
    • ClickHouse 查询优化
    • ClickHouse 数据一致性
    • ClickHouse 物化视图
    • ClickHouse MaterializeMySQL引擎
    • ClickHouse 监控及备份
  • hbase

    • Hbase 介绍及安装
    • Hbase 优化
    • Hbase phoenix安装及使用
    • Hbase LSM-TREE
  • hive

    • Hive 介绍及安装
    • Hive 内外部表、分区表、分桶表概念及hiveSQL命令
    • Hive 数据类型
    • Hive 函数 MySQL联合
    • Hive 数据倾斜和优化
    • Hive Sqoop安装及指令
  • flink

    • Flink 介绍及安装
    • Flink 配置介绍及Demo
    • Flink API讲解
    • Flink 运行架构
    • Flink 时间语义及Watermark
    • Flink 状态管理
    • Flink 容错,检查点,保存点
    • Flink 状态一致性
    • Flink Table API 和 Flink SQL
    • Flink CEP编程
    • Flink Joining编程
    • Flink CDC
  • flume

    • Flume 日志收集系统介绍及安装
    • Flume Source支持的类型
    • Flume Sink支持的类型
    • Flume Channel支持的类型
    • Flume Selector
    • Flume Interceptor拦截器类型
    • Flume Process
  • sqlite

    • SQLite介绍
目录
数据库环境
所有节点配置HOST
修改My.cnf配置文件
端口防火墙
登录mysql并配置
启动MGR单主模式
主主复制
101主启动设置
102主启动设置
查询状态

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
1

加入如下:

10.240.30.101 node101
10.240.30.102 node102 
10.240.30.103 node103
1
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
1
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
1
setenforce 0
1

# 登录 mysql 并配置

登录成功之后,安装插件,如果配置使声明如下

plugin_load_add='group_replication.so'
1

则可以跳过 install 步骤。

mysql> install PLUGIN group_replication SONAME 'group_replication.so';
Query OK, 0 rows affected (0.08 sec)
1
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)

1
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';
1
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;
1
2
3

从操作
清除可能不必要的一些日志

mysql> RESET MASTER;
1
mysql> START GROUP_REPLICATION;
1

查询状态

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)

1
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)
1
2

# 101 主启动设置

设置单主模式参数为 off

mysql> set GLOBAL group_replication_single_primary_mode=off;
Query OK, 0 rows affected (0.00 sec)
1
2

该参数设置为 ON,则禁用了在多主模式下一些可能产生未知数据冲突的操作

mysql> set GLOBAL group_replication_enforce_update_everywhere_checks=ON;
Query OK, 0 rows affected (0.00 sec)
1
2

设置为第一个准备启动 MGR(bootstrap)的节点

mysql> set GLOBAL group_replication_bootstrap_group=ON;
Query OK, 0 rows affected (0.00 sec)
1
2

启动复制

mysql> START GROUP_REPLICATION;
Query OK, 0 rows affected (2.37 sec)
1
2

为了防止后续由于意外再启动另外一个复制组,关闭 bootstrap 参数

mysql> set GLOBAL group_replication_bootstrap_group=OFF;
Query OK, 0 rows affected (0.00 sec)
1
2

# 102 主启动设置

mysql> set GLOBAL group_replication_single_primary_mode=off;
Query OK, 0 rows affected (0.00 sec)
1
2
mysql> set GLOBAL group_replication_enforce_update_everywhere_checks=ON;
Query OK, 0 rows affected (0.00 sec)
1
2
mysql> START GROUP_REPLICATION;
Query OK, 0 rows affected (3.55 sec)
1
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)
1
2
3
4
5
6
7
8

102 如果重启,需要再次使用 sql 语句,加入到组。
关于 mysql 高可用看下一篇文章

上次更新: 6/11/2025, 4:10:30 PM
MySQL 高可用MGR(一) 理论
MySQL 高可用MGR(三) 测试

← MySQL 高可用MGR(一) 理论 MySQL 高可用MGR(三) 测试→

Theme by Vdoing | Copyright © 2023-2025
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式