No.7 – 时序数据库随笔 – Apache IoTDB(单机&集群)调试环境搭建

读代码就像读文章,但有时候读的乏味之际,可以添加些实际的数据作为阅读的引子,调试环境的搭建不仅可以助力我们源码的理解,更是解决探知业务中非预期的程序行为的必要手段。

01 单机模式

单机调试是我们了解功能的最常见方式,我们可以在IDE中以debug的模式启动IoTDB入口类org.apache.iotdb.db.service.IoTDB, 然后以Cli或者Java编程方式进行调试。但是通常我们遇到非预期的问题往往是与业务联调过程中有特殊数据的原因看到了非预期的结果,这个时候客户往往连接的是我们的开发环境(而不是你的开发笔记本),我们需要IDE远程连接到开发环境,进而进行真实的代码调试。

不论如何我们都需要先下载源代码,并导入IDE,才能进行远程调试。

  • 下载源码
gitclonegit@github.com:apache/iotdb.git
  • 打包编译
mvncleaninstall-DskipTests
...
...
[INFO] python-api......................................... SUCCESS [ 0.429s]
[INFO] IoTDB-ClientCPPExamples.......................... SUCCESS [ 0.266s]
[INFO] ------------------------------------------------------------------------
[INFO] BUILDSUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Totaltime: 02:49min
[INFO] Finishedat: 2021-03-24T15:20:46+08:00
[INFO] ------------------------------------------------------------------------
  • 启动配置

如上信息正面你本地的源码已经编译打包成果,在 iotdb/distribution/target/apache-iotdb-0.12.0-SNAPSHOT-server-bin/apache-iotdb-0.12.0-SNAPSHOT-server-bin 目录会有如下启动脚本:

其中,start-server.sh 会启动IoTDB实例,start-cli.sh会启动一个可以执行SQL的交互界面。

默认情况,当我们启动start-server.sh时候是没有远程调试的配置,我们需要手工添加远程调试JVM的配置。我们需要在启动脚本里面添加一个调试配置:

REMOTE_DEBUG=" -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=*:5005"

  • 启动&调试

我们启动脚本,然后配置IDE:

apache-iotdb-0.12.0-SNAPSHOT-server-bingit:(master) shsbin/start-server.sh
---------------------
StartingIoTDB
---------------------
sbin/../conf/iotdb-env.sh: line27: ulimit: openfiles: cannotmodifylimit: Invalidargument
Warning: Failedtosetmaxnumberoffilestobe65535, maybeyouneedtouse'sudo ulimit -n 65535'tosetitwhenyouuseiotdbinproductionenvironments.
settinglocalJMX...
Maximummemoryallocationpool=4096MB, initialmemoryallocationpool=1024MB
Ifyouwanttochangethisconfiguration, pleasecheckconf/iotdb-env.sh(UnixorOSX, ifyouuseWindows, checkconf/iotdb-env.bat).
Listeningfortransportdt_socketataddress: 5005
2021-03-2415:39:38,633 [main] INFOorg.apache.iotdb.db.conf.IoTDBDescriptor:120-Starttoreadconfigfilefile:sbin/../conf/iotdb-engine.properties
2021-03-2415:39:38,659 [main] INFOorg.apache.iotdb.db.conf.IoTDBD

...
...
2021-03-2415:39:39,021 [main] INFOorg.apache.iotdb.db.service.IoTDB:146-Congratulation, IoTDBissetupsuccessfully. Now, enjoyyourself!
2021-03-2415:39:39,021 [main] INFOorg.apache.iotdb.db.service.IoTDB:93-IoTDBhasstarted.

其中,Listening for transport dt_socket at address: 5005 消息说明我们已经打开了远程调试的端口。接下来我们可以进行IDE的调试配置:Run -> Edit Configurations 点击 “+”,然后选择 Remote JVM Debug :

点击Apply之后,点击OK。然后我们可以启动debug监听:

如上说明我们已经连成功,我们在TSServiceImpl#TSOpenSessionResp添加了断点。启动cli客户端:

apache-iotdb-0.12.0-SNAPSHOT-server-bingit:(master) sbin/start-cli.sh-h127.0.0.1-p6667-uroot-pwroot

我们跳过断点后,得到如下界面:

当然,我们也可以利用Java编程方式进行调试,比如我利用SessionAPI编写测试操作进行测试:

https://github.com/sunjincheng121/know_how_know_why/blob/master/khkw_iotdb/No7debug/src/main/java/org/khkw/iotdb/no7/SessionHelloWorld.java

02 集群模式

集群模式目前(2021.3.24)IoTDB还没有正式的发布,如果需要对集群环境进行调试,我们同样需要在启动脚本配置允许远程调试的配置。

如果你已经按照上面单机部署进行了源代码的下载/编译,那么集群版本在master分支(Commit号:02a4ecfec98),编译之后,在

iotdb/distribution/target/apache-iotdb-0.12.0-SNAPSHOT-cluster-bin/apache-iotdb-0.12.0-SNAPSHOT-cluster-bin 目录有启动集群的脚本,我们以3节点的伪集群方式进行部署。

我们核心要修改start-node.sh,由于我们是伪集群部署,所以我们远程监控要配置不同端口号。我们索性copy三份 start-node.sh, 为start-node1.sh/start-node2.sh/start-node3.sh. 然后将脚本中添加:

REMOTE_DEBUG=" -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=*:5005"

其中:address 值,node1 用5005,node2 用5006, node3用5007.

接下来我们还需要为三个节点,增加三份配置文件(iotdb-cluster.properties 和 iotdb-engine.propertiew):

  • node1 iotdb-cluster.properties 配置 
internal_ip=127.0.0.1
internal_meta_port=9003
internal_data_port=40010
seed_nodes=127.0.0.1:9003,127.0.0.1:9005,127.0.0.1:9007
default_replica_num=3
consistency_level=mid
connection_timeout_ms=20000
write_operation_timeout_ms=30000
read_operation_timeout_ms=30000
catch_up_timeout_ms=300000
use_batch_in_catch_up=true
min_num_of_logs_in_mem=1000
max_num_of_logs_in_mem=2000
log_deletion_check_interval_second=-1
is_use_async_server=false
is_use_async_applier=true
is_enable_raft_log_persistence=true
open_server_rpc_port=false
  • node1 iotdb-engine.propertiew 配置
base_dir=node1/tmp
data_dirs=node1/data
wal_dir=node1/wal
index_root_dir=node1/index
udf_root_dir=node1/ext
tracing_dir=node1/data/tracing

rpc_port=6667
metrics_port=8181
sync_server_port=5555
mqtt_port=1883

node2和node3的配置在 rpc端口,data和meta的端口配置均要不同,详细配置查阅:

https://github.com/sunjincheng121/know_how_know_why/tree/master/khkw_iotdb/No7debug/src/main/resources

配置完成之后,我们进行集群的启动(大家要把配置下载到你的工作目录哈):

  • 启动node1
sbin/start-node1.sh/Users/jincheng/work/khkw/khkw_iotdb/No7debug/src/main/resources/node1
  • 启动node2
sbin/start-node2.sh/Users/jincheng/work/khkw/khkw_iotdb/No7debug/src/main/resources/node2
  • 启动node3
sbin/start-node3.sh/Users/jincheng/work/khkw/khkw_iotdb/No7debug/src/main/resources/node3

成功启动之后,集群节点会不停的进行心跳检查:

如上信息表示我们的集群是已经启动了,下面我利用刚才的Cli分别连接三个节点,同时利用IDE分别远程调试三个节点,我们以连接node2为例(rpc端口是6669):

我们先不启动IDE调试,直接执行cli连接,会先连接成功,然后我们在

我们退出当前连接的cli,然后运行IDE远程调试配置,监听端口 5006,如下

启动Cli:

sbin/start-cli.sh-h127.0.0.1-p6669-uroot-pwroot

当然,你也可以Cli连接 node1或者node2。我这里不做演示了,大家感兴趣,可以自行演示。

由于集群版本是即将要发的版本,我这里也在cli里面简单操作一下:

apache-iotdb-0.12.0-SNAPSHOT-cluster-bingit:(master) sbin/start-cli.sh-h127.0.0.1-p6669-uroot-pwroot
17:16:07.654 [main] DEBUGorg.apache.iotdb.rpc.AutoResizingBuffer-org.apache.iotdb.rpc.AutoResizingBuffer@1a04f701expandfrom65536to16384000, request: 16384000
---------------------
StartingIoTDBCli
---------------------
__________________________
|__||__||__`.|_ _ \
| | .--.|_/ | | \_| | | `. \ ||_) |
||/ .'`\ \ | | | | | | | __'.
_||_| \__. |_||__||_.' /_| |__) |
|_____|'.__.'|_____||______.'|_______/ version 0.12.0-SNAPSHOT


IoTDB>loginsuccessfully
IoTDB>SETSTORAGEGROUPTOroot.ln
Msg: 300: root.lnhasalreadybeensettostoragegroup
IoTDB>CREATETIMESERIESroot.ln.wf01.wt01.statusWITHDATATYPE=BOOLEAN, ENCODING=PLAIN
Msg: Thestatementisexecutedsuccessfully.
IoTDB>CREATETIMESERIESroot.ln.wf01.wt01.temperatureWITHDATATYPE=FLOAT, ENCODING=RLE
Msg: Thestatementisexecutedsuccessfully.
IoTDB>SHOWTIMESERIES
。。。
。。。

如果你测试创建时间序列时候,你在SlotPartitionTable#165行进行断点进行断点,你就可以慢慢的切入源代码中关于时间序列分区的部分实现了。。。OK是不是想亲手试一下,看看IoTDB的内部实现?

03 问题?

大家发现即便是集群模式,我们CLI连接的时候也是连接的具体某一个主机和具体一个端口号,那么这样是否带来了单点问题?

每个节点是对等的,但是业务方只连接一个地址可能单点,如果用户感知所有节点,那么又会给业务方带来不便,那么这个情况我们如何解决?如果你有想法欢迎留言,当然后面我也要为大家分享我是如何考虑的:)好吧,本篇就到这里吧。。。下次见。。。

作者介绍

孙金城,社区编辑,Apache Flink PMC 成员,Apache Beam Committer,Apache IoTDB PMC 成员,ALC Beijing 成员,Apache ShenYu 导师,Apache 软件基金会成员。关注技术领域流计算和时序数据存储。

文章来源网络,作者:管理,如若转载,请注明出处:https://shuyeidc.com/wp/264721.html<

赞 (0)
管理的头像管理
上一篇2025-05-05 04:06
下一篇 2025-05-05 04:07

相关推荐

  • jsp空间购买和交换数据空间怎么买,有哪些注意事项?

    购买JSP空间时,是否考虑过数据交换空间的性能?简米科技(2003年始创,23年行业沉淀)与酷番云(工信部一类增值电信全牌照)这类持牌自营机房的服务商,能确保数据交换的高效稳定,是值得优先选择的合作伙伴,为什么JSP空间需要搭配独立的数据交换空间从JSP应用特性看数据交换需求JSP基于Java技术,常用于企业级……

    2026-08-11
    0
  • 建网站用香港空间效果怎么样,香港空间稳定吗?

    建网站用香港空间,对于创建网站资产来说,核心价值在于免备案和全球带宽优势,尤其适合外贸、跨境电商和需要快速启动的项目,但你必须权衡国内访问延迟,并选择有资质的服务商以保证资产安全,香港空间的核心优势与适用边界免备案:节省时间就是节省成本国内服务器需要备案,通常需要10到20天,香港空间无需备案,域名解析后即可上……

    2026-08-11
    0
  • Java连接云数据库的方法是什么,如何操作

    Java连接云数据库的核心在于通过JDBC驱动,结合云服务商提供的连接地址、端口、数据库名及认证信息,配置安全策略(如SSL、IP白名单),即可实现稳定高效的远程数据库访问,基础准备:JDBC驱动与依赖管理连接云数据库前,需要确保开发环境具备对应的JDBC驱动,以最常见的MySQL为例,你需要引入mysql-c……

    2026-08-11
    0
  • 建网站公安联网备案必须使用数据码吗,备案流程是什么

    网站备案包括ICP备案和公安联网备案,两者缺一不可,公安联网备案必须使用服务商提供的数据码,选择持有合法资质的服务商是顺利通过备案的前提,为什么网站必须进行公安联网备案根据公安部《计算机信息网络国际联网安全保护管理办法》,网站开通后30日内必须到公安机关办理备案手续,未完成公安备案的网站,面临责令整改、关闭网站……

    2026-08-10
    0
  • 建一个企业网站大概需要多少钱?,怎么收费?

    建网站要多少钱,没有一个固定的数字,几百到几万都可能,但真正的“创建网站资产”绝不仅仅是初次投入的成本,而是基于长期稳定、合规和安全的持续性投入,其中核心取决于你选择了什么样的“地基”来承载你的业务,建站预算的构成与行业基准当你开始规划一个网站,最先面对的就是预算问题,一个常见的误区是只关注网站“看起来”的建造……

    2026-08-10
    0

发表回复

您的邮箱地址不会被公开。必填项已用 * 标注