Citus 官方的dcoker demo 使用了membership-manager 进行节点的自动发现注册以及自动移除
同时demo 官方也放在了github 中,原理很简单,以下就是一个简单的说明
代码地址
https://github.com/citusdata/membership-manager
核心代码文件
manager.py
代码说明
原理上是通过连接docker 的unix socket 并监听时间,基于label 进行类型识别,同时进行worker注册
以及移除
- 事件监听以及代码处理
def docker_checker():
client = docker.DockerClient(base_url='unix:///var/run/docker.sock')
actions = {'health_status: healthy': add_worker, 'destroy': remove_worker}
# creates the necessary connection to make the sql calls if the master is ready
conn = connect_to_master()
# introspect the compose project used by this citus cluster
my_hostname = environ['HOSTNAME']
this_container = client.containers.get(my_hostname)
compose_project = this_container.labels['com.docker.compose.project']
# we only care about worker container health/destroy events from this cluster
print("found compose project: %s" % compose_project, file=stderr)
filters = {'event': list(actions),
'label': ["com.docker.compose.project=%s" % compose_project,
"com.citusdata.role=Worker"],
'type': 'container'}
# touch a file to signal we're healthy, then consume events
print('listening for events...', file=stderr)
open('/manager-ready', 'a').close()
for event in client.events(decode=True, filters=filters):
worker_name = event['Actor']['Attributes']['name']
status = event['status']
说明,对于不同事件的处理,通过了配置字典提供不同的action
add_worker:
实际上就是调用函数SELECT master_add_node(%(host)s, %(port)s)
remove_worker:
这个处理的就比较简单粗暴了,具体就是移除关于此worker 的数据分片原数据,然后调用函数
SELECT master_remove_node(%(host)s, %(port)s)
移除节点
删除分片原数据配置DELETE FROM pg_dist_placement WHERE groupid = (SELECT groupid FROM pg_dist_node WHERE nodename ='' AND nodeport = '' LIMIT 1);
说明
以上是对于membership-manager 原理的一个简单说明,可以加深下对于Citus 的一些理解,实际上官方文档提供了
比较全的说明,学习这些比较重要,是处理citus 灾备的方法支撑(除非购买企业版)
参考资料
https://github.com/citusdata/membership-manager/blob/master/manager.py
http://docs.citusdata.com/en/v9.2/admin_guide/cluster_management.html