部署Mysql
- Mysql版本:8.0.44
- proxysql版本:
MGR模式要求
- 仅支持 IPv4 网络,组大小限制为最少3个节点、最多9个节点。
registry.cn-hangzhou.aliyuncs.com/istr_office/open:mysql-8.0.44mkdir {conf,data}
[root@noce1 MGR]# tree
.
├── conf
│ └── my.cnf #配置文件
├── data
└── mysql.yml #启动文件配置文件(my.cnf)
ini
[mysqld]
server-id=1
log-bin=mysql-bin-1.log
binlog-format=ROW
# 开启binlog的GTID模式(MGR强制要求)
gtid-mode=ON
enforce-gtid-consistency=ON
log-slave-updates=ON
binlog-checksum=NONE
master-info-repository=TABLE
relay-log-info-repository=TABLE
transaction-write-set-extraction=XXHASH64
#以下MGR配置
loose-group-replication-group-name=aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee
loose-group-replication-start-on-boot=OFF
loose-group-replication-local-address=192.168.1.10:33061 #本机ip
loose-group-replication-group-seeds=192.168.1.10:33061,192.168.1.20:33061,192.168.1.30:33061 #所有节点ip
loose-group-replication-bootstrap-group=OFF
loose-group-replication-single-primary-mode=ON
loose-group-replication-enforce-update-everywhere-checks=OFF- server-id 每个节点的必须唯一。
- log-bin=mysql-bin-1.log 行级 binlog,MGR 硬性要求 ROW 格式。
- enforce-gtid-consistency 禁止任何会破坏 GTID 一致性的语句(如
CREATE TEMPORARY TABLE与CREATE TABLE ... SELECT),MGR 强制要求打开,否则无法启动组复制。 - binlog-checksum MySQL 8.0.20 之前的 MGR 要求关闭 binlog 校验和(因为早期组通信层不支持),8.0.20 及以后可以改为
CRC32,保持默认即可,但旧版本必须显式设置为NONE。 - group-name 给整个 MGR 组起一个全局唯一的名字(UUID 格式),。
- start-on-boot MySQL 实例启动时不自动启动 Group Replication 插件,这个参数如果设置为 OFF,当坏掉的节点修复后,不会自动加入集群。
- local-address 本机ip
- group-seed 种子列表,告诉当前节点“初次加入组时可以去找谁”。只要列表中的任意一个节点在线,新节点就能拿到完整的成员信息并加入组。通常把所有成员都写上,方便任何顺序启动。
- bootstrap-group ,用来创建组;之后必须立即改回 OFF 并重启,否则会出现“脑裂”或成员冲突(这个配置可不改,通过下面sql形式进行开关)
- single-primary-mode 打开单主模式(Single-Primary),组内只有一台节点可写(primary),其余为只读(secondaries),主节点故障时自动重新选举
- enforce-update-everywhere-checks 在多主模式下才生效;单主模式可保持 OFF
启动文件
yaml
services:
mysql:
image: registry.cn-hangzhou.aliyuncs.com/istr_office/open:mysql-8.0.44
container_name: mysql
command: ["mysqld"]
environment:
MYSQL_ROOT_PASSWORD: 123456789
volumes:
- ./data/:/var/lib/mysql
- ./conf/my.cnf:/etc/mysql/conf.d/mysql-master.cnf
healthcheck:
test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-u", "root", "-p$$MYSQL_ROOT_PASSWORD"]
interval: 10s
timeout: 5s
retries: 5- MySQL 节点端口 :3306
- MGR 通信端口:33061
集群初始化
3.1 进入容器 进入数据库
bash
docker exec -it mysql bash
mysql -uroot -p1234567893.2 每个节点都要执行
sql
-- 创建复制用户
CREATE USER 'repl_user'@'%' IDENTIFIED BY 'repl_password';
GRANT REPLICATION SLAVE ON *.* TO 'repl_user'@'%';
GRANT BACKUP_ADMIN ON *.* TO 'repl_user'@'%';
FLUSH PRIVILEGES;
reset master;3.3 上面执行完在执行下面。每个节点都要
sql
INSTALL PLUGIN group_replication SONAME 'group_replication.so';启动集群
4.1 主节点执行
sql
CHANGE MASTER TO MASTER_USER='repl', MASTER_PASSWORD='123456' FOR CHANNEL 'group_replication_recovery';
SET GLOBAL group_replication_bootstrap_group=ON;
START GROUP_REPLICATION; SET GLOBAL group_replication_bootstrap_group=OFF;
SELECT * FROM performance_schema.replication_group_members;4.2 从节点执行,上面执行完最好等10秒
sql
CHANGE MASTER TO MASTER_USER='repl', MASTER_PASSWORD='123456' FOR CHANNEL 'group_replication_recovery';
START GROUP_REPLICATION;
SELECT * FROM performance_schema.replication_group_members;
部署proxysql
端口介绍
6032 proxysql本身端口
6033 程序连接端口
创建必要用户
MGR主节点上创建一个用于ProxySQL监控的用户,后面配置用到。
sql
CREATE USER 'monitor'@'%' IDENTIFIED WITH mysql_native_password BY 'Jack_2025';
GRANT USAGE, REPLICATION CLIENT ON *.* TO 'monitor'@'%';
GRANT SELECT on sys.* to 'monitor'@'%';
GRANT SELECT on performance_schema.* to 'monitor'@'%';
FLUSH PRIVILEGES;二、配置文件准备
docker-compose.yml
yaml
services:
proxysql:
image: proxysql/proxysql:3.0.4
container_name: proxysql
ports:
- "6032:6032"
- "6033:6033"
privileged: true
restart: always
volumes:
- "./proxysql.cnf:/etc/proxysql.cnf"5.1 进入数据库
#进入容器
docker exec -it proxysql bash
#进入proxysql自身数据库 6032端口
mysql -u admin -pJack_2025 -h 127.0.0.1 -P6032 --prompt='Admin> '
select hostgroup_id, hostname,port, status from runtime_mysql_servers;
select time_start_us, hostname, port, viable_candidate, read_only, transactions_behind, error from mysql_server_group_replication_log order by time_start_us desc limit 6;read_only 字段为 NO 的表示主节点,为YES的表示从节点,hostname会将名称和IP都记录上
使用Navicat 采用 6033 端口连接ProxySQL看下是否可以成功连接上MySQL主节点。
proxysqlhttps://hub.docker.com/r/proxysql/proxysql
- MySQL Group Replication 是 MySQL 内部实现的分布式复制协议,提供了强一致性。是 InnoDB Cluster 的核心组件。
集群架构类型对比
| 架构类型 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
| 主从复制 | 读写分离、备份 | 单点故障、延迟 | 中小规模应用 |
| 主主复制 | 高可用、读写分离 | 数据冲突风险,需要vip | 双活数据中心 |
| MHA(软件) | 自动故障切换 | 配置复杂 | 重要业务系统 |
| InnoDB Cluster | 自动化管理 | 技术较新 | 新建项目 |
| MGR (MySQL Group Replication) |
主主备份(keepalived)https://blog.csdn.net/qq_36120342/article/details/135144464
MHA InnoDB Cluster https://developer.aliyun.com/article/1687392
MGR https://www.cnblogs.com/namedgx/p/19159756
https://www.cnblogs.com/clnchanpin/p/19445620
MySQL 配置文件(通常是
my.cnf或my.ini)的参数名称是大小写不敏感的,并且可以使用连字符(-)或下划线(_)作为分隔符。