192.168.50.231、192.168.50.232、192.168.50.233 三台数据库节点上配置。

⚠️ 唯一需要修改的参数:

  • node1 (231): server-id = 1
  • node2 (232): server-id = 2
  • node3 (233): server-id = 3

将以下内容覆盖写入 /etc/my.cnf

[mysqld]
# ================= 基础标识 =================
# 每个节点必须唯一 (1, 2, 3)
server-id = 1
port = 3306
datadir = /var/lib/mysql
socket = /var/lib/mysql/mysql.sock
character-set-server = utf8mb4
collation-server = utf8mb4_0900_ai_ci
skip-name-resolve

# ================= 连接与网络 =================
# 4G内存不建议将连接数设得过高,1000 足以应对绝大多数常规并发
max_connections = 1000
max_connect_errors = 100000
wait_timeout = 7200
interactive_timeout = 7200

# ================= InnoDB 性能核心 (4G内存定制) =================
# 分配约 50% 物理内存给 Buffer Pool,保留充足内存给 OS 和其他会话
innodb_buffer_pool_size = 2G
# Buffer Pool 实例数,每 1G 分配一个实例
innodb_buffer_pool_instances = 2
innodb_redo_log_capacity = 1G
# 双1标准,保障强一致性
innodb_flush_log_at_trx_commit = 1
# 假定使用标准云盘/SSD
innodb_io_capacity = 2000
innodb_io_capacity_max = 4000
innodb_file_per_table = 1

# ================= 复制与高可用 (MGR 基础) =================
log_bin = binlog
binlog_format = ROW
binlog_row_image = FULL
gtid_mode = ON
enforce_gtid_consistency = ON
sync_binlog = 1
binlog_expire_logs_seconds = 604800

# MGR 强依赖参数
sql_require_primary_key = ON
transaction_write_set_extraction = XXHASH64
slave_preserve_commit_order = 1
slave_parallel_type = LOGICAL_CLOCK
slave_parallel_workers = 4

[client]
default-character-set = utf8mb4

阶段二:环境初始化与密码设置

请在 三个数据节点(231, 232, 233) 依次执行以下 Shell 脚本。此脚本包含防火墙放行、安装、启动以及自动化修改初始密码。

# 1. 端口放行 (业务端口: 3306, MGR通信端口: 33061)
firewall-cmd --permanent --add-port=3306/tcp
firewall-cmd --permanent --add-port=33061/tcp
firewall-cmd --reload

# 2. 安装 MySQL 8.0 和 MySQL Shell
yum install -y mysql-server mysql-shell

# 3. 启动服务
systemctl start mysqld
systemctl enable mysqld

# 4. 提取临时密码
TEMP_PASS=$(grep 'temporary password' /var/log/mysqld.log | awk '{print $NF}')

# 5. 免交互修改密码并授权 192.168.50.x 网段访问
mysql -u root -p"$TEMP_PASS" --connect-expired-password -e "
ALTER USER 'root'@'localhost' IDENTIFIED BY 'Passwd@123!';
CREATE USER 'root'@'192.168.50.%' IDENTIFIED BY 'Passwd@123!';
GRANT ALL PRIVILEGES ON *.* TO 'root'@'192.168.50.%' WITH GRANT OPTION;
FLUSH PRIVILEGES;
"

阶段三:组建 InnoDB Cluster

接下来的操作通过 MySQL Shell 完成,利用官方工具自动化处理底层的复制拓扑和 GTID 事务。

1. 检查并配置实例 (在 231, 232, 233 三台机器上各执行一次):
此命令会让 MySQL Shell 自动修复不符合 MGR 要求的动态参数。

mysqlsh -u root -p'Passwd@123!' -h localhost -e "dba.configureInstance('root@localhost:3306', {password: 'Passwd@123!', clearReadOnly: true, interactive: false})"

(注:执行后如果提示有参数修改,建议在三台机器上都执行一次 systemctl restart mysqld 确保配置生效)

2. 创建集群 (仅在 Node1 192.168.50.231 上执行):
登录 MySQL Shell:

mysqlsh -u root -p'Passwd@123!' -h 192.168.50.231

在 Shell 的 JS > 提示符下执行:

// 创建集群
var cluster = dba.createCluster('ProdCluster');

3. 加入节点 (继续在 Node1 192.168.50.231 的 MySQL Shell 中执行):

// 加入 Node2,使用 Clone 插件全量同步
cluster.addInstance('root@192.168.50.232:3306', {password: 'Passwd@123!', recoveryMethod: 'clone'});

// 加入 Node3,使用 Clone 插件全量同步
cluster.addInstance('root@192.168.50.233:3306', {password: 'Passwd@123!', recoveryMethod: 'clone'});

// 检查集群最终状态,确认三个节点均为 ONLINE
cluster.status();

第四阶段:部署 MySQL Router 路由层

请在应用接入服务器 192.168.50.235 上执行。

# 1. 安装 Router
yum install -y mysql-router

# 2. 引导 Router (从集群任意存活节点拉取拓扑信息)
mysqlrouter --bootstrap root@192.168.50.231:3306 --user=mysqlrouter

# 此处会提示输入密码,请输入:Passwd@123!

# 3. 启动并设置开机自启
systemctl start mysqlrouter
systemctl enable mysqlrouter

接入验证:
您的应用程序配置数据库连接时,直接指向 Router 服务器即可:

  • 业务写库 / 强一致性读: 192.168.50.235:6446
  • 业务纯读库 (负载均衡): 192.168.50.235:6447