大型分布式网站架构-设计与实现

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/大型分布式网站架构-设计与实现/
作者
dingrui
发布于
2023年2月28日
许可协议