高并发学习笔记
数据库优化
主从读写分离
使用场景
读请求过高
作用
- 从库作为数据备份
- 从库用于处理读请求,减少单机压力
注意事项
-
注意从库数量,从库越多,主库需要越多的资源用于数据复制,同时还占用主库网络带宽,一般最多挂3-5个从库
-
主从之间存在延迟,读从库可能读不到最新的数据
- 使用缓存,在更新数据后同时更新缓存,读的时候直接读缓存
- 写主库后的发送消息队列可以发送完整数据记录,避免后面读从库
- 不读从库,直接读主库
-
需要对主从延迟进行监控
-
最好屏蔽分离后导致访问数据库方式的改变
- 以基础库中间件的方式直接引进项目代码中,访问时直接访问该中间件,主流方案有TDDL、DDB
- 单独部署数据库代理层,业务代码使用时访问代理层,代理层转发到指定的数据源,有Cobar、Mycat、Atlas、DBProxy等; 这种方式多了一次转发,性能上有一些损耗
分库分表
使用场景
写请求过高
作用
- 随着存储量变大,单机写入性能和查询性能会降低,分库分表能提高读写性能
- 按模块分库,实现不同模块的故障隔离
拆分方式
垂直拆分:将数据库的表拆到不同数据库中
一般可以按业务来拆分,专库专用,将业务耦合度较高的表放到同一个库中
水平拆分:将单一表的数据按一定规则(选一个字段作为分区键)拆分到多个表中
- 对某个字段进行hash拆分
- 按某个字段的区间进行拆分,比如时间字段
注意事项
- 最好屏蔽分离后导致访问数据库方式的改变(同主从读写分离)
- 水平拆分后,为了避免全分区查询,尽量带上分区键;若查询条件中没有分区键,可创建查询条件字段与分区键的映射表,查询时先通过映射表找到分区键,再通过分区键去数据表中查询
- 水平拆分后,对于多表join的需求可直接把多个表的数据分别先查出来后在业务代码中进行关联
- 水平拆分后,对于一些聚合操作,比如count、sum,可以直接将聚合后的数据单独存储在一张表中或记录到redis中