Silentdoer

导航

分片/分区和副本

slot也有分区的意思;(redis里)

这是两个很重要的概念,新的存储中间件如ES、Kafka、MongoDB等都用了这两种技术;

分片/分区是实现数据分流的重要手段,也是实现动态扩容的重要手段;

而副本则是冗余数据实现高可用

而数据具体是放哪个分片则是通过路由来实现,kafka它要求所有的数据都有一个key,根据key来路由;

 

假设一个数据服务集群有三个节点+路由节点构成(可能叫客户端节点),然后又配置了6个分区和两个副本(包括主副本)

那么均衡的说,是每个节点都有两个主分片和两个备份分片(备份副本);所有节点加起来有12个分区/分片;

我们先假设6个数据分片分别是分片1/2/3/4/5/6,节点1有分区1/2,节点2有分区3/4,节点3有分区5/6

当我们提交数据的时候是提交到路由节点,路由节点根据数据的key路由得到它是保存在分片4上,然后再找出分片4是节点2来处理,因此会把数据发给节点2去处理;

节点2将数据保存在分区4上;

 

而副本似乎应该再有3个备份节点?还是直接复用这三个主数据节点?

我们假设是复用主节点,则要求节点1挂了还有其他节点可以有分片1/2的数据,因此可以这样:

节点1有节点3的分片5/6的数据,节点2有节点1的分片1/2的数据,节点3有节点2的分片3/4的数据;

所以数据结构是这样:

节点一有分片1/2的主数据,分片5/6的副本

节点二有分片3/4的主数据,分片1/2的副本

节点三有分片5/6的主数据,分片3/4的副本

这样就实现了高可用,比如节点1挂了,仍然有节点2可以提供分片1/2的数据;

 

当然最好还是六个数据节点,其中三个专门做冗余,毕竟数据同步入库也是一个耗资源的操作。

 

这里还有一个问题就是:

怎么实现动态扩容呢?比如我加了两台数据节点(和两台数据冗余节点),这个感觉好像很难动态路由到新的节点上?

举个例子,之前是根据求模的方式,如之前是只有3个节点,所以分母是3;其实key是1/2/3的就分别到了节点2,节点3,节点1上(求模值+1);

现在是五个节点,分母是5了,然后又来了key是3的数据,这个时候它按之前的路由算法就是应该在节点4上而非节点1上了,那之前保存在节点1的数据是会自动迁移?

posted on 2023-12-04 10:58  Silentdoer  阅读(16)  评论(0编辑  收藏  举报