亚马逊AWS官方博客
开源软件 ProxySQL 与 AWS RDS 不得不说系列 Blog(一): Proxy on AWS 测试架构和 ProxySQL 基本配置
ProxySQL概述
ProxySQL 是一种基于 GNU 通用公共许可证 (GPL) ,并位于 MySQL 数据库与数据库客户端之间的数据库访问代理中间件。
ProxySQL的性能非常好,功能也很多,几乎能够满足中间件所需的绝大多数的功能,主要包括:
- 跨多个数据库的智能负载均衡;
- 连接池特性,在高并发连接下提高数据库访问性能;
- 可以对查询语句进行mirror,实现日志审计功能;
- 可以基于用户、基于 Schema 和基于 SQL 语句的规则对 SQL 语句进行路由转发,实现读/写分离和简单的数据库分片功能;
- Firewall白名单功能可以实现数据库防火墙,用白名单规则定义允许执行的查询语句;
本文是系列blog的首篇,主要介绍ProxySQL on AWS的整体架构和测试环境的基本配置,各个功能特性将在后续blog中陆续展开。
ProxySQL on AWS架构图
以下为本文的部署架构图:
因为是测试环境,所以只配置了一个ProxySQL实例,应用的访问也采用在ProxySQL上安装MySQL客户端进行模拟操作。如果部署生产环境,需要加上ProxySQL的cluster配置,然后配合ELB负载均衡服务器,对应用提供高可用和负载均衡。
RDS MySQL环境是标准的三个实例部署:一个Master实例,两个Replica只读副本。
先决条件
根据以上的架构图,搭建的环境需要以下:
- 在AWS创建一个运行Amazon Linux2的实例,用于安装ProxySQL 2.0.10。步骤可以参考:https://docs.amazonaws.cn/AWSEC2/latest/UserGuide/EC2_GetStarted.html#ec2-launch-instance
创建完成后,记录下实例的公网IP,并保存好密钥文件。
- 在EC2实例所在的VPC,创建一个AWS RDS MySQL的Master实例和两个replica实例,版本为7.22。对应的安全组需要配置ProxySQL实例所在网段,允许3306端口访问策略。具体操作步骤可以参考:https://docs.amazonaws.cn/AmazonRDS/latest/UserGuide/CHAP_GettingStarted.CreatingConnecting.MySQL.html
其中mytest57为Master实例,可以进行读写操作;mytest-r1和mytest-r2是replica,作为只读副本,可以进行读操作。
记录三个数据库实例的访问地址:
mytest57.cs8yfqtavsti.rds.cn-northwest-1.amazonaws.com.cn
mytest57-r1.cs8yfqtavsti.rds.cn-northwest-1.amazonaws.com.cn
mytest57-r2.cs8yfqtavsti.rds.cn-northwest-1.amazonaws.com.cn
记录下创建数据库实例时的用户名和密码:user01/Welcome1。
记录下为user01创建的数据库schema:test01。
过程列表
主要的步骤分为以下两个部分:
- 在EC2实例下载并安装ProxySQL 2.0.10版本
- ProxySQL的基本配置
下载安装ProxySQL 2.0.10
EC2实例的操作系统为Amazon Linux 2,步骤如下:
- 用保存的密钥文件登陆实例
- 添加repo配置文件
- 安装和启动ProxySQL服务
查看运行状态
正常启动后,服务将处于running状态。
- 安装MySQL
由于ProxySQL要用mysql客户端进行管理,同时后端保护的数据库也需要进行一些测试的操作,所以在EC2实例上安装mysql。
- 登陆ProxySQL管理界面
管理端口为6032,数据库连接的端口为6033。
使用默认管理员和密码都为admin登陆。
可以看到ProxySQL的默认5个数据库。
- 用MySQL客户端直接访问RDS MySQL实例
为确认实例可以正常访问RDS MySQL实例,使用记录用户名密码和RDS Master实例的访问地址,登陆Master实例进行查看
创建ProxySQL用于监控后端数据库的monitor用户
可以用monitor用户进行测试,登陆RDS实例。
注意:之后的RDS MySQL数据库操作都将通过访问ProxySQL的6033端口进行操作。
Admin> 的提示符表示在ProxySQL的管理界面进行操作
登陆命令为:$mysql -u admin -padmin -h 127.0.0.1 -P6032 --prompt='Admin> '
RDS-Direct>的提示符表示直接访问RDS MySQL数据库进行操作
登陆命令为:$mysql -u user01 -pWelcome1 -h mytest57.cs8yfqtavsti.rds.cn-northwest-1.amazonaws.com.cn --prompt='RDS-Direct> '
RDS>的提示符表示通过ProxySQL代理访问RDS MySQL数据库进行操作
登陆命令为:$mysql -u user01 -pWelcome1 -h 127.0.0.1 -P6033 --prompt='RDS> '
ProxySQL的基本配置
为使用ProxySQL可以作为代理客户端连接,需要进行基本的配置,主要是加入后端的数据库服务器地址,配置主机组、数据库用户等,保证可以接受客户端连接,通过ProxSQL正常访问数据库。
- 在ProxySQL配置加入RDS数据库三个实例的访问地址,作为后端的数据库服务器
mysql_servers 表中包括将由 ProxySQL 代理的所有后端数据库服务器;mysql_replication_hostgroups 表包含自己识别和划分只读终端节点的配置。
注:以上mysql_replication_hostgroups 的配置,是对于RDS MySQL的,如果后端数据库是Amazon Aurora ,则check_typ字段需要改为“innodb_read_only”来进行配置。
- 配置ProxySQL的后端用户和查询规则
在ProxySQL 配置中定义后端用户user01,其中test01是为user01创建的默认schema。
以下的查询规则配置完成后,可以实现简单的读写分离。
- 配置后端的监控用户monitor,配置监控间隔和后端数据库版本
查看ProxySQL监控状态,确认后端数据库服务器是否配置成功
可以看到成功的监控到后端服务器的连接和ping的时间。如果配置有问题,会出现timeout的信息。
- 使用MySQL客户端,通过ProxySQL代理访问后端RDS数据库
通过显示的结果,可以看的MySQL客户端已经可以正常的通过ProxySQL代理,对后端RDS MySQL数据库进行各类查询操作。
小结
至此,ProxySQL on AWS的测试环境已经搭建好,可以开始进行各项功能测试了。
本文是对RDS MySQL数据库环境进行配置和测试,如果后端数据库是用AWS Aurora或在EC2自建MySQL,配置稍微有所不同,具体可参见ProxySQL文档:https://github.com/sysown/proxysql/wiki。
ProxySQL默认使用4个thread接受客户端的连接,考虑到资源使用情况,对单个节点的实例大小和配置也要根据实际情况进行调整。
如果将ProxySQL部署在生产环境,可以用ProxySQL的cluster功能,多个ProxySQL节点同时工作,配合ELB负载均衡服务,保证业务的高可用。或者也可以考虑使用AWS的自动扩展组功能,对ProxySQL节点配置ASG策略,保证多个节点可以同时工作。