You are viewing a plain text version of this content. The canonical link for it is here.
Posted to reviews@iotdb.apache.org by GitBox <gi...@apache.org> on 2022/05/24 12:26:36 UTC

[GitHub] [iotdb] leety1228 commented on issue #6004: ConfigNode and DataNode Scaling

leety1228 commented on issue #6004:
URL: https://github.com/apache/iotdb/issues/6004#issuecomment-1135855379

   ConfigNode
   1.ConfigNode多节点初始启动设计
   (1)启动参数
            启动参数target_confignode指向自身。
   (2)方案设计
          1)调用start-confignode.sh启动ConfigNode进程;
          2)调用checkGlobalConfig()互相检查 iotdb-confignode.properties 的关键参数,若不一致,全部启动失败;
          3)调用isFisrtStart()检查confignode-system.properties文件是否存在,若存在,则执行重启相关步骤;
          4)若不存在,则认为该ConfigNode是第一次启动,需要初始化,创建confignode-system.properties文件;
          5)调用isSeedConfigNode()判断target_confignode是否指向自身,若不指向自身,则执行执行扩容相关步骤;
          6)若指向自身,则将iotdb-confignode.properties 的关键参数持久化到confignode-system.properties文件中,持久化只包含自己的confignode_list参数;
          7)target_confignode请求建立PartitionRegion;
          8)根据共识协议和状态机构建共识层,调用addConsensusGroup()加入 ConfigNodeGroup,全体成员都更新confignode_list;
          9)若updateConfigNodeList失败,target_confignode返回APPLY_CONFIGNODE_FAILED状态码,ConfigNode初始化失败;
          10)若updateConfigNodeList成功,target_confignode 返回SUCCESS_STATUS状态;
          11)ConfigNodeGroup启动成功,对外提供服务。
   
   2.ConfigNode扩容设计
   (1)启动参数
            启动参数target_confignode指向其它节点。
   (2)方案设计
         1)调用start-confignode.sh脚本初始化ConfigNode进程。
         2)调用isFirstStart()检查confignode-system.properties文件是否存在。
              a. 若存在,则证明ConfigNode是重启操作;
              b. 若不存在,则证明ConfigNode是第一次启动,需要创建confignode-system.properties文件
         3)向target_confignode发送registerConfigNode请求,target_confignode调用isLeader()判断当前节点是否ConfigNode的Leader节点,若不是则将请求转发给Leader节点。
              a. 若几次重试后仍无法连接至target_confignode,ConfigNode初始化失败,结束
              b. ConfigNode的Leader节点比较关键参数的一致性,若不一致,ConfigNode初始化失败
              c. ConfigNode的Leader节点返回当前ConfigNodeGroup全体成员信息
         4)调用writeSystemProperties()将iotdb-confignode.properties文件内的关键参数持久化至confignode-system.properties文件中。
              a. 持久化ConfigNode的Leader节点返回的confignode_list
         5)根据ConfigNode的Leader节点返回的成员信息建立PartitionRegion,并调用addConsensusGroup()加入ConfigNodeGroup。
              a. 新节点的PartitionRegion根据共识层日志追赶各类持久化数据(依靠共识组日志实现最终一致性,ConfigNode无须等待此过程)
         6)向ConfigNode的Leader节点发送applyConfigNode请求
               a. 若几次重试后仍无法连接至ConfigNode的Leader节点,ConfigNode初始化失败,结束
               b. ConfigNode的Leader节点通过addPeer请求通知PartitionRegion,有新的ConfigNode希望加入 ConfigNodeGroup
                    i. 若addPeer失败,ConfigNode的Leader节点返回APPLY_CONFIGNODE_FAILED状态码,ConfigNode初始化失败
                    ii. PartitionRegion命令当前ConfigNodeGroup的全体成员执行addPeer请求(依靠共识组日志实现最终一致性,target_confignode无须等待此过程)
               c. ConfigNode的Leader节点通过PartitionRegion执行写操作updateConfigNodeList,以保证 ConfigNodeGroup全体成员都更新confignode_list
   		i. 若updateConfigNodeList失败,ConfigNode的Leader节点返回APPLY_CONFIGNODE_FAILED 状态码,ConfigNode初始化失败
   		ii. PartitionRegion命令当前ConfigNodeGroup的全体成员执行updateConfigNodeList请求(依靠共识组日志实现最终一致性,target_confignode无须等待此过程)
              d. ConfigNode的Leader节点返回SUCCESS_STATUS状态码
         7)ConfigNode初始化成功,对外提供服务
   
   3.ConfigNode缩容设计
         1)执行remove-confignode.sh脚本,并发送删除实例请求到ConfigNode的Leader节点;
   	    a.若连接ConfigNode的Leader节点失败,则删除实例失败,结束
         2)ConfigNode的Leader节点首先检查Cluster中是否满足ConfigNode节点至少为一个的条件,若不满足,则直接删除实例失败;
         3)若满足条件,则ConfigNode的Leader节点广播给所有DataNode有一个ConfigNode节点申请remove,DataNode的所有请求将不能再发送给待remove的ConfigNode节点;
         4)为防止Leader切换问题,调用isLeader()判断当前待删除节点是否为Leader,若是,则调用startElection()重新选举,并将remove请求转发给新的Leader节点,执行步骤7;
         5)若待删除节点不是ConfigNode的Leader节点,则Leader利用raft的共识能力,发送removeConfigNode请求;
               a. 若几次重试后仍无法请求连接共识层,ConfigNode删除实例失败,结束
               b.若removePeer()失败,Leader返回REMOVE_ CONFIGNODE_FAILED状态,删除ConfigNode失败;
               c. PartitionRegion命令当前ConfigNodeGroup的全体成员执行removePeer();
         6)此时Leader会查看删除实例是否完成,等ConfigNode角色自杀后,Leader节点广播给所有DataNode节点remove完成;
         7)等所有待删除节点remove完成后,返回SUCCESS_STATUS状态给Manager,删除实例完成。
   
   


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: reviews-unsubscribe@iotdb.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org