HashiCorp Terraform 是一款基础架构即代码工具,旨在实现 "Write, Plan, and Create Infrastructure as Code"。它通过配置文件来描述云资源的拓扑结构,包括虚拟机、存储账户和网络接口。Terraform 几乎支持市面上所有的云服务,能够通过代码管理 IT 资源,并自动化部署资源,从而避免手动部署可能引发的错误。此外,Terraform 的命令行接口(CLI)简化了将配置文件部署到 AWS 或其他云平台的过程。
本教程将介绍如何通过 Terraform 快速地在 AWS 部署 DolphinDB 单节点和高可用集群。
Terraform 包含以下功能:
terraform plan
命令解析 Terraform 模板,并生成一个可执行的计划。这个计划包含了当前模板需要创建或变更的资源及其属性。用户预览执行计划以确认模板的内容是否正确。在确认无误后,通过 terraform apply
命令来执行计划,以完成所定义资源的创建或变更。这个过程允许在实际操作之前对变更内容进行审核和验证。terraform apply
命令,可以实现复杂资源的无缝变更。Terraform 不仅简化了创建、修改和删除等变更操作,还保持了计划的一致性。此外,Terraform 还提供了回滚和恢复机制,能够有效地减少人为错误,提高系统的可靠性和稳定性。在进行 Terraform 相关操作之前,请确保完成以下准备工作:
完成上述步骤后,执行以下命令,验证环境配置的正确性:
$ terraform -help
Usage:terraform [-version] [-help] [args]
The available commands for execution are listed below.
The most common, useful commands are shown first, followed by
less common or more advanced commands. If you're just getting
started with Terraform, stick with the common commands. For the
other commands, please read the help and docs before usage.
#...
$ aws --version
aws-cli/2.10.0 Python/3.11.2 Linux/4.14.133-113.105.amzn2.x86_64 botocore/2.4.5
在使用 Terraform 前,AWS 会对 Terraform 进行身份验证,需要设置AWS_ACCESS_KEY_ID
和AWS_SECRET_ACCESS_KEY
两个环境变量。其中 AWS_ACCESS_KEY_ID
用来设置 Access Key;AWS_SECRET_ACCESS_KEY
用来设置 Secret Key。在 Linux 或 macOS 环境下,通过 export
命令进行设置:
export AWS_ACCESS_KEY_ID=YourAccessKeyId
export AWS_SECRET_ACCESS_KEY=YourSecretAccessKey
在 Windows 环境下,通过 set
命令进行设置:
set AWS_ACCESS_KEY_ID=YourAccessKeyId
set AWS_SECRET_ACCESS_KEY=YourSecretAccessKey
创建一个 Terraform 项目文件夹,以下是项目文件夹的结构:
project_directory
|-- main.tf
|-- variables.tf
|-- files.tfvars
其中,每个文件的作用为:
以下展示了 main.tf 文件的部分内容,完整代码请参考本教程结尾附件部分:
# 声明 Terraform 提供者及其版本
terraform {
......
}
# 配置 AWS 提供者
provider "aws" {
......
}
# 创建 AWS 实例资源(dolphindb_server)
resource "aws_instance" "dolphindb_server" {
......
}
# 创建 AWS EBS 卷资源(data)
resource "aws_ebs_volume" "data" {
......
}
# 创建 AWS EBS 卷附加资源(data_attachment)
resource "aws_volume_attachment" "data_attachment" {
......
}
# 创建 null_resource(mount_data_volume),用于在实例上挂载数据卷
resource "null_resource" "mount_data_volume" {
......
}
以上代码实现的具体内容为:
以下展示了 variables.tf 文件的部分内容,完整代码请参考本教程结尾附件部分:
variable "region" {
type = string
}
variable "instance_name" {
description = "name of EC2"
type = string
default = "TestDolphinDBServerInstance"
}
# EC2 实例的其他参数内容已省略...
variable "ddbversion" {
description = "version of DolphinDB to install"
type = string
}
variable "dolphindb_cfg_content" {
# 替换为您的dolphindb.cfg内容
type=string
}
variable "replace_dolphindb_lic" {
description = "whether to replace dolphindb.lic"
type = bool
default = true
}
variable "dolphindb_lic_content" {
type=string
}
该文件记录配置 DolphinDB 单节点所需要的参数定义说明如下:
us-west-2
。以下展示了 files.tfvars文件的部分内容,完整代码请参考本教程结尾附件部分:
dolphindb_cfg_content= <]
files.tfvars 文件是记录 Terraform 变量的文件,其中包含了一些关键配置项。以下是对每个变量的简要说明:
通过终端进入 Terraform 项目文件夹:
cd /path/to/Dolphindb-Terraform
初始化目录:
terraform init
部署实例,可以根据实际的资源和需求来填写 variables.tf 文件中定义的变量:
terraform apply -var "region=" -var "subnet_id="
-var "key_name=" -var "ddbversion=2.00.10.8" -var "az="
-var "key_location=" -var-file="files.tfvars"
按照提示输入 yes
确认创建资源。等待 Terraform 完成部署。
在浏览器中输入部署服务器 IP 地址和部署端口号(默认是 8848)。若可以打开 Web 管理界面,则表示 DolphinDB 单节点运行正常。打开后的 Web 管理界面如下,以管理员身份(默认账号:admin,默认密码:123456)进行登录。
本教程示例集群的部署架构图如下:
请注意该 IP 仅用于示例,实际 IP 由设置的 subnet 以及部署 EC2 实例时自动生成。
部署高可用集群前的要求和准备:
创建一个 Terraform 项目文件夹,以下是项目文件夹的结构:
project_directory
|-- main.tf
|-- variables.tf
|-- files.tfvars
|-- output.tf
其中,每个文件的作用为:
以下展示了 main.tf 文件的部分内容,完整代码请参考本教程结尾附件部分:
# 声明 Terraform 提供者及其版本
terraform {
......
}
# 配置 AWS 提供者
provider "aws" {
......
}
# 创建 AWS 实例资源(ddb_p1)
resource "aws_instance" "ddb_p1" {
......
}
# 创建其他两个 AWS 实例资源(ddb_p2、ddb_p3),与 ddb_p1 的配置类似
# ......
# 创建 AWS EBS 卷资源(data_p1)
resource "aws_ebs_volume" "data_p1" {
......
}
# 创建其他两个 AWS EBS 卷资源(data_p2、data_p3),与 data_p1 的配置类似
# ......
# 创建 AWS EBS 卷附加资源(data_attachment_p1)
resource "aws_volume_attachment" "data_attachment_p1" {
......
}
# 创建其他两个 AWS EBS 卷附加资源,与 data_attachment_p1 配置类似
# ......
# 创建 null_resource(mount_data_volume_p1),用于在实例上挂载数据卷
resource "null_resource" "mount_data_volume_p1" {
......
}
# 创建其他两个 null_resource,用于在 ddb_p2 和 ddb_p3 上挂载数据卷,配置 DolphinDB 等,与 mount_data_volume_p1 的配置类似
# ......
以上代码实现的具体内容为:
以下展示了 variables.tf 文件的部分内容,完整代码请参考本教程结尾附件部分:
# EC2 实例的其他参数内容已省略...
variable "ddbversion" {
description = "version of DolphinDB to install"
type = string
}
variable "replace_dolphindb_lic" {
description = "whether to replace dolphindb.lic"
type = bool
default = true
}
variable "dolphindb_lic_content" {
type = string
}
variable "cluster_nodes" {
type = string
}
variable "cluster_cfg" {
type = string
}
variable "controller_cfg_p1" {
type = string
}
variable "agent_cfg_p1" {
type = string
}
# P2 P3 相关内容已省略...
该文件用于存放 DolphinDB 高可用集群配置所需要的参数定义,其中一部分参数与部署 DolphinDB 单节点时的参数含义相同,这里不再赘述,仅说明不同配置参数:
在 files.tfvars 文件中添加以下内容:
# 企业版 license
dolphindb_lic_content = <
files.tfvars 文件记录了 Terraform 的变量,其中包含了一些关键配置项。以下是对每个配置项的简要说明:
在 output.tf 文件中添加以下内容:
output "public_ip_p1" {
value = aws_instance.ddb_p1.public_ip
}
output "private_ip_p1" {
value = aws_instance.ddb_p1.private_ip
}
output "public_ip_p2" {
value = aws_instance.ddb_p2.public_ip
}
output "private_ip_p2" {
value = aws_instance.ddb_p2.private_ip
}
output "public_ip_p3" {
value = aws_instance.ddb_p3.public_ip
}
output "private_ip_p3" {
value = aws_instance.ddb_p3.private_ip
}
这些参数会在集群部署完成后输出,下面是参数解释:
通过终端进入 Terraform 项目文件夹:
cd /path/to/Dolphindb-Terraform
初始化目录:
terraform init
部署实例,可以根据实际的资源和需求来填写 variables.tf 文件中定义的变量:
terraform apply -var "region=" -var "subnet_id_p1=" -var "subnet_id_p2=" -var "subnet_id_p3=" -var "key_name=" -var "ddbversion=2.00.10.8" -var "az_p1=" -var "az_p2=" -var "az_p3=" -var "key_location=" -var-file="files.tfvars"
按照提示输入 yes
确认创建资源。等待 Terraform 完成部署。
可以通过 Web 管理界面启动或关闭数据节点和计算节点,以及修改集群的配置。在浏览器中输入任一控制节点的 IP 地址和端口号即可进入 Web 管理界面,例如,P2 上控制节点的 IP 为 10.0.0.81,端口号为 8800,所以访问地址为 10.0.0.81:8800。访问后若出现如下提示,表明当前控制节点不是 Leader 节点,点击确定即可自动跳转至 Leader 节点:
打开后的 Web 管理界面如下。以管理员身份(默认账号:admin,默认密码:123456)登录后,勾选数据节点和计算节点,再点击启动(关闭)按键即可启动(关闭)相应的数据节点和计算节点:
刷新页面后可看到对应的数据节点和计算节点已启动,如下图所示:
在 AWS EC2 中,key_name
参数用于指定启动实例时要使用的密钥对的名称。密钥对用于对实例进行身份验证,从而允许用户通过 SSH 登录到实例。以下是详细的步骤:
.pem
结尾)。2. 将私钥文件添加到 SSH 代理:
在本地计算机上,使用以下命令将私钥添加到 SSH 代理。请将 /path/to/your-key.pem 替换为第一步中保存的私钥文件的实际路径。
ssh-add /path/to/your-key.pem
3. 设置密钥对名称和文件位置
terraform apply // 其他变量...
-var "key_name="
-var "key_location="
4. SSH 登录到实例:
使用以下命令通过 SSH 登录到 EC2 实例。请将your-instance-ip
替换为实际的 IP 地址。
ssh -i /path/to/your-key.pem ec2-user@your-instance-ip
注意:ec2-user 是 Amazon Linux AMI 的默认用户名。请根据实际使用的 AMI 修改用户名,例如,若 AMI 是Ubuntu,则用户名填 ubuntu
。
在 files.tfvars 文件中,将 dolphindb_lic_content 变量的内容替换为企业版授权许可内容。同时,确保 variables.tf 文件中 replace_dolphindb_lic 的值设为 true(默认为true)。
dolphindb_lic_content= <