用 Docker 手动部署

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

注意

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

设置一个 ZooKeeper 集群

HServerHStore 需要 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/
  3. # writes the number of shards that this box will have
  4. echo 1 | sudo tee /data/logdevice/NSHARDS
  5. # creates symlink for shard 0
  6. sudo ln -s /mnt/data0 /data/logdevice/shard0
  7. # adds the user for the logdevice daemon
  8. sudo useradd logdevice
  9. # changes ownership for the data directory and the disk
  10. sudo chown -R logdevice /data/logdevice/
  11. 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-hostHStore Admin Server 节点的 IP 地址。
  • --server-id:你应该为每个服务器实例设置一个的唯一标识符

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