ProxySQL之连接复用(multiplexing)以及相关问题说明
ProxySQL在连接池(persistent connection poll)的基础上,还有一个连接复用的概念 multiplexing connection,官方的wiki里没有很明确的说明,但在作者的一些 blog post 和 issue 里能找到解答: https://github.com/sysown/proxysql/issues/939#issuecomment-287489317 由于SQL可以路由,一个客户端连接上来,可能会到多个 hostgroup 发起连接。复用的意思是,一个后端DB的连接,可以“同时”被多个客户端使用。 传统的连接池,会在客户端断开连接(会话)后,把连接放回到池里。在ProxySQL中,由于连接复用,连接会在sql语句执行结束后,便将连接放回到池里(客户端会话可能并没有断开),这样便可大大提高后端连接的使用效率,而避免前段请求过大导致后端连接数疯长。 但这样做有时候并不安全,比如应用端连接时指定了 set NAMES xxx,然后执行查询,那么由于multiplexing可能导致两个语句发到不同的DB上执行,继而没有按照预期的字符集执行。proxysql考虑到了这种情况: 连接会话里创建了临时表,CREATE TEMPORARY table xxxx... select @开头的变量,如select @@hostname 手动开启了事务,start transaction, commit, rollback等等 连接设置了自己的用户变量,比如set names xxx, set autocommit x, set sql_mode=xxx, set v_uservar=xx等等 第1,2,3点会根据路由规则,会自动禁用multiplex,发到对应hostgroup后,连接未断开之前不会复用到其它客户端。具体是发到主库还是从库,与匹配的规则有关。 issue #941 和 #917 都有提到临时表丢失的问题,可以用不同的rule来避免 下面对上面几点一一说明。 1. 临时表与用户变量(验证 1, 2) 以下注意连接的会话窗口及执行顺序,admin打头的是在proxysql管理接口上执行。 -- [session 1] mysql client proxysql (ecdba@10.0.100.36:6033) [(none)]> select 1; +---+ | 1 | +---+ | 1 | +---+ -- [session 2] proxysql admin cli select * from stats_mysql_processlist; Empty set (0....