大型分布式网站架构-设计与实现
1 分库分表
分表
访问极为频繁且数据量巨大的单表,减少单表的记录条数,以便减少数据查询所需时间,提高数据库的吞吐
分库
分表能够解决单表数据量过大带来的查询效率下降问题,却无法处理数据库的兵法处理能力,对数据库进行拆分,从而提高数据库的写入能力
路由策略
temp=user_id%(库数量*每个库的表数量)
库=取整(temp/每个库的表数量)
表=temp%每个库的表数量
2 HBase
角色
- HMaster - 负责HRegionServer的调度及集群状态的监管
- HRegionServer - 一个HRegionServer可以管理多个Region
随着记录条数增加而不断变大后,分裂成一个个的Region,每个Region由(startKey, endKey)表示
3 垂直化搜索引擎
分布式系统中,垂直化搜索引擎
- 既能满足对全文检索、模糊匹配的续期,解决数据库like查询效率低下的问题
- 又能解决分布式环境下由于采用分库分表或者使用NoSQL数据库,导致无法进行多表关联或者复杂查询的问题
3.1 Lucene
倒排索引
又称反向索引,是搜索引擎中最常见的数据结构,将文档中的词作为关键字,建立词与文档的映射关系,通过对倒排索引的检索,可以根据词快速获取包含这个词的文档列表
优化
- 索引读写分离
- 索引切分
4 弱一致性
不一致性窗口
弱一致性指的是系统的某个数据被更新后,后续对该数据的读取操作获取到的可能是更新前的值,也可能是更新后的值,全部用户完全获取到更新后的值需要经过一段时间
最终一致性
是弱一致性的一种特殊形式
最终一致性案例
- MySQL数据库的主/从数据同步
- ZooKeeper的Leader election和Atomic broadcas
5 并发扣减库存
杜绝网络投机者使用工具参与秒杀导致的不公平竞争行为,让竞争变得公平
- 图像验证码
- 问答式验证码
高并发
- 分库分表
数据一致性问题
实际库存与浏览库存分离
真实的库存保存在数据库中,前端浏览的库存信息存放在缓存中,数据库下单与减库存两个动作可以在同一个事务中执行,避免数据不一致
库存更新完毕后,再将数据库中的数据同步到缓存中
行锁竞争
将一行库存拆分成多行,解除行锁导致的并发资源利用问题,下单减库存操作路由到哪条记录
- 用户id取模
- 随机
总库存大于0,前端下单请求可能刚好被路由到一条库存为0的记录,导致扣减库存失败,而实际上还有其他记录库存不是0
大型分布式网站架构-设计与实现
https://bannirui.github.io/2023/02/28/大型分布式网站架构-设计与实现/