分布式系统-分区(partition)

分区(Partition)

什么是分区?node

分区主要是为了可扩展性。不一样的分区能够放在不共享集群中的不一样节点上mysql

为何要分区?sql

  • 提高系统的扩展性
  • 提高系统的可用性(节点故障只会引发一部分数据丢失)

*水平分区与垂直分区

图

水平切分经常使用于分布式系统数据库

  • 不存在单库数据量过大、高并发的性能瓶颈,提高系统稳定性和负载能力
  • 应用端改造较小,不须要拆分业务模块

垂直切分经常使用于DBMSbash

  • 解决业务系统层面的耦合,业务清晰
  • 与微服务的治理相似,也能对不一样业务的数据进行分级管理、维护、监控、扩展等
  • 高并发场景下,垂直切分必定程度的提高IO、数据库链接数、单机硬件资源的瓶颈
Synonymes(同义词)

分区partition在不一样数据库有不一样的称谓数据结构

  • Shard [分片] MongoDB,Elasticsearch
  • Region[区域] HBase
  • tablet[表块] BigTable
  • vnode [虚节点] Cassandra,Riak

分区与复制

分区一般与复制结合使用,使得每一个分区的副本存储在多个节点上。 这意味着,即便每条记录属于一个分区,它仍然能够存储在多个不一样的节点上以得到容错能力。 并发

pic

键值数据的分区

分区目标是将数据和查询负载均匀分布在各个节点上。若是每一个节点均匀分享数据和负载,那么理论上10个节点应该可以处理10倍的数据量和10倍的单个节点的读写吞吐量。负载均衡

两个概念 skew&hot spot
  • skew:一些分区比其余分区有更多的数据或查询,咱们称之为偏斜
  • hot spot:不均衡致使的高负载的分区被称为热点
根据键的范围分区(Range Partitioning)

一种分区的方法是为每一个分区指定一块连续的键范围(从最小值到最大值)分布式

mysql range partition为例,建立一个employees微服务

CREATE TABLE employees (
    id INT NOT NULL,
    fname VARCHAR(30),
    lname VARCHAR(30),
    hired DATE NOT NULL DEFAULT '1970-01-01',
    separated DATE NOT NULL DEFAULT '9999-12-31',
    job_code INT NOT NULL,
    store_id INT NOT NULL
)
PARTITION BY RANGE (store_id) (
    PARTITION p0 VALUES LESS THAN (6),
    PARTITION p1 VALUES LESS THAN (11),
    PARTITION p2 VALUES LESS THAN (16),
    PARTITION p3 VALUES LESS THAN (21)
);
复制代码

能够看到store_id = 1~5被分到p0分区,6-11被分到p2分区,而后依次类推

range partition的优缺点

  • 支持范围查询,好比按照时间散列
  • load skew
根据键的散列分区

hash partition 哈希散列

  • Map the (skewed) range of keys to a uniformly distributed range of hashes

一致性hash

上篇文章已经介绍过一致性hash的内容了,再也不赘述。

分片与次级索引

基于文档的分区(document-based)和基于关键词(term-based)的分区。

local index

Every partition manages its own index with all pointers to local data items

  • Vertically(垂直) partitioned index
  • Insert/update/delete: performed locally
  • Select: queries all partition indexes

适用于OnLine Transaction Processing(联机事务处理过程)

global index

Index entries are partitioned by their key independently from local data items

  • Horizontally partitioned index
  • Insert/update/delete: require remote updates
  • Select: queries only one partition index

适用于OnLine Analytical Processing(分析处理过程)

分区再平衡

Things change:

  • Query load → add more CPUs
  • Data size → add more disks and RAM
  • Nodes fail → other nodes need to take over
  • Require to move data around (rebalancing)!
反面教材 hash mod N

若是n改变了,那么对于mod n的数值也会随着变动 好比:

123456 % 10 = 6, 123456 % 11 = 3, 123456 % 12 = 0,

固定数量的分区

若是一个节点被添加到集群中,新节点能够从当前每一个节点中窃取一些分区,直到分区再次公平分配

动态分区
  • 建立一些初始分区数
  • 若是分区超过某个最大大小阈值,将其拆分开来
  • 若是分区小于最小的阈值,将其合并

相似于B树数据结构

按节点比例分区

请求路由

如今咱们已经将数据集分割到多个机器上运行的多个节点上。可是仍然存在一个未解决的问题。当客户端想要发出请求时,如何知道要链接哪一个节点?随着分区从新平衡,分区对节点的分配也发生变化。

这个问题能够归纳为 服务发现(service discovery)

  • 循环策略的负载均衡(Round-Robin Load Balancer)若是节点刚好有请求的分区,则直接处理,不然转发到适当的节点
  • 首先将全部来自客户端的请求发送到路由层,它决定了应该处理请求的节点,并相应地转
  • 要求客户端知道分区和节点的分配

许多分布式数据系统都依赖于一个独立的协调服务,好比ZooKeeper来跟踪集群元数据。每一个节点在ZooKeeper中注册本身,ZooKeeper维护分区到节点的可靠映射。

CassandraRiak采起不一样的方法:他们在节点之间使用流言协议(gossip protocol) 来传播群集状态的变化。请求能够发送到任意节点,该节点会转发到包含所请求的分区的适当节点

相关文章
相关标签/搜索