1 概念
读写分离是通过主从的配置方式,将查询请求均匀地分散到多个数据副本,提升系统的处理能力。
主库:新增、修改、删除数据操作所使用的数据库
从库:查询数据操作所使用的数据库
主从架构:读写分离,目的是实现高可用、读写可扩展。主从库内容相同,根据SQL语义进行路由。
分库分表架构:数据分片,读写扩展、存储扩容,数据库和数据表内容不同,根据分片配置进行路由。
将水平分片和读写分离联合起来使用,能够更加有效的提升系统性能。
读写分离虽然可以提升系统的吞吐量和可用性,但时也带来了数据不一致的问题,包括多个主库之间的数据一致性,以及主库与从库之间的数据一致性问题。
同时,读写分离也带了与数据分片同样的问题,使用应用的开发和运维人员,对数据库的操作和运维变得更加复杂。
2 配置
按照一主一从的方式进行配置。
主从配置是数据库自身支持的,和之前的mycat主从配置相同。
首先修改 MySQL 主库的配置:
- 设置 log_bin,主要是设置生成的 binlog 日志的文件名
- 设置 server-id,数值型,主库与从库的数值不能相同
- 设置 binlog-do-db,配置需要做主从同步的数据库,如果不设置,则会同步所有的数据库,如果需要配置多个库时,需要配置多行
- 设置 binlog-ignore-db,配置不需要进行主从同步的数据库,当有多个库时,需要配置多行
修改 MySQL 从库的配置:
- 设置 log_bin,与主库作用相同
- 设置 server-id,与主库作用相同,但设置的值不能相同
3 ShardingJDBC对读写分离的支持与局限
核心功能
- 提供一主多从的读写分离配置。但仅支持单主库,可以支持独立使用,也可以配合分库分表使用
- 独立使用读写分离,支持SQL透传。不需要SQL改写流程
- 同一线程且同一数据库连接内,能保证数据一致性。如果有写入操作,后续的读操作均从主库读取。
- 基于Hint的强制主库路由。可以强制路由走主库查询实时数据,避免主从同步数据延迟。
不支持项
- 主库和从库的数据同步
- 主库和从库的数据同步延迟
- 主库双写或多写
- 跨主库和从库之间的事务的数据不一致。在主从架构中,事务中的读写应当均用主库操作。