1. 概述:目标与前置条件
- 目标:在越南云服务器上把单库 MySQL 拆分为分库分表,并使用分布式事务保证跨库写一致性。
- 前置条件:已购买越南云实例(如 VNPT/VNG/FPT/Tencent VN)、具备 root/管理员权限、已安装 Docker 或可访问 Kubernetes 集群。
2. 环境准备(实例与网络)
- 新建两台或多台越南云服务器:db-node-1、db-node-2(MySQL),另建一台用于中间件(sharding)和事务协调(Seata)。
- 安全组开放端口:3306(MySQL)、3307(若 Proxy 使用)、8080/8091(ShardingSphere)、8091/8092(Seata)、22(SSH)。
3. 安装 MySQL 与基本配置
- 在每台 db-node 执行(以 Ubuntu 为例):apt update && apt install -y mysql-server。
- 编辑 /etc/mysql/my.cnf:设置 server-id 唯一、启用 binlog(log-bin=mysql-bin)、binlog_format=ROW、gtid_mode=ON(若需要 GTID)。重启 MySQL:systemctl restart mysql。
4. 创建基础数据库与表结构(分库前)
- 在 db-node-1 上创建逻辑库如 order_db、user_db。导出表结构:mysqldump --no-data order_db > order_schema.sql。
- 设计分片键(建议:业务唯一且均匀分布,如 user_id 或 order_id 的高位/哈希)。
5. 分库分表方案与映射表设计
- 决定水平拆分规则:按 user_id % N(N 为分片数)。
- 建议建立一个元数据表 shard_map 存储 user_id 到 db-node 映射(可选,适用于按范围或不均匀拆分)。示例字段:shard_id, host, port, db_name。
6. 部署 ShardingSphere(Proxy 模式)
- 下载并启动 ShardingSphere-Proxy(或使用 ShardingSphere-JDBC 嵌入式)。解压后修改 conf/server.yaml 指向管理端口。
- 编辑 conf/config-sharding.yaml,定义数据源(db-node-1, db-node-2)及分片规则示例:order表按 user_id 哈希到 t_order_0..t_order_3,并映射到不同数据源。启动 proxy:bin/start.sh。
7. 数据迁移步骤(平滑切换)
- 使用在线迁移工具:建议 gh-ost 或 pt-online-schema-change 做 DDL;使用 Dumpling/Loader 或 Mydumper + loader 做数据搬迁。
- 步骤示例:1) 在源库导出数据快照;2) 在目标分库按分片规则导入;3) 开启 binlog 事件同步直到零差异;4) 切换应用指向 ShardingSphere。
8. 分布式事务处理:选型与原理
- 选型建议:Seata(AT 模式)或基于 XA 的 2PC。Seata 更适合微服务/应用层集成,支持 RM/TC 模式。
- 原理:在应用端引入 Seata 客户端(DataSourceProxy),启动 Seata Server(注册中心可用 file/nacos/zk)。事务由 TC 协调,RM 在本地执行回滚/补偿。
9. Seata 部署与应用接入实操
- 部署:下载 Seata-server,修改 conf/registry.conf 和 conf/file.conf 指定注册中心并设置事务服务端口,启动 sh seata-server.sh。
- 应用接入(Spring Boot 示例):引入 seata-spring-boot-starter,配置 application.yml:seata.service.vgroup-mapping.my_test_tx-group=default,配置 DataSource 使用 DataSourceProxy 替换原始数据源并加上 @GlobalTransactional 注解在业务方法上。
10. 测试与验证步骤
- 测试分片路由:在应用中插入 user_id 不同的数据,观察数据落在不同 db-node。可在 ShardingSphere 控制台查看路由日志。
- 测试分布式事务:编写跨两个分库的业务(例如下订单同时扣库存与写交易记录),在事务中抛出异常,确认 Seata 能回滚两端数据。
11. 监控、备份与运维建议
- 监控:部署 Prometheus + Grafana 监控 MySQL 性能、Proxy 延迟、Seata 状态。
- 备份策略:每个分库独立备份并保留 binlog,用于 PITR。定期演练故障恢复与跨区域容灾。
12. 常见陷阱与优化建议
- 注意热点键:避免单一 user_id 导致单库写热点,使用哈希或前缀路由分散压力。
- 事务粒度:尽量缩小分布式事务范围,优先使用最终一致性模式(Saga/补偿)以提高可用性。
13. 问:越南云服务器在网络延迟上会影响分布式事务吗?
- 答:会有影响。分布式事务(尤其 2PC)对延迟敏感,跨机房或跨区域会加大 RT。建议将 DB 节点与中间件放在同一区域/可用区,使用内网直连并优化心跳/超时配置;对跨区域场景优先采用最终一致性方案。
14. 问:如何在线扩容分片(新增一个 db-node)而不影响服务?
- 答:步骤:1) 在新节点创建相同schema并启动 MySQL;2) 更新 ShardingSphere 配置加入新数据源;3) 采用迁移工具按分片规则迁移部分数据到新节点;4) 更新路由规则并逐步切换流量;5) 验证一致性后移除旧分片。
15. 问:是否推荐使用 ShardingSphere + Seata 的组合生产化?
- 答:是可行且常见的组合。ShardingSphere 提供分片路由能力,Seata 提供事务协调。但需注意:充分测试性能与容错、避免大事务、做好监控与回滚策略。生产环境应做容量测试与灾备演练。
来源:扩展性越南云服务器数据库 分库分表与分布式事务处理案例