本文介绍了一种手动配置 ProxySQL 代理 SQL 服务器的高可用架构。通过在多 AZ EC2 上部署 ProxySQL 服务,并用 NLB 来保证代理层高可用。通过对 ProxySQL 的读写分离手动配置来减轻真实后端 RDS-MySQL 的压力,并提供一个统一的 SQL endpoint。

**步骤**
1. 创建一个 1 primary 2 replica 的 MySQL RDS 服务
2. 创建 2个 位于不同 AZ 的 EC2 instance 用于 ProxySQL 服务器
3. 配置 ProxySQL 服务器对进入流量进行读写分离代理分配
4. 添加 NLB 代理层用于负载均衡保证可用
**1. 创建一个 1 primary 2 replica 的 MySQL RDS 服务**

**2. 创建两个 EC2 instance 用于 ProxySQL 服务器**
此时更改 MySQL 默认的 security group inbound 配置添加 EC2 的 security group 使得 EC2 proxySQL 可以访问 MySQL RDS
以下安装环境以 Amazon Linux 2 为例:
- 使用 sudo yum install mysql 安装 mysql client 客户端
- 添加 ProxySQL repo
vi /etc/yum.repos.d/proxysql.repo
\[proxysql_repo]
name= ProxySQL YUM repository
baseurl=https\://repo.proxysql.com/ProxySQL/proxysql-2.0.x/centos/latest
gpgcheck=1
- gpgkey=https\://repo.proxysql.com/ProxySQL/repo_pub_key安装 ProxySQL sudo yum install proxysql
- 启动 ProxySQL: sudo service proxysql start
- 登陆 ProxySQL: mysql -u admin -padmin -h 127.0.0.1 -P6032 --prompt='ProxySql> '
ProxySQL 的 6032 端口用于登陆 Admin 进行 ProxySQL 的配置管理。 6033 端口用于 ProxySQL 给后端使用的 SQL 服务,后续第 3 步中将更改为常用的 3306 来方便使用。
**3. 配置 ProxySQL 服务器对进入流量进行读写分离代理**
- proxySQL 使用类 SQL 语言方式来进行配置,以下 SQL 为 proxySQL 配置为了避免 admin 和 mysql 账号冲突,这里建立新的 admin 账号 密码 proxyadmin。 并将 proxysql 后端端口改为 常用的 3306 方便访问
- SET admin-admin_credentials=’proxyadmin:proxyadmin’;
load admin variables to runtime;
save admin variables to disk;
SET mysql-interfaces=’0.0.0.0:3306′;
SAVE MYSQL VARIABLES TO DISK;
- PROXYSQL RESTART;使用新 proxyadmin 账户登陆 mysql -u proxyadmin -pproxyadmin -h 127.0.0.1 -P6032 --prompt='ProxySql> '
- 添加 mysql primary 和 replica 到 mysql_server 表中
- INSERT INTO mysql_servers (hostname,hostgroup_id,port,weight,max_connections) VALUES (‘\<RDS Master endpoint>’,10,3306,1000,2000);
INSERT INTO mysql_servers (hostname,hostgroup_id,port,weight,max_connections) VALUES (‘\<first RDS Read Replica endpoint>’,20,3306,1000,2000);
- INSERT INTO mysql_servers (hostname,hostgroup_id,port,weight,max_connections) VALUES (‘\<second RDS Read Replica endpoint>’,20,3306,1000,2000);定义读写组 (10/20: 读/写)
- INSERT INTO mysql_replication_hostgroups (writer_hostgroup,reader_hostgroup,comment,check_type) VALUES (10,20,'RDS MYSQL R/W Split','innodb_read_only');
- 将配置落盘并持久化
- LOAD MYSQL SERVERS TO RUNTIME;
- SAVE MYSQL SERVERS TO DISK;定义 query 路由规则进行读写分离,将写流量导入 10 号组, 读流量导入 20 号组
- INSERT INTO mysql_query_rules (rule_id,active,match_digest,destination_hostgroup,apply) VALUES (50,1,’^SELECT.\*FOR UPDATE$’,10,1), (51,1,’^SELECT’,20,1);
- 将配置落盘并持久化
- LOAD MYSQL QUERY RULES TO RUNTIME;
- SAVE MYSQL QUERY RULES TO DISK;定义后端账号,此账号将用于后端服务访问 proxysql,账号密码应与 mysql 的账号密码一致
- insert into mysql_users (username,password,active,default_hostgroup,transaction_persistent) values ('\<Database Username>','\<Database password>',1,10,1);
- 将配置落盘并持久化
- LOAD MYSQL USERS RULES TO RUNTIME;
- SAVE MYSQL USERS RULES TO DISK;配置完成
- 观察 proxysql query 汇总可看到,写入流量流入 10 组,读流量流入 20 组。select \* from stats_mysql_query_digest
- 此时使用本机访问 EC2 的 ProxySQL 服务,show databases 成功,代表 proxySQL 服务正常。

<!--StartFragment-->
**4.创建 NLB 层,并将两台 ProxySQL 服务器添加至 Target Group,端口号均为 3306**

使用本机访问 ELB 代理的 EC2 的 ProxySQL 服务,show databases 成功,代表 NLB ProxySQL 服务正常。

**Reference:**
1. [<https://medium.com/@smadan2703/high-availability-proxysql-to-split-mysql-read-and-write-queries-on-aws-rds-mysql-8-0-3ffd9a5ab63e>](https://medium.com/@smadan2703/high-availability-proxysql-to-split-mysql-read-and-write-queries-on-aws-rds-mysql-8-0-3ffd9a5ab63e?trk=cndc-detail)
2. [<https://blog.bitipcman.com/setup-proxysql-for-transparency-read-write-sql-proxy/>](https://blog.bitipcman.com/setup-proxysql-for-transparency-read-write-sql-proxy/?trk=cndc-detail)