网站Logo 江大龙-日常

ShardingSphere 资料记录

jianglong
18
2025-07-13

unsplash-fR9U2S31Exs.pngShardingSphere 学习实践: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 等工具校验)。

    • 确认数据源 urluserpassword 正确(可手动用 mysql 客户端测试连接)。

    • 检查 ext-lib 目录是否包含所需驱动(如 MySQL 驱动 mysql-connector-java-8.0.29.jar)。


总结

本文完整演示了 MySQL 主从集群的 Docker 部署、主从复制配置,以及 ShardingSphere-Proxy 的核心配置与验证方法。通过实践这些步骤,你可以掌握分布式数据库的基础架构搭建,并为进一步学习 ShardingSphere 的分片、读写分离等高级功能打下基础。

下一步建议​:尝试在 ShardingSphere-Proxy 中配置分片规则,观察数据写入后是否按规则分布到不同表/库,验证分片效果!