暂无图片
暂无图片
3
暂无图片
暂无图片
2
暂无图片

ProxySQL使用手册-主要功能介绍

原创 小气鬼 2021-10-29
4753

1.   主要功能介绍

图 1‑1 ProxySQL功能架构

 

主要实现的功能包括:

1.      读写分离

2.      负载均衡

3.      连接池

4.      自动摘除宕机的DB

5.      动态加载配置

6.      访问控制

7.      查询缓存

8.      ProxySQL集群

1.1.   读写分离

数据库中间件最基本的功能是实现读写分离,ProxySQL当然也支持。ProxySQL可以非常有效、非常弹性地对各种查询进行选择性地路由。路由配置规则如下几种:

 

1、配置基于端口的读/写分离

基于端口进行读写分离局限性很大,应用程序需要内置读写能力,以便区分读和写,和当前业务现状基本相同。

 

2、使用正则表达式实现基本的读/写分离

在路由表中创建对应的路由规则,实现自己想要读写分离。比如所有select走从库、select for update 走主库,其他所有查询走主库等等。

 

3、使用正则表达式和digest配置读写分离

只发送那些想要发送给slaves/readers的查询,而不仅仅通过SELECT语句来判断。所有请求都走主库,通过ProxySQL中stats_mysql_query_digest表找出开销最大的select语句,然后决定这些开销大的语句路由给负责读节点,开始配置mysql_query_rules规则表。

 

1.2.   负载均衡

负载均衡的主要作用是使各DB服务器的负载大致相当。

Proxy可通过各DB的当前连接数,请求时间,重连次数,DB系统状态(status,variables等),DB机器状态等情况选择当前请求选择的连接。

 


图 1-2 负载均衡

如上图所示,当前负载均衡的策略是:

1.       基本原则是在所有备选DB服务器中选择当前连接数/权重系数最小的进行连接。

2.       如果总权重大于0,且当前DB服务器的权重等于0,则跳过此DB服务器。

3.       如果当前DB服务器达到了最大连接数上限,则跳过此DB服务器

 

1.3.   连接池

客户端连接关闭时,ProxySQL检查到DB服务器的连接是否可重用,如果不可复用,则断开连接,如果可复用,则并不断开到DB服务器的连接,而是把连接放到连接池,下次客户端再连接ProxySQL时,ProxySQL从连接池中获取一个连接给客户端使用。如果连接池中没有可用的连接,则建立新连接。

 

ProxySQL支持多路路由(multiplexing),作用是将语句分多路路由。开启了multiplexing开关,读/写分离、按规则路由才能进行。但有时候,有些语句要求路由到同一个主机组,甚至是同一个主机组中的同一个节点上。这时会自动禁用multiplexing。禁用multiplexing后,语句会根据同一个连接进行路由。如:激活事务时、锁表等。

1.4.   自动摘除宕机的DB

Monitor模块用于定期检查后端的各项指标。当前支持4种类型的指标检查connectpingreplication lagread only;可以自行更新mysql拓扑、进行故障处理和感知。ProxySQL在以下几种情况自动感知故障从库,并将其剔除,具体情况:

1、延迟超过阀值

2、ping 延迟超过阀值

3、网络不通或宕机

4、连接数打满

1.5.   动态加载配置

ProxySQL有管理端口,热修改配置(内存修改),即在线修改。唯有mysql-interfacesmysql-threadsmysql-stacksize 三个参数修改需要重启实例。

1.6.   访问控制

 


                    

密码加密:安全考虑,本地配置(sqlite)中通过加密函数将密码加密,不显示写明文密码。

 

SQL过滤:可以自动根据执行的频率,执行的时间来自动的添加,其中频率时间,都是可以根据自己的需求动态修改的;支持对query的路由,可以针对某个语句进行分配去哪个实例执行。


                      图1.3  安全认证流程

 

IP白名单:用户IP限制,限制了用户的host地址,该功能提供用户对连接ProxySQL的用户的ip进行限制的功能;ProxySQL路由表中可提供一个全局白名单,同时各个用户也可以配置各自用户的私有白名单。

 

独立账号:从库流量配置,可以指定某一个用户只能访问某几个从库,或者反过来说某几个从库只允许某几个用户访问,这样可能在一个更细的力度上对数据库的资源进行分配。

 

1.7.   查询缓存

一个非常常见的场景,识别出那些引起数据库负载加重的非最优化SELECT语句,这些非最优化查询的结果应当被缓存个几秒钟,在路由表中创建匹配规则,并设置缓存时长即可。

1.8.   ProxySQL 集群

原生集群功能还处于试验阶段,即不通过外部工具实现扩展的多个节点同构。


上图几个注意点:

  1. 负载软件层,也可以使用ProxySQL对ProxySQL集群进行负载均衡,因为ProxySQL自身就是一个代理,而且是专门负责MySQL协议的代理。
  2. 在负载均衡层,要保证事务持久,不能让一个事务内的不同语句路由到不同的目标上,也就是说负载的目标是"有状态"的。因此在使用lvs/haproxy时,必须想办法保证事务持久性。通用性方法是,从多个ProxySQL节点中取出一个作为逻辑写节点(可以有backup),haproxy/lvs通过端口(也可以用户名,但通常采用端口)代理的方式,强制将所有写语句路由到这个固定的ProxySQL节点上。
而通过ProxySQL来代理ProxySQL集群,因为ProxySQL内部支持事务持久(在mysql_users表中字段transaction_persistent控制持久性)。



「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
4人已赞赏
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论

暂无图片
3年前
评论
暂无图片 0
3、使用正则表达式和digest配置读写分离 请问这里的DIGEST 是MYSQL 对每个语句数字化,类似于ORALCE的SQL_ID?
3年前
暂无图片 点赞
1
向日葵
暂无图片
3年前
回复
暂无图片 0
DIGEST和ORALCE的SQL_ID都是对语句数字化,规则类似,唯一地代表除了参数部分的查询语句
3年前
暂无图片 点赞
回复