ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

第六章:数据分区

第六章:数据分区 第六章数据分区这一章紧接着第五章讨论数据如何拆分到多台机器上。第五章的复制是同一份数据放多份第六章的分区是不同数据放不同机器。Kleppmann 的核心论点是分区是水平扩展的基本手段但如何分区、如何再平衡、如何路由请求决定了系统的可扩展性和复杂度。本章结构先讲分区策略键区间 vs 哈希再讲二级索引的分区最后讲再平衡与请求路由。一、为什么需要分区分区Partitioning也叫分片Sharding指把大数据集拆分成多个小数据集分布到不同节点上。动机单机存储容量有限单机吞吐有限分区后可以并行处理与复制的关系分区不同数据放不同节点解决容量和吞吐复制同一数据放多个节点解决可用性和延迟实际系统通常两者结合每个分区有多个副本目标数据均匀分布避免热点查询高效减少跨分区可扩展增加节点能提升容量二、键值数据的分区1. 键区间分区Partitioning by Key Range方式按 key 的连续区间划分如A-F 在分区 1G-M 在分区 2等等每个分区内 key 有序优点范围查询高效相邻 key 在同一分区一次读取即可分区内有序支持排序缺点热点问题如果 key 分布不均某些分区可能过载例子按时间戳分区写入总是集中在最新分区应对热点不用时间戳直接做 key而是加前缀如sensor_id timestamp但这样就丧失了按时间范围查询的能力代表HBase、Bigtable、RethinkDBMongoDB早期版本2. 哈希分区Partitioning by Hash of Key方式对 key 计算哈希按哈希值分区如hash(key) % n决定分区优点均匀分布哈希打散 key避免热点适合随机读写缺点范围查询低效相邻 key 哈希后可能在不同分区需要扫描所有分区解决方案复合键用(key, timestamp)做哈希但排序键用 timestamp这样既均匀分布又支持范围查询代表Cassandra代表Cassandra、DynamoDB、RiakMongoDB新版本3. 两种策略对比维度键区间分区哈希分区数据分布可能不均均匀范围查询高效低效热点容易产生较少排序支持不支持代表HBase、BigtableCassandra、DynamoDBKleppmann 的结论没有完美方案。键区间分区适合范围查询哈希分区适合均匀负载。实际系统常用复合键兼顾两者。三、分区与二级索引二级索引的分区比主键分区更复杂因为索引通常不唯一。1. 按文档分区Partitioning by Document也叫本地索引Local Index。方式每个分区维护自己的二级索引索引只覆盖本分区的数据查询时需要分散-聚集Scatter/Gather查所有分区合并结果优点写入简单只更新本分区索引分区独立缺点读取慢需要查所有分区尾延迟高最慢的分区决定整体代表MongoDB、Cassandra、Elasticsearch2. 按词条分区Partitioning by Term也叫全局索引Global Index。方式索引按词条分区而非按文档如所有 “apple” 的文档 ID 在一个分区查询时只需查对应分区优点读取快只查一个分区适合读多写少缺点写入复杂一次写入可能影响多个分区需要分布式事务或异步更新代表早期 DynamoDB一些搜索引擎3. 两种方式对比维度按文档分区按词条分区索引位置每个分区本地全局按词条写入简单复杂读取慢分散-聚集快尾延迟高低代表MongoDB、ESDynamoDB四、分区再平衡Rebalancing再平衡指在节点增减时把数据从旧节点迁移到新节点保持均匀分布。1. 再平衡的要求负载均匀迁移量小迁移期间可用不中断服务2. 再平衡策略1固定分区数Fixed Number of Partitions创建远超节点数的分区如 1000 个分区10 个节点每个节点负责多个分区增减节点时迁移整个分区优点简单迁移量可控代表Riak、Elasticsearch、Couchbase2动态分区Dynamic Partitioning分区数随数据量动态调整分区太大就分裂太小就合并优点适应数据增长缺点分裂/合并有开销代表HBase、RethinkDB3按节点比例分区Partitioning Proportionally to Nodes分区数固定每个节点负责固定数量分区节点数变化时分区重新分配代表Cassandra3. 自动 vs 手动再平衡自动系统自动检测并迁移优点省事缺点可能误判迁移风暴手动运维触发优点可控缺点需要人工介入Kleppmann 建议自动再平衡要谨慎最好有人工确认环节避免自动变成自动出问题。五、请求路由Request Routing分区后客户端如何知道该连哪个节点1. 三种路由方式1客户端直接连客户端知道分区和节点映射直接连对应节点简单但客户端要维护映射2路由层Routing Tier客户端连路由层路由层转发路由层知道分区映射代表ZooKeeper、etcd 协调3任意节点转发客户端连任意节点节点负责转发节点之间知道映射代表Cassandra、Riak2. 分区映射的协调关键问题谁维护分区 → 节点的映射ZooKeeper / etcd集中式协调HBase、Kafka 用Gossip 协议去中心化Cassandra、Riak 用元数据服务如 MongoDB 的 config server3. 请求路由的挑战映射变化时如何通知所有节点网络分区时如何保证一致性这直接引出第九章一致性与共识六、本章的核心思想总结主题核心观点分区动机水平扩展突破单机容量和吞吐键区间分区范围查询高效但易热点哈希分区均匀分布但范围查询低效复合键兼顾均匀和范围查询二级索引按文档分区写简单读慢vs 按词条分区读快写复杂再平衡固定分区数、动态分区、按节点比例请求路由客户端、路由层、任意节点转发三个贯穿全书的判断分区是水平扩展的核心没有分区就无法突破单机限制。分区策略决定查询能力键区间支持范围查询哈希支持均匀负载复合键兼顾。再平衡和路由是分区系统的运维难点自动化要谨慎协调服务是关键。七、这一章在全书中地位第六章是分布式数据的关键一环第五章数据复制分区通常与复制结合每个分区有多个副本第七章事务跨分区事务是分布式事务的难点第八章分布式系统挑战再平衡和路由涉及网络、时钟、共识第九章一致性与共识分区映射的协调需要共识算法第十章批处理分区是并行处理的基础一句话概括本章数据分区是水平扩展的基本手段。键区间分区适合范围查询但易热点哈希分区均匀但丧失范围查询复合键兼顾两者。二级索引的分区有按文档和按词条两种策略各有取舍。再平衡和请求路由是分区系统的运维核心需要谨慎设计和协调服务支持。
返回列表