一、分布式数据库集群角色分配算法需求

一般分布式数据库自动化安装过程中,需要将不同角色安装到不同的服务器中

1、服务器与角色

比如,笔者有四台服务器,需要将MongoDB集群安装到这四台服务器,需要四个分片,那么每台服务器都要有一个副本集的主节点,每个分片是主-从-仲裁的副本集结构,那么如何进行划分呢

注:在集群中,一个副本集=集群的一个分片

服务器

ch01 192.168.1.11
ch02 192.168.1.12
ch03 192.168.1.13
ch04 192.168.1.14

 

MongoDB集群角色(一个副本集)

primary 主节点
secondry 从节点
arbiter 仲裁节点

 

2、服务器与角色划分

服务器+角色划分

 ch01 ch02 ch03 ch04
sh0-primary sh0-secondry sh0-arbiter sh1-arbiter
sh2-arbiter sh1-primary sh1-secondry sh2-secondry
sh3-secondry sh3-arbiter sh2-primary sh3-primary

通过上面的划分思路,那么每台服务器上面有三个mongodb节点,可以先安装好这些节点,最后将角色初始化。

二、划分算法

1、服务器副本集划分

一个副本集有三台不同服务器构成,那么同一副本集主、从、仲裁就要分不到不同的三台服务器。

同时,有几台服务器就要有几个副本集。

示例中有四台服务器,那么就要有四个副本集,根据(一)中的划分思路,将思路转化为python代码

host=['ch01','ch02','ch03','ch04']

for i in range(len(host)):
    rplist = host[i:3+i]
    rlen = len(rplist)
    if rlen < 3:
        rplist = ['sh' + str(i)] + rplist + host[:3-int(rlen)]
        print(rplist)
    else:
        print(['sh' + str(i)] + rplist)

for i in range(len(host)):
    rplist = host[i:3+i]
    rlen = len(rplist)
    if rlen < 3:
        rplist = rplist + host[:3-int(rlen)]
        print(rplist)
    else:
        print( rplist)

 

2、MongoDB副本集角色划分

host=['ch01','ch02','ch03','ch04']

role = ['P','S','A']
for i in range(len(host)):
    rplist = host[i:3+i]
    rlen = len(rplist)
    if rlen < 3:
        rplist = list(zip(role,rplist + host[:3-int(rlen)]))
        print(rplist)
    else:
        print(list(zip(role, rplist)))

这样,副本集划分与角色划分都已完成

三、无角色的集群配置

1、clickhouse配置

ch不需要角色配置,只需要分片,相同分片使用相同的端口,每个分片三个实例组成,相同分片的不同实例放到不同服务器中

host=['ch01','ch02','ch03','ch04']
port = ['9001','9002','9003','9004']
rplist_all = []
for i in range(len(host)):
    rplist = host[i:3+i]
    rlen = len(rplist)
    if rlen < 3:
        rplist = list(rplist + host[:3-int(rlen)])
        rplist_all.append(rplist)
    else:
        rplist_all.append(rplist)

print(dict(zip(port,rplist_all)))

 

 posted on 2022-10-08 15:56  xibuhaohao  阅读(101)  评论(0)    收藏  举报