使用 Docker-Compose 快速上手

前提条件

启动 HStream 需要一个内核版本不小于 Linux 4.14 的操作系统。

安装

安装 docker

提示

如果您已经有一安装好的 Docker,可以跳过这一步

浏览查阅 Install Docker Engine快速上手 - 图1 (opens new window),然后 安装到您的操作系统上。安装时,请注意检查您的设备是否满足所有的前置条件。

确认 Docker daemon 正在运行:

  1. docker version

提示

在 Linux,Docker 需要 root 权限。当然,你也可以以非 root 用户的方式运行 Docker,详情可以参考 Post-installation steps for Linux快速上手 - 图2 (opens new window)

安装 docker-compose

提示

如果您已经有一安装好的 Docker Compose,可以跳过这一步

浏览查阅 Install Docker Compose快速上手 - 图3 (opens new window),然 后安装到您的操作系统上。安装时,请注意检查您的设备是否满足所有的前置条件。

  1. docker-compose -v

启动 HStreamDB 服务

注意

请不要在生产环境中使用以下配置

创建一个 quick-start.yaml, 可以直接下载快速上手 - 图4 (opens new window)或者复制以下内容:

  1. # quick-start.yaml
  2. version: "3.5"
  3. services:
  4. hserver0:
  5. image: hstreamdb/hstream:v0.11.0
  6. depends_on:
  7. - zookeeper
  8. - hstore
  9. ports:
  10. - "127.0.0.1:6570:6570"
  11. expose:
  12. - 6570
  13. networks:
  14. - hstream-quickstart
  15. volumes:
  16. - /var/run/docker.sock:/var/run/docker.sock
  17. - /tmp:/tmp
  18. - data_store:/data/store
  19. command:
  20. - bash
  21. - "-c"
  22. - |
  23. set -e
  24. /usr/local/script/wait-for-storage.sh hstore 6440 zookeeper 2181 600 \
  25. /usr/local/bin/hstream-server \
  26. --bind-address 0.0.0.0 --port 6570 \
  27. --internal-port 6571 \
  28. --server-id 100 \
  29. --seed-nodes "$$(hostname -I | awk '{print $$1}'):6571,hserver1:6573" \
  30. --advertised-address $$(hostname -I | awk '{print $$1}') \
  31. --metastore-uri zk://zookeeper:2181 \
  32. --store-config /data/store/logdevice.conf \
  33. --store-admin-host hstore --store-admin-port 6440 \
  34. --io-tasks-path /tmp/io/tasks \
  35. --io-tasks-network hstream-quickstart
  36. hserver1:
  37. image: hstreamdb/hstream:v0.11.0
  38. depends_on:
  39. - zookeeper
  40. - hstore
  41. ports:
  42. - "127.0.0.1:6572:6572"
  43. expose:
  44. - 6572
  45. networks:
  46. - hstream-quickstart
  47. volumes:
  48. - /var/run/docker.sock:/var/run/docker.sock
  49. - /tmp:/tmp
  50. - data_store:/data/store
  51. command:
  52. - bash
  53. - "-c"
  54. - |
  55. set -e
  56. /usr/local/script/wait-for-storage.sh hstore 6440 zookeeper 2181 600 \
  57. /usr/local/bin/hstream-server \
  58. --bind-address 0.0.0.0 --port 6572 \
  59. --internal-port 6573 \
  60. --server-id 101 \
  61. --seed-nodes "hserver0:6571,$$(hostname -I | awk '{print $$1}'):6573" \
  62. --advertised-address $$(hostname -I | awk '{print $$1}') \
  63. --metastore-uri zk://zookeeper:2181 \
  64. --store-config /data/store/logdevice.conf \
  65. --store-admin-host hstore --store-admin-port 6440 \
  66. --io-tasks-path /tmp/io/tasks \
  67. --io-tasks-network hstream-quickstart
  68. hserver-init:
  69. image: hstreamdb/hstream:v0.11.0
  70. depends_on:
  71. - hserver0
  72. - hserver1
  73. networks:
  74. - hstream-quickstart
  75. command:
  76. - bash
  77. - "-c"
  78. - |
  79. timeout=120
  80. until ( \
  81. /usr/local/bin/hadmin server --host hserver0 --port 6570 status && \
  82. /usr/local/bin/hadmin server --host hserver1 --port 6572 status \
  83. ) >/dev/null 2>&1; do
  84. >&2 echo 'Waiting for servers ...'
  85. sleep 1
  86. timeout=$$((timeout - 1))
  87. [ $$timeout -le 0 ] && echo 'Timeout!' && exit 1;
  88. done; \
  89. /usr/local/bin/hadmin server --host hserver0 init
  90. hstore:
  91. image: hstreamdb/hstream:v0.11.0
  92. networks:
  93. - hstream-quickstart
  94. volumes:
  95. - data_store:/data/store
  96. command:
  97. - bash
  98. - "-c"
  99. - |
  100. set -ex
  101. /usr/local/bin/ld-dev-cluster --root /data/store \
  102. --use-tcp --tcp-host $$(hostname -I | awk '{print $$1}') \
  103. --user-admin-port 6440 \
  104. --no-interactive
  105. zookeeper:
  106. image: zookeeper
  107. expose:
  108. - 2181
  109. networks:
  110. - hstream-quickstart
  111. volumes:
  112. - data_zk_data:/data
  113. - data_zk_datalog:/datalog
  114. networks:
  115. hstream-quickstart:
  116. name: hstream-quickstart
  117. volumes:
  118. data_store:
  119. name: quickstart_data_store
  120. data_zk_data:
  121. name: quickstart_data_zk_data
  122. data_zk_datalog:
  123. name: quickstart_data_zk_datalog

在同一个文件夹中运行:

  1. docker-compose -f quick-start.yaml up

如果出现如下信息,表明现在已经有了一个运行中的 HServer:

  1. hserver_1 | [INFO][2021-11-22T09:15:18+0000][app/server.hs:137:3][thread#67]************************
  2. hserver_1 | [INFO][2021-11-22T09:15:18+0000][app/server.hs:145:3][thread#67]Server started on port 6570
  3. hserver_1 | [INFO][2021-11-22T09:15:18+0000][app/server.hs:146:3][thread#67]*************************

提示

当然,你也可以选择在后台启动

  1. docker-compose -f quick-start.yaml up -d

并且可以通过以下命令展示 logs :

  1. docker-compose -f quick-start.yaml logs -f hserver

启动 HStreamDB 的 SQL 命令行界面

  1. docker run -it --rm --name some-hstream-cli --network host hstreamdb/hstream:v0.11.0 hstream --port 6570 sql

如果所有的步骤都正确运行,您将会进入到命令行界面,并且能看见一下帮助信息:

  1. __ _________________ _________ __ ___
  2. / / / / ___/_ __/ __ \/ ____/ | / |/ /
  3. / /_/ /\__ \ / / / /_/ / __/ / /| | / /|_/ /
  4. / __ /___/ // / / _, _/ /___/ ___ |/ / / /
  5. /_/ /_//____//_/ /_/ |_/_____/_/ |_/_/ /_/
  6. Command
  7. :h To show these help info
  8. :q To exit command line interface
  9. :help [sql_operation] To show full usage of sql statement
  10. SQL STATEMENTS:
  11. To create a simplest stream:
  12. CREATE STREAM stream_name;
  13. To create a query select all fields from a stream:
  14. SELECT * FROM stream_name EMIT CHANGES;
  15. To insert values to a stream:
  16. INSERT INTO stream_name (field1, field2) VALUES (1, 2);
  17. >

创建一个 stream

首先,我们可以用 CREATE STREAM 语句创建一个名为 demo 的 stream.

  1. CREATE STREAM demo;

对这个 stream 执行一个持久的查询操作

现在,我们可以通过 SELECT 在这个 stream 上执行一个持久的查询。

这个查询的结果将被直接展现在 CLI 中。

以下查询任务会输出所有 demo stream 中具有 humidity 大于 70 的数据。

  1. SELECT * FROM demo WHERE humidity > 70 EMIT CHANGES;

现在看起来好像无事发生。这是因为从这个任务执行开始,还没有数据被写入到 demo 中。 接下来,我们会写入一些数据,然后符合条件的数据就会被以上任务输出。

启动另一个 CLI 窗口

我们可以利用这个新的 CLI 来插入数据:

  1. docker exec -it some-hstream-cli hstream --port 6570 sql

向 stream 中写入数据

输入并运行以下所有 INSERT 语句,然后关注我们之前创建的 CLI 窗口。

  1. INSERT INTO demo (temperature, humidity) VALUES (22, 80);
  2. INSERT INTO demo (temperature, humidity) VALUES (15, 20);
  3. INSERT INTO demo (temperature, humidity) VALUES (31, 76);
  4. INSERT INTO demo (temperature, humidity) VALUES ( 5, 45);
  5. INSERT INTO demo (temperature, humidity) VALUES (27, 82);
  6. INSERT INTO demo (temperature, humidity) VALUES (28, 86);

不出意外的话,你将看到以下的结果。

  1. {"temperature":22,"humidity":80}
  2. {"temperature":31,"humidity":76}
  3. {"temperature":27,"humidity":82}
  4. {"temperature":28,"humidity":86}