分片/分区和副本
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 阅读(31) 评论(0) 编辑 收藏 举报