1.介绍
在部署 DolphinDB 集群时,用户通常需要对多个文件进行配置,例如在多个不同文件中的多处配置同一个IP。为了提升效率,我们可以使用 Ansible 工具实现 DolphinDB 集群的自动化部署。本文为大家介绍了如何使用 Ansible 自动化部署 DolphinDB 集群,尽量做到同一值在配置文件中只出现一次,从而简化部署过程。
2.前置条件
- 在主控机器上克隆或下载本项目,然后通过
cd
指令进入到下载目录。 - 阅读用户手册:通过 分布式数据库 来了解 DolphinDB 集群控制节点(controller)、代理节点(agent)、计算节点和数据节点的相关定义,以及 DolhinDB 集群如何通过使用 Raft 机制来实现控制节点的高可用,详见 集群配置。
- 本地安装 Ansible,参考:教程。本文使用的 ansible-playbook 版本为 2.9.X。
- 运行如下命令,安装社区扩展:
ansible-galaxy collection install community.general
- 一个或多个有 SSH 权限的 Linux 远程机器。如果集群的控制节点开启了元数据高可用机制,则至少需要三台机器。
- (可选)如果远程机器上不能进行 SSH 公钥认证或尚未配置,可通过以下指令在本地机器上安装 sshpass:
sudo apt-get install sshpass ##for Ubuntu
- 准备好磁盘卷。建议将控制节点的元数据、数据节点的 Redolog 和 chunkMetaData 存储在 SSD 磁盘上,而数据节点的实际数据可以存储在 HDD 磁盘上,详见 数据模型。更多内容,参考第二节对
controller_home_dir
,datanode_volume_prefix
,datanode_redolog_prefix
等变量的描述。 - 确保 SSH 用户对要使用的磁盘卷拥有读写的权限。
- 通过 官网 下载社区版 DolphinDB Server(包含试用版本的许可证)至本机。也可以申请商业版本的许可证。
3. 在 Linux 主机上部署一个普通集群
Ansible 的运行机制是提供声明式的语法,将要执行的操作和可变的配置项分隔开。最常见的用法是:
ansible-playbook -i some.ini some.yml
其中, .yml 文件包含了执行操作的逻辑,而 .ini 包含了可变的配置项。在本教程所用仓库中,yml 文件,即 deploy.yml (已经写好),提供了一个较为通用的用于部署 DolphinDB 集群的执行逻辑,无需修改。用户只需要定义或修改 inventory.ini。编写好之后,用户无需关心 DolphinDB 的各种配置文件,如 cluster.cfg 和 cluster.nodes。
下面这个例子将近一步说明 inventory.ini 应该如何编写和修改:
假设使用两台服务器部署一个集群,包含一个控制节点(在 192.168.1.1),两个数据节点(分别在 192.168.1.1 和 192.168.1.2),以及两个代理节点(也分别在 192.168.1.1 和 192.168.1.2)。
3.1 定义各个进程(节点)的 IP 和节点名称的对应关系
首先我们在 inventory.ini 中定义如下内容:
[controllers]
controller1 ansible_host=192.168.1.1
[agents]
agent1 ansible_host=192.198.1.1
agent2 ansible_host=192.198.1.2
[datanodes]
data1 ansible_host=192.198.1.1
data2 ansible_host=192.198.1.2
其中 controller1
, agent1
, agent2
, data1
, data2
,被用作集群中 DolphinDB 进程的别名.建议用户设置该变量时,确保命名唯一,有意义且仅包含英文字母和数字。
3.2 配置各个进程(节点)的监听端口
由于 DolphinDB 各个节点(即进程)需要网络通信,我们需要定义各进程监听的端口,即变量 port。在每行最后追加:
[controllers]
controller1 ansible_host=192.168.1.1 port=10010
[agents]
agent1 ansible_host=192.198.1.1 port=10011
agent2 ansible_host=192.198.1.2 port=10011
[datanodes]
data1 ansible_host=192.198.1.1 port=10012
data2 ansible_host=192.198.1.2 port=10012
注意同一个服务器上的各个进程的监听的端口不能相互冲突,也不能和已有进程冲突。
3.3 配置硬盘目录
我们希望 DolphinDB 的数据节点和控制节点将 DolphinDB 自身的文本运行日志、元数据(如 Redolog)以及数据库文件本身存储在指定的目录,因此我们在 ini 文件中添加:
[controllers:vars]
controller_home_dir="/ssd/ssd1/controllerhome"
log_dir="/hdd/hdd1/dolphindb_log"
第一行将 controller 节点的元数据目录指定为服务器上的 /ssd/ssd1/controllerhome
。用户需要替换为自己希望设置的目录。推荐将该目录设置在 SSD 盘。 第二行将 DolphinDB 的运行日志目录指定为 /hdd/hdd1/dolphindb_log
。也需要替换为自己希望设置的目录。
[datanodes:vars]
datanode_volume_prefix='/hdd/hdd3/datanode_vol'
datanode_redolog_prefix='/ssd/ssd0/datanode_redo'
datanode_chunk_meta_prefix='/ssd/ssd0/datanode_chunkmeta/'
datanode_tsdb_redolog_prefix='/ssd/ssd0/datanode_tsdb_redolog/'
log_dir="/hdd/hdd1/dolphindb_log"
以上配置了 datanode 节点的数据目录和元数据目录,分别对应 DolphinDB 配置项中的 volumes, redoLogDir 和 TSDBRedoLogDir,以及 chunkMetaDir。您也需要替换为自己希望设置的目录。除了 volumes 和 log_dir 可以设置为 HDD 盘的目录外,其他都推荐设置为 SSD 目录。
修改后的 inventory.ini 如下
[controllers]
controller1 ansible_host=192.168.1.1 port=10010
[agents]
agent1 ansible_host=192.198.1.1 port=10011
agent2 ansible_host=192.198.1.2 port=10011
[datanodes]
data1 ansible_host=192.198.1.1 port=10012
data2 ansible_host=192.198.1.2 port=10012
[controllers:vars]
controller_home_dir="/ssd/ssd1/controllerhome"
log_dir="/hdd/hdd1/dolphindb_log"
[datanodes:vars]
datanode_volume_prefix='/hdd/hdd3/datanode_vol'
datanode_redolog_prefix='/ssd/ssd0/datanode_redo'
datanode_chunk_meta_prefix='/ssd/ssd0/datanode_chunkmeta/'
datanode_tsdb_redolog_prefix='/ssd/ssd0/datanode_tsdb_redolog/'
log_dir="/hdd/hdd1/dolphindb_log"
3.4 配置本机的 DolphinDB 二进制文件路径
下载许可证文件(名为 dolphindb.lic)和 DolphinDB 二进制压缩文件(名为 DolphinDB_Linux64_*.zip)。在 inventory.ini
中新增一行 [all:vars]
,在该行下新增 local_exec_zip
和 local_license
变量, 使它们指向你本机的绝对或相对路径。完成配置后, Ansible 才能知道从哪里拷贝这些文件到远程服务器。
例如,如果你下载的许可证文件位于本机的 /Users/your_user_name/Downloads/dolphindb.lic
,你应该在 inventory.ini 中新增 local_license=/Users/your_user_name/Downloads/dolphindb.lic
。
修改后的 inventory.ini 如下
[controllers]
controller1 ansible_host=192.168.1.1 port=10010
[agents]
agent1 ansible_host=192.198.1.1 port=10011
agent2 ansible_host=192.198.1.2 port=10011
[datanodes]
data1 ansible_host=192.198.1.1 port=10012
data2 ansible_host=192.198.1.2 port=10012
[controllers:vars]
controller_home_dir="/ssd/ssd1/controllerhome"
log_dir="/hdd/hdd1/dolphindb_log"
[datanodes:vars]
datanode_volume_prefix='/hdd/hdd3/datanode_vol'
datanode_redolog_prefix='/ssd/ssd0/datanode_redo'
datanode_chunk_meta_prefix='/ssd/ssd0/datanode_chunkmeta/'
datanode_tsdb_redolog_prefix='/ssd/ssd0/datanode_tsdb_redolog/'
log_dir="/hdd/hdd1/dolphindb_log"
[all:vars]
local_license=/Users/your_user_name/Downloads/dolphindb.lic
local_exec_zip=/Users/your_user_name/Downloads/DolphinDB_Linux64_V2.00.8.zip
添加以下命令以指定 DolphinDB_Linux64_*.zip 在服务器上的解压路径:
server_dir='/hdd/hdd2/your_user_name/server1'
3.5 设置 raft_controller 为 False
最后因为这个集群没有开启控制节点 Raft 高可用,必须添加一行:
raft_controller=False
最终的 inventory.ini
如下:
[controllers]
controller1 ansible_host=192.168.1.1 port=10010
[agents]
agent1 ansible_host=192.198.1.1 port=10011
agent2 ansible_host=192.198.1.2 port=10011
[datanodes]
data1 ansible_host=192.198.1.1 port=10012
data2 ansible_host=192.198.1.2 port=10012
[controllers:vars]
controller_home_dir="/ssd/ssd1/controllerhome"
log_dir="/hdd/hdd1/dolphindb_log"
[datanodes:vars]
datanode_volume_prefix='/hdd/hdd3/datanode_vol'
datanode_redolog_prefix='/ssd/ssd0/datanode_redo'
datanode_chunk_meta_prefix='/ssd/ssd0/datanode_chunkmeta/'
datanode_tsdb_redolog_prefix='/ssd/ssd0/datanode_tsdb_redolog/'
log_dir="/hdd/hdd1/dolphindb_log"
[all:vars]
local_license=/Users/your_user_name/Downloads/dolphindb.lic
local_exec_zip=/Users/your_user_name/Downloads/DolphinDB_Linux64_V2.00.8.zip
server_dir='/hdd/hdd2/your_user_name/server1'
raft_controller=False
3.6 启动
配置文件已准备好,此时只需运行
ansible-playbook -i inventory.ini deploy.yml --ask-become-pass
稍作等待,如果没有出现 Error
的信息,说明部署成功。浏览器打开任意控制节点或数据节点的 Web 界面进行确认。
4. 在 Linux 主机上部署一个 Raft 高可用多控制节点的 DolphinDB 集群
- 在本地机器上克隆或下载该项目,然后通过
cd
指令进入到该项目目录。 - 通过 官网 下载社区版 DolphinDB Server(包含试用版本的许可证)至集群需要安装的机器。也可以申请商业版本的许可证。
- 编辑
inventory.ini
中的local_exec_zip
和local_license
变量, 使之指向本机 server 压缩包和许可证对应的绝对或相对路径。 例如,如果您下载的许可证文件的本机路径为/Users/foo/dolphindb.lic
,您可以把inventory.ini
中的local_license
设置为local_license=/Users/foo/dolphindb.lic
。 - 下图显示了
inventory.ini
所定义的集群及其进程,其中 host1, host2, host3 的 IP 分别为192.192.168.2, 192.192.168.3, 192.192.168.4。 您可以根据自己的配置来编辑、添加或删除inventory.ini
中的controllers
,agents
,datanodes
, andcomputenodes
的相关配置。
注意:不要删除[controllers]
[agents]
[datanodes]
[computenodes]
这些行。具体内容在图表下面。
注意:每台远程机器应该只有一个 agent 节点进程。
下述代码中第一列的变量,可以通过 Ansible 的魔法变量 inventory_hostname
访问,也被用作集群中 DolphinDB 进程的别名。建议用户设置该变量时,确保命名唯一,有意义且仅包含英文字母和数字,例如:假设集群中有两台主机,每台两个数据节点进程,一共四个数据节点进程,可以将其命名为 data1
, data2
, data3
, data4
(注意: 同一台机器不能有相同的 port 以避免端口冲突,例如,下面的 data1 data2 数据节点进程在同一台机器 192.168.100.1 上,因此 port 必须不同; data3,data4 同理)
[datanodes]
data1 port=10015 ansible_host=192.168.100.1
data2 port=10016 ansible_host=192.168.100.1
data3 port=10015 ansible_host=192.168.100.2
data4 port=10016 ansible_host=192.168.100.2
注意:避免使用以dummy
开头的主机名(如dummy0
,dummy1
),因为它们已经被内部定义。
变量 port
(用户定义的 host变量
),为 DolphinDB 用于进程监听的 TCP 端口。集群的每个节点都需要有对应的端口号。若同一服务器上的 DolphinDB 进程端口不会冲突,那么可以在组变量里定义 port
,如下:
[datanodes]
data1 ansible_host=192.168.100.1
data2 ansible_host=192.168.100.2
data3 ansible_host=192.168.100.3
[datanodes:vars]
port=10015
## ....
更多相关信息请参考 Ansible 的文档:变量优先级。
Ansible 变量 ansible_host
既用于 Ansible SSH 连接到远程机器,也用于 DolphinDB 进程间的通讯,建议配置为内网 IP 。如果您需要在数据节点或计算节点上通过 subscribeTable 函数订阅流数据表,请在数据节点或计算节点配置中添加 sub_port
变量,如下:
[datanodes]
data1 port=10017 ansible_host=192.168.100.1
data2 port=10018 ansible_host=192.168.100.2 sub_port=10019
data3 port=10020 ansible_host=192.168.100.3
data4 port=10021 ansible_host=192.168.100.1 sub_port=10022
data5 port=10023 ansible_host=192.168.100.2
data6 port=10024 ansible_host=192.168.100.3 sub_port=10025
[computenodes]
compute1 port=10026 ansible_host=192.168.100.1 sub_port=10027
compute2 port=10028 ansible_host=192.168.100.2
注意,同一台机器的 port
,sub_port
的端口也不能冲突。
- 编辑
inventory.ini
中all:vars
,datanodes:vars
和controllers:vars
模块下的变量(除raft_controller=True
和local_*
等之前已编辑过的变量)。 其中,使**_dir
变量需指向远端机器上的现有路径。
相关变量的含义如下:
名称 | 含义 |
---|---|
server_dir | DolphinDB server 可执行文件所在的绝对路径。 |
log_dir | DolphinDB 的应用程序日志目录的绝对路径;可以放在普通硬盘上。 |
controller_home_dir | 控制节点元数据目录的绝对路径;建议放在 SSD 上;不可删除。 |
datanode_volume_prefix | 数据节点配置项 volumes 指定的绝对路径;必须加英文引号,以便 Ansible 能够识别它为字符串类型;可以在一个或多个硬盘上;不可删除。 |
datanode_redolog_prefix | 数据节点配置项 redoLogDir 指定的绝对路径;建议放在 SSD 上;不可删除。 |
datanode_chunk_meta_prefix | 数据节点配置项 chunkMetaDir 指定的绝对路径的前缀;建议放在 SSD 上;不可删除。 |
datanode_tsdb_redolog_prefix | 数据节点配置项 TSDBRedoLogDir 的绝对路径;只有在使用 2.0.x+ 版本和TSDB引擎时才有用;如果使用1.x 版本,该配置应该被删除;建议指定为 SSD 盘上的路径 。 |
agent_home_dir | agents 进程指定的 home 目录的绝对路径;可以放在普通硬盘上。 |
- (可选)编辑或添加
roles/dolphindb_cfg_controller/templates/cfg/cluster.cfg
文件中的配置行(参考用户手册 参数配置 章节以了解更多细节)
注意:与 IP:port 和磁盘卷相关的配置,如locateSite
,port
,sites
,volumes
,redoLogDir
,TSDBRedoLogDir
等已经通过inventory.ini
中配置的变量生成(通过templates/*.j2
文件的帮助),因此用户无需在*.cfg
文件中手动添加这些配置,也无需修改templates/*.j2
文件。
- 在本地机器上,运行命令
ansible-playbook -i inventory.ini deploy.yml --ask-become-pass
完成部署。如果您的 SSH 设置了密码认证,可以通过命令行传递用户名和密码,例如ansible-playbook -i inventory.ini deploy. yml --extra-vars "ansible_user=foo ansible_password=bar"
。系统检查 TCP 端口的可用性后,会自动将许可证文件和 DolphinDB 压缩包复制到远程机器上,然后根据定义的变量生成 DolphinDB 的配置文件,并启动集群。 - 在浏览器中打开
http://controllerip:port
(高可用场景下,可以指定为任意一个控制节点的 IP:port,系统会自动重定向到主控制节点)。您可以通过查看状态页面来检查所有节点是否已经启动并运行。