---
url: /v6.2/install-first-cluster.md
---
# 集群安装

本文讲述如何在集群环境下进行 HENGSHI SENSE 安装的操作过程。

在安装前请确认网络环境，如果是隔离环境，无法连接互联网时，请先按照[离线环境安装依赖](install-dependencies-offline.md)的指导进行依赖包的安装，然后按照本文的指导继续操作。如果网络环境可以连接互联网，请直接按照本文的指导进行安装。

## 准备工作

集成安装前，请完成下面的准备工作。

### 环境准备

请按如下步骤进行环境准备。

1. 首先参考[安装环境](enviroment.md)文档准备安装环境。
2. 请确保安装设备满足以下条件。
   * 每台设备上都安装有 sudo 命令。
   * 每台设备上建立可以无密码 ssh 登录的运行用户。
   * 每台设备上运行用户配置无密码 sudo 权限。
   * 每台设备 hostname 不同。
   * 各设备间防火墙开放端口限制，内网间互通。
   * 保证当前执行集群安装机器安装 ansible。

如果您已经完成了步骤1和步骤2中的环境准备，请忽略下面的提示直接跳到[配置用户与安装目录](#配置用户与安装目录)继续进行安装操作。如果您不清楚步骤2中的条件如何配置时，可以参考下面的提示进行设置。

1. 安装 sudo 命令。 该命令需要在 root 用户下执行。
   ```shell
   yum install -y sudo
   ```
2. 在每台设备上都建立执行用户。示例中以 hengshi 用户为例。 该操作需要在 root 用户下执行。
   ```shell
   useradd -m hengshi
   passwd hengshi #设置 hengshi 登录密码
   ```
3. 为执行用户设置无密码 sudo 权限。该操作需要在 root 用户下执行。
   ```shell
   visudo
   ```
   在其中输入, 保存并退出
   ```shell
   hengshi ALL=(ALL)       NOPASSWD: ALL
   ```
4. 每台设备上 hostname 不同。 如果 hostname 有相同情况，如 localhost, 则需要设置。直接编辑 hostname 文件进行修改。
   ```shell
   sudo vim /etc/hostname
   ```
5. 每台机器可以用 hostname 通信。编辑 /etc/hosts 文件，如存在127.0.0.1 本地 ip 信息，删除并重启服务器。
   ```shell
   a.b.c.d1 ${Node-A-hostname}
   a.b.c.d2 ${Node-B-hostname}
   a.b.c.d3 ${Node-C-hostname}
   ```
6. 配置运行用户，保证每台机器无密码 ssh 登录。
   假设集群为三台机器 Node-A, Node-B, Node-C, 以用户 hengshi 在每台机器运行

   > \[!TIP] 提示
   > Node-A, Node-B, Node-C 仅为文档示例，实际配置请以服务器的真实hostname为准。

   * 期间按照提示输入 hengshi 密码
   * 提示如下信息输入 yes。 "Are you sure you want to continue connecting (yes/no)?" 输入 yes
   * 需要对本机 ip 执行 ssh-copy-id 操作，如在 Node-A 上需要执行 'ssh-copy-id hengshi@Node-A'

   ```shell
   test -e ~/.ssh/id_rsa || { yes "" | ssh-keygen -t rsa -q -P ''; }
   ssh-copy-id hengshi@localhost
   ssh-copy-id hengshi@127.0.0.1
   ssh-copy-id hengshi@${Node-A-hostname}
   ssh-copy-id hengshi@${Node-A-ip}
   ssh-copy-id hengshi@${Node-B-hostname}
   ssh-copy-id hengshi@${Node-B-ip}
   ssh-copy-id hengshi@${Node-C-hostname}
   ssh-copy-id hengshi@${Node-C-ip}
   ```
7. 在执行安装部署的机器上安装 ansible。
   ```shell
   sudo yum install -y epel-release
   sudo yum install -y ansible
   ```

### 配置用户与安装目录

下面的操作请在 sudo 或 root 权限下执行。

示例中演示如何在集群上配置用户和安装目录，用户名为 hengshi，安装目录为/opt/hengshi，假设有三个节点 A,B,C ，用户在不同节点上执行下列操作。

```shell
for x in ${Node-A-hostname} ${Node-B-hostname} ${Node-C-hostname}; do
    ssh $x "grep hengshi /etc/passwd > /dev/null || sudo useradd -m hengshi"
    #建立 henghsi 用户, 设置安装目录及权限
    ssh $x "sudo mkdir -p /opt/hengshi && sudo chown hengshi:hengshi /opt/hengshi"
done
```

### ssh 登录确认

假如三台机器 A B C，执行下面代码进行登录确认。

```shell
nodes=(${Node-A-hostname} ${Node-B-hostname} ${Node-C-hostname})
for host in ${nodes[@]}; do
  ssh $host "for x in ${nodes[@]}; do ssh-keygen -R \$x; ssh-keyscan -H \$x >> ~/.ssh/known_hosts; done"
done
```

### 服务端 sshd 监听非22端口

安装所涉及的机器包括本机以及 HS_ENGINE_SEGMENTS 变量中配置的机器，如有非 ssh 22端口的情况，需要在部署用户 ~/.ssh/config 中配置各个 host 的实际端口。

本机需要配置 localhost 和 hostname 命令返回域名的端口。

例如: 本机配置 hostname 为 localhost，并且 HS_ENGINE_SEGMENTS 为 A，B，C 台，对应的监听端口都为122。

在.ssh/config 配置文件中需要包含以下配置，并同步到每台机器上的.ssh/config。

```
Host localhost
  Port 122
Host ${Node-A-hostname}
  Port 122
Host ${Node-B-hostname}
  Port 122
Host ${Node-C-hostname}
  Port 122
```

### 设置集群信息

在需要执行部署命令的机器上设置集群信息。

* 建立集群配置目录，该目录建议与安装包解压目录同一层级，方便升级时复用配置。可以参考下面示例，示例中安装包解压目录为 hengshi-sense-\[version]。

  ```shell
  mkdir hengshi-sense-[version]/../cluster-conf
  cd hengshi-sense-[version]
  cp ansible/hosts.sample ../cluster-conf/hosts
  cp ansible/vars.yml.sample ../cluster-conf/vars.yml
  ```

* 配置 hosts。按照示例中的提示进行操作。
  ```
  [metadb] #内部元数据库
  ${Node-A-hostname}

  #[metaslave] #metadb 数据库从库（选填）可用于主库 down 机 备用库使用
  #${Node-B-hostname}

  [engine] #指定一台为 master
  ${Node-A-hostname} master=true
  ${Node-B-hostname}
  ${Node-C-hostname}

  #引擎类型非doris可忽略此项配置, 将其注释或清理均可，不会影响配置项。
  #注意 doris-fe 数量需要配置奇数台
  [doris-fe] # 建议使用 ip 信息配置,hostname 配置可能存在启动失败问题
  ${Node-A-hostname} master=true
  ${Node-B-hostname}
  ${Node-C-hostname}

  #引擎类型非doris可忽略此项配置, 将其注释或清理均可，不会影响配置项。
  [doris-be] # 建议使用 ip 信息配置,hostname 配置可能存在启动失败问题
  ${Node-A-hostname}
  ${Node-B-hostname}
  ${Node-C-hostname}

  [minio]
  ${Node-A-hostname}

  [redis]
  ${Node-A-hostname}

  [hengshi]
  ${Node-A-hostname}
  ${Node-B-hostname}
  ${Node-C-hostname}
  ```

* 配置 vars.yaml。按照下面示例中的提示配置 vars.yaml
  ```yaml
  temp_work_dir_root: "/tmp" #临时目录,一般不需要改
  install_path: "/opt/hengshi" #安装目标目录
  hengshi_sense_port: 8081
  metadb_port: 54320
  engine_master_port: 15432
  engine_segment_base_port: 25432
  ```

## 安装

按照以下指导完成安装过程。

1. 设置环境变量 ANSIBLE_PLAYBOOK。
   ```shell
   export ANSIBLE_PLAYBOOK="ansible-playbook -v"
   ```
2. 切换到执行安装的用户，示例中用户名为 hengshi。
   ```shell
   sudo su - hengshi
   ```
3. 进入安装包解压后的目标目录。
   ```shell
   cd ~/pkgs/hengshi-sense-[version]
   ```
4. 执行集群安装命令。
   ```shell
   ./hs_install -m cluster -c ../cluster-conf    #执行集群安装
   ```
   安装过程会显示提示信息，当各个节点状态均为\[unreachable=0,failed=0]，表示安装成功。
   ```shell
   PLAY RECAP ****************************************************************
   Node-A : ok=18   changed=3    unreachable=0    failed=0    skipped=2    rescued=0    ignored=0
   Node-B : ok=18   changed=3    unreachable=0    failed=0    skipped=2    rescued=0    ignored=0
   Node-C : ok=18   changed=3    unreachable=0    failed=0    skipped=2    rescued=0    ignored=0
   ```

## 配置系统

启动服务前，请阅读[配置文件](install-configure.md)对相关的配置进行设置。
如内置引擎类型要求为 Doris，请阅读[Doris 引擎配置](engine-doris-config.md)。

如果需要导入自签发证书，请先把证书放到部署机上的某个目录（如 `<dir>`）。
`./hs_install -a certs -t <dir>` 只负责把证书分发到各个 `hengshi` 节点的 `/opt/hengshi/conf/trust-certs/`。

然后在部署机上执行同步命令：

```shell
./hs_install -a certs -t <dir>
```

同步完成后，先切到 `/opt/hengshi`，再执行 `bin/hengshi-sense-bin certs import` 导入证书；`check` 和 `list` 用于查看结果。

## 启动服务

请按照如下步骤启动服务。

1. 初始化 OS。

   初始化时请检查执行用户有 sudo 权限，初始化完成后可以关闭 sudo 权限。
   进入执行用户，在安装目录下，执行初始化 OS 命令。可以参考如下示例，示例中执行用户为 hengshi，安装目录是/opt/hengshi。

   ```shell
   sudo su - hengshi
   cd /opt/hengshi
   bin/hengshi-sense-bin init-os all  #初始化 os
   ```

   > \[!TIP] 提示
   > 离线环境可执行 bin/hengshi-sense-bin init-os all-offline 跳过依赖安装

   查看提示信息，当各个节点状态显示\[unreachable=0,failed=0]时表示 OS 初始化成功。

   ```sh
   TASK [deploy : init-os kernel] ********************************************************************************************************************************************************************************************************************************
   changed: [Node-A]
   changed: [Node-B]
   changed: [Node-C]

   TASK [deploy : init-os deps] **********************************************************************************************************************************************************************************************************************************
   changed: [Node-A]
   changed: [Node-B]
   changed: [Node-C]

   PLAY RECAP ****************************************************************************************************************************************************************************************************************************************************
   Node-A              : ok=5    changed=3    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0
   Node-B              : ok=5    changed=3    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0
   Node-C              : ok=5    changed=3    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0
   ```

2. 初始化 HENGSHI SENSE。

   在执行用户下进入安装目录，执行初始化 HENGSHI SENSE 命令。可以参考以下示例，示例中执行用户为 hengshi，安装目录为/opt/hengshi。

   ```sh
   sudo su - hengshi
   cd /opt/hengshi
   bin/hengshi-sense-bin init all   #初始化衡石系统
   ```

   查看提示信息，当各个节点状态显示\[unreachable=0    failed=0]时表示 HENGSHI SENSE 初始化成功。

   ```sh
   TASK [operations : metadb init] *******************************************************************************************************************************************************************************************************************************
   skipping: [Node-A]
   skipping: [Node-B]
   skipping: [Node-C]

   TASK [operations : engine init] *******************************************************************************************************************************************************************************************************************************
   skipping: [Node-A]
   skipping: [Node-B]
   skipping: [Node-C]

   PLAY RECAP ****************************************************************************************************************************************************************************************************************************************************
   Node-A              : ok=1    changed=0    unreachable=0    failed=0    skipped=2    rescued=0    ignored=0
   Node-B              : ok=1    changed=0    unreachable=0    failed=0    skipped=2    rescued=0    ignored=0
   Node-C              : ok=2    changed=1    unreachable=0    failed=0    skipped=1    rescued=0    ignored=0
   ```

3. 未输入 license 前，启动服务。　
   未输入 license 前，系统不支持多机运行。需要先要启动一个实例的服务(比如 Node-A)，等更新 license 后，再启动所有实例的服务。
   ```shell
   cd /opt/hengshi
   bin/hengshi-sense-bin start metadb
   bin/hengshi-sense-bin start engine
   bin/hengshi-sense-bin start minio
   bin/hengshi-sense-bin start redis
   ansible-playbook ansible/site.yml -i ansible/hosts --tags start-hengshi -e "target=hengshi"  --limit "Node-A";
   ```

4. 参考[软件授权](license.md)，输入 license。

5. 授权成功后，正常启动 HENGSHI SENSE。

   在执行用户下进入安装目录，执行启动 HENGSHI SENSE 命令。请参考下面的示例，示例中执行用户为 hengshi，安装目录是/opt/hengshi。

   ```sh
   sudo su - hengshi
   cd /opt/hengshi                 #进入安装目标目录
   bin/hengshi-sense-bin restart hengshi    #重新启动 hengshi 服务
   ```

   查看提示信息，当各个节点状态显示\[unreachable=0    failed=0]时表示 HENGSHI SENSE 启动成功。

   ```sh
   PLAY RECAP ***********************************************************************
   Node-A              : ok=4    changed=3    unreachable=0    failed=0    skipped=2    rescued=0    ignored=0
   Node-B              : ok=3    changed=2    unreachable=0    failed=0    skipped=3    rescued=0    ignored=0
   Node-C              : ok=3    changed=2    unreachable=0    failed=0    skipped=3    rescued=0    ignored=0
   ```

6. 可以通过浏览器访问服务地址，默认地址: http://localhost:8081  使用 HENGSHI SENSE 服务。如果不能访问，请检查配置文件 conf/hengshi-sense-env.sh 中的服务端口 HS_HENGSHI_PORT 是否对外开放。

## 启动服务后相关操作

当 HENGSHI SENSE 服务运行时，需要定时备份数据防止数据丢失，及时清理无用日志释放存储空间。

1. 定时备份数据。

   建议每日对数据库 metadb 进行备份，可以备份到本地设备也可以备份到远程设备。定时备份建议在非业务高峰期进行，比如凌晨，避免影响用户使用服务。 下面示例是每日零时将数据备份到远程设备的执行命令，参数详细说明请参考[数据备份](backup-restore.md)。

   ```sh
   0 0 * * * /opt/hengshi/bin/dbbackup.sh -m metadb -l /BACKUP/PATH -h $REMOTE_IP -r /BACKUP/PATH
   ```

2. 定时清理日志。

   运行过程中，HENGSHI SENSE 会产生运行日志，这些日志需要定时清理释放存储空间。下面示例是每日定时清理内部数据库的滚动日志的命令。

   ```sh
   0 0 * * * /opt/hengshi/bin/clean_engine.sh -t -r -c -g -p
   */5 * * * * /opt/hengshi/bin/clean_engine.sh -l
   ```

3. 公网情况下端口开放须知。

   在公网环境下，非必要场景中不暴露衡石整体的服务端口，避免因组件原因造成被攻击的情况。在特殊情况下，可通过 IP+端口访问的形式使用 web 服务的端口。

## 停止服务

通过下面命令停止集群服务。

```shell
bin/hengshi-sense-bin stop all
```

当提示信息中各个节点状态都为\[unreachable=0    failed=0]时表示停止服务成功。

```sh
PLAY RECAP ****************************************************************
Node-A : ok=18   changed=3    unreachable=0    failed=0    skipped=2    rescued=0    ignored=0
Node-B : ok=18   changed=3    unreachable=0    failed=0    skipped=2    rescued=0    ignored=0
Node-C : ok=18   changed=3    unreachable=0    failed=0    skipped=2    rescued=0    ignored=0
```

## 检查服务运行状态

执行以下命令时，可以查看服务运行状态。

```shell
bin/hengshi-sense-bin status all
```

在显示信息中可以查看 metadb、engine minio、redis等 HENGSHI 模块的运行信息，其中"IS ACTIVE"表示对应模块运行中，"NOT ACTIVE"表示对应模块已停止，"skipping"表示节点没有安装相应的模块。

```sh
TASK [operations : metadb status msg] ******************************************
ok: [10.0.5.230] => {}

MSG:

['[metadb]: IS ACTIVE']


TASK [operations : engine status msg] ******************************************
ok: [10.0.5.42] => {}
ok: [10.0.5.81] => {}
ok: [10.0.5.32] => {}

MSG:

['[engine]: IS ACTIVE']

TASK [operations : redis status msg] *******************************************
ok: [10.0.5.173] => {}

MSG:

['[redis]: IS ACTIVE']


TASK [operations : minio status msg] *******************************************
ok: [10.0.5.173] => {}

MSG:

['[minio]: IS ACTIVE']

TASK [operations : syslog status msg] ******************************************
ok: [10.0.5.42] => {}

MSG:

['[syslog]: IS ACTIVE']
ok: [10.0.5.81] => {}

MSG:

['[syslog]: IS ACTIVE']
ok: [10.0.5.32] => {}

MSG:

['[syslog]: IS ACTIVE']

TASK [operations : apmserver status msg] ***************************************
ok: [10.0.5.42] => {}

MSG:

['[apmserver]: IS ACTIVE']
ok: [10.0.5.81] => {}

MSG:

['[apmserver]: IS ACTIVE']
ok: [10.0.5.32] => {}

MSG:

['[apmserver]: IS ACTIVE']

TASK [operations : hengshi sense status msg] ***********************************
ok: [10.0.5.42] => {}

MSG:

['[hengshi]: IS ACTIVE']
ok: [10.0.5.81] => {}

MSG:

['[hengshi]: IS ACTIVE']
ok: [10.0.5.32] => {}

MSG:

['[hengshi]: IS ACTIVE']

TASK [operations : monit status msg] *******************************************
ok: [10.0.5.42] => {}

MSG:

['[monit]: IS ACTIVE']
ok: [10.0.5.81] => {}

MSG:

['[monit]: IS ACTIVE']
ok: [10.0.5.32] => {}

MSG:

['[monit]: IS ACTIVE']
ok: [10.0.5.230] => {}

MSG:

['[monit]: IS ACTIVE']

PLAY RECAP *********************************************************************
10.0.5.173                 : ok=7    changed=3    unreachable=0    failed=0    skipped=14   rescued=0    ignored=0
10.0.5.230                 : ok=5    changed=2    unreachable=0    failed=0    skipped=16   rescued=0    ignored=0
10.0.5.32                  : ok=11   changed=5    unreachable=0    failed=0    skipped=10   rescued=0    ignored=0
10.0.5.42                  : ok=11   changed=5    unreachable=0    failed=0    skipped=10   rescued=0    ignored=0
10.0.5.81                  : ok=11   changed=5    unreachable=0    failed=0    skipped=10   rescued=0    ignored=0
```
