MySQL中間件之ProxySQL(12):禁止多路路由


返回ProxySQL系列文章:http://www.cnblogs.com/f-ck-need-u/p/7586194.html

 

1.multiplexing

multiplexing,作用是將語句分多路路由。開啟了multiplexing開關,讀/寫分離、按規則路由才能進行。但有時候,有些語句要求路由到同一個主機組,甚至是同一個主機組中的同一個節點上。這時會自動禁用multiplexing。禁用multiplexing后,語句會根據同一個連接進行路由。

也就是說,在禁用multiplexing情況下,會將語句路由到同一個主機組中的同一個節點上。

什么情況下會禁用多路路由(disable multiplexing)?

  • 激活事務時

當某連接中激活了一個事務,則在該事務提交或回滾之前,multiplexing將一直被禁用。

  • 表被鎖

當執行了LOCK TABLE, LOCK TABLESFLUSH TABLES WITH READ LOCK 時,將一直禁用multiplexing,直到執行UNLOCK TABLES

  • 使用GET_LOCK()

如果執行了GET_LOCK(),將一直禁用multiplexing,且永不再次啟用。

  • 使用某些特定的會話/用戶(session/user)變量

所有查詢的query_digest部分包含了@的都將禁用multiplexing,且永不再次啟用。

下面的命令是類似的情況,都會禁用multiplexing且不再次啟用:

  • SET SQL_SAFE_UPDATES=?,SQL_SELECT_LIMIT=?,MAX_JOIN_SIZE=? (mysql --safe-updates)
  • SET FOREIGN_KEY_CHECKS
  • SET UNIQUE_CHECKS
  • SET AUTO_INCREMENT_INCREMENT (v 1.4.4+)
  • SET AUTO_INCREMENT_OFFSET (v 1.4.4+)
  • SET GROUP_CONCAT_MAX_LEN (v 1.4.4+)

但下面兩個語句是例外,因為它們被硬編碼為不禁用multiplexing:

  • SELECT @@tx_isolation
  • SELECT @@version

之所以要硬編碼這兩個例外,是因為很多應用程序在每個連接中都會執行這兩個語句。

  • 使用SQL_CALC_FOUND_ROWS

如果查詢語句中包含了SQL_CALC_FOUND_ROWS,那么該連接上將禁用multiplexing且不再啟用。

  • 臨時表

如果執行了CREATE TEMPORARY TABLE,那么該連接上將禁用multiplexing且不再啟用。

  • 使用PREPARE

如果執行PREPARE語句(該語句使用文本協議准備好語句,而不是二進制協議),將禁用multiplexing且不再啟用。

  • SQL_LOG_BIN設置為0時,即禁用binlog

如果SQL_LOG_BIN設置為0,則multiplexing將被禁用直到SQL_LOG_BIN開啟。

Not handled session variables

大多數會話變量都不會自動進行處理。
例如,如果客戶端發出了SET TX_ISOLATION=?,將不會禁用multiplexing。
當有不同客戶端使用了不同的tx_isolation時,這將是一個bug,但一般所有客戶端都使用默認的tx_isolation(絕大多數情況都如此)。

Ad-hoc enable/disable of multiplexing

mysql_query_rules.multiplexing允許基於匹配標准來啟用/禁用multiplexing。當前該字段可接受的值有:

  • 0 : 禁用multiplexing
  • 1 : 啟用multiplexing
  • 2 : 對於包含了@的查詢語句不禁用multiplexing(默認包含了@的語句會禁用multiplexing)

例如,如果你的應用程序中使用了SET SQL_SELECT_LIMIT,你可以創建下面兩條規則來啟用multiplexing:

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的語句,為了避免默認情況下這樣的語句禁用multiplexing,可以創建如下規則:

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);

如果你的應用程序嘗試要設置一個變量,而這可能會禁用multiplexing,如果這個設置語句能夠寫規則來匹配,可以創建一個篩選條件返回OK而無需去執行查詢,這樣就不會修改multiplexing當前的策略:

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM