Partition
)什么是分区?node
分区主要是为了可扩展性。不一样的分区能够放在不共享集群中的不一样节点上mysql
为何要分区?sql
水平切分经常使用于分布式系统数据库
垂直切分经常使用于DBMS
bash
分区partition
在不一样数据库有不一样的称谓数据结构
Shard
[分片] MongoDB
,Elasticsearch
Region
[区域] HBase
tablet
[表块] BigTable
vnode
[虚节点] Cassandra
,Riak
分区一般与复制结合使用,使得每一个分区的副本存储在多个节点上。 这意味着,即便每条记录属于一个分区,它仍然能够存储在多个不一样的节点上以得到容错能力。 并发
分区目标是将数据和查询负载均匀分布在各个节点上。若是每一个节点均匀分享数据和负载,那么理论上10个节点应该可以处理10倍的数据量和10倍的单个节点的读写吞吐量。负载均衡
skew
&hot spot
skew
:一些分区比其余分区有更多的数据或查询,咱们称之为偏斜hot spot
:不均衡致使的高负载的分区被称为热点一种分区的方法是为每一个分区指定一块连续的键范围(从最小值到最大值)分布式
拿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
的内容了,再也不赘述。
基于文档的分区(document-based
)和基于关键词(term-based
)的分区。
local index
Every partition manages its own index with all pointers to local data items
适用于OnLine Transaction Processing(联机事务处理过程)
global index
Index entries are partitioned by their key independently from local data items
适用于OnLine Analytical Processing(分析处理过程)
Things change:
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
维护分区到节点的可靠映射。
Cassandra
和Riak
采起不一样的方法:他们在节点之间使用流言协议(gossip protocol
) 来传播群集状态的变化。请求能够发送到任意节点,该节点会转发到包含所请求的分区的适当节点