暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

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

孙金城 2021-03-24
1514

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


本文我们会介绍Apache IoTDB 的单机和集群两种模式下如何进行调试。



01

单机模式


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


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

  • 下载源码

    git clone git@github.com:apache/iotdb.git
    • 打包编译

       mvn clean install -DskipTests
      ...
      ...
      [INFO] python-api ......................................... SUCCESS [  0.429 s]
      [INFO] IoTDB-Client CPP Examples .......................... SUCCESS [ 0.266 s]
      [INFO] ------------------------------------------------------------------------
      [INFO] BUILD SUCCESS
      [INFO] ------------------------------------------------------------------------
      [INFO] Total time: 02:49 min
      [INFO] Finished at: 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-bin git:(master) ✗ sh sbin/start-server.sh 
          ---------------------
          Starting IoTDB
          ---------------------
          sbin/../conf/iotdb-env.sh: line 27: ulimit: open files: cannot modify limit: Invalid argument
          Warning: Failed to set max number of files to be 65535, maybe you need to use 'sudo ulimit -n 65535' to set it when you use iotdb in production environments.
          setting local JMX...
          Maximum memory allocation pool = 4096MB, initial memory allocation pool = 1024MB
          If you want to change this configuration, please check conf/iotdb-env.sh(Unix or OS X, if you use Windows, check conf/iotdb-env.bat).
          Listening for transport dt_socket at address: 5005
          2021-03-24 15:39:38,633 [main] INFO org.apache.iotdb.db.conf.IoTDBDescriptor:120 - Start to read config file file:sbin/../conf/iotdb-engine.properties
          2021-03-24 15:39:38,659 [main] INFO org.apache.iotdb.db.conf.IoTDBD


          ...
          ...
          2021-03-24 15:39:39,021 [main] INFO org.apache.iotdb.db.service.IoTDB:146 - Congratulation, IoTDB is set up successfully. Now, enjoy yourself!
          2021-03-24 15:39:39,021 [main] INFO  org.apache.iotdb.db.service.IoTDB:93 - IoTDB has started. 

          其中,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-bin git:(master) ✗ sbin/start-cli.sh -h 127.0.0.1 -p 6667 -u root -pw root

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

            当然,我们也可以利用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):

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

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

                        启动Cli:

                          sbin/start-cli.sh -h 127.0.0.1 -p 6669 -u root -pw root

                           

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


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

                            ➜  apache-iotdb-0.12.0-SNAPSHOT-cluster-bin git:(master) ✗ sbin/start-cli.sh -h 127.0.0.1 -p 6669 -u root -pw root
                            17:16:07.654 [main] DEBUG org.apache.iotdb.rpc.AutoResizingBuffer - org.apache.iotdb.rpc.AutoResizingBuffer@1a04f701 expand from 65536 to 16384000, request: 16384000
                            ---------------------
                            Starting IoTDB Cli
                            ---------------------
                            _____ _________ ______ ______
                            |_ _| | _ _ ||_ _ `.|_ _ \
                            | | .--.|_/ | | \_| | | `. \ | |_) |
                            | | .'`\ \ | | | | | | | __'.
                            _| |_| \__. | _| |_ _| |_.' _| |__) |
                            |_____|'.__.' |_____| |______.'|_______/ version 0.12.0-SNAPSHOT



                            IoTDB> login successfully
                            IoTDB> SET STORAGE GROUP TO root.ln
                            Msg: 300: root.ln has already been set to storage group
                            IoTDB> CREATE TIMESERIES root.ln.wf01.wt01.status WITH DATATYPE=BOOLEAN, ENCODING=PLAIN
                            Msg: The statement is executed successfully.
                            IoTDB> CREATE TIMESERIES root.ln.wf01.wt01.temperature WITH DATATYPE=FLOAT, ENCODING=RLE
                            Msg: The statement is executed successfully.
                            IoTDB> SHOW TIMESERIES
                            。。。
                            。。。


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



                            03


                            ?问题?


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


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


                            阿里招聘

                            时序数据库开发岗位

                            (P7/P8/P9)

                            (长期有效)


                            职位描述:

                            1. 精通Java/Scala编程

                            2. 精通常用数据结构和算法应用,具备良好的、精益求精的设计思维,每一个bit都是客户/技术价值。

                            3. 了解Hadoop/Flink/Spark等计算框架和熟悉HBase/LevelDB/RocksDB等主流NoSQL数据库,深入理解其实现原理和架构优势劣势;

                            4. 具备分布式系统的设计和应用的经历,能对分布式常用技术进行应用和改进者优先;

                            5. 有开源社区贡献,并成为Flink/Spark/Druid/OpenTSDB/InfluxDB/IoTDB等社区的Committer/PMC者优先;

                            6. 要具备良好的团队协作能力,良好的沟通表达能力,和对正确事情持之以恒的韧性和耐力。


                            来!让我看到你的简历,因为成就你的不仅仅是能力,更是雷厉风行的执行力!

                            文章转载自孙金城,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

                            评论