Mysql Proxysql 多路复用到底有多大作用

2020-09-22 00:00:00 数据库 连接 线程 复用 情况下

POSTGRESQL 在多并发连接的时候,会考虑使用pgbouncer , MYSQL 实际上很少听到说,还要使用代理的情况, 大多都是直接连接到mysql或者即使有中间件,也没有提到多路复用的技术.


实际上PROXYSQL 是支持多路复用技术应用在 MYSQL 上的,具体到底怎么应用,应用以后会怎样,这都是本篇需要说的问题.

如果没有

在ProxySQL中的多路复用是一个允许多个前端连接复用同一个数据库后端连接的特性。MySQL使用“每个连接的线程”而不是“线程池”实现。这将导致为每个连接打开一个单一的thead,随着连接数量的增加idel连接也会增加,会消耗资源降低性能。ProxySQL使用了“线程池”,通过多路复用,ProxySQL减少了数据库后端分配和管理的资源数量.  这就是ProxySQL 的多路复用的主要的作用.


在POSTGRESQL 中的pgbouncer 中是有相关某些情况不能使用代理, ProxySQL 作为 MYSQL的通用型代理, 在某些情况下,也是有不能进行复用的情况,或 如果要复用,必须有一些前提条件.


1  正在处理的transaction 在没有commit  前,他所使用的connection 是不能进行复用的.

2  当有表锁,刷表以及读锁的情况下, 是不能进行相关复用的

3  以及使用其他的类似 get_lock 函数的情况

4  在查询中获取系统变量的情况下  例如 select @@tx_isolation 或者自定义变量的情况下.


其实以上的这些问题都比较好理解, 一句话,如果本线程处理的事务必须在这个线程完成,如果在未完成之前,如果转换了其他的线程继续完成任务,将导致数据有误,则复用变得不可用.

另外如果使用了临时表,或者 sql_log_bin 设置为0 则这些情况也不OK.

当然这还不是完全会影响的复用被终止的全部因素, 具体可以去查看 PROXYSQL 的官方文档.



实际上应用和数据库之间基本上需要一个Mux在数据库和应用服务器之间,进行数据处理工作,这意味着代理层可以将通信通道合并到后端数据库。目的是减少打开多个连接的开销,并将打开连接的数量保持在低限度,以减少内存占用。同时有人会提出问题, 例如MYSQL的 enterprise 版本和PERCONA 的MYSQL 以及MariaDB 都提供thread pool, 但实际上PROXYSQL 来做thread pool 提供的功能和相关的灵活性都要大大高于这些简单的thread pool,尤其在本地服务器有着很大负担的情况下, 选择PROXYSQL 其实某些场景会提高MYSQL 集群的灵活性.

上图是一个对比MYSQL 在使用和不使用proxysql的对比图,可以看到对比使用了proxysql 整体的连接数仅仅是不使用的50%.


连接数少了,自然open connection 和 消耗的memory都会使用的变小,对于系统的资源的reduce 自然是有效果. 




同时在上图中我们也可以观察到使用了proxysql后,每秒可以执行的,SQL 语句,在不使用的情况下诶秒大是30K 在使用了可以达到60K, 所以这就是使用PROXYSQL 的好处之一, 其实原理和CPU 分时利用的原理是一致的,同一个和MYSQL 之间的线程,但连接大部分时间是处于IDEL 的,这就降低了线程的利用率, 将一个线程大化的利用是PROXYSQL 将连接到自身的访问,来复用MYSQL数据库本身的连接,达到分时复用的效果,让少开连接,让一个连接承接多个访问.



相关文章