# Manual Deployment with Docker

This document describes how to run HStreamDB cluster with docker.

注意

This tutorial only shows the main process of starting HStreamDB cluster with docker, the parameters are not configured with any security in mind, so please do not use them directly when deploying!

# Set up a ZooKeeper ensemble

HServer and HStore require ZooKeeper in order to store some metadata. We need to set up a ZooKeeper ensemble first.

You can find a tutorial online on how to build a proper ZooKeeper ensemble. As an example, here we just quickly start a single-node ZooKeeper via docker.

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

# Create data folders on storage nodes

Storage nodes store data in shards. Typically each shard maps to a different physical disk. Assume your data disk is mounted on /mnt/data0

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

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

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

# adds the user for the logdevice daemon
sudo useradd logdevice

# changes ownership for the data directory and the disk
sudo chown -R logdevice /data/logdevice/
sudo chown -R logdevice /mnt/data0/
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

# Create a configuration file

Here is a minimal configuration file example. Before using it, please modify it to suit your situation.

{
  "server_settings": {
    "enable-nodes-configuration-manager": "true",
    "use-nodes-configuration-manager-nodes-configuration": "true",
    "enable-node-self-registration": "true",
    "enable-cluster-maintenance-state-machine": "true"
  },
  "client_settings": {
    "enable-nodes-configuration-manager": "true",
    "use-nodes-configuration-manager-nodes-configuration": "true",
    "admin-client-capabilities": "true"
  },
  "cluster": "logdevice",
  "internal_logs": {
    "config_log_deltas": {
      "replicate_across": {
        "node": 3
      }
    },
    "config_log_snapshots": {
      "replicate_across": {
        "node": 3
      }
    },
    "event_log_deltas": {
      "replicate_across": {
        "node": 3
      }
    },
    "event_log_snapshots": {
      "replicate_across": {
        "node": 3
      }
    },
    "maintenance_log_deltas": {
      "replicate_across": {
        "node": 3
      }
    },
    "maintenance_log_snapshots": {
      "replicate_across": {
        "node": 3
      }
    }
  },
  "metadata_logs": {
    "nodeset": [],
    "replicate_across": {
      "node": 3
    }
  },
  "zookeeper": {
    "zookeeper_uri": "ip://10.100.2.11:2181",
    "timeout": "30s"
  }
}
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
  • If you have a multi-node ZooKeeper ensemble, use the list of ZooKeeper ensemble nodes and ports to modify zookeeper_uri in the zookeeper section:

        "zookeeper": {
            "zookeeper_uri": "ip://10.100.2.11:2181,10.100.2.12:2181,10.100.2.13:2181",
            "timeout": "30s"
        }
    
    1
    2
    3
    4
  • Detailed explanations of all the attributes can be found in the Cluster configuration (opens new window) docs.

# Store the configuration file

You can the store configuration file in ZooKeeper, or store it on each storage nodes.

# Store configuration file in ZooKeeper

Suppose you have a configuration file on one of your ZooKeeper nodes with the path ~/logdevice.conf. Save the configuration file to the ZooKeeper by running the following command.

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

You can verify the create operation by:

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

# Set up HStore cluster

For the configuration file stored in ZooKeeper, assume that the value of the zookeeper_uri field in the configuration file is "ip:/10.100.2.11:2181" and the path to the configuration file in ZooKeeper is /logdevice.conf.

For the configuration file stored on each node, assume that your file path is /data/logdevice/logdevice.conf.

# Start admin server on a single node

  • Configuration file stored in ZooKeeper:

    docker run --rm -d --name storeAdmin --network host -v /data/logdevice:/data/logdevice \
            hstreamdb/hstream:v0.6.1 /usr/local/bin/ld-admin-server \
            --config-path zk:10.100.2.11:2181/logdevice.conf \
            --enable-maintenance-manager \
            --maintenance-log-snapshotting \
            --enable-safety-check-periodic-metadata-update
    
    1
    2
    3
    4
    5
    6
    • If you have a multi-node ZooKeeper ensemble, Replace --config-path parameter to: --config-path zk:10.100.2.11:2181,10.100.2.12:2181,10.100.2.13:2181/logdevice.conf
  • Configuration file stored in each node:

    Replace --config-path parameter to --config-path /data/logdevice/logdevice.conf

# Start logdeviced on every node

  • Configuration file stored in ZooKeeper:

    docker run --rm -d --name hstore --network host -v /data/logdevice:/data/logdevice \
            hstreamdb/hstream:v0.6.1 /usr/local/bin/logdeviced \
            --config-path zk:10.100.2.11:2181/logdevice.conf \
            --name store-0 \
            --address 192.168.0.3 \
            --local-log-store-path /data/logdevice
    
    1
    2
    3
    4
    5
    6
    • For each node, you should update the --name to a different value and --address to the host IP address of that node.
  • Configuration file stored in each node:

    Replace --config-path parameter to --config-path /data/logdevice/logdevice.conf

# Bootstrap the cluster

After starting the admin server and logdeviced for each storage node, now we can bootstrap our cluster.

On the admin server node, run:

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

And you should see something like this:

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

You can check the cluster status by run:

docker exec storeAdmin hadmin status
1

And the result should be:

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

Now we finish setting up the HStore cluster.

# Set up HServer cluster

To start a single HServer instance, you can modify the start command to fit your situation:

docker run -d --name hstream-server --network host \
        hstreamdb/hstream:v0.6.1 /usr/local/bin/hstream-server \
        --host $SERVER_HOST \
        --address $SERVER_HOST \
        --zkuri $ZK_ADDRESS \
        --store-config zk:$ZK_ADDRESS/logdevice.conf \
        --store-admin-host $ADMIN_HOST \
        --replicate-factor 3 \
        --server-id 1
1
2
3
4
5
6
7
8
9
  • $SERVER_HOST :The host IP address of your server node, e.g 192.168.0.1
  • $ZK_ADDRESS :Your ZooKeeper ensemble address list, e.g 10.100.2.11:2181,10.100.2.12:2181,10.100.2.13:2181
  • --store-config :The path to your HStore configuration file. Should match the value of the --config-path parameter when starting the HStore cluster
  • --store-admin-host: The IP address of the HStore Admin Server node
  • --server-id :You should set a unique identifier for each server instance

You can start multiple server instances on different nodes in the same way.