何为SHARDING:
将大数据集分为多个块,存储在不一样的服务器上node
目的:
可扩展性: 不一样的分片能够放在不一样的服务器上,分散读请求
复杂查询能够并行的在不一样的分片上执行
写请求分散到各个服务器上算法
问题1: 怎么分?
每一个服务器上数据保持均匀,避免数据倾斜数据库
- 随机分配:
优势: 数据均匀
缺点: 没法知道数据在哪一个节点
- 每一个分片保存主键一个范围内连续键值 (partition by key range)
优势: 容易算出主键在哪一个节点. 主键可有序存储,方便范围搜索
缺点: 每一个分片数据可能不均匀,须要调节分片边界 --> 手动或自动. 主键前缀解决分布问题
- 按主键HASH值分片: (riak, couchbase, voldemort)
优势: 理论上数据均匀,取决于HASH算法. 容易算出数据在哪一个节点
缺点: 难以进行范围搜索
- 混合模式: 联合主键,先按主键第一个属性HASH,再按其余属性有序排列 (cassandra)
适合处理一对多数据
处理数据倾斜和热点键读写:
须要应用层解决: 如对键值增长随机先后缀. 缺点: 同一个键值的数据分散在不一样分片内,增长读取复杂度 问题2: 如何查询数据?
分片策略解决了写和主键查询的问题,可是如何解决其余查询条件查询?如何在数据分片的状况下创建二级索引?服务器
- 本地索引: 每一个分片单独维护二级查询条件到主键列表的字典映射
优势:写数据时更新索引时容易
缺点:查询必须在每一个分片的二级索引中查找,再合并结果
- 全局索引: 一个独立的索引结构覆盖全部分片,索引自己也分片,按照索引对应的查询条件 (term partitioned)
优势:查询索引落到单个分片,效率高,若是采用RANGE分片也支持范围查询
缺点: 写入数据复杂,写操做会影响多个分片(数据分片和索引分片未必在同一个节点), 须要分布式事务支持, 或者采用异步方式,牺牲一致性,新写入的数据未必马上在索引中可见. 问题3: 集群扩容或者有宕机节点分片数据如何处理?
分片数据须要从一个节点迁移到另外一个节点 (partition rebalancing) 网络
数据重平衡需求:
- 迁移后负载必须保持均匀 (集群扩容)
- 迁移中集群必须可用,读写无影响
- 迁移必须最小化没必要要的数据移动,减小集群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网络随机选择分片边界而不须要一个集中式的一致性协议,通常不太适合使用于数据库