分库分表实战及中间件(三)
前言
sharding中也支持读写分离,读写分离可以极大的提高提升系统的吞吐量和可用性,但同时也带来了数据不一致的问题,包括多个主库之间
的数据一致性,以及主库与从库之间的数据一致性的问题。 并且,读写分离也带来了与数据分片同样的问题,它同样会使得应用开发和运维人员对数据库的操作和运维变得更加复杂。
读写分离
在数据量不是很多的情况下,我们可以将数据库进行读写分离,以应对高并发的需求,通过水平扩展从库,来缓解查询的压力。
分表+读写分离
如果在读写分离的基础上,数据量还是很大,在未来可预见性下,可以考虑分库分表存储。
读写分离
- 主从架构
读写分离,目的是高可用、读写扩展。主从库内容相同,根据SQL语义进行路由。 - 分库分表架构
数据分片,目的读写扩展、存储扩容。库和表内容不同,根据分片配置进行路由。
将水平分片和读写分离联合使用,能够更加有效的提升系统性能, 下图展现了将分库分表与读写分离一同使用时,应用程序与数据库集群之间的复杂拓扑关系。
sharding 读写分离配置
sharding 支持读写分离配置,让使用方尽量像使用一个数据库一样使用主从数据库集群是ShardingSphere读写分离模块的主要设计目标。
sharding 读写分离支持主库、从库、主从同步、负载均衡
核心功能
- 提供一主多从的读写分离配置。仅支持单主库,可以支持独立使用,也可以配合分库分表使
用 - 独立使用读写分离,支持SQL透传。不需要SQL改写流程
- 同一线程且同一数据库连接内,能保证数据一致性。如果有写入操作,后续的读操作均从主
库读取。 - 基于Hint的强制主库路由。可以强制路由走主库查询实时数据,避免主从同步数据延迟。
不支持项
- 主库和从库的数据同步
- 主库和从库的数据同步延迟
- 主库双写或多写
- 跨主库和从库之间的事务的数据不一致。建议在主从架构中,事务中的读写均用主库操作。
缺点
由于读写分离带来的延迟问题,同时sharding对其支持了强制性路由,可以强制性去主库进行操作数据。可以参考 分库分表实战及中间件(四)
读写分离实战
这儿仅仅是单表的读写分离配置
#打印shardingsphere sql
spring.shardingsphere.props.sql.show=true
## 读写分离
# 分库信息配置
spring.shardingsphere.datasource.names=test0,test1
#配置数据库信息
#配置连接池
spring.shardingsphere.datasource.test0.type=com.zaxxer.hikari.HikariDataSource
spring.shardingsphere.datasource.test0.driver-class-name=com.mysql.jdbc.Driver
spring.shardingsphere.datasource.test0.jdbc-url=jdbc:mysql://localhost:3306/test0
spring.shardingsphere.datasource.test0.username=root
spring.shardingsphere.datasource.test0.password=root
#配置连接池
spring.shardingsphere.datasource.test1.type=com.zaxxer.hikari.HikariDataSource
spring.shardingsphere.datasource.test1.driver-class-name=com.mysql.jdbc.Driver
spring.shardingsphere.datasource.test1.jdbc-url=jdbc:mysql://localhost:3306/test1
spring.shardingsphere.datasource.test1.username=root
spring.shardingsphere.datasource.test1.password=root
# master-slave
spring.shardingsphere.masterslave.name=datasource
#主库数据源名
spring.shardingsphere.masterslave.master-data-source-name=test0
#从库数据源名 多个可以,隔开
spring.shardingsphere.masterslave.slave-data-source-names=test1
#从库负载均衡配置
spring.shardingsphere.masterslave.load-balance-algorithm-type=ROUND_ROBIN
# 表 雪花算法id
spring.shardingsphere.sharding.tables.position_master_slave.key-generator.column=id
#对应主键类getType返回内容
spring.shardingsphere.sharding.tables.position_master_slave.key-generator.type=SNOWFLAKE