# 使用 Docker-Compose 快速上手

# 前提条件

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

# 安装

# 安装 docker

提示

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

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

确认 Docker daemon 正在运行:

docker version
1

提示

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

# 安装 docker-compose

提示

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

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

docker-compose -v
1

# 启动 HStreamDB 服务

注意

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

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

# quick-start.yaml

version: "3.5"

services:
  hserver0:
    image: hstreamdb/hstream:v0.9.0
    depends_on:
      - zookeeper
      - hstore
    ports:
      - "127.0.0.1:6570:6570"
    expose:
      - 6570
    networks:
      - hstream-quickstart
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      - /tmp:/tmp
      - data_store:/data/store
    command:
      - bash
      - "-c"
      - |
        set -e
        /usr/local/script/wait-for-storage.sh hstore 6440 zookeeper 2181 600 \
        /usr/local/bin/hstream-server \
        --host 0.0.0.0 --port 6570 \
        --internal-port 6571 \
        --server-id 100 \
        --seed-nodes "$$(hostname -I | awk '{print $$1}'):6571,hserver1:6573" \
        --address $$(hostname -I | awk '{print $$1}') \
        --zkuri zookeeper:2181 \
        --store-config /data/store/logdevice.conf \
        --store-admin-host hstore --store-admin-port 6440 \
        --io-tasks-path /tmp/io/tasks \
        --io-tasks-network hstream-quickstart

  hserver1:
    image: hstreamdb/hstream:v0.9.0
    depends_on:
      - zookeeper
      - hstore
    ports:
      - "127.0.0.1:6572:6572"
    expose:
      - 6572
    networks:
      - hstream-quickstart
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      - /tmp:/tmp
      - data_store:/data/store
    command:
      - bash
      - "-c"
      - |
        set -e
        /usr/local/script/wait-for-storage.sh hstore 6440 zookeeper 2181 600 \
        /usr/local/bin/hstream-server \
        --host 0.0.0.0 --port 6572 \
        --internal-port 6573 \
        --server-id 101 \
        --seed-nodes "hserver0:6571,$$(hostname -I | awk '{print $$1}'):6573" \
        --address $$(hostname -I | awk '{print $$1}') \
        --zkuri zookeeper:2181 \
        --store-config /data/store/logdevice.conf \
        --store-admin-host hstore --store-admin-port 6440 \
        --io-tasks-path /tmp/io/tasks \
        --io-tasks-network hstream-quickstart

  hserver-init:
    image: hstreamdb/hstream:v0.9.0
    depends_on:
      - hserver0
      - hserver1
    networks:
      - hstream-quickstart
    command:
      - bash
      - "-c"
      - |
        timeout=60
        until ( \
            /usr/local/bin/hadmin server --host hserver0 --port 6570 status && \
            /usr/local/bin/hadmin server --host hserver1 --port 6572 status \
        ) >/dev/null 2>&1; do
            >&2 echo 'Waiting for servers ...'
            sleep 1
            timeout=$$((timeout - 1))
            [ $$timeout -le 0 ] && echo 'Timeout!' && exit 1;
        done; \
        /usr/local/bin/hadmin server --host hserver0 init

  hstore:
    image: hstreamdb/hstream:v0.9.0
    networks:
      - hstream-quickstart
    volumes:
      - data_store:/data/store
    command:
      - bash
      - "-c"
      - |
        set -ex
        /usr/local/bin/ld-dev-cluster --root /data/store \
        --use-tcp --tcp-host $$(hostname -I | awk '{print $$1}') \
        --user-admin-port 6440 \
        --no-interactive

  zookeeper:
    image: zookeeper
    expose:
      - 2181
    networks:
      - hstream-quickstart
    volumes:
      - data_zk_data:/data
      - data_zk_datalog:/datalog

networks:
  hstream-quickstart:
    name: hstream-quickstart

volumes:
  data_store:
    name: quickstart_data_store
  data_zk_data:
    name: quickstart_data_zk_data
  data_zk_datalog:
    name: quickstart_data_zk_datalog

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132

在同一个文件夹中运行:

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

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

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

提示

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

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

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

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

# 启动 HStreamDB 的 SQL 命令行界面

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

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

      __  _________________  _________    __  ___
     / / / / ___/_  __/ __ \/ ____/   |  /  |/  /
    / /_/ /\__ \ / / / /_/ / __/ / /| | / /|_/ /
   / __  /___/ // / / _, _/ /___/ ___ |/ /  / /
  /_/ /_//____//_/ /_/ |_/_____/_/  |_/_/  /_/

Command
  :h                           To show these help info
  :q                           To exit command line interface
  :help [sql_operation]        To show full usage of sql statement

SQL STATEMENTS:
  To create a simplest stream:
    CREATE STREAM stream_name;

  To create a query select all fields from a stream:
    SELECT * FROM stream_name EMIT CHANGES;

  To insert values to a stream:
    INSERT INTO stream_name (field1, field2) VALUES (1, 2);

>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22

# 创建一个 stream

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

CREATE STREAM demo;
1

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

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

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

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

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

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

# 启动另一个 CLI 窗口

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

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

# 向 stream 中写入数据

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

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

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

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