热门标签 | 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,主要服务于大中型企事业单位客户。



推荐阅读
  • Oracle seg,V$TEMPSEG_USAGE与Oracle排序的关系及使用方法
    本文介绍了Oracle seg,V$TEMPSEG_USAGE与Oracle排序之间的关系,V$TEMPSEG_USAGE是V_$SORT_USAGE的同义词,通过查询dba_objects和dba_synonyms视图可以了解到它们的详细信息。同时,还探讨了V$TEMPSEG_USAGE的使用方法。 ... [详细]
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • ZSI.generate.Wsdl2PythonError: unsupported local simpleType restriction ... [详细]
  • 本文详细介绍了在ASP.NET中获取插入记录的ID的几种方法,包括使用SCOPE_IDENTITY()和IDENT_CURRENT()函数,以及通过ExecuteReader方法执行SQL语句获取ID的步骤。同时,还提供了使用这些方法的示例代码和注意事项。对于需要获取表中最后一个插入操作所产生的ID或马上使用刚插入的新记录ID的开发者来说,本文提供了一些有用的技巧和建议。 ... [详细]
  • 本文介绍了Java高并发程序设计中线程安全的概念与synchronized关键字的使用。通过一个计数器的例子,演示了多线程同时对变量进行累加操作时可能出现的问题。最终值会小于预期的原因是因为两个线程同时对变量进行写入时,其中一个线程的结果会覆盖另一个线程的结果。为了解决这个问题,可以使用synchronized关键字来保证线程安全。 ... [详细]
  • 本文详细介绍了Spring的JdbcTemplate的使用方法,包括执行存储过程、存储函数的call()方法,执行任何SQL语句的execute()方法,单个更新和批量更新的update()和batchUpdate()方法,以及单查和列表查询的query()和queryForXXX()方法。提供了经过测试的API供使用。 ... [详细]
  • 标题: ... [详细]
  • 前景:当UI一个查询条件为多项选择,或录入多个条件的时候,比如查询所有名称里面包含以下动态条件,需要模糊查询里面每一项时比如是这样一个数组条件:newstring[]{兴业银行, ... [详细]
  • 本文介绍了iOS数据库Sqlite的SQL语句分类和常见约束关键字。SQL语句分为DDL、DML和DQL三种类型,其中DDL语句用于定义、删除和修改数据表,关键字包括create、drop和alter。常见约束关键字包括if not exists、if exists、primary key、autoincrement、not null和default。此外,还介绍了常见的数据库数据类型,包括integer、text和real。 ... [详细]
  • 本文详细介绍了如何使用MySQL来显示SQL语句的执行时间,并通过MySQL Query Profiler获取CPU和内存使用量以及系统锁和表锁的时间。同时介绍了效能分析的三种方法:瓶颈分析、工作负载分析和基于比率的分析。 ... [详细]
  • Java学习笔记之使用反射+泛型构建通用DAO
    本文介绍了使用反射和泛型构建通用DAO的方法,通过减少代码冗余度来提高开发效率。通过示例说明了如何使用反射和泛型来实现对不同表的相同操作,从而避免重复编写相似的代码。该方法可以在Java学习中起到较大的帮助作用。 ... [详细]
  • SpringBoot整合SpringSecurity+JWT实现单点登录
    SpringBoot整合SpringSecurity+JWT实现单点登录,Go语言社区,Golang程序员人脉社 ... [详细]
  • Activiti7流程定义开发笔记
    本文介绍了Activiti7流程定义的开发笔记,包括流程定义的概念、使用activiti-explorer和activiti-eclipse-designer进行建模的方式,以及生成流程图的方法。还介绍了流程定义部署的概念和步骤,包括将bpmn和png文件添加部署到activiti数据库中的方法,以及使用ZIP包进行部署的方式。同时还提到了activiti.cfg.xml文件的作用。 ... [详细]
  • Django + Ansible 主机管理(有源码)
    本文给大家介绍如何利用DjangoAnsible进行Web项目管理。Django介绍一个可以使Web开发工作愉快并且高效的Web开发框架,能够以最小的代价构建和维护高 ... [详细]
  • DockerDataCenter系列(四)-离线安装UCP和DTR,Go语言社区,Golang程序员人脉社 ... [详细]
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社区 版权所有