思考问题
- 亿级商品存储下,如何分析分布式系统的原理性问题?
- 如何设计一个支持海量商品存储的高扩展性架构?
- 在做分库分表时,基于 Hash 取模和一致性 Hash 的数据分片是如何实现的?
- 在电商大促时期,如何对热点商品数据做存储策略?
分布式数据存储需要考虑的问题
- 单台服务器存储和性能限制 —— 数据分片
- 数据高可用 —— 数据复制
- 数据多副本下的数据一致性问题 —— 数据一致性的选择
- 主节点故障后的故障恢复问题 —— 故障恢复
- 不同数据存储之间事务一致性 —— 分布式事务
具体问题分析
- 如何解决单台数据库的热点问题?
- 通过数据分片来解决,数据分片有哪些,比较好的数据分片算法为 Range 范围分片。(这里暂时不考虑使用缓存,如果是缓存,还可以包含在所有节点上都配置相同数据,随机选择节点读取,降低单节点访问)
- 举例说明。比如在商品场景下,每个商品是存在多级类别目录的。在根据类别目录分片时,可以按照一、二、三级类目进行灵活分片。对于京东强势的 3C 品类,可以按照 3C 的三级品类设置分片;对于弱势品类,可以先按照一级品类进行分片,这样会让分片间的数据更加平衡。
- 这种方式的缺点是,对于业务代码的侵占性比较高。如果降低对业务代码的侵占,也可以搭建一个分片元数据服务。在请求数据的时候,先访问该服务获得真实数据所在的节点,后续再去该节点上去获取数据。当然这种增加了系统的复杂性、开发和维护成本等,需要进行权衡。
- 如何保证分片元数据服务的可用性和数据一致性?
- 最直接的方式是专门给元数据做一个服务集群,并通过一致性算法复制数据。在实现方式上,就是将元数据服务的高可用和数据一致性问题转嫁给外围协调组件,如 ETCD 集群,这样既保证了系统的可靠,数据同步的成本又比较低。知道了设计思路,那具体的架构实现上怎么做?
- 给分片元数据做集群服务,并通过 ETCD 存储数据分片信息。
- 每个数据存储实例节点定时向元数据服务集群同步心跳和分片信息。
- 当调用端的请求过来时,元数据服务节点只需要做好高可用和缓存即可。