Apache IoTDB 分布式架构三部曲(一)集群概念

2c677cfa73f056784148d7f8b793e49e.jpeg

IoTDB 原生分布式架构特点与高效运维指南!

Apache IoTDB 在 1.0 版本推出了全新的原生分布式架构。数据分区存储,具有高可扩展性;多副本存储,无单点故障,具备高可用性;搭配多种一致性协议,可适配不同场景。那么:

IoTDB 分布式架构是什么样的?

我们该如何高效的运用 IoTDB 的分布式能力?

跟随我们一起用三篇文章来解密 IoTDB 分布式相关的细节!

本篇文章将主要介绍 IoTDB 的分布式架构特点,该如何根据需要运维 IoTDB 集群。

01

IoTDB 分布式架构

那么什么是分布式?分布式系统是一组独立的计算机,通过网络进行通信,对外表现为一个统一的整体。

具体到 IoTDB 中,IoTDB 的原生分布式架构将服务分为了两个部分:

  • ConfigNode(简称 C、CN):管理节点,管理分区表和节点信息等,负责整个集群的负载均衡等功能。

  • DataNode(简称 D、DN):数据节点,大致上可以分为五个主要模块:

    • 查询引擎:负责查询语句的解析,分布式查询算子的计算,调度等;

    • 存储引擎:负责面向数据场景特殊优化的类 LSM 引擎时序数据高速写入;

    • 元数据引擎:负责管理元数据,包括内存中的元数据及其持久化;

    • 共识引擎:负责管理多个副本之间的可用性和一致性等;

    • 流处理引擎:负责对实时数据进行高效的抽取,处理和预警等。

4cb26e7a0a57aa2b8c4b2331ed43ac1f.jpeg

该架构图就是常用来举例的 3C3D 集群,即集群中有 3 个 CN,3 个 DN。

在实际使用过程中:

1. CN 一般配置 1 个或者 3 个,CN 只向 DN 提供服务。

2. DN 可以依据业务情况配置至少 1 个(目前 IoTDB 最高有配置 3C100D 的线上环境哦)。

3. Client 可以连接任意一个或多个已经启动的 DN。并且无论是连一个还是多个,都能够读取集群全部的数据,也能够完成任意数据的写入。Client 对于 CN 是无感知的。当 Client 配置连接多个 DN 的时候,连接的部分节点宕机时会完成 Client 无感知的连接切换,不影响写入及查询,实现高可用。

02

集群运维

在了解了 IoTDB 的分布式架构后,让我们以一个 3C3D 集群为例,结合分布式的相关知识,来讲讲该如何高效的运维它。

(1)部署

DN 管理数据需要大量的资源,因此一般推荐多个 DN 部署在不同的节点上。

CN 管理集群内的 CN 和 DN 节点,需要的资源较少,因此可以部署在与 DN 相同的节点上,也可以单独部署在节点上。

以 3C3D 集群为例,一般会部署在 3 台物理机上,每一台机器上部署 1C1D。

修改 hosts 文件,首先需要修改 3 台物理机的 hosts 文件,在 3 台机器上执行:

echo "192.168.132.10 iotdb-1"  /etc/hosts 
echo "192.168.132.11 iotdb-2"  /etc/hosts 
echo "192.168.132.12 iotdb-3"  /etc/hosts

(2)启动

由于 CN 管理集群内的 CN 和 DN 节点,所以需要先于 DN 启动。

所有CN 和 DN 初次启动的时候,都需要向已经启动的 CN 注册信息,即配置 cn_seed_config_node 和 dn_seed_config_node。特殊的,对于第一次启动的第一个 CN,将 cn_seed_config_node 设置成自身即可。

因此一定要保证第一个 CN 启动成功后,再启动其余的 CN 和 DN。

1. 修改配置文件,配置文件在 /data/iotdb/conf 目录下。按照下表修改相应的配置文件:

7eaceb15a51cc274b1d57393c58a2aca.jpeg

2. 启动第一个节点,登录 cn_seed_config_node 节点即 iotdb-1(192.168.132.10) ,执行如下命令:

cd /data/iotdb
# 启动 ConfigNode 服务
sbin/start-confignode.sh

注意:

    a. 要保证第一个节点启动成功后,再启动其他节点。确切的说,要先保证第一个 CN 服务启动成功,即 cn_seed_config_node 配置的节点。

    b. 如果启动失败,需要参照下文,执行清理集群后,再次启动。

3. 启动剩下两个节点的 CN ,在节点 iotdb-2(192.168.132.11) 和 iotdb-3(192.168.132.12) 两个节点上分别执行:

cd /data/iotdb
# 启动 ConfigNode 服务
sbin/start-confignode.sh

4. 启动三个节点的 DN,在三个节点上分别执行:

cd /data/iotdb
# 启动 DataNode 服务
sbin/start-datanode.sh

5. 校验集群状态,使用 Cli 连接任意节点,执行如下操作:

/data/iotdb/sbin/start-cli.sh -h iotdb-1
IoTDB>show cluster;
# 示例结果如下:
+------+----------+-------+---------------+------------+-------+---------+
|NodeID|  NodeType| Status|InternalAddress|InternalPort|Version|BuildInfo|
+------+----------+-------+---------------+------------+-------+---------+
|     0|ConfigNode|Running|    iotdb-1    |       10710|1.x.x  |  xxxxxxx|
|     1|ConfigNode|Running|    iotdb-2    |       10710|1.x.x  |  xxxxxxx|
|     2|ConfigNode|Running|    iotdb-3    |       10710|1.x.x  |  xxxxxxx|
|     3|  DataNode|Running|    iotdb-1    |       10730|1.x.x  |  xxxxxxx|
|     4|  DataNode|Running|    iotdb-2    |       10730|1.x.x  |  xxxxxxx|
|     5|  DataNode|Running|    iotdb-3    |       10730|1.x.x  |  xxxxxxx|
+------+----------+-------+---------------+------------+-------+---------+

(3)停止

由于 DN 负责和客户端(Client)连接,CN 负责管理 CN 和 DN。

因此应该遵从 Client->DN->CN 的关闭顺序。

1. 停止所有的读写业务,即停止客户端连接。

2. 停止所有的 DN,在 3 个节点上,执行如下操作:

# 停止 DataNode 
./sbin/stop-datanode.sh

3. 停止所有的 CN,在 3 个节点上,执行如下操作:

# 停止 ConfigNode
./sbin/stop-confignode.sh

(4)升级

当进行集群升级时,不同版本之间的数据,日志等信息是可以兼容。但是由于新增功能,修复 bug 等原因,相关的 lib 库会更新,同时有时也会更新相应的脚本,因此需要更换 lib 目录和 sbin 目录。

1. 参照上文先执行集群停止操作。

2. 在每一个节点删除 IoTDB 根目录下旧版本的 lib 目录及 sbin 目录:

cd /data/iotdb
rm -rf lib
rm -rf sbin

3. 将新版本的 lib 目录和 sbin 目录移动至 IoTDB 根目录下。

cd /data/iotdb
mv /data/new_iotdb/lib .
mv /data/new_iotdb/sbin .

4. 参照上文执行集群启动操作。

(5)扩容

当提到集群扩容时,我们一般指的是要为了提升 IoTDB 整体的性能,此时一般横向扩展更多的节点并在上面部署 DN。

扩容方式与上方启动其他节点相同。也就是,在要添加的节点上,下载 IoTDB 的安装包,解压,修改配置,然后启动。这里要添加节点的 IP 为 192.168.132.13。

注意:

  • 扩展节点必须是无数据的空节点,即其 data 目录中不能包含任何数据。

  • iotdb-common.properties 中的 cluster_name 的配置必须和已有集群一致。

  • cn_seed_config_node 和 dn_seed_config_node 的配置必须和现有集群保持一致。

  • 已有数据不会自动迁移到新节点,新的元数据和数据会分配到新节点上。

1. 修改配置,在原节点上新增一行 hosts:

echo "192.168.132.13 iotdb-4"  /etc/hosts

在该节点设置 hosts:

echo "192.168.132.10 iotdb-1"  /etc/hosts 
echo "192.168.132.11 iotdb-2"  /etc/hosts 
echo "192.168.132.12 iotdb-3"  /etc/hosts 
echo "192.168.132.13 iotdb-4"  /etc/hosts

2. 按照下表修改相应的配置文件:

a31cfdd2c71e5b45a68abd23c1c3b792.png

3. 扩容,在新增节点 iotdb-4(192.168.132.13) 上,执行:

cd /data/iotdb
# 启动 DataNode 服务
sbin/start-datanode.sh

4. 验证扩容的结果,在 Cli 执行 show cluster,结果如下:

/data/iotdb/sbin/start-cli.sh -h iotdb-1
IoTDB>show cluster;
# 示例结果如下:
+------+----------+-------+---------------+------------+-------+---------+
|NodeID|  NodeType| Status|InternalAddress|InternalPort|Version|BuildInfo|
+------+----------+-------+---------------+------------+-------+---------+
|     0|ConfigNode|Running|    iotdb-1    |       10710|1.x.x  |  xxxxxxx|
|     1|ConfigNode|Running|    iotdb-2    |       10710|1.x.x  |  xxxxxxx|
|     2|ConfigNode|Running|    iotdb-3    |       10710|1.x.x  |  xxxxxxx|
|     3|  DataNode|Running|    iotdb-1    |       10730|1.x.x  |  xxxxxxx|
|     4|  DataNode|Running|    iotdb-2    |       10730|1.x.x  |  xxxxxxx|
|     5|  DataNode|Running|    iotdb-3    |       10730|1.x.x  |  xxxxxxx|
|     6|  DataNode|Running|    iotdb-4    |       10730|1.x.x  |  xxxxxxx|
+------+----------+-------+---------------+------------+-------+---------+

同样的,参考上文的集群启动修改相关配置,用 start-confignode.sh 脚本启动 CN 也能实现 CN 的扩容(一般情况下 CN 的个数达到 3 就能实现高可用,不用扩容到个数大于三个)。

(6)缩容

当提到集群缩容时,也一般指的是减少 DN 的数量,可以移除集群中已启动的 DN:

cd /data/iotdb
# 方式一:使用 ip:port 移除
sbin/remove-datanode.sh iotdb-4:6667


# 方式二:使用节点编号移除, `show cluster`中的 NodeID
sbin/remove-datanode.sh 6

在 Cli 执行 show cluster 验证结果:

+------+----------+-------+---------------+------------+-------+---------+
|NodeID|  NodeType| Status|InternalAddress|InternalPort|Version|BuildInfo|
+------+----------+-------+---------------+------------+-------+---------+
|     0|ConfigNode|Running|    iotdb-1    |       10710|1.x.x  |  xxxxxxx|
|     1|ConfigNode|Running|    iotdb-2    |       10710|1.x.x  |  xxxxxxx|
|     2|ConfigNode|Running|    iotdb-3    |       10710|1.x.x  |  xxxxxxx|
|     3|  DataNode|Running|    iotdb-1    |       10730|1.x.x  |  xxxxxxx|
|     4|  DataNode|Running|    iotdb-2    |       10730|1.x.x  |  xxxxxxx|
|     5|  DataNode|Running|    iotdb-3    |       10730|1.x.x  |  xxxxxxx|
+------+----------+-------+---------------+------------+-------+---------+

当然也可以通过 remove-confignode.sh 脚本移除集群中已启动的 CN 来实现缩容集群。

(7)清理

当您想修改某些启动后无法更改的参数,或者启动过程中步骤出错,导致启动失败,或者一些其他原因,想要获取一个“崭新”的 IoTDB 时,您需要清理集群,主要是清理 data 目录

1. 参照上文执行集群停止操作。

2. 清理数据,具体的可以通过在每一个节点上执行:

cd /data/iotdb
# 清理 ConfigNode 和 DataNode 的数据
sbin/destroy-all.sh

当然也可以通过如下命令:

# 清理 ConfigNode 数据
sbin/destroy-confignode.sh
# 清理 DataNode 数据
sbin/destroy-datanode.sh

3. 参照上文重新集群启动操作。

这样再次重新启动后您就获得了一个“崭新”的 IoTDB。

03

总结

本篇文章是 Apache IoTDB 分布式架构三部曲中的第一篇,主要是介绍 IoTDB 原生分布式架构,以及如何基于此架构来高效运维集群。

想知道 IoTDB 是如何在这套分布式架构下,实现在 3 节点的场景下支持 2 副本的上亿时间序列的高可用高性能的运行和维护么?后续我们将解密 IoTDB 分布式中的两个核心设计:

1. 数据分片与负载均衡

2. 副本、共识协议与高可用

希望读者可以通过这个系列文章,理解 IoTDB 的分布式设计,高效的使用 IoTDB 集群。

更多内容推荐:

• 了解如何使用 IoTDB 企业版

• 了解更多 IoTDB 应用案例

4cb470a0a684b4053773b55724c81eec.gif

88b8142b6e619506145fbc5470d1a5c0.jpeg

3d186425683e3e6d46423c7adae9ad61.jpeg

1bbe372c26e927b652ed3eab8cba8cc9.jpeg

0db0f63334d7fff79420d38f7f718c2d.gif

  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Java分布式架构是一种基于Java语言开发的架构模式,用于构建分布式系统。它可以将一个系统拆分为多个独立的模块(或称为服务),这些模块可以在不同的计算机或服务器上运行,并通过网络进行通信和协调。 Java分布式架构通常采用以下技术和组件来实现: 1. 远程过程调用(RPC):通过RPC技术,不同的模块可以在远程服务器上调用彼此的方法,实现跨网络的通信和功能调用。 2. 消息队列:使用消息队列可以实现模块之间的解耦和异步通信。Java中常用的消息队列系统有ActiveMQ、RabbitMQ和Kafka等。 3. 分布式缓存:分布式缓存可以提高系统的性能和可扩展性。常用的Java分布式缓存技术包括Redis和Memcached。 4. 分布式数据库:分布式数据库可以将数据存储在多个服务器上,提高系统的数据处理能力和容错性。常见的Java分布式数据库有MySQL集群、MongoDB和Cassandra等。 5. 负载均衡:负载均衡可以将请求均匀地分发到不同的服务器上,提高系统的性能和可靠性。在Java中,可以使用Nginx、Apache等来实现负载均衡。 6. 分布式事务:分布式事务处理可以确保在跨多个模块的操作中保持数据的一致性。Java中的分布式事务处理可以使用JTA(Java Transaction API)或分布式事务协调器(如Atomikos)来实现。 通过使用这些技术和组件,Java分布式架构可以实现高性能、高可用性和可扩展性的分布式系统。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Apache IoTDB

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值