No.7-时序数据库随笔-ApacheIoTDB(单机&集群)调试环境搭建环境的搭建不仅可以帮助我们理解源码,也是解决检测中意外程序行为的必要手段商业。01单机模式单机调试是我们了解功能最常见的方式。我们可以在IDE中以调试模式启动IoTDB入口类org.apache.iotdb.db.service.IoTDB,然后使用Cli或Java编程进行调试。但通常我们遇到意想不到的问题,往往是因为业务联调过程中的特殊数据。我们看到意想不到的结果。这时候客户往往会连接到我们的开发环境(不是你的开发笔记本),而我们的IDE需要远程连接到开发环境进行真正的代码调试。不管怎样,我们都需要先下载源码,导入到IDE中进行远程调试。下载源码gitclonegit@github.com:apache/iotdb.git包并编译mvncleaninstall-DskipTests......[INFO]python-api.........................................................成功[0.429s][INFO]IoTDB-ClientCPP示例................成功[0.266秒][信息]-----------------------------------------------------------------------[信息]构建成功[信息]--------------------------------------------------------------------[信息]总时间:02:49分钟[信息]完成时间:2021-03-24T15:20:46+08:00[信息]------------------------------------------------------------------启动配置上述信息是肯定的,你的本地源代码已经编译好了并打包,在iotdb/distribution/target/apache的-iotdb-0.12.0-SNAPSHOT-server-bin/apache-iotdb-0.12.0-SNAPSHOT-server-bin目录下会有如下启动脚本:其中,启动-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----------------------启动IoTDB---------------------sbin/../conf/iotdb-env.sh:line27:ulimit:openfiles:cannotmodifylimit:InvalidargumentWarning:无法将最大文件数设置为65535,在生产环境中使用iotdb时,可能需要使用'sudoulimit-n65535'进行设置。设置本地JMX...最大内存分配池=4096MB,初始内存allocationpool=1024MB如果要更改此配置,请检查conf/iotdb-env.sh(Unix或OSX,如果您使用Windows,检查conf/iotdb-env.bat)。监听传输dt_socket地址:50052021-03-2415:39:38,633[main]INFOorg.apache.iotdb.db.conf.IoTDBDescriptor:120-开始读取配置文件file:sbin/../conf/iotdb-engine.properties2021-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-恭喜,IoTDB设置成功。现在,尽情享受吧!2021-03-2415:39:39,021[main]INFOorg.apache.iotdb.db.service.IoTDB:93-IoTDB已启动。其中Listeningfortransportdt_socketataddress:5005消息表明我们已经打开了用于远程调试的端口。接下来,我们可以配置IDE进行调试:Run->EditConfigurations点击“+”,然后选择RemoteJVMDebug:点击Apply后,点击OK。然后我们就可以开始调试监控了:如上,我们连接成功,我们在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.java02集群模式集群模式目前(2021.3.24)IoTDB尚未正式发布。如果需要调试集群环境,我们还需要配置启动脚本,允许远程Debug配置。如果你已经按照上面的单机部署下载/编译了源码,那么集群版本在master分支(Commitnumber:02a4ecfec98),编译后在iotdb/distribution/target/apache-iotdb-0.12.0-SNAPSHOT-cluster-bin/apache-iotdb-0.12.0-SNAPSHOT-cluster-bin目录下有启动集群的脚本,我们部署在3节点伪集群中。我们的内核需要修改start-node.sh。由于我们是在伪集群中部署,所以需要配置不同的端口号进行远程监控。我们简单的复制了三份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"其中:地址值,node1使用5005,node2使用5006,node3使用5007。接下来,我们需要为三个节点添加三个配置文件(iotdb-cluster.properties和iotdb-engine.propertiew):node1iotdb-cluster.properties配置internal_ip=127.0.0.1internal_meta_port=9003internal_data_port=40010seed_nodes=127.0.0.1:9003,127.0.0.1:9005,127.0.0.1:9007default_replica_num=3consistency_level=midconnection_timeout_ms=20000write_operation_timeout_ms=30000read_operation_timeout_ms=30000catch_up_timeout_ms=300000use_batch_in_catch_up=truemin_num_of_logs_in_mem=1000max_num_of_logs_in_mem=2000log_deletion_check_interval_second=-1is_use_async_server=falseis_use_async_applier=trueis_enable_raft_log_persistence=trueopen_server_rpc_port=falsenode1iotdb-engine.propertiew配置base_dir=node1/tmpdata_dirs=node1/datawal_dir=node1/walindex_root_dir=node1/indexudf_root_dir=node1/extracing_dir=node1/data/tracingrpc_port=6667metrics_port=8181sync_server_port=5555mqtt_port=1883node2和node3配置在rpc端口上,data和meta的端口配置不同。详细配置请参考:https://github.com/sunjincheng121/know_how_know_why/tree/master/khkw_iotdb/No7debug/src/main/resources配置完成后,我们启动集群(下载配置到你的工作目录):startnode1sbin/start-node1.sh/Users/jincheng/work/khkw/khkw_iotdb/No7debug/src/main/resources/node1startnode2sbin/start-node2.sh/Users/jincheng/work/khkw/khkw_iotdb/No7debug/src/main/resources/node2启动node3sbin/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-pwroot17:16:07.654[main]DEBUGorg.apache.iotdb.rpc.AutoResizingBuffer-org.apache.iotdb.rpc.AutoResizingBuffer@1a04f701从65536扩展到16384000,请求:063840--------------------启动IoTDBCli--------------------__________________________|__||__||__`。|__\||.--.|_/||\_|||`。\||_)|||/.'`\\|||||||__'。_||_|\__。|_||__||_.'/_||__)||____|'.__.'|____||______.'|_______/version0.12.0-SNAPSHOTIoTDB>登录成功IoTDB>SETSTORAGEGROUPTOroot.lnMsg:300:root.lnhasalreadybeensettostoragegroupIoTDB>CREATETIMESERIESroot.ln.wf01.wt01.statusWITHDATAINGANYPE=BOOO=PLAINMsg:语句执行成功。物联网数据库>CREATETIMESERIESroot.ln.wf01.wt01.temperatureWITHDATATYPE=FLOAT,ENCODING=RLEMsg:语句执行成功。IoTDB>显示时间序列。....如果你在测试创建时序的时候在SlotPartitionTable#165行下了断点,就可以慢慢切入源码中关于时序划分的部分。..OK,要不要自己试试,看看IoTDB的内部实现?03问题?大家发现即使是在集群模式下,我们连接CLI的时候,还是连接到特定的主机和特定的端口号,那么这样会不会带来单点问题呢?每个节点都是点对点的,但业务端只连接一个地址或单点。如果用户感知所有节点,会给业务方带来不便。我们如何解决这种情况?如果您有任何想法,请留言。当然,后面我会和大家分享我是怎么想的:)好了,本文到此结束。..下次见。..作者介绍孙金城,51CTO社区编辑,ApacheFlinkPMC成员,ApacheBeamCommitter,ApacheIoTDBPMC成员,ALC北京成员,Apache神鱼导师,Apache软件基金会成员。专注于技术领域的流计算和时序数据存储。
