用 Docker 手动部署

本文描述了如何用 Docker 运行 HStreamDB 集群。

注意

本教程只展示了用 Docker 启动 HStreamDB 集群的主要过程。参数的配置没有考虑到任何安全问题,所以请 请不要在部署时直接使用它们

设置一个 ZooKeeper 集群

HServer 和 HStore 需要 ZooKeeper 来存储一些元数据,所以首先我们需要配置一个 ZooKeeper 集群。

你可以在网上找到关于如何建立一个合适的 ZooKeeper 集群的教程。

这里我们只是通过 docker 快速启动一个单节点的 ZooKeeper 为例。

1. docker run --rm -d --name zookeeper --network host zookeeper

在存储节点上创建数据文件夹

存储节点会把数据存储分片(Shard)中。通常情况下,每个分片映射到不同的物理磁盘。 假设你的数据盘被挂载(mount)在/mnt/data0 上

1. # creates the root folder for data
2. sudo mkdir -p /data/logdevice/

4. # writes the number of shards that this box will have
5. echo 1 | sudo tee /data/logdevice/NSHARDS

7. # creates symlink for shard 0
8. sudo ln -s /mnt/data0 /data/logdevice/shard0

10. # adds the user for the logdevice daemon
11. sudo useradd logdevice

13. # changes ownership for the data directory and the disk
14. sudo chown -R logdevice /data/logdevice/
15. sudo chown -R logdevice /mnt/data0/

创建配置文件

这里是一个配置文件的最小示例。

在使用它之前,请根据你的情况进行修改。

1. {
2. "server_settings": {
3. "enable-nodes-configuration-manager": "true",
4. "use-nodes-configuration-manager-nodes-configuration": "true",
5. "enable-node-self-registration": "true",
6. "enable-cluster-maintenance-state-machine": "true"
7. },
8. "client_settings": {
9. "enable-nodes-configuration-manager": "true",
10. "use-nodes-configuration-manager-nodes-configuration": "true",
11. "admin-client-capabilities": "true"
12. },
13. "cluster": "logdevice",
14. "internal_logs": {
15. "config_log_deltas": {
16. "replicate_across": {
17. "node": 3
18. }
19. },
20. "config_log_snapshots": {
21. "replicate_across": {
22. "node": 3
23. }
24. },
25. "event_log_deltas": {
26. "replicate_across": {
27. "node": 3
28. }
29. },
30. "event_log_snapshots": {
31. "replicate_across": {
32. "node": 3
33. }
34. },
35. "maintenance_log_deltas": {
36. "replicate_across": {
37. "node": 3
38. }
39. },
40. "maintenance_log_snapshots": {
41. "replicate_across": {
42. "node": 3
43. }
44. }
45. },
46. "metadata_logs": {
47. "nodeset": [],
48. "replicate_across": {
49. "node": 3
50. }
51. },
52. "zookeeper": {
53. "zookeeper_uri": "ip://10.100.2.11:2181",
54. "timeout": "30s"
55. }
56. }
  • 如果你有一个多节点的 ZooKeeper,修改 zookeeper_uri部分为 ZooKeeper 集群的节点和端口列表:

1. "zookeeper": { 2. "zookeeper_uri": "ip://10.100.2.11:2181,10.100.2.12:2181,10.100.2.13:2181", 3. "timeout": "30s" 4. } - 所有属性的详细解释可以在集群配置用 Docker 手动部署 - 图2 (opens new window) 文档中找到。

存储配置文件

你可以将配置文件存储在 ZooKeeper 中,或存储在每个存储节点上。

在 ZooKeeper 中存储配置文件

假设你的一个 ZooKeeper 节点上有一个路径为 ~/logdevice.conf 的配置文件。

通过运行以下命令将配置文件保存到 ZooKeeper 中:

1. docker exec zookeeper zkCli.sh create /logdevice.conf "`cat ~/logdevice.conf`"

通过以下命令验证创建是否成功:

1. docker exec zookeeper zkCli.sh get /logdevice.conf

配置 HStore 集群

对于存储在 ZooKeeper 中的配置文件,假设配置文件中 zookeeper_uri 字段的值是 "ip:/10.100.2.11:2181" ,ZooKeeper中配置文件的路径是 /logdevice.conf 。

对于存储在每个节点上的配置文件,假设你的文件路径是 `/data/logdevice/logdevice.conf’。

在单个节点上启动 admin 服务器

  • 配置文件存储在 ZooKeeper 中:

1. docker run --rm -d --name storeAdmin --network host -v /data/logdevice:/data/logdevice \ 2. hstreamdb/hstream:v0.11.0 /usr/local/bin/ld-admin-server \ 3. --config-path zk:10.100.2.11:2181/logdevice.conf \ 4. --enable-maintenance-manager \ 5. --maintenance-log-snapshotting \ 6. --enable-safety-check-periodic-metadata-update

  • 如果你有一个多节点的 ZooKeeper,请将--config-path替换为: --config-path zk:10.100.2.11:2181,10.100.2.12:2181,10.100.2.13:2181/logdevice.conf
  • 存储在每个节点的配置文件:

更改 --config-path 参数为 --config-path /data/logdevice/logdevice.conf

在每个节点上启动 logdeviced

  • 存储在 ZooKeeper 中的配置文件:

1. docker run --rm -d --name hstore --network host -v /data/logdevice:/data/logdevice \ 2. hstreamdb/hstream:v0.11.0 /usr/local/bin/logdeviced \ 3. --config-path zk:10.100.2.11:2181/logdevice.conf \ 4. --name store-0 \ 5. --address 192.168.0.3 \ 6. --local-log-store-path /data/logdevice

  • 对于每个节点,你应该将--name更新为一个不同的值,并将--address更新为该节点的 IP 地址。
  • 存储在每个节点的配置文件:

更改 --config-path 参数为 --config-path /data/logdevice/logdevice.conf

Bootstrap 集群

在启动管理服务器和每个存储节点的 logdeviced 之后,现在我们可以 bootstrap 我们的集群。

在管理服务器节点上,运行。

1. docker exec storeAdmin hadmin store nodes-config bootstrap --metadata-replicate-across 'node:3'

你应该看到像这样的信息:

1. Successfully bootstrapped the cluster, new nodes configuration version: 7
2. Took 0.019s

你可以通过运行以下命令来检查集群的状态:

1. docker exec storeAdmin hadmin store status

而结果应该是:

1. +----+---------+----------+-------+-----------+---------+---------------+
2. | ID |  NAME   | PACKAGE  | STATE |  UPTIME   |  SEQ.   | HEALTH STATUS |
3. +----+---------+----------+-------+-----------+---------+---------------+
4. | 0  | store-0 | 99.99.99 | ALIVE | 2 min ago | ENABLED | HEALTHY       |
5. | 1  | store-2 | 99.99.99 | ALIVE | 2 min ago | ENABLED | HEALTHY       |
6. | 2  | store-1 | 99.99.99 | ALIVE | 2 min ago | ENABLED | HEALTHY       |
7. +----+---------+----------+-------+-----------+---------+---------------+
8. Took 7.745s

现在我们完成了对 HStore 集群的设置。

配置 HServer 集群

要启动一个单一的 HServer 实例,你可以修改启动命令以适应你的情况。

1. docker run -d --name hstream-server --network host \
2. hstreamdb/hstream:v0.11.0 /usr/local/bin/hstream-server \
3. --bind-address $SERVER_HOST \
4. --advertised-address $SERVER_HOST \
5. --seed-nodes $SERVER_HOST \
6. --metastore-uri zk://$ZK_ADDRESS \
7. --store-config zk:$ZK_ADDRESS/logdevice.conf \
8. --store-admin-host $ADMIN_HOST \
9. --replicate-factor 3 \
10. --server-id 1
  • $SERVER_HOST:你的服务器节点的主机 IP 地址,例如 192.168.0.1。
  • metastore-uri: 你的元信息存储 HMeta 地址,例如使用 zk://$ZK_ADDRESS 指定 zookeeper 存储元数据。同时实现性支持使用 rqlite rq://$RQ_ADDRESS。
  • $ZK_ADDRESS :你的 ZooKeeper 集群地址列表,例如 10.100.2.11:2181,10.100.2.12:2181,10.100.2.13:2181。
  • --store-config:你的 HStore 配置文件的路径。应该与启动 HStore 集群 --config-path 参数的值一致。
  • --store-admin-host:HStore Admin Server 节点的 IP 地址。
  • --server-id:你应该为每个服务器实例设置一个的唯一标识符

你可以以同样的方式在不同的节点上启动多个服务器实例。