Skip to content

docs:Tair(兼容 Redis)通过 Proxy 组件实现读写分离 #336

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
## Introduction

<!-- DOCS_DESCRIPTION_CN -->
本示例用于实现解决方案[Redis 通过 Proxy 组件实现读写分离](https://www.aliyun.com/solution/tech-solution/read-write-splitting-through-tair-proxy), 涉及到专有网络(VPC)、交换机(VSwitch)、云服务器(ECS)、云数据库 Tair(兼容 Redis)等资源的创建。
<!-- DOCS_DESCRIPTION_CN -->

<!-- DOCS_DESCRIPTION_EN -->
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).
<!-- DOCS_DESCRIPTION_EN -->

<!-- BEGIN_TF_DOCS -->
## Providers

| Name | Version |
|------|---------|
| <a name="provider_alicloud"></a> [alicloud](#provider\_alicloud) | n/a |
| <a name="provider_random"></a> [random](#provider\_random) | n/a |

## Modules

No modules.

## Resources

| Name | Type |
|------|------|
| [alicloud_ecs_command.install_redis_client](https://registry.terraform.io/providers/aliyun/alicloud/latest/docs/resources/ecs_command) | resource |
| [alicloud_ecs_invocation.install_redis_client](https://registry.terraform.io/providers/aliyun/alicloud/latest/docs/resources/ecs_invocation) | resource |
| [alicloud_instance.ecs_instance](https://registry.terraform.io/providers/aliyun/alicloud/latest/docs/resources/instance) | resource |
| [alicloud_kvstore_instance.redis](https://registry.terraform.io/providers/aliyun/alicloud/latest/docs/resources/kvstore_instance) | resource |
| [alicloud_security_group.ecs_security_group](https://registry.terraform.io/providers/aliyun/alicloud/latest/docs/resources/security_group) | resource |
| [alicloud_security_group_rule.http](https://registry.terraform.io/providers/aliyun/alicloud/latest/docs/resources/security_group_rule) | resource |
| [alicloud_vpc.vpc](https://registry.terraform.io/providers/aliyun/alicloud/latest/docs/resources/vpc) | resource |
| [alicloud_vswitch.vswitch](https://registry.terraform.io/providers/aliyun/alicloud/latest/docs/resources/vswitch) | resource |
| [random_id.suffix](https://registry.terraform.io/providers/hashicorp/random/latest/docs/resources/id) | resource |
| [alicloud_images.default](https://registry.terraform.io/providers/aliyun/alicloud/latest/docs/data-sources/images) | data source |
| [alicloud_instance_types.default](https://registry.terraform.io/providers/aliyun/alicloud/latest/docs/data-sources/instance_types) | data source |
| [alicloud_kvstore_zones.zones_ids](https://registry.terraform.io/providers/aliyun/alicloud/latest/docs/data-sources/kvstore_zones) | data source |
| [alicloud_regions.current](https://registry.terraform.io/providers/aliyun/alicloud/latest/docs/data-sources/regions) | data source |

## Inputs

| Name | Description | Type | Default | Required |
|------|-------------|------|---------|:--------:|
| <a name="input_db_password"></a> [db\_password](#input\_db\_password) | Tair数据库密码。长度8-30,必须包含大写字母、小写字母、数字、特殊符号三个;特殊字符包括:!@#$%^&*()\_+-= | `string` | n/a | yes |
| <a name="input_ecs_instance_password"></a> [ecs\_instance\_password](#input\_ecs\_instance\_password) | ECS实例密码。服务器登录密码,长度8-30,必须包含三项(大写字母、小写字母、数字、 ()`~!@#$%^&*_-+=|{}[]:;<>,.?/ 中的特殊符号)` | `string` | n/a | yes |
| <a name="input_region_id"></a> [region\_id](#input\_region\_id) | 请输入地域ID(例如:cn-hangzhou)。 | `string` | `"cn-hangzhou"` | no |
<!-- END_TF_DOCS -->
107 changes: 107 additions & 0 deletions solution/tech-solution/read-write-splitting-through-tair-proxy/main.tf
Original file line number Diff line number Diff line change
@@ -0,0 +1,107 @@
provider "alicloud" {
region = var.region_id
}

resource "random_id" "suffix" {
byte_length = 8
}

data "alicloud_kvstore_zones" "zones_ids" {
instance_charge_type = "PostPaid"
}

data "alicloud_images" "default" {
name_regex = "^aliyun_3_x64_20G_alibase_*"
most_recent = true
owners = "system"
}

data "alicloud_instance_types" "default" {
cpu_core_count = 4
system_disk_category = "cloud_essd"
image_id = data.alicloud_images.default.images[0].id
instance_type_family = "ecs.c6"
availability_zone = data.alicloud_kvstore_zones.zones_ids.zones[length(data.alicloud_kvstore_zones.zones_ids.zones) - 1].id
}

locals {
common_name = random_id.suffix.id
redis_install_script = <<-SCRIPT
#!/bin/bash
export ROS_DEPLOY=true
curl -fsSL https://static-aliyun-doc.oss-cn-hangzhou.aliyuncs.com/install-script/read-write-splitting-through-tair-proxy/install.sh | bash
SCRIPT
}

# VPC Resources
resource "alicloud_vpc" "vpc" {
vpc_name = "VPC_HZ"
cidr_block = "192.168.0.0/16"
}

resource "alicloud_vswitch" "vswitch" {
vpc_id = alicloud_vpc.vpc.id
cidr_block = "192.168.1.0/24"
zone_id = data.alicloud_kvstore_zones.zones_ids.zones[length(data.alicloud_kvstore_zones.zones_ids.zones) - 1].id
vswitch_name = "vsw_001"
}

# Security Group
resource "alicloud_security_group" "ecs_security_group" {
vpc_id = alicloud_vpc.vpc.id
security_group_name = "SecurityGroup_1"
security_group_type = "normal"
}

resource "alicloud_security_group_rule" "http" {
type = "ingress"
ip_protocol = "tcp"
port_range = "80/80"
cidr_ip = "0.0.0.0/0"
security_group_id = alicloud_security_group.ecs_security_group.id
}

# Redis Instance
resource "alicloud_kvstore_instance" "redis" {
db_instance_name = "redis"
instance_class = "redis.shard.small.2.ce"
engine_version = "7.0"
password = var.db_password
payment_type = "PostPaid"
vswitch_id = alicloud_vswitch.vswitch.id
zone_id = data.alicloud_kvstore_zones.zones_ids.zones[length(data.alicloud_kvstore_zones.zones_ids.zones) - 1].id
read_only_count = 1
security_ips = ["192.168.0.0/16"]
}

# ECS Instance
resource "alicloud_instance" "ecs_instance" {
instance_name = "ecs-${local.common_name}"
system_disk_category = data.alicloud_instance_types.default.system_disk_category
system_disk_size = 100
image_id = data.alicloud_images.default.images[0].id
vswitch_id = alicloud_vswitch.vswitch.id
password = var.ecs_instance_password
instance_type = data.alicloud_instance_types.default.instance_types[0].id
internet_max_bandwidth_out = 5
security_groups = [alicloud_security_group.ecs_security_group.id]
}

# Install Redis Client Command
resource "alicloud_ecs_command" "install_redis_client" {
name = "install-redis-client-${local.common_name}"
description = "Install Redis client on ECS instance"
type = "RunShellScript"
command_content = base64encode(local.redis_install_script)
timeout = 600
working_dir = "/root"
}

resource "alicloud_ecs_invocation" "install_redis_client" {
instance_id = [alicloud_instance.ecs_instance.id]
command_id = alicloud_ecs_command.install_redis_client.id
depends_on = [alicloud_kvstore_instance.redis]
timeouts {
create = "10m"
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
# Outputs
output "ecs_login_address" {
description = "ECS登录地址"
value = "https://ecs-workbench.aliyun.com/?from=EcsConsole&instanceType=ecs&regionId=${data.alicloud_regions.current.regions[0].id}&instanceId=${alicloud_instance.ecs_instance.id}"
}

output "redis_connection_address" {
description = "Redis连接地址"
value = alicloud_kvstore_instance.redis.connection_domain
}

output "ecs_public_ip" {
description = "ECS公网IP"
value = alicloud_instance.ecs_instance.public_ip
}

data "alicloud_regions" "current" {
current = true
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
# Parameters
variable "region_id" {
description = "请输入地域ID(例如:cn-hangzhou)。"
default = "cn-hangzhou"
}

variable "db_password" {
type = string
description = "Tair数据库密码。长度8-30,必须包含大写字母、小写字母、数字、特殊符号三个;特殊字符包括:!@#$%^&*()_+-="
sensitive = true
validation {
condition = can(regex("^[0-9A-Za-z_!@#$%^&*()_+\\-=\\+]+$", var.db_password)) && length(var.db_password) >= 8 && length(var.db_password) <= 30
error_message = "长度8-30,必须包含三项(大写字母、小写字母、数字、 !@#$%^&*()_+-=中的特殊符号)"
}
}


variable "ecs_instance_password" {
type = string
description = "ECS实例密码。服务器登录密码,长度8-30,必须包含三项(大写字母、小写字母、数字、 ()`~!@#$%^&*_-+=|{}[]:;<>,.?/ 中的特殊符号)"
sensitive = true
validation {
condition = can(regex("^[a-zA-Z0-9-\\(\\)\\`\\~\\!\\@\\#\\$\\%\\^\\&\\*\\_\\-\\+\\=\\|\\{\\}\\[\\]\\:\\;\\<\\>\\,\\.\\?\\/]*$", var.ecs_instance_password)) && length(var.ecs_instance_password) >= 8 && length(var.ecs_instance_password) <= 30
error_message = "长度8-30,必须包含三项(大写字母、小写字母、数字、 ()`~!@#$%^&*_-+=|{}[]:;<>,.?/ 中的特殊符号)"
}
}
Loading