首页 > 技术文章 > Citus 官方docker demo 中membership-manager原理简单说明

rongfengliang 2020-03-08 20:19 原文

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

推荐阅读