跳至主要內容

Klustron(原KunlunBase) cluster_mgr 集群管理

Klustron大约 4 分钟

Klustron(原KunlunBase) cluster_mgr 集群管理

1 需求背景

Klustron cluster_mgr 作为 Klustron 的集群管理系统,实现 Klustron 集群高可用(即 fullsync HA,以后台服务形式自动运行)保障, 以 API 形式提供集群管理服务(集群安装和卸载、集群节点启停、增删计算节点和存储节点、增删 storage shard、物理和逻辑备份恢复、扩缩容、repartition,集群节点运行状态监控和拉起)以及以后台自动服务的形式,在集群事务处理过程中发生节点故障后的部分故障恢复工作。这些功能都要求 cluster_mgr 具有实时以及高可用等特性,确保 cluster_mgr 持续提供集群管理服务,以便确保 Klustron 集群不间断对外提供服务。因此Klustron 团队基于 braft 现 cluster_mgr 集群高可用功能,该功能不仅可以确保 cluster_mgr 集群主节点宕机后自动选出新主节点持续提供 cluster_mgr 的各项服务,还允许用户(DBA)在不停 cluster_mgr 服务情况下,完成节点所在机器故障替换以及调整cluster_mgr集群节点数目等操作。目前 cluster_mgr 集群提供手动主备切换,添加/删除 cluster_mgr 节点等操作功能。

2 实现原理

2.1 cluster_mgr 集群手动主备切换

cluster_mgr 接受业务发送 http 请求,解析请求参数以及参数校验等操作,然后调用底层 braft api 接口发起 transfer_leader 命令。通过 braft rpc 接口将请求转发到当前leader节点,leader节点根据请求参数进行操作。

2.1.1 如果要切换到目标节点为当前 leader 节点,直接返回成功

2.2.2 如果要切换到目标节点非当前 leader 节点,根据当前 braft 状态机中记录 braft log 加载位置,发送 rpc 命令到目标节点让其加载 braft log 该位置,并设置超时时间。如果加载到指定位置,则返回成功。当前 leader 节点自动降级为 follower,并将目标节点提升为 leader 。

2.2 cluster_mgr 集群添加节点

cluster_mgr 接受业务发送 http 请求,解析请求参数以及参数校验等操作,然后调用底层 raft api 接口发起 add_peer 命令。通过 braft rpc 接口将请求转发到当前 leader 节点,leader 节点根据请求参数进行操作。

2.2.1 通过 rpc 连接要添加节点braft 端口

2.2.2 将要添加节点 ip:port 信息添加 braft configuration 中

2.2.3 要添加节点通过 snapshot+ 增量 raft log 方式同步数据

2.3 cluster_mgr 集群删除节点

cluster_mgr 接受业务发送 http 请求,解析请求参数以及参数校验等操作,然后调用底层 braft api 接口发起 remove_peer 命令。通过 braft rpc 接口将请求转发到当前 leader 节点,leader 节点根据请求参数进行操作。

2.3.1 通过rpc连接要删除节点braft 端口

2.3.2 将要删除节点ip:port信息从braft configuration中删除

3 配置使用

为了便于业务操作,cluster_mgr api 接口来进行集群管理

3.1 手动主备切换

curl -d '

{

  "version":"1.0",

  "job_id":"",

  "job_type":"raft_mission",

  "timestamp":"1435749309",

  "user_name":"kunlun_test",

  "paras":{

    "task_type":"transfer_leader",

    "target_leader":"127.0.0.1:59001"

  }

}

' -X POST http://127.0.0.1:58000/HttpService/Emit

该接口为异步接口,返回job_id,根据返回的job_id查询任务执行状态。

curl -d '

{

  "version":"1.0",

  "job_id":"10",

  "job_type":"get_status",

  "timestamp":"1435749309",

  "user_name":"kunlun_test",

  "paras":{

  }

}

' -X POST http://127.0.0.1:58000/HttpService/Emit

3.2 添加节点

用户需要在新节点机器上,配置好 cluster_mgr.cnf 文件,raft_group_member_init_config 中就需要包括当前集群各机器ip:port,同时加上新增机器的 ip:port。然后启动 cluster_mgr 进程。新节点上 cluster_mgr 一直尝试发起选主操作,由于当前运行集群中没有新节点 cluster_mgr 信息,则集群其他节点直接应答拒绝。需要调用 cluster_mgr 添加节点 api,将该节点加入当前运行集群。

curl -d '

{

  "version":"1.0",

  "job_id":"",

  "job_type":"raft_mission",

  "timestamp":"1435749309",

  "user_name":"kunlun_test",

  "paras":{

    "task_type":"add_peer",

    "peer":"127.0.0.2:59001"

  }

}

' -X POST http://127.0.0.1:58000/HttpService/Emit

该接口为异步接口,返回 job_id,根据返回的 job_id 查询任务执行状态。

curl -d '

{

  "version":"1.0",

  "job_id":"10",

  "job_type":"get_status",

  "timestamp":"1435749309",

  "user_name":"kunlun_test",

  "paras":{

  }

}

' -X POST http://127.0.0.1:58000/HttpService/Emit

3.3 删除节点

用户发起删除节点后,被删除节点就不在当前集群中,直接停掉cluster_mgr进程就可以直接下线该机器。

curl -d '

{

  "version":"1.0",

  "job_id":"",

  "job_type":"raft_mission",

  "timestamp":"1435749309",

  "user_name":"kunlun_test",

  "paras":{

    "task_type":"remove_peer",

    "peer":"127.0.0.2:59001"

  }

}

' -X POST http://127.0.0.1:58000/HttpService/Emit

该接口为异步接口,返回 job_id,根据返回的 job_id 查询任务执行状态。

curl -d '

{

  "version":"1.0",

  "job_id":"10",

  "job_type":"get_status",

  "timestamp":"1435749309",

  "user_name":"kunlun_test",

  "paras":{

  }

}

' -X POST http://127.0.0.1:58000/HttpService/Emit

特别强调:

添加/删除节点,cluster_mgr 只是涉及到 braft 内存 configuration 配置的更新。cluster_mgr 配置文件中raft_group_member_init_config 配置项没有更新,需要人工登录机器手动修改。不需要重启 cluster_mgr 进程,当 cluster_mgr 重启后会自动加载修改后配置文件。

END