增加 DataNode


每个 DataNode 是独立加入集群的,不相互依赖,只依赖 ConfigNode。


启动脚本:add-dnode.sh


配置项:iotdb-datanode.properties 

  • hostname
  • 单机配置项
  • Coordinator 服务端口
  • 共识协议服务端口
  • ConfigNode 列表 List<hostname:clusterPort>(不需要写全,DataNode 能够访问一个活跃的 ConfigNode 即可)


启动流程

  • 读取本地数据信息(VSG/MManager)
  • 向  ConfigNode 汇报本节点硬件信息和数据负载,加入集群并检查 DataNode 内的数据是否有效,ConfigNode 进行如下检查
    • ConfigNode 识别该 DataNode 是否已在集群中
      • 如果不在集群中,进行扩容操作,调整每个存储组的最大 VSG 个数,改为当前集群总核数/副本数,并创建新的 VSG
      • 如果已在集群中,记录节点信息
    • 触发负载均衡策略
  • 如果本节点的 VSG/MManager 已在某共识组内且有效,恢复共识组,并向 ConfigNode 汇报恢复的共识组


停掉 DataNode


停机流程


  • 向 ConfigNode 共识组汇报此 DataNode A 即将停机
  • ConfigNode 记录此信息,后续请求避免路由到此节点
  • 此 DataNode 共识组记录此信息
  • 如果 DataNode A 为 Leader,则将 Leader 迁移到另一台 DataNode B
  • DataNode A 进程退出


移除 DataNode


移除流程


用户操作:通过客户端向集群发送命令,指定删除某节点

实现目标:尽量少重复执行删除命令


分区表使用 Raft 共识的移除流程

  • 客户端连接的 DataNode 向 ConfigNode 汇报删除节点操作
  • ConfigNode 检查集群节点数是否大于副本数,如果不大于,返回禁止删除
    • >= 3 副本时
      • ConfigNode 通过 Raft 日志记录移除开始日志,返回客户端
      • ConfigNode 通过 Raft 日志记录执行此移除命令
        • ConfigNode 检查是否有移除结束日志,以及本节点是否为 leader
        • 对于被删除节点的每个 VSG
          • ConfigNode 通过 Raft 日志记录此 VSG 共识组的变更开始日志
          • ConfigNode 执行此 VSG 共识组的变更开始日志
            • ConfigNode 检查是否有变更结束日志,以及本节点是否为 leader
            • ConfigNode 为此 VSG 共识组新增一个 VSG(分配一个节点),数据迁移,并删除失效 VSG
            • ConfigNode 通过 Raft 日志记录此 VSG 共识组的变更结束日志
        • ConfigNode 通过 Raft 日志记录此移除命令结束
    • 2 副本时
      • ConfigNode 通过 Raft 日志记录此移除命令
      • 对于被删除节点的每个 VSG
        • ConfigNode 通过 Raft 日志记录此 VSG 共识组的变更开始日志
        • ConfigNode 执行此 VSG 共识组的变更开始日志
          • ConfigNode 检查是否有变更结束日志,以及本节点是否为 leader
          • ConfigNode 为此 VSG 共识组新增一个 VSG(分配一个节点),数据迁移,并删除失效的 VSG
          • ConfigNode 通过 Raft 日志记录此 VSG 的变更结束日志
      • 返回客户端


  • No labels

1 Comment

  1. 另一个文章里面提到数据迁移和扩容是分开的两步,数据迁移手动执行。

    那么在扩容后,数据迁移前这个阶段,数据读写是怎样的?