是的,ShardingSphere-Proxy 的读写分离功能可以将写库和读库配置为同一台机器。这在某些场景下是合理的,例如:
1. 为什么需要这样做?
- 架构过渡阶段:初期单机部署时,可能暂时无需物理分离读写库,但希望代码提前适配读写分离逻辑。
- 测试环境:在资源有限的环境中,用同一台机器模拟读写分离的拓扑结构。
- 故障容错:当读库故障时,可通过配置强制将读请求路由到写库(需注意性能风险)。
2. 如何配置?
在 ShardingSphere-Proxy 的配置文件中(如 config-readwrite-splitting.yaml
),将写库和读库的数据源指向同一数据库实例:
dataSources:
write_ds:
url: jdbc:mysql://192.168.1.100:3306/db?useSSL=false
username: root
password: root
connectionTimeoutMilliseconds: 30000
idleTimeoutMilliseconds: 60000
maxLifetimeMilliseconds: 1800000
maxPoolSize: 50
read_ds_0: # 读库与写库指向同一机器
url: jdbc:mysql://192.168.1.100:3306/db?useSSL=false
username: root
password: root
connectionTimeoutMilliseconds: 30000
idleTimeoutMilliseconds: 60000
maxLifetimeMilliseconds: 1800000
maxPoolSize: 50
rules:
- !READWRITE_SPLITTING
dataSources:
primary_ds:
type: Static
props:
write-data-source-name: write_ds
read-data-source-names: read_ds_0
loadBalancerName: round_robin
loadBalancers:
round_robin:
type: ROUND_ROBIN
3. 注意事项
- 性能问题:读写流量同时落到同一数据库实例,可能增加单机负载,需根据实际并发量评估。
- 数据一致性:由于读写同一实例,不会存在主从延迟问题,但失去了读写分离降低负载的意义。
- 负载均衡策略:即使只有一个读库,仍需配置负载均衡器(如
ROUND_ROBIN
),否则可能报错。
4. 动态扩展建议
若未来需要物理分离读写库,只需修改读库的数据源配置即可,无需改动业务代码:
read_ds_0:
url: jdbc:mysql://192.168.1.101:3306/db?useSSL=false # 改为独立读库IP
✅ 总结
ShardingSphere-Proxy 支持将写库和读库指向同一台机器,但在生产环境中应谨慎使用(仅推荐测试或过渡场景)。实际部署时需根据业务需求权衡架构设计。
内容由零声教学AI助手提供,问题来源于学员提问