Skip to content

Commit d8fcef1

Browse files
wbw2048shanye997
authored andcommitted
docs:通过 RDS 读写分离提升数据库性能
1 parent c95d64a commit d8fcef1

File tree

4 files changed

+300
-0
lines changed

4 files changed

+300
-0
lines changed
Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
## Introduction
2+
3+
<!-- DOCS_DESCRIPTION_CN -->
4+
本示例用于实现解决方案[RDS 通过代理组件实现读写分离](https://www.aliyun.com/solution/tech-solution/read-write-splitting-through-rds-proxy), 涉及到专有网络(VPC)、交换机(VSwitch)、云服务器(ECS)、云数据库(RDS MySQL) 等资源的创建。
5+
<!-- DOCS_DESCRIPTION_CN -->
6+
7+
<!-- DOCS_DESCRIPTION_EN -->
8+
This example demonstrates the implementation of the solution [Read write splitting through RDS proxy](https://www.aliyun.com/solution/tech-solution/read-write-splitting-through-rds-proxy). It involves the creation, and deployment of resources such as Virtual Private Cloud (VPC), VSwitch, Elastic Compute Service (ECS), and ApsaraDB RDS for MySQL.
9+
<!-- DOCS_DESCRIPTION_EN -->
10+
11+
<!-- BEGIN_TF_DOCS -->
12+
## Providers
13+
14+
| Name | Version |
15+
|------|---------|
16+
| <a name="provider_alicloud"></a> [alicloud](#provider\_alicloud) | n/a |
17+
| <a name="provider_random"></a> [random](#provider\_random) | n/a |
18+
19+
## Modules
20+
21+
No modules.
22+
23+
## Resources
24+
25+
| Name | Type |
26+
|------|------|
27+
| [alicloud_db_account.db_account](https://registry.terraform.io/providers/aliyun/alicloud/latest/docs/resources/db_account) | resource |
28+
| [alicloud_db_account_privilege.account_privilege](https://registry.terraform.io/providers/aliyun/alicloud/latest/docs/resources/db_account_privilege) | resource |
29+
| [alicloud_db_database.rds_database](https://registry.terraform.io/providers/aliyun/alicloud/latest/docs/resources/db_database) | resource |
30+
| [alicloud_db_instance.database](https://registry.terraform.io/providers/aliyun/alicloud/latest/docs/resources/db_instance) | resource |
31+
| [alicloud_db_readonly_instance.readonly_instance](https://registry.terraform.io/providers/aliyun/alicloud/latest/docs/resources/db_readonly_instance) | resource |
32+
| [alicloud_ecs_command.install_script](https://registry.terraform.io/providers/aliyun/alicloud/latest/docs/resources/ecs_command) | resource |
33+
| [alicloud_ecs_invocation.run_install](https://registry.terraform.io/providers/aliyun/alicloud/latest/docs/resources/ecs_invocation) | resource |
34+
| [alicloud_instance.ecs_instance](https://registry.terraform.io/providers/aliyun/alicloud/latest/docs/resources/instance) | resource |
35+
| [alicloud_rds_db_proxy.db_proxy](https://registry.terraform.io/providers/aliyun/alicloud/latest/docs/resources/rds_db_proxy) | resource |
36+
| [alicloud_security_group.security_group](https://registry.terraform.io/providers/aliyun/alicloud/latest/docs/resources/security_group) | resource |
37+
| [alicloud_security_group_rule.allow_http](https://registry.terraform.io/providers/aliyun/alicloud/latest/docs/resources/security_group_rule) | resource |
38+
| [alicloud_vpc.vpc](https://registry.terraform.io/providers/aliyun/alicloud/latest/docs/resources/vpc) | resource |
39+
| [alicloud_vswitch.vswitch1](https://registry.terraform.io/providers/aliyun/alicloud/latest/docs/resources/vswitch) | resource |
40+
| [alicloud_vswitch.vswitch2](https://registry.terraform.io/providers/aliyun/alicloud/latest/docs/resources/vswitch) | resource |
41+
| [random_id.suffix](https://registry.terraform.io/providers/hashicorp/random/latest/docs/resources/id) | resource |
42+
| [alicloud_db_instance_classes.example](https://registry.terraform.io/providers/aliyun/alicloud/latest/docs/data-sources/db_instance_classes) | data source |
43+
| [alicloud_db_zones.rds_zones](https://registry.terraform.io/providers/aliyun/alicloud/latest/docs/data-sources/db_zones) | data source |
44+
| [alicloud_images.default](https://registry.terraform.io/providers/aliyun/alicloud/latest/docs/data-sources/images) | data source |
45+
| [alicloud_instance_types.default](https://registry.terraform.io/providers/aliyun/alicloud/latest/docs/data-sources/instance_types) | data source |
46+
| [alicloud_regions.current](https://registry.terraform.io/providers/aliyun/alicloud/latest/docs/data-sources/regions) | data source |
47+
48+
## Inputs
49+
50+
| Name | Description | Type | Default | Required |
51+
|------|-------------|------|---------|:--------:|
52+
| <a name="input_db_name"></a> [db\_name](#input\_db\_name) | 请输入数据库名称(由小写字母、数字及特殊字符 -\_ 组成,以字母开头,字母或数字结尾,最多64个字符)。 | `string` | `"db_test"` | no |
53+
| <a name="input_db_password"></a> [db\_password](#input\_db\_password) | 请输入RDS数据库密码。密码长度为8-32位,需包含大写字母、小写字母、数字和特殊字符(如:!@#$%^&*()\_+-=)。 | `string` | n/a | yes |
54+
| <a name="input_db_user_name"></a> [db\_user\_name](#input\_db\_user\_name) | 请输入RDS数据库用户名(长度为2-16个字符,仅允许小写字母、数字和下划线,必须以字母开头,以字母或数字结尾)。 | `string` | `"testuser"` | no |
55+
| <a name="input_ecs_instance_password"></a> [ecs\_instance\_password](#input\_ecs\_instance\_password) | 请输入服务器登录密码。密码长度为8-30位,必须包含大写字母、小写字母、数字和特殊字符(如:!@#$%^&*\_-+=\|{}[]:;'<>,.?/)。 | `string` | n/a | yes |
56+
| <a name="input_region_id"></a> [region\_id](#input\_region\_id) | 请输入地域ID(例如:cn-hangzhou)。 | `string` | `"cn-hangzhou"` | no |
57+
| <a name="input_vpc_cidr_block"></a> [vpc\_cidr\_block](#input\_vpc\_cidr\_block) | 请输入VPC的CIDR块(支持的值包括:192.168.0.0/16、172.16.0.0/12、10.0.0.0/8)。这是您的虚拟私有云的地址范围。 | `string` | `"192.168.0.0/16"` | no |
58+
| <a name="input_vswitch1_cidr_block"></a> [vswitch1\_cidr\_block](#input\_vswitch1\_cidr\_block) | 请输入主交换机的CIDR块(例如:192.168.1.0/24)。这是您主虚拟交换机的地址范围。 | `string` | `"192.168.1.0/24"` | no |
59+
| <a name="input_vswitch2_cidr_block"></a> [vswitch2\_cidr\_block](#input\_vswitch2\_cidr\_block) | 请输入备交换机的CIDR块(例如:192.168.2.0/24)。这是您备虚拟交换机的地址范围。 | `string` | `"192.168.2.0/24"` | no |
60+
<!-- END_TF_DOCS -->
Lines changed: 177 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,177 @@
1+
provider "alicloud" {
2+
region = var.region_id
3+
}
4+
5+
resource "random_id" "suffix" {
6+
byte_length = 8
7+
}
8+
9+
locals {
10+
zone_id_1 = data.alicloud_db_zones.rds_zones.zones[length(data.alicloud_db_zones.rds_zones.zones) - 1].id
11+
zone_id_2 = data.alicloud_db_zones.rds_zones.zones[length(data.alicloud_db_zones.rds_zones.zones) - 2].id
12+
common_name = random_id.suffix.id
13+
install_script = <<SCRIPT
14+
#!/bin/sh
15+
export ROS_DEPLOY=true
16+
curl -fsSL https://static-aliyun-doc.oss-cn-hangzhou.aliyuncs.com/install-script/read-write-splitting-for-databases/install.sh | bash
17+
18+
SCRIPT
19+
}
20+
21+
data "alicloud_db_zones" "rds_zones" {
22+
engine = "MySQL"
23+
engine_version = "8.0"
24+
instance_charge_type = "PostPaid"
25+
category = "HighAvailability"
26+
db_instance_storage_type = "cloud_essd"
27+
28+
}
29+
data "alicloud_db_instance_classes" "example" {
30+
zone_id = local.zone_id_1
31+
engine = data.alicloud_db_zones.rds_zones.engine
32+
engine_version = data.alicloud_db_zones.rds_zones.engine_version
33+
category = data.alicloud_db_zones.rds_zones.category
34+
db_instance_storage_type = data.alicloud_db_zones.rds_zones.db_instance_storage_type
35+
instance_charge_type = data.alicloud_db_zones.rds_zones.instance_charge_type
36+
}
37+
38+
data "alicloud_instance_types" "default" {
39+
cpu_core_count = 4
40+
system_disk_category = "cloud_essd"
41+
image_id = data.alicloud_images.default.images[0].id
42+
instance_type_family = "ecs.c6"
43+
availability_zone = local.zone_id_1
44+
}
45+
46+
data "alicloud_images" "default" {
47+
name_regex = "^aliyun_3_x64_20G_alibase_*"
48+
most_recent = true
49+
owners = "system"
50+
}
51+
52+
# VPC Resources
53+
resource "alicloud_vpc" "vpc" {
54+
vpc_name = "vpc"
55+
cidr_block = var.vpc_cidr_block
56+
}
57+
58+
# VSwitch Resources
59+
resource "alicloud_vswitch" "vswitch1" {
60+
vpc_id = alicloud_vpc.vpc.id
61+
cidr_block = var.vswitch1_cidr_block
62+
zone_id = local.zone_id_1
63+
vswitch_name = "vsw_001"
64+
}
65+
66+
resource "alicloud_vswitch" "vswitch2" {
67+
vpc_id = alicloud_vpc.vpc.id
68+
cidr_block = var.vswitch2_cidr_block
69+
zone_id = local.zone_id_2
70+
vswitch_name = "vsw_002"
71+
}
72+
73+
# Security Group
74+
resource "alicloud_security_group" "security_group" {
75+
vpc_id = alicloud_vpc.vpc.id
76+
security_group_name = "sg"
77+
security_group_type = "normal"
78+
}
79+
80+
resource "alicloud_security_group_rule" "allow_http" {
81+
type = "ingress"
82+
ip_protocol = "tcp"
83+
port_range = "80/80"
84+
cidr_ip = "140.205.11.1/25"
85+
security_group_id = alicloud_security_group.security_group.id
86+
}
87+
88+
# ECS Resources
89+
resource "alicloud_instance" "ecs_instance" {
90+
instance_name = "ecs-${local.common_name}"
91+
system_disk_category = data.alicloud_instance_types.default.system_disk_category
92+
system_disk_size = 40
93+
image_id = data.alicloud_images.default.images[0].id
94+
vswitch_id = alicloud_vswitch.vswitch1.id
95+
password = var.ecs_instance_password
96+
instance_type = data.alicloud_instance_types.default.instance_types[0].id
97+
internet_max_bandwidth_out = 5
98+
security_groups = [alicloud_security_group.security_group.id]
99+
}
100+
101+
# RDS Resources
102+
resource "alicloud_db_instance" "database" {
103+
engine = data.alicloud_db_instance_classes.example.engine
104+
engine_version = data.alicloud_db_instance_classes.example.engine_version
105+
instance_type = data.alicloud_db_instance_classes.example.instance_classes[0].instance_class
106+
instance_storage = data.alicloud_db_instance_classes.example.instance_classes[0].storage_range.min
107+
instance_name = "rds-${local.common_name}"
108+
vswitch_id = alicloud_vswitch.vswitch1.id
109+
monitoring_period = 60
110+
zone_id = local.zone_id_1
111+
zone_id_slave_a = local.zone_id_2
112+
category = data.alicloud_db_instance_classes.example.category
113+
security_group_ids = [alicloud_security_group.security_group.id]
114+
}
115+
116+
resource "alicloud_db_database" "rds_database" {
117+
instance_id = alicloud_db_instance.database.id
118+
name = var.db_name
119+
character_set = "utf8"
120+
}
121+
122+
resource "alicloud_db_account" "db_account" {
123+
db_instance_id = alicloud_db_instance.database.id
124+
account_name = var.db_user_name
125+
account_password = var.db_password
126+
account_type = "Normal"
127+
}
128+
129+
resource "alicloud_db_account_privilege" "account_privilege" {
130+
instance_id = alicloud_db_instance.database.id
131+
account_name = alicloud_db_account.db_account.account_name
132+
privilege = "ReadWrite"
133+
db_names = [alicloud_db_database.rds_database.name]
134+
depends_on = [alicloud_db_database.rds_database]
135+
}
136+
137+
# RDS DB Proxy
138+
resource "alicloud_rds_db_proxy" "db_proxy" {
139+
instance_id = alicloud_db_instance.database.id
140+
db_proxy_instance_type = "common"
141+
vpc_id = alicloud_vpc.vpc.id
142+
vswitch_id = alicloud_vswitch.vswitch1.id
143+
db_proxy_features = "ReadWriteSplitting"
144+
instance_network_type = "VPC"
145+
db_proxy_instance_num = 2
146+
depends_on = [alicloud_db_account_privilege.account_privilege]
147+
}
148+
149+
resource "alicloud_db_readonly_instance" "readonly_instance" {
150+
master_db_instance_id = alicloud_db_instance.database.id
151+
zone_id = local.zone_id_2
152+
vswitch_id = alicloud_vswitch.vswitch2.id
153+
instance_type = "mysqlro.n2.medium.1c"
154+
instance_storage = alicloud_db_instance.database.instance_storage
155+
instance_name = "readonly-${local.common_name}"
156+
engine_version = alicloud_db_instance.database.engine_version
157+
depends_on = [alicloud_rds_db_proxy.db_proxy]
158+
}
159+
160+
# ECS Command
161+
resource "alicloud_ecs_command" "install_script" {
162+
name = "install-${local.common_name}"
163+
command_content = base64encode(local.install_script)
164+
description = "Install read-write splitting application"
165+
type = "RunShellScript"
166+
working_dir = "/root"
167+
timeout = 3600
168+
}
169+
170+
resource "alicloud_ecs_invocation" "run_install" {
171+
command_id = alicloud_ecs_command.install_script.id
172+
instance_id = [alicloud_instance.ecs_instance.id]
173+
depends_on = [alicloud_db_readonly_instance.readonly_instance]
174+
timeouts {
175+
create = "15m"
176+
}
177+
}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
# Outputs
2+
output "ecs_login_address_1" {
3+
description = "ECS登录地址"
4+
value = "https://ecs-workbench.aliyun.com/?from=EcsConsole&instanceType=ecs&regionId=${data.alicloud_regions.current.regions.0.id}&instanceId=${alicloud_instance.ecs_instance.id}"
5+
}
6+
7+
data "alicloud_regions" "current" {
8+
current = true
9+
}
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
variable "region_id" {
2+
description = "请输入地域ID(例如:cn-hangzhou)。"
3+
default = "cn-hangzhou"
4+
}
5+
6+
variable "vpc_cidr_block" {
7+
description = "请输入VPC的CIDR块(支持的值包括:192.168.0.0/16、172.16.0.0/12、10.0.0.0/8)。这是您的虚拟私有云的地址范围。"
8+
default = "192.168.0.0/16"
9+
validation {
10+
condition = contains(["192.168.0.0/16", "172.16.0.0/12", "10.0.0.0/8"], var.vpc_cidr_block)
11+
error_message = "无效的VPC CIDR块,请检查并重新输入。"
12+
}
13+
}
14+
15+
variable "vswitch1_cidr_block" {
16+
description = "请输入主交换机的CIDR块(例如:192.168.1.0/24)。这是您主虚拟交换机的地址范围。"
17+
default = "192.168.1.0/24"
18+
}
19+
20+
variable "vswitch2_cidr_block" {
21+
description = "请输入备交换机的CIDR块(例如:192.168.2.0/24)。这是您备虚拟交换机的地址范围。"
22+
default = "192.168.2.0/24"
23+
}
24+
25+
variable "ecs_instance_password" {
26+
description = "请输入服务器登录密码。密码长度为8-30位,必须包含大写字母、小写字母、数字和特殊字符(如:!@#$%^&*_-+=|{}[]:;'<>,.?/)。"
27+
type = string
28+
sensitive = true
29+
}
30+
31+
variable "db_name" {
32+
description = "请输入数据库名称(由小写字母、数字及特殊字符 -_ 组成,以字母开头,字母或数字结尾,最多64个字符)。"
33+
default = "db_test"
34+
validation {
35+
condition = regex("^[a-z][a-z0-9-_]{0,62}[a-z0-9]$", var.db_name) != ""
36+
error_message = "数据库名称格式不正确。名称应由小写字母、数字及特殊字符 -_ 组成,以字母开头,字母或数字结尾,最多64个字符。"
37+
}
38+
}
39+
40+
variable "db_user_name" {
41+
description = "请输入RDS数据库用户名(长度为2-16个字符,仅允许小写字母、数字和下划线,必须以字母开头,以字母或数字结尾)。"
42+
type = string
43+
default = "testuser"
44+
validation {
45+
condition = can(regex("^[a-zA-Z][a-zA-Z0-9_]{0,30}[a-zA-Z0-9]$", var.db_user_name))
46+
error_message = "数据库用户名必须以字母开头,以字母或数字结尾,只能包含字母、数字和下划线。最多32个字符。"
47+
}
48+
}
49+
50+
variable "db_password" {
51+
description = "请输入RDS数据库密码。密码长度为8-32位,需包含大写字母、小写字母、数字和特殊字符(如:!@#$%^&*()_+-=)。"
52+
type = string
53+
sensitive = true
54+
}

0 commit comments

Comments
 (0)