读写分离

说明

如果数据存在如下特征

  • 大量并发读,写操作少
  • 可以接受一段时间内的数据不一致

数据存在如上的特征时,并且数据库读压力比较大时,优先考虑缓存,比如Redis,缓存的成本比从库小。当应用了缓存之后,数据库的读压力还是存在瓶颈的情况下,就可以采用读写分离。

Zebra 微服务框架引入了 ShardingSphere 的 Sharding-JDBC 组件来支持读写分离的功能。Sharding-JDBC 相关说明请参考官方文档

样例

请参考 TODO

开发

引入依赖

引入如下依赖

  1. <dependency>
  2. <groupId>com.guosen</groupId>
  3. <artifactId>zebra-database</artifactId>
  4. <version>${zebra.version}</version>
  5. </dependency>

注:将 ${zebra.version} 替换为使用的 Zebra 版本

配置

配置样例

  1. zebra.database.url[0]=jdbc:sqlserver://ip:port;database=masterDbName
  2. zebra.database.username[0]=sa
  3. zebra.database.pwd[0]=passwd
  4. zebra.database.dataSourceName[0]=master
  5. zebra.database.url[1]=jdbc:sqlserver://ip:port;database=slave00DbName
  6. zebra.database.username[1]=sa
  7. zebra.database.pwd[1]=passwd
  8. zebra.database.dataSourceName[1]=slave00
  9. zebra.database.url[2]= jdbc:sqlserver://ip:port;database=slave01DbName
  10. zebra.database.username[2]=sa
  11. zebra.database.pwd[2]=passwd
  12. zebra.database.dataSourceName[2]=slave01
  13. zebra.database.shardingcfg.msds01.basePackage=com.guosen.test.zebra.dao
  14. zebra.database.shardingcfg.msds01.masterslave.master-data-source-name=master
  15. zebra.database.shardingcfg.msds01.masterslave.slave-data-source-names=slave00,slave01
  16. zebra.database.shardingcfg.msds01.masterslave.load-balance-algorithm-type=round_robin
  17. zebra.database.shardingcfg.msds01.props.sql.show=true

如上图,zebra.database.shardingcfg 为读写分离配置的前缀,msds01 为读写分离数据源名称,msds01后为具体的读写分离配置项。

配置说明

和 Sharding-JDBC 基本保持一致,但是配置前缀修改为 zebra.database.shardingcfg.${读写分离数据源名称}

配置项 说明
masterslave.master-data-source-name 读写分离主库的原始数据源名称
masterslave.slave-data-source-names 读写分离从库的原始数据源名称列表,支持多个,以逗号隔开
masterslave.load-balance-algorithm-type slave数据源负载均衡算法类型,支持如下配置 round_robin : 轮询(默认值) random : 随机
basePackage 读写分离数据源对应MyBatis的basePackage。 此为zebra定制配置项
props.sql.show 是否开启SQL打印,取如下的值。只建议在开发及上线初期开启。 true : 开启 false : 不开启(默认值)

代码编写

代码开发和 zebra 数据库一致,所有读 SQL 会走 Slave 数据库,所有 写 SQL 会走 Master 数据库。

日志

如果将配置项 props.sql.show 设置为 true,则 Sharding-JDBC 会将读写分离 SQL 详情打印到日志中,可判断 SQL 最终路由到哪个数据源上。可通过关键字 “ShardingSphere-SQL” 进行搜索。此开关在开发阶段用于自验,在生产环境需关闭,否则会打印大量日志,影响性能及占用空间。