Docker环境下部署MySQL MGR单主模式集群

本文详细介绍了如何使用Docker部署MySQL Group Replication (MGR) 单主模式集群,包括创建网络、配置容器、安装MGR插件、设置复制账号以及在集群中添加新节点的步骤。此外,还提供了在遇到问题时的解决方案,如节点加入时的事务同步问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、MySQL MGR单主模式集群部署

1.拉取镜像

docker pull mysql:8.0.20

2.创建MySQL专用网络

docker network create --subnet=172.72.0.0/24 mysql-network
//查看创建好的网络
docker network ls
NETWORK ID     NAME            DRIVER    SCOPE
9315b794232d   bridge          bridge    local
c349f69981fc   host            host      local
7d4d632f293f   mysql-network   bridge    local
630ce37f9903   none            null      local

3.创建MySQL容器挂载在本地的存储数据的目录

mkdir -p /xxx/docker/mysql01/conf.d
mkdir -p /xxx/docker/mysql01/data
mkdir -p /xxx/docker/mysql02/conf.d
mkdir -p /xxx/docker/mysql02/data
mkdir -p /xxx/docker/mysql03/conf.d
mkdir -p /xxx/docker/mysql03/data

4.创建3个MySQL容器

在运行以下命令时注意挂载路径需要与步骤三中创建的路径保持一致

docker run -d --name mysql8020mgr33065 \
   -h mgr15 -p 33065:3306 --net=mysql-network --ip 172.72.0.15 \
   -v /xxx/docker/mysql01/conf.d:/etc/mysql/conf.d -v /xxx/docker/mysql01/data:/var/lib/mysql/ \
   -e MYSQL_ROOT_PASSWORD=sunxi \
   -e TZ=Asia/Shanghai \
   mysql:8.0.20

docker run -d --name mysql8020mgr33066 \
   -h mgr16 -p 33066:3306 --net=mysql-network --ip 172.72.0.16 \
   -v /xxx/docker/mysql02/conf.d:/etc/mysql/conf.d -v /xxx/docker/mysql02/data:/var/lib/mysql/ \
   -e MYSQL_ROOT_PASSWORD=sunxi \
   -e TZ=Asia/Shanghai \
   mysql:8.0.20

docker run -d --name mysql8020mgr33067 \
   -h mgr17 -p 33067:3306 --net=mysql-network --ip 172.72.0.17 \
   -v /xxx/docker/mysql03/conf.d:/etc/mysql/conf.d -v /xxx/docker/mysql03/data:/var/lib/mysql/ \
   -e MYSQL_ROOT_PASSWORD=sunxi \
   -e TZ=Asia/Shanghai \
   mysql:8.0.20

5.在本地修改MySQL的配置项

cat > /xxx/docker/mysql01/conf.d/my.cnf <<"EOF"
[mysqld]
user=mysql
port=3306
character_set_server=utf8mb4
secure_file_priv=''
server-id = 802033065
default-time-zone = '+8:00'
log_timestamps = SYSTEM
log-bin = 
binlog_format=row
binlog_checksum=NONE
log-slave-updates=1
skip-name-resolve
auto-increment-increment=2
auto-increment-offset=1
gtid-mode=ON
enforce-gtid-consistency=on
default_authentication_plugin=mysql_native_password
max_allowed_packet = 500M

master_info_repository=TABLE
relay_log_info_repository=TABLE
relay_log=mgr15-relay-bin-ip15


transaction_write_set_extraction=XXHASH64
loose-group_replication_group_name="aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa"
loose-group_replication_start_on_boot=OFF
loose-group_replication_local_address= "172.72.0.15:33061"
loose-group_replication_group_seeds= "172.72.0.15:33061,172.72.0.16:33062,172.72.0.17:33063"
loose-group_replication_bootstrap_group=OFF
loose-group_replication_ip_whitelist="172.72.0.15,172.72.0.16,172.72.0.17"

report_host=172.72.0.15
report_port=3306

EOF
cat >  /xxx/docker/mysql02/conf.d/my.cnf <<"EOF"
[mysqld]
user=mysql
port=3306
character_set_server=utf8mb4
secure_file_priv=''
server-id = 802033066
default-time-zone = '+8:00'
log_timestamps = SYSTEM
log-bin = 
binlog_format=row
binlog_checksum=NONE
log-slave-updates=1
gtid-mode=ON
enforce-gtid-consistency=ON
skip_name_resolve
default_authentication_plugin=mysql_native_password
max_allowed_packet = 500M

master_info_repository=TABLE
relay_log_info_repository=TABLE
relay_log=mgr16-relay-bin-ip16


transaction_write_set_extraction=XXHASH64
loose-group_replication_group_name="aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa"
loose-group_replication_start_on_boot=OFF
loose-group_replication_local_address= "172.72.0.16:33062"
loose-group_replication_group_seeds= "172.72.0.15:33061,172.72.0.16:33062,172.72.0.17:33063"
loose-group_replication_bootstrap_group=OFF
loose-group_replication_ip_whitelist="172.72.0.15,172.72.0.16,172.72.0.17"

report_host=172.72.0.16
report_port=3306

EOF
cat > /xxx/docker/mysql03/conf.d/my.cnf <<"EOF"
[mysqld]
user=mysql
port=3306
character_set_server=utf8mb4
secure_file_priv=''
server-id = 802033067
default-time-zone = '+8:00'
log_timestamps = SYSTEM
log-bin = 
binlog_format=row
binlog_checksum=NONE
log-slave-updates=1
gtid-mode=ON
enforce-gtid-consistency=ON
skip_name_resolve
default_authentication_plugin=mysql_native_password
max_allowed_packet = 500M


master_info_repository=TABLE
relay_log_info_repository=TABLE
relay_log=mgr17-relay-bin-ip17


transaction_write_set_extraction=XXHASH64
loose-group_replication_group_name="aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa"
loose-group_replication_start_on_boot=OFF
loose-group_replication_local_address= "172.72.0.17:33063"
loose-group_replication_group_seeds= "172.72.0.15:33061,172.72.0.16:33062,172.72.0.17:33063"
loose-group_replication_bootstrap_group=OFF
loose-group_replication_ip_whitelist="172.72.0.15,172.72.0.16,172.72.0.17"

report_host=172.72.0.17
report_port=3306

EOF

6.重启MySQL容器

docker restart mysql8020mgr33065 mysql8020mgr33066 mysql8020mgr33067

7.在所有MySQL容器中安装MGR插件

//xxx是容器的名称
docker exec -it xxx mysql -uroot -psunxi
//安装MGR插件
INSTALL PLUGIN group_replication SONAME 'group_replication.so';

验证插件是否安装完成:

show plugins;

在这里插入图片描述

8.在所有节点上创建复制账号

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

mysql> CREATE USER repl@'%' IDENTIFIED BY 'sunxi';
Query OK, 0 rows affected (0.01 sec)

mysql> GRANT REPLICATION SLAVE ON *.* TO repl@'%';
Query OK, 0 rows affected (0.01 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 MASTER TO MASTER_USER='repl', MASTER_PASSWORD='sunxi' FOR CHANNEL 'group_replication_recovery';
Query OK, 0 rows affected, 2 warnings (0.08 sec)

9.启动MGR单主模式

在主节点上启动MGR:

SET GLOBAL group_replication_bootstrap_group=ON;
START GROUP_REPLICATION;
SET GLOBAL group_replication_bootstrap_group=OFF;
SELECT * FROM performance_schema.replication_group_members;

剩余节点需要加入MGR,在剩余节点上执行以下操作:

START GROUP_REPLICATION;
SELECT * FROM performance_schema.replication_group_members;

注意:正常的单主模式MGR集群中的所有节点的状态是ONLINE,并且MEMBER_ROLE中有一个是PRIMARY,其余的是SECONDARY。
这里在从节点上执行START GROUP_REPLICATION;命令时,节点日志会报以下错误信息:

[ERROR] [MY-011526] [Repl] Plugin group_replication reported: 'This member has more executed transactions than those present in the group. Local transactions: 5da99189-0c8e-11ec-a1f4-0242ac480011:1-5 > Group transactions: 4be24ffe-0c8e-11ec-8495-0242ac48000f:1-5,
aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa:1-5'

解决方法:在从节点上先执行reset master;然后再执行START GROUP_REPLICATION;


二、MySQL MGR单主模式集群中添加节点

1.创建新节点在本地挂载的存储数据的目录

mkdir -p /xxx/docker/mysql04/conf.d
mkdir -p /xxx/docker/mysql04/data

2.创建1个MySQL容器

docker run -d --name mysql8020mgr33068 \
  -h mgr18 -p 33068:3306 --net=mysql-network --ip 172.72.0.18 \
  -v /xxx/docker/mysql04/conf.d:/etc/mysql/conf.d -v /xxx/docker/mysql04/data:/var/lib/mysql/ \
  -e MYSQL_ROOT_PASSWORD=sunxi \
  -e TZ=Asia/Shanghai \
  mysql:8.0.20

3.修改新增MySQL容器的配置项

cat > /xxx/docker/mysql04/conf.d/my.cnf <<"EOF"
[mysqld]
user=mysql
port=3306
character_set_server=utf8mb4
secure_file_priv=''
server-id = 802033068
log-bin = 
binlog_format=row
binlog_checksum=NONE
log-slave-updates=1
skip-name-resolve
auto-increment-increment=2
auto-increment-offset=1
gtid-mode=ON
enforce-gtid-consistency=on
default_authentication_plugin=mysql_native_password
max_allowed_packet = 500M
log_slave_updates=on

master_info_repository=TABLE
relay_log_info_repository=TABLE
relay_log=mgr18-relay-bin-ip18

transaction_write_set_extraction=XXHASH64
loose-group_replication_group_name="aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa"
loose-group_replication_start_on_boot=OFF
loose-group_replication_local_address= "172.72.0.18:33064"
loose-group_replication_group_seeds= "172.72.0.15:33061,172.72.0.16:33062,172.72.0.17:33063,172.72.0.18:33064"
loose-group_replication_bootstrap_group=OFF
loose-group_replication_ip_whitelist="172.72.0.15,172.72.0.16,172.72.0.17,172.72.0.18"
report_host=172.72.0.18
report_port=3306

EOF

4.重启新增MySQL容器

docker restart mysql8020mgr33068

5.在新增MySQL容器上安装MGR插件并验证安装是否完成

docker exec -it mysql8020mgr33068 mysql -uroot -psunxi
INSTALL PLUGIN group_replication SONAME 'group_replication.so';
show plugins;

6.在新增MySQL容器中设置复制账号

SET SQL_LOG_BIN=0;
CREATE USER repl@'%' IDENTIFIED BY 'sunxi';
GRANT REPLICATION SLAVE ON *.* TO repl@'%';
FLUSH PRIVILEGES;
SET SQL_LOG_BIN=1;
CHANGE MASTER TO MASTER_USER='repl', MASTER_PASSWORD='sunxi' FOR CHANNEL 'group_replication_recovery';

7.修改集群中原来3个节点的配置信息

这一步修改集群中原有节点的配置信息主要是包含以下两个配置项:

  • group_replication_group_seeds
  • group_replication_ip_whitelist

在修改配置信息时可以进行动态修改:

set global group_replication_group_seeds='172.72.0.15:33061,172.72.0.16:33062,172.72.0.17:33063,172.72.0.18:33064';
stop group_replication;
set global group_replication_ip_whitelist="172.72.0.15,172.72.0.16,172.72.0.17,172.72.0.18";
start group_replication;

动态修改配置信息后,当集群进行重启时之前进行动态配置的配置项不会起作用,所以可以对其配置文件直接修改,在配置文件中修改以下两个配置项:

loose-group_replication_group_seeds= "172.72.0.15:33061,172.72.0.16:33062,172.72.0.17:33063,172.72.0.18:33064"
loose-group_replication_ip_whitelist="172.72.0.15,172.72.0.16,172.72.0.17,172.72.0.18"

重启MySQL服务:

docker restart xxx

启动复制:

//xxx是容器的名称
docker exec -it xxx mysql -uroot -psunxi
START GROUP_REPLICATION;
SELECT * FROM performance_schema.replication_group_members;

8.在新增节点上启动复制

start group_replication;

在执行这一步时新增节点的日志中会出现以下报错日志:

[ERROR] [MY-011526] [Repl] Plugin group_replication reported: 'This member has more executed transactions than those present in the group. Local transactions: 5cdef463-0ebc-11ec-9c11-0242ac480012:1-5 > Group transactions: 4be24ffe-0c8e-11ec-8495-0242ac48000f:1-5,
aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa:1-10'

解决方法:在该节点上执行reset master;后再次执行START GROUP_REPLICATION;

9.查看集群中的节点信息

SELECT * FROM performance_schema.replication_group_members;

三、补充

1.进入MySQL容器

//xxx为容器名称
docker exec -it xxx bash
docker exec -it xxx mysql -uroot -psunxi

2.查看MySQL容器日志

//xxx为容器名称
docker logs xxx
<think>我们正在处理个关于MySQL安装运维指南的查询。用户希望查找相关的指南或教程。根据提供的引用内容,我们可以整合以下信息:引用[1]提到了MySQLConnector/Python的安装,这是个Python连接MySQL的驱动,安装命令是:pipinstallmysql-connector-python引用[2]详细介绍了如何启动MySQL服务,包括不同操作系统(Windows、Linux、MacOS)的方法,以及如何验证安装和解决常见问题。引用[3]则涉及更高级的运维架构,如两从的容器化部署,使用MySQL8.0的组复制(MGR)和MySQLRouter实现读写分离和故障切换。但是,用户当前的问题集中在“安装”指南上,因此我们应重点参考引用[2]的内容,因为引用[2]的标题和内容都明确指向安装和启动服务。回答结构:1.介绍MySQL安装的般步骤。2.分操作系统介绍安装方法(如果引用中有详细内容则提取,但引用[2]要讲启动服务,安装部分可能在其他地方?引用[2]提到“安装MySQL并正确地启动MySQL服务”,但具体安装步骤并未详细说明)。3.由于引用中并没有详细描述安装过程,只有启动过程,所以我们需要结合常识补充安装步骤,同时确保引用已有的信息。注意:引用[2]要讲启动服务,引用[1]讲Python驱动安装,引用[3]讲高级架构。因此,在回答安装指南时,我们只能从引用[2]中提取启动服务的信息,安装部分可能需要其他知识。然而,用户要求参考站内引用,因此我们只能使用这些引用内容。所以,我们重点回答启动服务部分(因为引用[2]详细),并简要提及安装(因为引用[2]提到“安装MySQL”但没有具体步骤,所以只能笼统说)。因此,我们这样组织:1.安装MySQL:由于引用中没有详细步骤,我们可以说“安装MySQL的具体步骤因操作系统而异,通常可以通过下载官方安装包或使用系统包管理器完成。安装完成后,需要启动MySQL服务。”2.重点介绍启动MySQL服务(根据引用[2]):-不同操作系统的启动方式(命令行、图形界面)-配置启动参数-验证安装-常见问题解决3.另外,如果需要连接Python,可以按照引用[1]安装驱动。4.对于高级运维架构(如集群部署),引用[3]提供了种方案,但用户当前问题是安装,所以可以简要提及或放在相关问题中。注意:用户问题只要求安装指南,所以我们重点在安装和启动。由于引用[2]的内容比较丰富,我们可以详细展开启动服务部分。具体步骤:、安装MySQL-在Windows上,通常下载MSI安装包并运行安装向导。-在Linux上,使用包管理器(如apt、yum)安装。-在MacOS上,可以使用Homebrew或下载DMG安装包。二、启动MySQL服务根据引用[2]:1.命令行启动:在Windows中可以使用netstartmysql,在Linux中可以使用systemctlstartmysql(或servicemysqlstart)。2.图形界面:在Windows服务管理器中启动,在Linux和Mac上可能有系统管理工具。3.配置启动参数:可以通过修改配置文件(如my.cnf或my.ini)来设置启动参数。4.验证:使用命令行连接MySQL(例如:mysql-uroot-p)来验证服务是否正常运行。5.常见问题:端口冲突、权限问题、配置文件错误等。三、安装Python连接器(可选)如果用户需要在Python中使用MySQL,按照引用[1]执行:pipinstallmysql-connector-python四、高级部署(可选,简要提及)引用[3]提到了两从的容器化部署方案,使用MySQL8.0的组复制和MySQLRouter。但这属于安装后的集群部署,用户如果只是单机安装则不需要。由于引用[2]提到“验证MySQL安装”,我们可以描述如下:在启动服务后,可以运行以下命令验证:mysql--version#查看安装的版本mysql-uroot-p#登录到MySQL服务器最后,生成相关问题。注意:引用内容需要标注引用标识。回答如下:</think>### MySQL 运维安装指南 #### 、安装准备 1. **选择版本** 根据需求选择 MySQL 社区版(免费)或企业版(商业许可),推荐使用 MySQL 8.0 版本(支持最新特性)[^3]。 2. **系统环境** - **Windows**:下载 MSI 安装包(官网提供) - **Linux**:使用包管理器(如 `apt`/`yum`)安装 - **macOS**:通过 Homebrew (`brew install mysql`) 或 DMG 安装包 - **容器化部署**:推荐 Docker 快速部署(`docker pull mysql:8.0`)[^3] --- #### 二、安装步骤(以 Linux 为例) ```bash # Ubuntu/Debian sudo apt update sudo apt install mysql-server # 初始化安全配置 sudo mysql_secure_installation # 启动服务 sudo systemctl start mysql sudo systemctl enable mysql # 设置开机自启 ``` #### 三、验证安装 1. **检查服务状态** ```bash systemctl status mysql # 显示 "active (running)" 即成功[^2] ``` 2. **连接数据库** ```bash mysql -u root -p # 输入密码后进入 MySQL Shell ``` 3. **查看版本** ```sql SELECT VERSION(); -- 返回类似 8.0.36 的版本信息 ``` --- #### 四、关键运维操作 1. **服务管理** - 启动:`systemctl start mysql` - 停止:`systemctl stop mysql` - 重启:`systemctl restart mysql`[^2] 2. **配置优化** 编辑配置文件 `/etc/mysql/my.cnf`: ```ini [mysqld] max_connections=1000 # 调高并发连接数 innodb_buffer_pool_size=2G # 调整缓存大小 ``` 3. **驱动安装(Python 示例)** 使用官方 Connector/Python: ```bash pip install mysql-connector-python # 安装 Python 驱动[^1] ``` --- #### 五、高级部署方案(生产环境) **两从高可用架构**[^3]: 1. 使用 MySQL Group Replication (MGR) 实现组复制 2. 通过 MySQL Router 中间件实现读写分离 3. 容器化部署支持快速伸缩和滚动升级 > 注:该方案仅支持 MySQL 8.0+ 版本 --- #### 六、故障排查 | 问题现象 | 解决方案 | |---------|----------| | 服务启动失败 | 检查日志 `/var/log/mysql/error.log` | | 连接被拒绝 | 验证防火墙(开放 3306 端口) | | 权限错误 | 执行 `GRANT` 语句重赋权 |
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值