热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

mysqlproxy与rds_开源软件ProxySQL与AWSRDS不得不说系列Blog(一):ProxyonAWS测试架构和ProxySQL基本配置...

ProxySQL概述ProxySQL是一种基于GNU通用公共许可证(GPL),并位于MySQL数据库与数据库客户端之间的数据库访问代理中间件。ProxySQL的性能非

ProxySQL概述

ProxySQL 是一种基于 GNU 通用公共许可证 (GPL) ,并位于 MySQL 数据库与数据库客户端之间的数据库访问代理中间件。

ProxySQL的性能非常好,功能也很多,几乎能够满足中间件所需的绝大多数的功能,主要包括:

跨多个数据库的智能负载均衡;

连接池特性,在高并发连接下提高数据库访问性能;

可以对查询语句进行mirror,实现日志审计功能;

可以基于用户、基于 Schema 和基于 SQL 语句的规则对 SQL 语句进行路由转发,实现读/写分离和简单的数据库分片功能;

Firewall白名单功能可以实现数据库防火墙,用白名单规则定义允许执行的查询语句;

本文是系列blog的首篇,主要介绍ProxySQL on AWS的整体架构和测试环境的基本配置,各个功能特性将在后续blog中陆续展开。

ProxySQL on AWS架构图

以下为本文的部署架构图:

b09e29ed8817503b6f06811a18477c20.png

因为是测试环境,所以只配置了一个ProxySQL实例,应用的访问也采用在ProxySQL上安装MySQL客户端进行模拟操作。如果部署生产环境,需要加上ProxySQL的cluster配置,然后配合ELB负载均衡服务器,对应用提供高可用和负载均衡。

RDS MySQL环境是标准的三个实例部署:一个Master实例,两个Replica只读副本。

先决条件

根据以上的架构图,搭建的环境需要以下:

创建完成后,记录下实例的公网IP,并保存好密钥文件。

在EC2实例所在的VPC,创建一个AWS RDS MySQL的Master实例和两个replica实例,版本为7.22。对应的安全组需要配置ProxySQL实例所在网段,允许3306端口访问策略。具体操作步骤可以参考:https://docs.amazonaws.cn/AmazonRDS/latest/UserGuide/CHAP_GettingStarted.CreatingConnecting.MySQL.html39ea31678f9afdfdb3cca79ea682fccc.png

其中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,步骤如下:

用保存的密钥文件登陆实例

$ssh -i mykey.pem ec2-user@instance-ip

添加repo配置文件

$sudo 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

$sudo systemctl start ProxySQL

$sudo systemctl enable ProxySQL

查看运行状态

$sudo systemctl status ProxySQL

正常启动后,服务将处于running状态。

ProxySQL.service - High Performance Advanced Proxy for MySQL

Loaded: loaded (/etc/systemd/system/ProxySQL.service; enabled; vendor preset: disabled)

Active: active (running) since 五 2020-04-10 03:04:38 UTC; 3h 54min ago

Process: 1499 ExecStart=/usr/bin/ProxySQL -c /etc/ProxySQL.cnf (code=exited, status=0/SUCCESS)

Main PID: 1501 (ProxySQL)

CGroup: /system.slice/ProxySQL.service

├─1501 /usr/bin/ProxySQL -c /etc/ProxySQL.cnf

└─1502 /usr/bin/ProxySQL -c /etc/ProxySQL.cnf

4月 10 03:04:38 ip-172-31-32-82.cn-northwest-1.compute.internal systemd[1]: Starting High Performance Advanced Proxy for MySQL...

4月 10 03:04:38 ip-172-31-32-82.cn-northwest-1.compute.internal ProxySQL[1499]: 2020-04-10 03:04:38 [INFO] Using config file /etc/ProxySQL.cnf

4月 10 03:04:38 ip-172-31-32-82.cn-northwest-1.compute.internal ProxySQL[1499]: 2020-04-10 03:04:38 [INFO] Using OpenSSL version: OpenSSL 1.1.0h 27 Mar 2018

4月 10 03:04:38 ip-172-31-32-82.cn-northwest-1.compute.internal ProxySQL[1499]: 2020-04-10 03:04:38 [INFO] SSL keys/certificates found in datadir (/var/lib/ProxySQL): loading them.

4月 10 03:04:38 ip-172-31-32-82.cn-northwest-1.compute.internal systemd[1]: Started High Performance Advanced Proxy for MySQL

安装MySQL

由于ProxySQL要用mysql客户端进行管理,同时后端保护的数据库也需要进行一些测试的操作,所以在EC2实例上安装mysql。

$sudo yum install MySQL

登陆ProxySQL管理界面

管理端口为6032,数据库连接的端口为6033。

使用默认管理员和密码都为admin登陆。

$mysql -u admin -padmin -h 127.0.0.1 -P6032 --prompt='Admin> '

Welcome to the MariaDB monitor. Commands end with ; or \g.

Your MySQL connection id is 33

Server version: 5.7.22 (ProxySQL Admin Module)

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

Admin> show databases;

+-----+---------------+-------------------------------------+

| seq | name | file |

+-----+---------------+-------------------------------------+

| 0 | main | |

| 2 | disk | /var/lib/ProxySQL/ProxySQL.db |

| 3 | stats | |

| 4 | monitor | |

| 5 | stats_history | /var/lib/ProxySQL/ProxySQL_stats.db |

+-----+---------------+-------------------------------------+

5 rows in set (0.00 sec)

可以看到ProxySQL的默认5个数据库。

用MySQL客户端直接访问RDS MySQL实例

为确认实例可以正常访问RDS MySQL实例,使用记录用户名密码和RDS Master实例的访问地址,登陆Master实例进行查看

$mysql -u user01 -pWelcome1 -h mytest57.cs8yfqtavsti.rds.cn-northwest-1.amazonaws.com.cn --prompt='RDS-Direct> '

Welcome to the MariaDB monitor. Commands end with ; or \g.

Your MySQL connection id is 8418

Server version: 5.7.22-log Source distribution

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

RDS-Direct> show databases;

+--------------------+

| Database |

+--------------------+

| information_schema |

| innodb |

| mysql |

| performance_schema |

| sys |

| test01 |

+--------------------+

6 rows in set (0.00 sec)

创建ProxySQL用于监控后端数据库的monitor用户

RDS-Direct>CREATE USER 'monitor'@'%' IDENTIFIED by 'monitor';

RDS-Direct>GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, RELOAD, PROCESS, REFERENCES, INDEX, ALTER, SHOW DATABASES, CREATE TEMPORARY TABLES, LOCK TABLES, EXECUTE, REPLICATION SLAVE, REPLICATION CLIENT, CREATE VIEW, SHOW VIEW, CREATE ROUTINE, ALTER ROUTINE, CREATE USER, EVENT, TRIGGER ON *.* TO 'monitor'@'%' WITH GRANT OPTION

RDS-Direct>FLUSH PRIVILEGES;

可以用monitor用户进行测试,登陆RDS实例。

$mysql -u monitor -pmonitor -h mytest57.cs8yfqtavsti.rds.cn-northwest-1.amazonaws.com.cn --prompt='RDS-Direct> '

RDS-Direct>

注意:之后的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 -u admin -padmin -h 127.0.0.1 -P6032 --prompt='Admin> '

Admin> delete from mysql_servers where hostgroup_id in (10,20);

Admin> delete from mysql_replication_hostgroups where writer_hostgroup=10;

Admin> INSERT INTO mysql_servers (hostname,hostgroup_id,port,weight,max_connections) VALUES ('mytest57.cs8yfqtavsti.rds.cn-northwest-1.amazonaws.com.cn',10,3306,1000,2000);

Admin> INSERT INTO mysql_servers (hostname,hostgroup_id,port,weight,max_connections) VALUES ('mytest57-r1.cs8yfqtavsti.rds.cn-northwest-1.amazonaws.com.cn',20,3306,1000,2000);

Admin> INSERT INTO mysql_servers (hostname,hostgroup_id,port,weight,max_connections) VALUES ('mytest57-r2.cs8yfqtavsti.rds.cn-northwest-1.amazonaws.com.cn',20,3306,1000,2000);

Admin> INSERT INTO mysql_replication_hostgroups (writer_hostgroup,reader_hostgroup,comment,check_type) VALUES (10,20,'RDS-MySQL','read_only');

Admin> LOAD MYSQL SERVERS TO RUNTIME;

Admin> SAVE MYSQL SERVERS TO DISK;

注:以上mysql_replication_hostgroups 的配置,是对于RDS MySQL的,如果后端数据库是Amazon Aurora ,则check_typ字段需要改为“innodb_read_only”来进行配置。

配置ProxySQL的后端用户和查询规则

在ProxySQL 配置中定义后端用户user01,其中test01是为user01创建的默认schema。

Admin> delete from mysql_users where username='user01';

Admin> insert into mysql_users (username,password,active,default_hostgroup,default_schema,transaction_persistent) values ('user01','Welcome1',1,10,'test01',1);

Admin> LOAD MYSQL USERS TO RUNTIME;

Admin> SAVE MYSQL USERS TO DISK;

以下的查询规则配置完成后,可以实现简单的读写分离。

Admin> delete from mysql_query_rules where rule_id in (50,51);

Admin> 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);

Admin> LOAD MYSQL QUERY RULES TO RUNTIME;

Admin> SAVE MYSQL QUERY RULES TO DISK;

配置后端的监控用户monitor,配置监控间隔和后端数据库版本

Admin> UPDATE global_variables SET variable_value='monitor' WHERE variable_name='mysql-monitor_username';

Admin> UPDATE global_variables SET variable_value='monitor' WHERE variable_name='mysql-monitor_password';

Admin> UPDATE global_variables SET variable_value='2000' WHERE variable_name IN ('mysql-monitor_connect_interval','mysql-monitor_ping_interval','mysql-monitor_read_only_interval');

Admin> UPDATE global_variables SET variable_value='5.7.22' WHERE variable_name='mysql-server_version';

Admin> LOAD MYSQL VARIABLES TO RUNTIME;

Admin> SAVE MYSQL VARIABLES TO DISK;

查看ProxySQL监控状态,确认后端数据库服务器是否配置成功

Admin> SELECT * FROM monitor.mysql_server_connect_log ORDER BY time_start_us DESC LIMIT 10;

499b449d193d9bcba4bb73a571db4840.png

Admin> SELECT * FROM monitor.mysql_server_ping_log ORDER BY time_start_us DESC LIMIT 10;

9b54ff47858774535e7a38a177c795fb.png

可以看到成功的监控到后端服务器的连接和ping的时间。如果配置有问题,会出现timeout的信息。

使用MySQL客户端,通过ProxySQL代理访问后端RDS数据库

$mysql -u user01 -pWelcome1 -h 127.0.0.1 -P6033 -e "SELECT 1"

+---+

| 1 |

+---+

| 1 |

+---+

$mysql -u user01 -pWelcome1 -h 127.0.0.1 -P6033 -e "SELECT @@port"

+--------+

| @@port |

+--------+

| 3306 |

+--------+

通过显示的结果,可以看的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策略,保证多个节点可以同时工作。

本篇作者

e5911c4a32ec6c90247adc7780f999e1.png

AWS 解决方案架构师。负责基于 AWS 云计算解决方案架构的咨询和设计,同时致力于 AWS 云服务在国内半导体行业的应用和推广。在加入 AWS 前,拥有超过18年的IT项目经验,曾就职于Oracle,主要服务于大中型企事业单位客户。



推荐阅读
  • 本文探讨了Web开发与游戏开发之间的主要区别,旨在帮助开发者更好地理解两种开发领域的特性和需求。文章基于作者的实际经验和网络资料整理而成。 ... [详细]
  • 在Linux系统上构建Web服务器的详细步骤
    本文详细介绍了如何在Linux系统上搭建Web服务器的过程,包括安装Apache、PHP和MySQL等关键组件,以及遇到的一些常见问题及其解决方案。 ... [详细]
  • Java实现文本到图片转换,支持自动换行、字体自定义及图像优化
    本文详细介绍了如何使用Java实现将文本转换为图片的功能,包括自动换行、自定义字体加载、抗锯齿优化以及图片压缩等技术细节。 ... [详细]
  • 本文介绍了Java语言开发的远程教学系统,包括源代码、MySQL数据库配置以及相关文档,适用于计算机专业的毕业设计。系统支持远程调试,采用B/S架构,适合现代教育需求。 ... [详细]
  • Java EE CDI:解决依赖关系冲突的实例
    在本教程中,我们将探讨如何在Java EE的CDI(上下文和依赖注入)框架中有效解决依赖关系的冲突问题。通过学习如何使用限定符,您将能够为应用程序的不同客户端提供多种接口实现,并确保每个客户端都能正确调用其所需的实现。 ... [详细]
  • Spring Cloud Config 使用 Vault 作为配置存储
    本文探讨了如何在Spring Cloud Config中集成HashiCorp Vault作为配置存储解决方案,基于Spring Cloud Hoxton.RELEASE及Spring Boot 2.2.1.RELEASE版本。文章还提供了详细的配置示例和实践建议。 ... [详细]
  • 前言无论是对于刚入行工作还是已经工作几年的java开发者来说,面试求职始终是你需要直面的一件事情。首先梳理自己的知识体系,针对性准备,会有事半功倍的效果。我们往往会把重点放在技术上 ... [详细]
  • 字节跳动夏季招聘面试经验分享
    本文详细记录了字节跳动夏季招聘的面试经历,涵盖了一、二、三轮面试的技术问题及项目讨论,旨在为准备类似面试的求职者提供参考。 ... [详细]
  • 利用SSH隧道实现外网对局域网机器的安全访问
    本文探讨了一种常见的网络配置问题及其解决方案,即如何在外网环境下安全地访问位于局域网内的计算机。特别介绍了使用SSH反向隧道技术来实现这一目标的具体步骤和注意事项。 ... [详细]
  • Java 架构:深入理解 JDK 动态代理机制
    代理模式是 Java 中常用的设计模式之一,其核心在于代理类与委托类共享相同的接口。代理类主要用于为委托类提供预处理、过滤、转发及后处理等功能,以增强或改变原有功能的行为。 ... [详细]
  • 本文介绍了一种在Win10 UWP应用中实现根据数值动态改变颜色的控件的方法。通过将椭圆的颜色与整数绑定,并利用值转换器来实现颜色的渐变效果。 ... [详细]
  • Android商城应用开发指南(第二部分):创建启动欢迎页
    大多数商城应用程序在启动时会显示一个欢迎页面,以提升用户体验。本文将指导您如何实现一个基本的欢迎页,该页面会在用户打开应用后短暂展示,随后自动跳转至主界面。 ... [详细]
  • 在服务器虚拟化领域,用户面临多种选择,尤其是来自同一供应商的不同产品。正确评估这些选项对于项目的成功至关重要。本文将深入探讨VMware提供的两款主要虚拟化平台——免费的VMware Server和付费的ESX Server之间的区别,旨在为决策提供专业指导。 ... [详细]
  • 热璞数据库与云宏达成兼容性互认证,共筑数据安全屏障
    热璞数据库与云宏信息技术有限公司近期宣布完成产品兼容性互认证,旨在提升数据安全性与稳定性,支持企业数字化转型。 ... [详细]
  • 深入理解Java MySQL数据库连接池实现
    尽管利用Apache Commons DBCP等工具可以轻松构建数据库连接池,但本文详细解析了数据库连接池的工作机制,提供了详尽的注释,帮助开发者深入理解其内部运作。这不仅有助于提高数据库操作的效率,还能增强应用程序的稳定性和性能。 ... [详细]
author-avatar
逸之思
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有