一、分布式数据库集群角色分配算法需求
一般分布式数据库自动化安装过程中,需要将不同角色安装到不同的服务器中
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
浙公网安备 33010602011771号