MySQL中間件之ProxySQL(11):鏈式規則( flagIN 和 flagOUT )

来源:https://www.cnblogs.com/f-ck-need-u/archive/2018/07/22/9350631.html
-Advertisement-
Play Games

返回 "ProxySQL系列文章:http://www.cnblogs.com/f ck need u/p/7586194.html"   1.理解鏈式規則 在mysql_query_rules表中,有兩個特殊欄位" flagIN "和" flagOUT ",它們分別用來定義規則的入口和出 ...


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

 

1.理解鏈式規則

在mysql_query_rules表中,有兩個特殊欄位"flagIN"和"flagOUT",它們分別用來定義規則的入口和出口,從而實現鏈式規則(chains of rules)。

鏈式規則的實現方式如下:

  1. 當入口值flagIN設置為0時,表示開始進入鏈式規則。如未顯式指定規則的flagIN值,則預設都為0。
  2. 當語句匹配完當前規則後,將記下當前規則的flagOUT值,如果flagOUT值非空(NOT NULL),則為該語句打上flagOUT標記。如果該規則的apply欄位值不是1,則繼續向下匹配。
  3. 如果語句的flagOUT標記和下一條規則的flagIN值不同,則跳過該規則,繼續向下匹配。直到匹配到flagOUT=flagIN的規則,則匹配該規則。該規則是鏈式規則中的另一條規則。
  4. 直到某規則的apply欄位設置為1,或者已經匹配完所有規則,則最後一次被評估的規則將直接生效,不再繼續向下匹配。

通過下麵兩張圖,應該很容易理解鏈式規則的生效方式。

必須註意,規則是按照rule_id的大小順序進行的。且並非只有apply=1時才會應用規則,當無規則可匹配,或者某規則的flagIN和flagOUT值相同,都會應用最後一次被評估的規則

以下幾個示例,可以解釋生效規則:

# rule_id=3 生效
+---------+-------+--------+---------+
| rule_id | apply | flagIN | flagOUT |
+---------+-------+--------+---------+
| 1       | 0     | 0      | 23      |
| 2       | 0     | 23     | 23      |
| 3       | 0     | 23     | NULL    |
+---------+-------+--------+---------+

# rule_id=2 生效
+---------+-------+--------+---------+
| rule_id | apply | flagIN | flagOUT |
+---------+-------+--------+---------+
| 1       | 0     | 0      | 23      |
| 2       | 0     | 23     | 23      |
| 3       | 0     | 24     | NULL    |
+---------+-------+--------+---------+

# rule_id=2 生效,因為匹配完rule_id=2後,還打著flagOUT=23標記
+---------+-------+--------+---------+
| rule_id | apply | flagIN | flagOUT |
+---------+-------+--------+---------+
| 1       | 0     | 0      | 23      |
| 2       | 0     | 23     | NULL    |
| 3       | 1     | 24     | NULL    |
+---------+-------+--------+---------+

# rule_id=3 生效,因為匹配完rule_id=2後,還打著flagOUT=23標記
+---------+-------+--------+---------+
| rule_id | apply | flagIN | flagOUT |
+---------+-------+--------+---------+
| 1       | 0     | 0      | 23      |
| 2       | 0     | 23     | NULL    |
| 3       | 1     | 23     | NULL    |
+---------+-------+--------+---------+

2.鏈式規則示例

有了普通規則匹配方式,為什麼還要設計鏈式規則呢?雖然ProxySQL通過正則表達式實現了很靈活的規則匹配模式,但需求總是千變萬化的,有時候僅通過一條正則匹配規則和替換規則很難實現比較複雜的要求,例如sharding時。

鏈式規則除了常用的多次替換,還可巧用於多次匹配

本文簡單演示一下鏈式規則,不具有實際意義,只為後面ProxySQL實現sharding的文章做基礎知識鋪墊。

2個測試庫,共4張表test{1,2}.t{1,2}。

mysql> select * from test1.t1;
+------------------+
| name             |
+------------------+
| test1_t1_malong1 |
| test1_t1_malong2 |
| test1_t1_malong3 |
+------------------+

mysql> select * from test1.t2;
+------------------+
| name             |
+------------------+
| test1_t2_malong1 |
| test1_t2_malong2 |
| test1_t2_malong3 |
+------------------+

mysql> select * from test2.t1;
+--------------------+
| name               |
+--------------------+
| test2_t1_xiaofang1 |
| test2_t1_xiaofang2 |
| test2_t1_xiaofang3 |
+--------------------+

mysql> select * from test2.t2;
+--------------------+
| name               |
+--------------------+
| test2_t2_xiaofang1 |
| test2_t2_xiaofang2 |
| test2_t2_xiaofang3 |
+--------------------+

現在借用鏈式規則,一步一步地將對test1.t1表的查詢路由到test2.t2表的查詢。再次聲明,此處示例毫無實際意義,僅為演示鏈式規則的基本用法。

大致鏈式匹配的過程為:

test1.t1 --> test1.t2 --> test2.t1 --> test2.t2

以下是具體插入的規則:

delete from mysql_query_rules;
select * from stats_mysql_query_digest_reset where 1=0;

insert into mysql_query_rules 
(rule_id,active,apply,flagIN,flagOUT,match_pattern,replace_pattern) values 
(1,1,0,0,23,"test1\.t1","test1.t2");

insert into mysql_query_rules 
(rule_id,active,apply,flagIN,flagOUT,match_pattern,replace_pattern) values 
(2,1,0,23,24,"test1\.t2","test2.t1");

insert into mysql_query_rules 
(rule_id,active,apply,flagIN,flagOUT,match_pattern,replace_pattern,destination_hostgroup) values 
(3,1,1,24,NULL,"test2\.t1","test2.t2",30);

load mysql query rules to runtime;
save mysql query rules to disk;

admin> select rule_id,
              apply,
              flagIN,
              flagOUT,
              match_pattern,
              replace_pattern,
              destination_hostgroup DH
              from mysql_query_rules;
+---------+-------+--------+---------+---------------+-----------------+------+
| rule_id | apply | flagIN | flagOUT | match_pattern | replace_pattern | DH   |
+---------+-------+--------+---------+---------------+-----------------+------+
| 1       | 0     | 0      | 23      | test1\.t1     | test1.t2        | NULL |
| 2       | 0     | 23     | 24      | test1\.t2     | test2.t1        | NULL |
| 3       | 1     | 24     | NULL    | test2\.t1     | test2.t2        | 30   |
+---------+-------+--------+---------+---------------+-----------------+------+

查詢test1.t1表,測試結果。

[root@xuexi ~]# mysql -uroot -pP@ssword1! -h127.0.0.1 -P6033 -e "select * from test1.t1;"
+--------------------+
| name               |
+--------------------+
| test2_t2_xiaofang1 |  <-- 查詢返回結果為test2.t2內容
| test2_t2_xiaofang2 |
| test2_t2_xiaofang3 |
+--------------------+

admin> select * from stats_mysql_query_rules;
+---------+------+
| rule_id | hits |
+---------+------+
| 1       | 1    |  <-- 3條規則全都命中
| 2       | 1    |
| 3       | 1    |
+---------+------+

admin> select hostgroup,digest_text from stats_mysql_query_digest; 
+-----------+----------------------------------+
| hostgroup | digest_text                      |
+-----------+----------------------------------+
| 30        | select * from test2.t2           |  <-- 路由目標hg=30
+-----------+----------------------------------+

顯然,已經按照預想中的方式進行匹配、替換、路由。

一個問題:如果查詢的是test1.t2表或test2.t1表,會進行鏈式匹配嗎?
答案是不會,因為rule_id=2rule_id=3這兩個規則的flagIN都是非0值,而每個SQL語句初始時只進入flagIN=0的規則。

此外還需註意,當某語句未按照我們的期望途經所有的鏈式規則,則可能會根據destination_hostgroup欄位的值直接路由出去,即使沒有指定該欄位值,還有用戶的預設路由目標組,或者基於埠的路由目標。所以,在寫鏈式規則時,應當儘可能地針對某一類型的語句進行完完整整的定製,保證這類語句能途經我們所期望的所有規則。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 最近在使用 BASH 進行處理 文本文件的時候,對於文本處理真的是力不從心,今天進行搜集一下linux 中文本處理相關的命令,這樣你在進行書寫shell 腳本的時候,就能寫出更好的方案。 命令搜集: 如果其中有命令還不是非常熟悉,請花時間看一看,多瞭解一下。必定事半功倍。 保持更新,轉載請標明出處。 ...
  • 函數定義:是一組預先定義好的SQL語句集合,理解為批處理語句。 ①提高代碼的重用性 ②簡化操作 ③減少編譯次數和減少和資料庫的連接次數,提高效率 ④安全性調高 函數和存儲過程的區別 函數:有且僅有一個返回值,適合作為數據處理後的一個標識。 存儲過程:返回值多種(可有可無)做批量插入和批量更新。 一、 ...
  • 在連接資料庫的時候,有時會遇到一個“ORA12514:監聽程式當前無法識別連接描述符中請求的服務”的錯誤,這個錯誤其實就是資料庫動態註冊(關於動態註冊會在稍後講解)不生效,導致監聽器無法識別客戶端連接符中提供的服務名,從而拒絕建立資料庫連接時報的錯誤信息,所以就需要對監聽器配置做修改。 在這裡,還需 ...
  • 占座 ...
  • PostgreSQL之視窗函數的用法 轉載請註明出處:https://www.cnblogs.com/funnyzpc/p/9311281.html PostgreSQL的高級特性本準備三篇的(遞歸、視窗函數、JSON),結果中間一直一直加班 和遺忘 拖到現在才寫到中篇,欸,加班真不是一件好事情。 ...
  • 一Redis 連接 Redis 連接命令主要是用於連接 redis 服務。 實例 以下實例演示了客戶端如何通過密碼驗證連接到 redis 服務,並檢測服務是否在運行: 下表列出了 redis 連接的基本命令: 二Redis 鍵(key) Redis key命令用於管理 redis 的鍵。 語法 實例 ...
  • 一、 系統變數 說明:變數由系統定義,不是用戶定義,屬於伺服器層面 註意:全局變數需要添加global關鍵字,會話變數需要添加session關鍵字,如果不寫,預設會話級別 使用步驟: 1、查看所有系統變數 show global|【session】variables; 2、查看滿足條件的部分系統變數 ...
  • 存儲過程 一、存儲過程的定義 二、存儲過程的優點 三、存儲過程的使用 3.1 存儲過程的創建和調用 3.2存儲過程的查看和刪除 一、存儲過程的定義: 存儲過程是一組為了完成特定功能的SQL語句集,存儲在數據中,經過一次編譯後再次調用不需要二次編譯,可以理解為批處理語句。 二、優點 ①提高了代碼的重用 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...