ProxySQL是轻量级MySQL读写分离中间件,具备自动故障切换、统一连接池、SQL路由等能力,相比手写代码和MyCAT/ShardingSphere更适配纯读写分离场景。

关键不在“堆容器”,而在主从角色明确、代理路由可控、状态持久可恢复。高可用不是加个健康检查就完事,得让故障能自动收敛、数据不丢、读写不乱。
数据库层:主从分离必须角色清晰、配置隔离
MySQL 或 PostgreSQL 的主从不能靠一个镜像启动多个实例自动形成复制关系。每个节点(master、slave-1、slave-2)必须有独立的 service 定义,且:
- 各自挂载专属配置文件(如 my.cnf 或 postgresql.conf),显式设置 server-id、log-bin(MySQL)或 wal_level(PostgreSQL)、replication user
- 数据目录通过 volumes 挂载到宿主机或命名卷,避免容器重启后数据丢失
- 从库需配置 CHANGE MASTER TO(MySQL)或 primary_conninfo(PostgreSQL),指向主库服务名(如 mysql-master),而非 IP
代理层:用 ProxySQL 或 Pgpool 统一入口、自动路由
不要让微服务自己判断读写——那是维护噩梦。引入中间件作为唯一数据库入口:
- ProxySQL(MySQL) 或 Pgpool-II(PostgreSQL) 单独定义为 service,监听固定端口(如 6033 / 9999)
- 在代理配置中定义 hostgroup,把主库归入 write_group,从库归入 read_group;SQL 规则按 SELECT 自动走读组,其余走写组
- 代理必须通过 depends_on + healthcheck 等待主从就绪后再启动,否则会因连接失败崩溃
微服务层:连接代理、规避延迟、适配语义
所有业务服务(user-service、order-service 等)只认代理地址,不直连任何数据库节点:
- 数据库连接 URL 写成 jdbc:mysql://proxysql:6033/dbname,不是 localhost 或 mysql-master
- 避免“刚写即读”逻辑:写完立刻查同一条记录,可能因主从同步延迟读到旧值;强一致性场景可加 /*+ FORCE_MASTER */ 注释(ProxySQL 支持)或单独建主库连接池
- Spring Boot 不推荐用 AbstractRoutingDataSource 做应用内读写分离——增加复杂度且难以统一管控,交给 ProxySQL 更干净
状态保障:有状态组件必须持久化+可自愈
高可用不只是数据库,注册中心、缓存等同样要稳:
- Nacos 启 Standalone 模式时,必须挂载 data 卷并设 PERSISTENCE=true,否则重启后服务列表清空
- Redis 若用主从,建议显式配置 slaveof redis-master 6379(通过 redis.conf),或直接上 Redis Cluster(Compose 中用 scale: 6 快速拉起)
- 所有关键服务都加 restart: unless-stopped,配合 healthcheck 实现故障自动拉起


















