Design Data Intensive Applications 笔记 (数据分片)

何为SHARDING:

将大数据集分为多个块,存储在不一样的服务器上node

目的:

可扩展性: 不一样的分片能够放在不一样的服务器上,分散读请求
复杂查询能够并行的在不一样的分片上执行
写请求分散到各个服务器上算法

问题1: 怎么分?

每一个服务器上数据保持均匀,避免数据倾斜数据库

  • 随机分配:
    优势: 数据均匀
    缺点: 没法知道数据在哪一个节点
  • 每一个分片保存主键一个范围内连续键值 (partition by key range)
    优势: 容易算出主键在哪一个节点. 主键可有序存储,方便范围搜索
    缺点: 每一个分片数据可能不均匀,须要调节分片边界 --> 手动或自动. 主键前缀解决分布问题
  • 按主键HASH值分片: (riak, couchbase, voldemort)
    优势: 理论上数据均匀,取决于HASH算法. 容易算出数据在哪一个节点
    缺点: 难以进行范围搜索
  • 混合模式: 联合主键,先按主键第一个属性HASH,再按其余属性有序排列 (cassandra)
    适合处理一对多数据
    处理数据倾斜和热点键读写:
    须要应用层解决: 如对键值增长随机先后缀. 缺点: 同一个键值的数据分散在不一样分片内,增长读取复杂度

    问题2: 如何查询数据?

    分片策略解决了写和主键查询的问题,可是如何解决其余查询条件查询?如何在数据分片的状况下创建二级索引?服务器

  • 本地索引: 每一个分片单独维护二级查询条件到主键列表的字典映射
    优势:写数据时更新索引时容易
    缺点:查询必须在每一个分片的二级索引中查找,再合并结果
  • 全局索引: 一个独立的索引结构覆盖全部分片,索引自己也分片,按照索引对应的查询条件 (term partitioned)
    优势:查询索引落到单个分片,效率高,若是采用RANGE分片也支持范围查询
    缺点: 写入数据复杂,写操做会影响多个分片(数据分片和索引分片未必在同一个节点), 须要分布式事务支持, 或者采用异步方式,牺牲一致性,新写入的数据未必马上在索引中可见.

    问题3: 集群扩容或者有宕机节点分片数据如何处理?

    分片数据须要从一个节点迁移到另外一个节点 (partition rebalancing) 网络

    数据重平衡需求:

    1. 迁移后负载必须保持均匀 (集群扩容)
    2. 迁移中集群必须可用,读写无影响
    3. 迁移必须最小化没必要要的数据移动,减小集群IO开销

      数据重平衡策略:

  • hash取模会致使扩容后大量分片所处节点发生变化, 不知足上述需求3
  • 不直接把key映射到node,而是先把key映射到partition, 再把partition映射到node. partition的数量远大于node的数量, 这样新增node获取部分partition数据, 同时保持key到partition的映射不变 (riak, elasticsearch, couchbase, voldemort)
    优势: 最小化扩容过程当中的数据移动
    缺点: partition数量是永远固定的,不可增减, 决定partition的数量很难,每一个partition的数据量过大或者太小都会带来额外开销
  • 动态主键范围分片: 数据分片按照主键排序, 当分片超过配置大小后自动分裂为两个分片, 当分片因为数据删除太小后和相邻的分片作合并. (hbase, rethinkDB)
    优势: 分片大小自动适配集群数据量
    缺点: 数据库刚初始化时仅有一个分片, 读写负载不能有效分散. 解决方案: 配置预分片.
    动态分片也可应用于HASH分片
  • 分片数同比例于节点数: 即每一个节点上分片数固定. 新节点加入时,随机选取必定数量的分片作等分,把一半数据移动到新节点. (cassandra, ketama)
    缺点:只支持HASH分片. 随机选取可能致使数据不均匀

    人工或自动平衡:

    自动重平衡
    优势:不须要人工干预
    缺点:分片数据移动是昂贵的操做,会对集群性能产生不可知影响,并容易引发雪崩效应
    人工重平衡
    优势:可控性强
    缺点:响应速度慢并发

请求路由:

重平衡以后客户端须要知道链接到哪一个节点异步

  • 客户端可链接到任何节点,若是分区存在则处理请求,不然由节点负责将请求发往分片所在节点
    优势:客户端不须要存储分片METADATA,
    缺点:请求roundtrip时间可能变长
  • 单独的路由层负责接收客户端请求并转发,路由层须要了解分片存储METADATA
    优势:客户端不须要存储分片METADATA,
    缺点:请求roundtrip时间可能变长
  • 客户端存储分片METADATA并直接路由到新节点
    优势:直接路由, 速度快
    缺点:客户端须要感知分片topology变化elasticsearch

    客户端感知路由变化是一个挑战性的问题. (网络延迟/分区等), 须要分布式一致性协议,或者用集中式路由METADATA存储如zookeeper等分布式

并行QUERY执行:

分析型数据库须要将复杂的QUERY分解成可多个并发执行的分片和阶段,构成一个有向无环图ide

其余:通常SHARDING和REPLICATION会一块儿使用,一个分片会保存在多个服务器上一致性HASH: 主要解决CDN网络随机选择分片边界而不须要一个集中式的一致性协议,通常不太适合使用于数据库

相关文章
相关标签/搜索