ProxySQL官檔翻譯__17_Multiplexing

17_Multiplexing

備註:文章編寫時間201904-201905期間,後續官方在github的更新沒有被寫入

多路複用[Multiplexing]

多路複用既單一鏈接的複用;通過多路複用配置後,可以大幅度降低後端節點的連接數。

一、多路複用不可用的情況[Conditions where multiplexing is disabled]

1、活躍的事務[active transaction]

當事務在連接中處於活動狀態時,將禁用多路複用,直到事務提交或回滾爲止。

2、表被加鎖[table(s) locked]

如果執行了 LOCK TABLE,LOCK TABLES或FLUSH TABLES WITH READ LOCK,則禁用多路複用,直到執行UNLOCK TABLES。

3、use of GET_LOCK()

如果執行了GET_LOCK()函數,則禁用多路複用,並且永遠不會再次啓用。

4、使用特定的 會話/用戶 變量[use of specific session/user variables]

在query_digest(查詢概要)中具有@(引用變量)的所有查詢都將禁用多路複用,並且永遠不會再次啓用它。
注意:如果您正在select一個變量(例如,select @test_var)並且沒有按預期獲得結果,則很可能是由於查詢規則將您的語句路由到另一個主機組(這時請查看您的查詢規則)。

同樣,如果執行以下這些命令,也會發生同樣的情況:
1)SET SQL_SAFE_UPDATES=?,SQL_SELECT_LIMIT=?,MAX_JOIN_SIZE=? (mysql --safe-updates)
2)SET FOREIGN_KEY_CHECKS
3)SET UNIQUE_CHECKS
4)SET AUTO_INCREMENT_INCREMENT (v 1.4.4+)
5)SET AUTO_INCREMENT_OFFSET (v 1.4.4+)
6)SET GROUP_CONCAT_MAX_LEN (v 1.4.4+)

但主要,在Proxy SQL中硬編碼有2個例外,它們不會禁用多路複用:
1)SELECT @@tx_isolation
2)SELECT @@version
以上這些例外語句是硬編碼的,因爲許多應用程序在每個連接中運行它們。

5、use of SQL_CALC_FOUND_ROWS

如果查詢包含MySQL的 SQL_CALC_FOUND_ROWS (SELECT語句中選項),則禁用多路複用,並且永遠不會再次啓用該連接。

6、Temporary tables

如果執行了 CREATE TEMPORARY TABLE 語句,則禁用多路複用,並且永遠不會再次在連接上啓用多路複用。

7、use of PREPARE

如果執行MySQL的 PREPARE 語句(使用TEXT協議而不是BINARY協議創建預準備語句),則禁用多路複用,並且永遠不會再次啓用。

8、會話關閉了binlog[SQL_LOG_BIN sets to 0]

如果SQL_LOG_BIN設置爲0,則禁用多路複用,直到SQL_LOG_BIN設置回1。

二、不處理會話變量[Not handled session variables]

大多數會話變量不會被自動處理。
例如,如果客戶端發出 SET TX_ISOLATION=? ,則多路複用不會被禁用。
但如果您的客戶端使用了不同的tx_isolation,這樣的使用方式是有問題的;推薦將所有客戶端指定相同的tx_isolation,這也是默認的。(根據我的經驗,使用通一的隔離級別纔是大衆選擇)。

三、啓用/禁用多路複用[Ad-hoc enable/disable of multiplexing]

在 mysql_query_rules.multiplexing 中允許根據匹配條件來控制啓用或禁用多路複用。

該字段目前接受以下值:
0 : 禁用多路複用
1 : 啓用多路複用
2 : 對包含@變量的該特定查詢,不禁用多路複用。

例如,在您的應用程序中使用 SET SQL_SELECT_LIMIT 提示語句,您可以創建以下兩個規則:

INSERT INTO mysql_query_rules (active,match_digest,multiplex) VALUES
('1','^SET SQL_SELECT_LIMIT=?',0), (1,'^SET SQL_SELECT_LIMIT=DEFAULT,1);

如果您的應用程序發送了類似 SELECT @@ max_allowed_packet 的內容,並且您希望阻止因此而禁用多路複用,則可以創建以下規則:

INSERT INTO mysql_query_rules (active,match_digest,multiplex) VALUES
('1','^SELECT @@max_allowed_packet',2);

......甚至可以緩存它:

INSERT INTO mysql_query_rules (active,match_digest,multiplex,cache_ttl) VALUES
('1','^SELECT @@max_allowed_packet',2,60000);

如果您的應用程序正在嘗試設置一些將導致禁用多路複用的變量,並且您認爲可以對其進行過濾,則可以創建一個在不執行查詢的情況下返回OK的過濾器:

INSERT INTO mysql_query_rules (active,match_digest,OK_msg) VALUES
('1','^SET @@wait_timeout = ?','');

完畢!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章