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种类型的指标检查connect、ping、replication
lag、read only;可以自行更新mysql拓扑、进行故障处理和感知。ProxySQL在以下几种情况自动感知故障从库,并将其剔除,具体情况:
1、延迟超过阀值
2、ping 延迟超过阀值
3、网络不通或宕机
4、连接数打满
1.5.
动态加载配置
ProxySQL有管理端口,热修改配置(内存修改),即在线修改。唯有mysql-interfaces
,mysql-threads
和 mysql-stacksize
三个参数修改需要重启实例。
1.6.
访问控制
密码加密:安全考虑,本地配置(sqlite)中通过加密函数将密码加密,不显示写明文密码。
SQL过滤:可以自动根据执行的频率,执行的时间来自动的添加,其中频率时间,都是可以根据自己的需求动态修改的;支持对query的路由,可以针对某个语句进行分配去哪个实例执行。
图1.3 安全认证流程
IP白名单:用户IP限制,限制了用户的host地址,该功能提供用户对连接ProxySQL的用户的ip进行限制的功能;ProxySQL路由表中可提供一个全局白名单,同时各个用户也可以配置各自用户的私有白名单。
独立账号:从库流量配置,可以指定某一个用户只能访问某几个从库,或者反过来说某几个从库只允许某几个用户访问,这样可能在一个更细的力度上对数据库的资源进行分配。
1.7.
查询缓存
一个非常常见的场景,识别出那些引起数据库负载加重的非最优化SELECT语句,这些非最优化查询的结果应当被缓存个几秒钟,在路由表中创建匹配规则,并设置缓存时长即可。
1.8.
ProxySQL 集群
原生集群功能还处于试验阶段,即不通过外部工具实现扩展的多个节点同构。
上图几个注意点:
- 负载软件层,也可以使用ProxySQL对ProxySQL集群进行负载均衡,因为ProxySQL自身就是一个代理,而且是专门负责MySQL协议的代理。
- 在负载均衡层,要保证事务持久,不能让一个事务内的不同语句路由到不同的目标上,也就是说负载的目标是"有状态"的。因此在使用lvs/haproxy时,必须想办法保证事务持久性。通用性方法是,从多个ProxySQL节点中取出一个作为逻辑写节点(可以有backup),haproxy/lvs通过端口(也可以用户名,但通常采用端口)代理的方式,强制将所有写语句路由到这个固定的ProxySQL节点上。
评论
