Skip to content

Commit 62c5995

Browse files
wbw2048shanye997
authored andcommitted
docs:Tair(兼容 Redis)通过 Proxy 组件实现读写分离
1 parent a35a06d commit 62c5995

File tree

4 files changed

+200
-0
lines changed

4 files changed

+200
-0
lines changed
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
## Introduction
2+
3+
<!-- DOCS_DESCRIPTION_CN -->
4+
本示例用于实现解决方案[Redis 通过 Proxy 组件实现读写分离](https://www.aliyun.com/solution/tech-solution/read-write-splitting-through-tair-proxy), 涉及到专有网络(VPC)、交换机(VSwitch)、云服务器(ECS)、云数据库 Tair(兼容 Redis)等资源的创建。
5+
<!-- DOCS_DESCRIPTION_CN -->
6+
7+
<!-- DOCS_DESCRIPTION_EN -->
8+
This example demonstrates the implementation of the solution [Read write splitting through tair proxy](https://www.aliyun.com/solution/tech-solution/read-write-splitting-through-tair-proxy). It involves the creation, and deployment of resources such as Virtual Private Cloud (VPC), VSwitch, Elastic Compute Service (ECS), and Tair (Redis OSS-compatible).
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_ecs_command.install_redis_client](https://registry.terraform.io/providers/aliyun/alicloud/latest/docs/resources/ecs_command) | resource |
28+
| [alicloud_ecs_invocation.install_redis_client](https://registry.terraform.io/providers/aliyun/alicloud/latest/docs/resources/ecs_invocation) | resource |
29+
| [alicloud_instance.ecs_instance](https://registry.terraform.io/providers/aliyun/alicloud/latest/docs/resources/instance) | resource |
30+
| [alicloud_kvstore_instance.redis](https://registry.terraform.io/providers/aliyun/alicloud/latest/docs/resources/kvstore_instance) | resource |
31+
| [alicloud_security_group.ecs_security_group](https://registry.terraform.io/providers/aliyun/alicloud/latest/docs/resources/security_group) | resource |
32+
| [alicloud_security_group_rule.http](https://registry.terraform.io/providers/aliyun/alicloud/latest/docs/resources/security_group_rule) | resource |
33+
| [alicloud_vpc.vpc](https://registry.terraform.io/providers/aliyun/alicloud/latest/docs/resources/vpc) | resource |
34+
| [alicloud_vswitch.vswitch](https://registry.terraform.io/providers/aliyun/alicloud/latest/docs/resources/vswitch) | resource |
35+
| [random_id.suffix](https://registry.terraform.io/providers/hashicorp/random/latest/docs/resources/id) | resource |
36+
| [alicloud_images.default](https://registry.terraform.io/providers/aliyun/alicloud/latest/docs/data-sources/images) | data source |
37+
| [alicloud_instance_types.default](https://registry.terraform.io/providers/aliyun/alicloud/latest/docs/data-sources/instance_types) | data source |
38+
| [alicloud_kvstore_zones.zones_ids](https://registry.terraform.io/providers/aliyun/alicloud/latest/docs/data-sources/kvstore_zones) | data source |
39+
| [alicloud_regions.current](https://registry.terraform.io/providers/aliyun/alicloud/latest/docs/data-sources/regions) | data source |
40+
41+
## Inputs
42+
43+
| Name | Description | Type | Default | Required |
44+
|------|-------------|------|---------|:--------:|
45+
| <a name="input_db_password"></a> [db\_password](#input\_db\_password) | Tair数据库密码。长度8-30,必须包含大写字母、小写字母、数字、特殊符号三个;特殊字符包括:!@#$%^&*()\_+-= | `string` | n/a | yes |
46+
| <a name="input_ecs_instance_password"></a> [ecs\_instance\_password](#input\_ecs\_instance\_password) | ECS实例密码。服务器登录密码,长度8-30,必须包含三项(大写字母、小写字母、数字、 ()`~!@#$%^&*_-+=|{}[]:;<>,.?/ 中的特殊符号)` | `string` | n/a | yes |
47+
| <a name="input_region_id"></a> [region\_id](#input\_region\_id) | 请输入地域ID(例如:cn-hangzhou)。 | `string` | `"cn-hangzhou"` | no |
48+
<!-- END_TF_DOCS -->
Lines changed: 107 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,107 @@
1+
provider "alicloud" {
2+
region = var.region_id
3+
}
4+
5+
resource "random_id" "suffix" {
6+
byte_length = 8
7+
}
8+
9+
data "alicloud_kvstore_zones" "zones_ids" {
10+
instance_charge_type = "PostPaid"
11+
}
12+
13+
data "alicloud_images" "default" {
14+
name_regex = "^aliyun_3_x64_20G_alibase_*"
15+
most_recent = true
16+
owners = "system"
17+
}
18+
19+
data "alicloud_instance_types" "default" {
20+
cpu_core_count = 4
21+
system_disk_category = "cloud_essd"
22+
image_id = data.alicloud_images.default.images[0].id
23+
instance_type_family = "ecs.c6"
24+
availability_zone = data.alicloud_kvstore_zones.zones_ids.zones[length(data.alicloud_kvstore_zones.zones_ids.zones) - 1].id
25+
}
26+
27+
locals {
28+
common_name = random_id.suffix.id
29+
redis_install_script = <<-SCRIPT
30+
#!/bin/bash
31+
export ROS_DEPLOY=true
32+
curl -fsSL https://static-aliyun-doc.oss-cn-hangzhou.aliyuncs.com/install-script/read-write-splitting-through-tair-proxy/install.sh | bash
33+
SCRIPT
34+
}
35+
36+
# VPC Resources
37+
resource "alicloud_vpc" "vpc" {
38+
vpc_name = "VPC_HZ"
39+
cidr_block = "192.168.0.0/16"
40+
}
41+
42+
resource "alicloud_vswitch" "vswitch" {
43+
vpc_id = alicloud_vpc.vpc.id
44+
cidr_block = "192.168.1.0/24"
45+
zone_id = data.alicloud_kvstore_zones.zones_ids.zones[length(data.alicloud_kvstore_zones.zones_ids.zones) - 1].id
46+
vswitch_name = "vsw_001"
47+
}
48+
49+
# Security Group
50+
resource "alicloud_security_group" "ecs_security_group" {
51+
vpc_id = alicloud_vpc.vpc.id
52+
security_group_name = "SecurityGroup_1"
53+
security_group_type = "normal"
54+
}
55+
56+
resource "alicloud_security_group_rule" "http" {
57+
type = "ingress"
58+
ip_protocol = "tcp"
59+
port_range = "80/80"
60+
cidr_ip = "0.0.0.0/0"
61+
security_group_id = alicloud_security_group.ecs_security_group.id
62+
}
63+
64+
# Redis Instance
65+
resource "alicloud_kvstore_instance" "redis" {
66+
db_instance_name = "redis"
67+
instance_class = "redis.shard.small.2.ce"
68+
engine_version = "7.0"
69+
password = var.db_password
70+
payment_type = "PostPaid"
71+
vswitch_id = alicloud_vswitch.vswitch.id
72+
zone_id = data.alicloud_kvstore_zones.zones_ids.zones[length(data.alicloud_kvstore_zones.zones_ids.zones) - 1].id
73+
read_only_count = 1
74+
security_ips = ["192.168.0.0/16"]
75+
}
76+
77+
# ECS Instance
78+
resource "alicloud_instance" "ecs_instance" {
79+
instance_name = "ecs-${local.common_name}"
80+
system_disk_category = data.alicloud_instance_types.default.system_disk_category
81+
system_disk_size = 100
82+
image_id = data.alicloud_images.default.images[0].id
83+
vswitch_id = alicloud_vswitch.vswitch.id
84+
password = var.ecs_instance_password
85+
instance_type = data.alicloud_instance_types.default.instance_types[0].id
86+
internet_max_bandwidth_out = 5
87+
security_groups = [alicloud_security_group.ecs_security_group.id]
88+
}
89+
90+
# Install Redis Client Command
91+
resource "alicloud_ecs_command" "install_redis_client" {
92+
name = "install-redis-client-${local.common_name}"
93+
description = "Install Redis client on ECS instance"
94+
type = "RunShellScript"
95+
command_content = base64encode(local.redis_install_script)
96+
timeout = 600
97+
working_dir = "/root"
98+
}
99+
100+
resource "alicloud_ecs_invocation" "install_redis_client" {
101+
instance_id = [alicloud_instance.ecs_instance.id]
102+
command_id = alicloud_ecs_command.install_redis_client.id
103+
depends_on = [alicloud_kvstore_instance.redis]
104+
timeouts {
105+
create = "10m"
106+
}
107+
}
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
# Outputs
2+
output "ecs_login_address" {
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+
output "redis_connection_address" {
8+
description = "Redis连接地址"
9+
value = alicloud_kvstore_instance.redis.connection_domain
10+
}
11+
12+
output "ecs_public_ip" {
13+
description = "ECS公网IP"
14+
value = alicloud_instance.ecs_instance.public_ip
15+
}
16+
17+
data "alicloud_regions" "current" {
18+
current = true
19+
}
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
# Parameters
2+
variable "region_id" {
3+
description = "请输入地域ID(例如:cn-hangzhou)。"
4+
default = "cn-hangzhou"
5+
}
6+
7+
variable "db_password" {
8+
type = string
9+
description = "Tair数据库密码。长度8-30,必须包含大写字母、小写字母、数字、特殊符号三个;特殊字符包括:!@#$%^&*()_+-="
10+
sensitive = true
11+
validation {
12+
condition = can(regex("^[0-9A-Za-z_!@#$%^&*()_+\\-=\\+]+$", var.db_password)) && length(var.db_password) >= 8 && length(var.db_password) <= 30
13+
error_message = "长度8-30,必须包含三项(大写字母、小写字母、数字、 !@#$%^&*()_+-=中的特殊符号)"
14+
}
15+
}
16+
17+
18+
variable "ecs_instance_password" {
19+
type = string
20+
description = "ECS实例密码。服务器登录密码,长度8-30,必须包含三项(大写字母、小写字母、数字、 ()`~!@#$%^&*_-+=|{}[]:;<>,.?/ 中的特殊符号)"
21+
sensitive = true
22+
validation {
23+
condition = can(regex("^[a-zA-Z0-9-\\(\\)\\`\\~\\!\\@\\#\\$\\%\\^\\&\\*\\_\\-\\+\\=\\|\\{\\}\\[\\]\\:\\;\\<\\>\\,\\.\\?\\/]*$", var.ecs_instance_password)) && length(var.ecs_instance_password) >= 8 && length(var.ecs_instance_password) <= 30
24+
error_message = "长度8-30,必须包含三项(大写字母、小写字母、数字、 ()`~!@#$%^&*_-+=|{}[]:;<>,.?/ 中的特殊符号)"
25+
}
26+
}

0 commit comments

Comments
 (0)