Skip to content

Commit aaeee38

Browse files
CodeArtisanXshanye997
authored andcommitted
add tech-solution rdsclickhouse-htap
1 parent de5ca8f commit aaeee38

File tree

4 files changed

+349
-0
lines changed

4 files changed

+349
-0
lines changed
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
## Introduction
2+
<!-- DOCS_DESCRIPTION_CN -->
3+
本示例用于实现解决方案[RDS 与 ClickHouse 构建一站式 HTAP](https://www.aliyun.com/solution/tech-solution/rdsclickhouse-htap),涉及专有网络(VPC)、交换机(VSwitch)、云服务器(ECS)、RDS数据库(RDS)、ClickHouse数据库(ClickHouse)等资源的部署。
4+
<!-- DOCS_DESCRIPTION_CN -->
5+
6+
<!-- DOCS_DESCRIPTION_EN -->
7+
This example is used to implement solution [RDS and ClickHouse enable an all-in-one HTAP solution](https://www.aliyun.com/solution/tech-solution/rdsclickhouse-htap), which involves the creation and deployment of resources such as Virtual Private Cloud (VPC), Virtual Switch (VSwitch), Elastic Compute Service (ECS), RDS Database (RDS), ClickHouse Database (ClickHouse).
8+
<!-- DOCS_DESCRIPTION_EN -->
9+
10+
<!-- BEGIN_TF_DOCS -->
11+
## Providers
12+
13+
| Name | Version |
14+
|------|---------|
15+
| <a name="provider_alicloud"></a> [alicloud](#provider\_alicloud) | n/a |
16+
| <a name="provider_random"></a> [random](#provider\_random) | n/a |
17+
18+
## Modules
19+
20+
No modules.
21+
22+
## Resources
23+
24+
| Name | Type |
25+
|------|------|
26+
| [alicloud_click_house_account.default](https://registry.terraform.io/providers/aliyun/alicloud/latest/docs/resources/click_house_account) | resource |
27+
| [alicloud_click_house_db_cluster.click_house](https://registry.terraform.io/providers/aliyun/alicloud/latest/docs/resources/click_house_db_cluster) | resource |
28+
| [alicloud_db_account.default](https://registry.terraform.io/providers/aliyun/alicloud/latest/docs/resources/db_account) | resource |
29+
| [alicloud_db_database.database](https://registry.terraform.io/providers/aliyun/alicloud/latest/docs/resources/db_database) | resource |
30+
| [alicloud_db_instance.rds_instance](https://registry.terraform.io/providers/aliyun/alicloud/latest/docs/resources/db_instance) | resource |
31+
| [alicloud_ecs_command.run_tpcc_alicloud_ecs_command](https://registry.terraform.io/providers/aliyun/alicloud/latest/docs/resources/ecs_command) | resource |
32+
| [alicloud_ecs_invocation.run_tpcc_alicloud_ecs_invocation](https://registry.terraform.io/providers/aliyun/alicloud/latest/docs/resources/ecs_invocation) | resource |
33+
| [alicloud_instance.ecs_instance](https://registry.terraform.io/providers/aliyun/alicloud/latest/docs/resources/instance) | resource |
34+
| [alicloud_security_group.security_group](https://registry.terraform.io/providers/aliyun/alicloud/latest/docs/resources/security_group) | resource |
35+
| [alicloud_vpc.vpc](https://registry.terraform.io/providers/aliyun/alicloud/latest/docs/resources/vpc) | resource |
36+
| [alicloud_vswitch.vswitch](https://registry.terraform.io/providers/aliyun/alicloud/latest/docs/resources/vswitch) | resource |
37+
| [random_id.suffix](https://registry.terraform.io/providers/hashicorp/random/latest/docs/resources/id) | resource |
38+
| [alicloud_db_zones.zones_ids](https://registry.terraform.io/providers/aliyun/alicloud/latest/docs/data-sources/db_zones) | data source |
39+
| [alicloud_images.centos_7_9](https://registry.terraform.io/providers/aliyun/alicloud/latest/docs/data-sources/images) | data source |
40+
41+
## Inputs
42+
43+
| Name | Description | Type | Default | Required |
44+
|------|-------------|------|---------|:--------:|
45+
| <a name="input_click_house_user"></a> [click\_house\_user](#input\_click\_house\_user) | ClickHouse数据库账号 | `string` | `"ck_user"` | no |
46+
| <a name="input_db_instance_class"></a> [db\_instance\_class](#input\_db\_instance\_class) | 数据库实例规格,请在以下规格中选择【8C32G, 16C64G, 32C128G,64C256G】 | `string` | `"8C32G"` | no |
47+
| <a name="input_db_password"></a> [db\_password](#input\_db\_password) | 数据库密码 | `string` | n/a | yes |
48+
| <a name="input_ecs_instance_password"></a> [ecs\_instance\_password](#input\_ecs\_instance\_password) | ecs实例密码 | `string` | n/a | yes |
49+
| <a name="input_ecs_instance_type"></a> [ecs\_instance\_type](#input\_ecs\_instance\_type) | 实例类型 | `string` | `"ecs.e-c1m2.large"` | no |
50+
| <a name="input_rds_db_user"></a> [rds\_db\_user](#input\_rds\_db\_user) | RDS数据库账号 | `string` | `"rds_user"` | no |
51+
<!-- END_TF_DOCS -->
Lines changed: 169 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,169 @@
1+
# ------------------------------------------------------------------------------
2+
# 核心资源定义
3+
#
4+
# 本文件包含了模块的核心基础设施资源
5+
# 这里的代码负责根据输入变量来创建和配置所有云资源
6+
# ------------------------------------------------------------------------------
7+
8+
# 配置阿里云提供商
9+
provider "alicloud" {
10+
region = "cn-hangzhou"
11+
}
12+
13+
# 创建一个随机ID
14+
resource "random_id" "suffix" {
15+
byte_length = 8
16+
}
17+
18+
# 定义本地变量
19+
locals {
20+
common_name = "rdsmysql2ck-${random_id.suffix.id}"
21+
# 选择第一个共同可用区(或根据逻辑选择)
22+
database_class = {
23+
RDS = {
24+
"8C32G" = "mysql.x4.xlarge.2c"
25+
"16C64G" = "mysql.x4.2xlarge.2c"
26+
"32C128G" = "mysql.x4.4xlarge.2c"
27+
"64C256G" = "mysql.x4.8xlarge.2c"
28+
}
29+
ClickHouse = {
30+
"8C32G" = "S8"
31+
"16C64G" = "S16"
32+
"32C128G" = "S32"
33+
"64C256G" = "S64"
34+
}
35+
}
36+
ecs_command = <<SHELL
37+
#!/bin/bash
38+
echo "export RDS_URL=${alicloud_db_instance.rds_instance.connection_string}" >> ~/.bash_profile
39+
echo "export RDS_USERNAME=${var.rds_db_user}" >> ~/.bash_profile
40+
echo "export RDS_PASSWORD=${var.db_password}" >> ~/.bash_profile
41+
echo "export ROS_DEPLOY=true" >> ~/.bash_profile
42+
source ~/.bash_profile
43+
curl -fsSL https://help-static-aliyun-doc.aliyuncs.com/install-script/rdsclickhouse-htap/install_htap.sh|sh
44+
SHELL
45+
}
46+
47+
# 查询满足条件的可用区
48+
data "alicloud_db_zones" "zones_ids" {
49+
engine = "MySQL"
50+
engine_version = "8.0"
51+
instance_charge_type = "PostPaid"
52+
category = "Basic"
53+
db_instance_storage_type = "cloud_essd"
54+
}
55+
56+
# 创建专有网络VPC
57+
resource "alicloud_vpc" "vpc" {
58+
vpc_name = "vpc_${local.common_name}"
59+
cidr_block = "192.168.0.0/16"
60+
}
61+
62+
# 创建交换机VSwitch
63+
resource "alicloud_vswitch" "vswitch" {
64+
vpc_id = alicloud_vpc.vpc.id
65+
zone_id = data.alicloud_db_zones.zones_ids.ids.1
66+
cidr_block = "192.168.0.0/24"
67+
vswitch_name = "vswitch_${local.common_name}"
68+
}
69+
70+
# 创建安全组
71+
resource "alicloud_security_group" "security_group" {
72+
vpc_id = alicloud_vpc.vpc.id
73+
}
74+
75+
# 创建RDS数据库实例
76+
resource "alicloud_db_instance" "rds_instance" {
77+
instance_name = "rdsmysql_${local.common_name}"
78+
engine = "MySQL"
79+
instance_storage = 100
80+
engine_version = "8.0"
81+
category = "HighAvailability"
82+
db_instance_storage_type = "cloud_essd"
83+
security_ips = ["0.0.0.0/0"]
84+
vpc_id = alicloud_vpc.vpc.id
85+
zone_id = data.alicloud_db_zones.zones_ids.ids.1
86+
vswitch_id = alicloud_vswitch.vswitch.id
87+
instance_charge_type = "Postpaid"
88+
instance_type = lookup(local.database_class["RDS"], var.db_instance_class, "rds.mysql.s1.small")
89+
}
90+
91+
# 创建数据库
92+
resource "alicloud_db_database" "database" {
93+
character_set = "utf8mb4"
94+
instance_id = alicloud_db_instance.rds_instance.id
95+
name = "tpcc"
96+
description = "tpcc_${local.common_name}"
97+
}
98+
99+
# 创建数据库账号
100+
resource "alicloud_db_account" "default" {
101+
db_instance_id = alicloud_db_instance.rds_instance.id
102+
account_name = var.rds_db_user
103+
account_password = var.db_password
104+
account_type = "Super"
105+
}
106+
107+
# 创建ClickHouse数据库集群
108+
resource "alicloud_click_house_db_cluster" "click_house" {
109+
db_cluster_version = "23.8"
110+
category = "Basic"
111+
db_cluster_class = lookup(local.database_class["ClickHouse"], var.db_instance_class, "rds.mysql.s1.small")
112+
db_cluster_network_type = "vpc"
113+
db_node_group_count = "1"
114+
payment_type = "PayAsYouGo"
115+
db_node_storage = "100"
116+
storage_type = "cloud_essd"
117+
vswitch_id = alicloud_vswitch.vswitch.id
118+
vpc_id = alicloud_vpc.vpc.id
119+
zone_id = data.alicloud_db_zones.zones_ids.ids.1
120+
db_cluster_description = "ck_${local.common_name}"
121+
}
122+
123+
# 创建ClickHouse数据库账号
124+
resource "alicloud_click_house_account" "default" {
125+
db_cluster_id = alicloud_click_house_db_cluster.click_house.id
126+
account_name = var.click_house_user
127+
account_password = var.db_password
128+
type = "Super"
129+
}
130+
131+
# 获取最新的CentOS 7.9系统镜像
132+
data "alicloud_images" "centos_7_9" {
133+
name_regex = "^centos_7_9_x64_*"
134+
owners = "system" # 官方镜像
135+
most_recent = true # 获取最新版本
136+
}
137+
138+
# 创建ECS实例
139+
resource "alicloud_instance" "ecs_instance" {
140+
availability_zone = data.alicloud_db_zones.zones_ids.ids.1
141+
vpc_id = alicloud_vpc.vpc.id
142+
vswitch_id = alicloud_vswitch.vswitch.id
143+
internet_max_bandwidth_out = 5
144+
security_groups = [alicloud_security_group.security_group.id]
145+
password = var.ecs_instance_password
146+
instance_type = var.ecs_instance_type
147+
system_disk_category = "cloud_essd"
148+
image_id = data.alicloud_images.centos_7_9.images[0].id
149+
}
150+
151+
# 创建ECS命令资源
152+
resource "alicloud_ecs_command" "run_tpcc_alicloud_ecs_command" {
153+
name = "commond_install"
154+
description = "commond_install_description"
155+
type = "RunShellScript"
156+
command_content = base64encode(local.ecs_command)
157+
timeout = 3600
158+
working_dir = "/root"
159+
}
160+
161+
# 创建ECS命令调用资源
162+
resource "alicloud_ecs_invocation" "run_tpcc_alicloud_ecs_invocation" {
163+
instance_id = [alicloud_instance.ecs_instance.id]
164+
command_id = alicloud_ecs_command.run_tpcc_alicloud_ecs_command.id
165+
depends_on = [alicloud_db_instance.rds_instance]
166+
timeouts {
167+
create = "60m"
168+
}
169+
}
Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
# ------------------------------------------------------------------------------
2+
# 模块输出值
3+
#
4+
# 本文件定义了模块执行成功后返回给调用方的值
5+
# 这些输出可以被其他 Terraform 配置引用,或在 apply 命令结束后显示给用户
6+
# ------------------------------------------------------------------------------
7+
8+
# 输出创建的VPC资源ID
9+
output "vpc_id" {
10+
value = alicloud_vpc.vpc.id
11+
}
12+
13+
# 输出创建的RDS实例ID
14+
output "rds_instance_id" {
15+
value = alicloud_db_instance.rds_instance.id
16+
}
17+
18+
# 输出创建的ClickHouse集群ID
19+
output "click_house_cluster_id" {
20+
value = alicloud_click_house_db_cluster.click_house.id
21+
}
22+
23+
# 输出创建的ECS实例ID
24+
output "ecs_instance_id" {
25+
value = alicloud_instance.ecs_instance.id
26+
}
27+
28+
# 输出RDS数据库用户名
29+
output "db_username" {
30+
value = var.rds_db_user
31+
description = "RDS数据库用户名"
32+
}
33+
34+
# 输出RDS数据库密码
35+
output "db_password" {
36+
value = var.db_password
37+
description = "RDS 数据库密码"
38+
sensitive = true
39+
}
40+
41+
# 输出ClickHouse数据库用户名
42+
output "ck_db_name" {
43+
value = var.click_house_user
44+
description = "ClickHouse 数据库用户名"
45+
}
46+
47+
# 输出ClickHouse数据库密码
48+
output "ck_db_password" {
49+
value = var.db_password
50+
description = "ClickHouse 数据库密码"
51+
sensitive = true
52+
}
53+
54+
# 输出ECS实例密码
55+
output "ecs_instance_password" {
56+
value = var.ecs_instance_password
57+
description = "ECS 实例密码"
58+
sensitive = true
59+
}
Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
# ------------------------------------------------------------------------------
2+
# 模块输入变量
3+
#
4+
# 本文件定义了该 Terraform 模块所有可配置的输入变量
5+
# 每个变量都包含了详细的说明,以帮助用户正确配置模块
6+
# ------------------------------------------------------------------------------
7+
8+
# 数据库实例规格
9+
variable "db_instance_class" {
10+
type = string
11+
default = "8C32G"
12+
validation {
13+
condition = contains(["8C32G", "16C64G", "32C128G", "64C256G"], var.db_instance_class)
14+
error_message = "无效的配置信息,请检查并重新输入"
15+
}
16+
description = "数据库实例规格,请在以下规格中选择【8C32G, 16C64G, 32C128G,64C256G】"
17+
}
18+
19+
# RDS数据库用户名
20+
variable "rds_db_user" {
21+
type = string
22+
default = "rds_user"
23+
validation {
24+
condition = can(regex("^[a-z][a-z0-9_]{0,30}[a-z0-9]$", var.rds_db_user))
25+
error_message = "数据库用户名必须以字母开头,以字母或数字结尾,只能包含字母、数字和下划线最多32个字符"
26+
}
27+
description = "RDS数据库账号"
28+
}
29+
30+
# 数据库密码
31+
variable "db_password" {
32+
type = string
33+
sensitive = true
34+
description = "数据库密码"
35+
#default = ""
36+
validation {
37+
condition = can(regex("^[0-9A-Za-z_!@#$%^&*()_+\\-=\\+]+$", var.db_password)) && length(var.db_password) >= 8 && length(var.db_password) <= 30
38+
error_message = "长度8-30,必须包含三项(大写字母、小写字母、数字、 !@#$%^&*()_+-=中的特殊符号)"
39+
}
40+
}
41+
42+
# ClickHouse数据库用户名
43+
variable "click_house_user" {
44+
type = string
45+
default = "ck_user"
46+
validation {
47+
condition = can(regex("^[a-z][a-z0-9_]{0,30}[a-z0-9]$", var.click_house_user))
48+
error_message = "数据库用户名必须以字母开头,以字母或数字结尾,只能包含字母、数字和下划线最多32个字符"
49+
}
50+
description = "ClickHouse数据库账号"
51+
}
52+
53+
# ECS实例类型
54+
variable "ecs_instance_type" {
55+
type = string
56+
default = "ecs.e-c1m2.large"
57+
description = "实例类型"
58+
}
59+
60+
# ECS实例密码
61+
variable "ecs_instance_password" {
62+
type = string
63+
description = "ecs实例密码"
64+
#default = ""
65+
sensitive = true
66+
validation {
67+
condition = can(regex("^[0-9A-Za-z_!@#$%^&*()_+\\-=\\+]+$", var.ecs_instance_password)) && length(var.ecs_instance_password) >= 8 && length(var.ecs_instance_password) <= 30
68+
error_message = "长度8-30,必须包含三项(大写字母、小写字母、数字、 !@#$%^&*()_+-=中的特殊符号)"
69+
}
70+
}

0 commit comments

Comments
 (0)