ShardingSphere 学习实践:MySQL 主从搭建与 Proxy 部署指南
本文将基于 Docker 环境,详细演示 MySQL 主从复制集群的搭建,以及 ShardingSphere-Proxy 的部署过程,并附关键配置说明与验证方法,助你快速掌握分布式数据库中间件的核心实践。
一、环境准备
1. 前置条件
已安装 Docker(版本 ≥ 20.10)及 Docker Compose(可选)
宿主机需创建数据存储目录(用于持久化 MySQL 数据与配置):
mkdir -p /mnt/docker/mysql/{master,slave1,slave2,proxy-a}/conf mkdir -p /mnt/docker/mysql/{master,slave1,slave2,proxy-a}/data
确保宿主机网络可访问 MySQL 主节点 IP(示例中主节点 IP 为
10.10.10.9
,需根据实际环境替换)。
二、MySQL 主从集群搭建
1. 启动 MySQL 主节点
docker run -d \
-p 3306:3306 \ # 映射宿主机 3306 端口到容器主库端口
-v /mnt/docker/mysql/master/conf:/etc/mysql/conf.d \ # 挂载自定义配置(如 my.cnf)
-v /mnt/docker/mysql/master/data:/var/lib/mysql \ # 持久化数据目录
-e MYSQL_ROOT_PASSWORD=123456 \ # 设置 root 密码
--name long-mysql-master \ # 容器名称
mysql:8.0.29 # 使用 MySQL 8.0.29 镜像
关键说明:
配置文件自定义:可通过
/mnt/docker/mysql/master/conf/my.cnf
调整主库参数(如server-id=1
,必须唯一),示例如下:[mysqld] server-id=1 # 主库 ID 必须唯一且最小 log-bin=mysql-bin # 开启二进制日志(主从复制核心) binlog-format=ROW # 推荐 ROW 格式记录变更
2. 启动 MySQL 从节点(Slave1 & Slave2)
# 从节点 1(端口 3307)
docker run -d \
-p 3307:3306 \
-v /mnt/docker/mysql/slave1/conf:/etc/mysql/conf.d \
-v /mnt/docker/mysql/slave1/data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=123456 \
--name long-mysql-slave1 \
mysql:8.0.29
# 从节点 2(端口 3308)
docker run -d \
-p 3308:3306 \
-v /mnt/docker/mysql/slave2/conf:/etc/mysql/conf.d \
-v /mnt/docker/mysql/slave2/data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=123456 \
--name long-mysql-slave2 \
mysql:8.0.29
关键说明:
从库配置:每个从库需在
my.cnf
中设置唯一的server-id
(如 Slave1 设为 2,Slave2 设为 3),否则主从复制会报错。网络连通性:确保从库容器能通过
10.10.10.9:3306
访问主库(可通过docker exec -it long-mysql-slave1 ping 10.10.10.9
测试)。
三、主从复制配置
1. 主库授权从库访问
默认情况下,MySQL 8.0 远程连接需使用 mysql_native_password
认证方式(避免兼容性问题),执行以下 SQL:
-- 登录主库容器:docker exec -it long-mysql-master bash; mysql -uroot -p123456
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '123456';
FLUSH PRIVILEGES; -- 刷新权限生效
2. 从库配置主库信息
在从库容器中执行 CHANGE MASTER TO
命令,指定主库连接信息:
-- 登录从库容器(以 Slave1 为例):docker exec -it long-mysql-slave1 bash; mysql -uroot -p123456
CHANGE MASTER TO
MASTER_HOST='10.10.10.9', -- 主库 IP(需替换为实际地址)
MASTER_USER='root', -- 主库授权用户
MASTER_PASSWORD='123456', -- 主库用户密码
MASTER_PORT=3306, -- 主库端口
MASTER_LOG_FILE='binlog.000003', -- 主库当前二进制日志文件(通过 SHOW MASTER STATUS; 获取)
MASTER_LOG_POS=1561; -- 主库日志偏移量(同上)
关键说明:
获取主库日志信息:在主库执行
SHOW MASTER STATUS;
,记录File
(日志文件名)和Position
(偏移量),示例输出:+------------------+----------+--------------+------------------+-------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set | +------------------+----------+--------------+------------------+-------------------+ | binlog.000003 | 1561 | | | | +------------------+----------+--------------+------------------+-------------------+
3. 启动从库复制并验证
-- 在从库执行
STOP SLAVE; -- 停止复制(若已启动)
START SLAVE; -- 启动复制
SHOW SLAVE STATUS\G -- 查看复制状态(关键指标)
复制状态验证:
Slave_IO_Running: Yes
:IO 线程正常(负责从主库拉取日志)。Slave_SQL_Running: Yes
:SQL 线程正常(负责执行日志中的 SQL)。Seconds_Behind_Master: 0
:从库与主库数据无延迟(理想状态)。
四、ShardingSphere-Proxy 部署
ShardingSphere-Proxy 是 ShardingSphere 提供的数据库代理服务,支持分片、读写分离等功能,以下为部署步骤:
1. 启动 Proxy 容器
docker run -d \
-v /mnt/docker/mysql/proxy-a/conf:/opt/shardingsphere-proxy/conf \ # 挂载配置目录
-v /mnt/docker/mysql/proxy-a/ext-lib:/opt/shardingsphere-proxy/ext-lib \ # 挂载扩展 JAR(如驱动)
-e ES_JAVA_OPTS="-Xmx256m -Xms256m -Xmn128m" \ # JVM 内存参数(根据需求调整)
-p 3321:3307 \ # 映射宿主机 3321 端口到容器 Proxy 端口(默认 3307)
--name server-proxy-a \
apache/shardingsphere-proxy:5.1.1 # ShardingSphere-Proxy 5.1.1 版本
2. 核心配置文件说明
Proxy 的核心配置位于 /mnt/docker/mysql/proxy-a/conf
目录,主要包括:
server.yaml
:全局配置(如数据源、规则、认证信息)。rules
目录:分片、读写分离等规则配置文件。
示例 server.yaml
(简化版):
dataSources:
ds_master: # 数据源名称(自定义)
dataSourceClassName: com.mysql.cj.jdbc.MysqlXADataSource
props:
url: jdbc:mysql://10.10.10.9:3306/master_db?serverTimezone=UTC&useSSL=false
user: root
password: 123456
maxPoolSize: 20
rules:
- !SHARDING
tables:
t_order: # 分片表名
actualDataNodes: ds_master.t_order_$->{0..1} # 实际数据节点(ds_master 库名 + t_order_0/1 表名)
databaseStrategy:
standard:
shardingColumn: user_id # 分片键
shardingAlgorithmName: db-inline # 分片算法名称
tableStrategy:
standard:
shardingColumn: order_id # 分片键
shardingAlgorithmName: table-inline # 分片算法名称
shardingAlgorithms:
db-inline:
type: INLINE
props:
algorithm-expression: ds_master # 固定分配到 ds_master 数据源(示例简化)
table-inline:
type: INLINE
props:
algorithm-expression: t_order_$->{order_id % 2} # 按 order_id 取模分表(0/1)
关键说明:
数据源配置:需根据实际数据库地址、库名、表名调整
url
和props
。分片规则:
actualDataNodes
定义实际存储的数据库和表,支持动态扩展;shardingColumn
为分片依据字段(如用户 ID、订单 ID)。认证配置:若需限制 Proxy 访问权限,可在
authentication
节点添加用户密码(如user: proxy_user; password: proxy_pwd
)。
3. 验证 Proxy 启动状态
# 检查容器运行状态
docker ps | grep server-proxy-a
# 测试端口连通性(宿主机执行)
telnet 127.0.0.1 3321 # 若连接成功,说明 Proxy 端口已暴露
# 使用 JDBC 连接测试(示例)
jdbc:mysql://127.0.0.1:3321/master_db?serverTimezone=UTC
五、常见问题排查
1. 主从复制失败
现象:
SHOW SLAVE STATUS
显示Slave_IO_Running: No
或Slave_SQL_Running: No
。排查:
检查主从库
server-id
是否唯一。确认从库能连接主库(
telnet 主库IP 3306
)。验证主库用户权限(
SHOW GRANTS FOR 'root'@'%'
)。检查
MASTER_LOG_FILE
和MASTER_LOG_POS
是否与主库当前日志一致(主库执行SHOW MASTER STATUS;
对比)。
2. ShardingSphere-Proxy 无法启动
现象:容器启动后立即退出,日志提示
Configuration error
。排查:
检查
server.yaml
配置格式(YAML 对缩进敏感,建议使用 VS Code 等工具校验)。确认数据源
url
、user
、password
正确(可手动用mysql
客户端测试连接)。检查
ext-lib
目录是否包含所需驱动(如 MySQL 驱动mysql-connector-java-8.0.29.jar
)。
总结
本文完整演示了 MySQL 主从集群的 Docker 部署、主从复制配置,以及 ShardingSphere-Proxy 的核心配置与验证方法。通过实践这些步骤,你可以掌握分布式数据库的基础架构搭建,并为进一步学习 ShardingSphere 的分片、读写分离等高级功能打下基础。
下一步建议:尝试在 ShardingSphere-Proxy 中配置分片规则,观察数据写入后是否按规则分布到不同表/库,验证分片效果!