搭建高可用 ProxySQL 对 RDS-MySQL 读写分离

搭建高可用 ProxySQL 对 RDS-MySQL 读写分离

本文介绍了一种手动配置 ProxySQL 代理 SQL 服务器的高可用架构。通过在多 AZ EC2 上部署 ProxySQL 服务,并用 NLB 来保证代理层高可用。通过对 ProxySQL 的读写分离手动配置来减轻真实后端 RDS-MySQL 的压力,并提供一个统一的 SQL endpoint。
搭建高可用 ProxySQL 对 RDS-MySQL 读写分离 2023-03-13 21:35:37
搭建高可用 ProxySQL 对 RDS-MySQL 读写分离 0
搭建高可用 ProxySQL 对 RDS-MySQL 读写分离
![image.png](https://dev-media.amazoncloud.cn/1e3be84ee0d64260b035a95f4e5790eb_image.png "image.png") **步骤** 1.  创建一个 1 primary 2 replica 的 MySQL RDS 服务 2.  创建 2个 位于不同 AZ 的 EC2 instance 用于 ProxySQL 服务器 3.  配置 ProxySQL 服务器对进入流量进行读写分离代理分配 4.  添加 NLB 代理层用于负载均衡保证可用 **1. 创建一个 1 primary 2 replica 的 MySQL RDS 服务** ![image.png](https://dev-media.amazoncloud.cn/f940d661c7cf4f29b94e7db93c82d158_image.png "image.png") **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 服务正常。 ![image.png](https://dev-media.amazoncloud.cn/4f49817a49a84474854596c52db2a0f6_image.png "image.png") <!--StartFragment--> **4.创建 NLB 层,并将两台 ProxySQL 服务器添加至 Target Group,端口号均为 3306** ![image.png](https://dev-media.amazoncloud.cn/665df3ae96ee4832ba165ed182c39d0b_image.png "image.png") 使用本机访问 ELB 代理的 EC2 的 ProxySQL 服务,show databases 成功,代表 NLB ProxySQL 服务正常。 ![image.png](https://dev-media.amazoncloud.cn/744fded76bb3485bb48a9ede06b4506c_image.png "image.png") **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)