MySQL-ProxySQL中間件(二)| Admin Schemas介紹

目錄

    MySQL-ProxySQL中間件(一)| ProxySQL基本概念:  http://www.javashuo.com/article/p-fnplpdym-k.html
    MySQL-ProxySQL中間件(二)| Admin Schemas介紹: http://www.javashuo.com/article/p-wuxjnuam-e.html

正文

    此次咱們主要來介紹下ProxySQL中核心數據庫Main的表結構及MGR監控配置腳本(內附彩蛋:MySQL 8.0 MGR 監控腳本)
    計劃其他數據庫,隨着功能介紹再作詳細說明,本文不作過多擴展。

  The Admin Schemas

    ProxySQL管理界面是一個使用MySQL協議的界面,任何可以經過這種界面發送命令的客戶端都很容易配置它。 html

    ProxySQL解析經過此接口發送的查詢以查找特定於ProxySQL的任何命令,若是適當,則將它們發送到嵌入式SQLite3引擎以運行查詢。前端

    請注意,SQLite3和MySQL使用的SQL語法不一樣,所以並不是全部適用於MySQL的命令都適用於SQLite3。 例如,儘管管理界面接受USE命令,但它不會更改默認架構,由於SQLite3中不提供此功能。mysql

        鏈接到ProxySQL管理界面時,咱們能夠看到有一些數據庫可用。 ProxySQL將SHOW DATABASES命令轉換爲SQLite3的等效命令。git

 

 

這些數據庫的做用以下:github

main:內存配置數據庫
使用此數據庫,能夠輕鬆地以自動方式查詢和更新ProxySQL的配置。 web

使用LOAD MYSQL USERS FROM MEMORY和相似命令,存儲在此處的配置能夠在運行時傳播到ProxySQL使用的內存數據結構。正則表達式

disk:基於磁盤的「main」鏡像。
在從新啓動時,「main」不會持久存在,而且能夠從「磁盤」數據庫或配置文件中加載,具體取決於啓動標誌和磁盤數據庫的存在。算法

stats:包含從代理的內部功能收集的運行時指標。
示例度量標準包括每一個查詢規則匹配的次數,當前運行的查詢等。sql

monitor:包含與ProxySQL鏈接的後端服務器相關的監控指標。
示例度量標準包括鏈接到後端服務器或對其進行ping操做的最短和最長時間。數據庫

myhgm:僅在調試版本中啓用
此外,使用這兩種類型的用戶使用這些默認憑據訪問管理數據庫:

user:admin / password:admin - 具備對全部表的讀寫訪問權限

user:stats / password:stats - 具備對統計表的只讀訪問權限。 這用於從ProxySQL中提取指標,而不會暴露太多的數據庫

上述的訪問憑據,可經過變量admin-admin_credentials和admin-stats_credentials進行配置。

MAIN數據庫

    主要包含了如下數據表:

    

核心配置表

1.    mysql_server

    

 

  字段定義    

hostgroup_id

    包含此mysqld實例的主機組。 請注意,同一實例能夠是多個主機組的一部分

hostname,port

    能夠聯繫mysqld實例的TCP端點

gtid_port                

    ProxySQL Binlog Reader偵聽GTID跟蹤的後端服務器端口

status

    ONLINE - 後端服務器徹底能夠運行

    SHUNNED - 後端服務器暫時中止使用,由於在時間過短或複製延遲超過容許閾值的狀況下鏈接錯誤太多

    OFFLINE_SOFT - 當服務器進入OFFLINE_SOFT模式時,再也不接受新的傳入鏈接,而現有鏈接將保持不變,直到它們變爲非活動狀態。 換句話說,鏈接一直在使用,直到當前事務完成。 這容許優雅地分離後端

    OFFLINE_HARD - 當服務器進入OFFLINE_HARD模式時,現有鏈接被丟棄,而新的傳入鏈接也不被接受。 這至關於從主機組中刪除服務器,或暫時將其從主機組中取出以進行維護工做

weight

    服務器相對於其餘權重的權重越大,從主機組中選擇服務器的機率就越高

compression

    若是該值大於0,則與該服務器的新鏈接將使用壓縮

max_connections

    ProxySQL將向此後端服務器打開的最大鏈接數。 即便此服務器具備最高權重,但一旦達到此限制,就不會向其打開新鏈接。 請確保後端配置了正確的max_connections值,以免ProxySQL嘗試超出該限制

max_replication_lag

    若是更大且爲0,ProxySQL將按期監視複製延遲,若是超出此閾值,它將暫時避開主機,直到複製遇上

use_ssl

    若是設置爲1,則與後端的鏈接將使用SSL

max_latency_ms

    按期監視ping時間。 若是主機的ping時間大於max_latency_ms,則它將從鏈接池中排除(儘管服務器保持ONLINE狀態)

comment

    可用於用戶定義的任何目的的文本字段。 能夠是主機存儲內容的描述,添加或禁用主機的提醒,或某些檢查器腳本處理的JSON。

2.   mysql_replication_hostgroups

    表mysql_replication_hostgroups定義用於傳統主/從異步或者半同步或者加強半同步複製的複製主機組。 
 
    若是使用Group Replication / InnoDB Cluster或Galera / Percona XtraDB Cluster進行復制,則應使用mysql_group_replication_hostgroups或mysql_galera_hostgroups(在2.x版中提供)。
    mysql_replication_hostgroups中的每一行表明一對writer_hostgroup和reader_hostgroup。 
 
    ProxySQL將監視指定主機組中全部服務器的read_only值,並根據read_only的值將服務器分配給writer組或reader組。 
 
    字段的註釋可用於存儲任意數據。

  字段定義   

writer_hostgroup - 默認狀況下將發送全部請求的主機組,MySQL中read_only = 0的節點將分配給該主機組。

reader_hostgroup - 應該發送讀取請求的主機組,應該定義查詢規則或單獨的只讀用戶將流量路由到此主機組,將read_only = 1的節點分配給該主機組。

check_type - 執行只讀檢查時檢查的MySQL變量,默認狀況下爲read_only(也可使用super_read_only)。 對於AWS Aurora,應使用innodb_read_only。

comment - 可用於用戶定義的任何目的的文本字段。 能夠是集羣存儲內容的描述,添加或禁用主機組的提醒,或某些檢查器腳本處理的JSON。

3.    mysql_group_replication_hostgroups(MGR)

 

    字段定義

writer_hostgroup - 默認狀況下將發送全部請求的主機組,MySQL中read_only = 0的節點將分配給該主機組。

backup_writer_hostgroup - 若是集羣有多個節點,其read_only = 0和max_writers,則ProxySQL會將其餘節點(超過max_writes的節點)放入backup_writer_hostgroup中。

reader_hostgroup - 應該發送讀請求的主機組,將read_only = 1的節點分配給該主機組。

offline_hostgroup - 當ProxySQL的監視肯定節點爲OFFLINE時,它將被放入offline_hostgroup。

active - 啓用時,ProxySQL監視主機組並在適當的主機組之間移動節點。

max_writers' - 此值肯定writer_hostgroup中應容許的最大節點數,超過此值的節點將放入backup_writer_hostgroup中

writer_is_also_reader - 肯定是否應將同一個節點添加到reader_hostgroup和writer_hostgroup中。

max_transactions_behind - 肯定在屏蔽節點以前,ProxySQL應容許的寫入器後面的最大事務數,以防止讀取落後過多(這是經過查詢MySQL中sys.gr_member_routing_candidate_status表的transactions_behind字段來肯定的)。

comment - 可用於用戶定義的任何目的的文本字段。 能夠是集羣存儲內容的描述,添加或禁用主機組的提醒,或某些檢查器腳本處理的JSON。

4.    mysql_galera_hostgroups(PXC)

    表mysql_galera_hostgroups(在ProxySQL 2.x及更高版本中可用)定義了用於Galera Cluster / Percona XtraDB Cluster的主機組。
    字段定義

writer_hostgroup - 默認狀況下將發送全部流量的主機組,MySQL中read_only = 0的節點將分配給該主機組。

backup_writer_hostgroup - 若是集羣有多個節點,其read_only = 0和max_writers,則ProxySQL會將其餘節點(超過max_writes)放入backup_writer_hostgroup中。

reader_hostgroup - 應該發送讀取流量的主機組,應該定義查詢規則或單獨的只讀用戶將流量路由到此主機組,將read_only = 1的節點分配給該主機組。

offline_hostgroup - 當ProxySQL的監控肯定主機處於OFFLINE時,它將被放入offline_hostgroup

active - 啓用時,ProxySQL監視主機組並在適當的主機組之間移動服務器。

max_writers - 此值肯定writer_hostgroup中應容許的最大節點數,超過此值的節點將放入backup_writer_hostgroup中

writer_is_also_reader - 肯定是否應將節點添加到reader_hostgroup以及在提高後的writer_hostgroup。

max_transactions_behind - 肯定在避開節點以前ProxySQL應容許的集羣后面的最大寫集數,以防止過期讀取(這是經過查詢wsrep_local_recv_queue Galera變量肯定的)。

comment - 可用於用戶定義的任何目的的文本字段。 能夠是集羣存儲內容的描述,添加或禁用主機組的提醒,或某些檢查器腳本處理的JSON。

5.    mysql_users

    表mysql_users定義MySQL用戶,用於鏈接後端。

 

    字段定義

username,password - 用於鏈接mysqld或ProxySQL實例的憑據。

active - 將在數據庫中跟蹤active = 0的用戶,但永遠不會在內存數據結構中加載

default_hostgroup - 若是此用戶發送的查詢沒有匹配規則,則生成的流量將發送到指定的主機組

default_schema - 默認狀況下鏈接應更改的架構

schema_locked - 尚不支持(TODO:check)

transaction_persistent - 若是是一個事務內的多條SQL,只會路由到一個主機組中。

fast_forward - 若是設置,它繞過查詢處理層(重寫,緩存)並直接將查詢傳遞給後端服務器。

frontend - 若是設置爲1,則此(用戶名,密碼)對用於對ProxySQL實例進行身份驗證

backend - 若是設置爲1,則此(用戶名,密碼)對用於針對任何主機組對mysqld服務器進行身份驗證

max_connections - 定義特定用戶的最大容許前端鏈接數。

comment - 可用於用戶定義的任何目的的文本字段。 能夠是集羣存儲內容的描述,添加或禁用主機組的提醒,或某些檢查器腳本處理的JSON。

    注意,目前全部用戶都須要將「frontend」和「後backend」都設置爲1。 

    ProxySQL的將來版本將在前端和後端之間分離證書。 

    經過這種方式,前端永遠不會知道直接鏈接到後端的憑證,強制經過ProxySQL進行全部鏈接並提升系統的安全性。

    fast_forward 注意事項:

1.    它不須要不一樣的端口:完整的功能代理邏輯和「快進」邏輯在同一代碼/模塊中實現

2.    fast_forward是基於每一個用戶實現的:取決於鏈接到ProxySQL的用戶,啓用或禁用fast_forward

3.    驗證後啓用fast_forward算法:客戶端仍然對ProxySQL進行身份驗證,當客戶端開始發送流量時,ProxySQL將建立鏈接。 這意味着在鏈接階段仍然會處理鏈接錯誤。

4.    fast_forward不支持SSL

5.    若是使用壓縮,則必須在兩端啓用它

注意:mysql_users中的用戶也不該該與admin-admin_credentials和admin-stats_credentials裏的配置相同

6.    mysql_query_rules

    表mysql_query_rules定義了路由策略和屬性。

 

    字段定義

rule_id - 規則的惟一ID。 規則以rule_id順序處理

 

active - 查詢處理模塊將僅考慮active = 1的規則,而且只將活動規則加載到運行時。

 

username - 匹配用戶名的過濾條件。 若是爲非NULL,則僅當使用正確的用戶名創建鏈接時,查詢纔會匹配

 

schemaname - 匹配schemaname的過濾條件。 若是爲非NULL,則僅當鏈接使用schemaname做爲默認模式時,查詢纔會匹配(在mariadb / mysql schemaname中等效於databasename)

flagIN,flagOUT,apply -

這些容許咱們建立一個接一個地應用的「規則鏈」。
輸入標誌值設置爲0,而且在開始時僅考慮flagIN = 0的規則。
當爲特定查詢找到匹配規則時,將評估flagOUT,若是爲NOT NULL,則將使用flagOUT中的指定標誌標記查詢。
若是flagOUT與flagIN不一樣,則查詢將退出當前鏈並輸入一個新的規則鏈,其中flagIN做爲新的輸入標誌。
若是flagOUT與flagIN匹配,則將針對具備所述flagIN的第一個規則再次從新評估查詢。
這種狀況會發生,直到沒有更多匹配規則,或者apply設置爲1(這意味着這是要應用的最後一條規則)


client_addr - 匹配來自特定源的流量

 

proxy_addr - 匹配特定本地IP上的傳入流量

 

proxy_port - 匹配特定本地端口上的傳入流量

使用stats_mysql_query_digest.digest返回的特定摘要匹配查詢

 

match_digest - 與查詢摘要匹配的正則表達式。 另請參見https://github.com/sysown/proxysql/wiki/Global-variables#mysql-query_processor_regex

 

match_pattern - 與查詢文本匹配的正則表達式。 另請參見https://github.com/sysown/proxysql/wiki/Global-variables#mysql-query_processor_regex

 

negate_match_pattern - 若是將其設置爲1,則只有與查詢文本不匹配的查詢纔會被視爲匹配項。 這在與match_pattern或match_digest匹配的正則表達式前面充當NOT運算符

 

re_modifiers -

用逗號分隔的選項列表,用於修改RE引擎的行爲。 使用CASELESS,匹配不區分大小寫。

使用GLOBAL,替換是全局的(替換全部匹配而不只僅是第一個匹配)。

爲了向後兼容,默認狀況下僅啓用CASELESS。 有關更多詳細信息,另請參見https://github.com/sysown/proxysql/wiki/Global-variables#mysql-query_processor_regex。

 

replace_pattern -

這是用於替換匹配模式的模式。

它是使用RE2 :: Replace完成的,所以值得一看有關的在線文檔:https://github.com/google/re2/blob/master/re2/re2.h#L378。

請注意,這是可選的,當缺乏此選項時,查詢處理器將僅緩存,路由或設置其餘參數而不重寫。

 

destination_hostgroup -

將匹配的查詢路由到此主機組。

除非存在已啓動的事務且登陸用戶將transaction_persistent標誌設置爲1(請參閱mysql_users表),不然會發生這種狀況。

 

cache_ttl - 緩存查詢結果的毫秒數。 注意:在ProxySQL 1.1中,cache_ttl只需幾秒鐘

 

cache_empty_result -

控制是否緩存沒有行的結果集

從新鏈接 - 未使用的功能

 

timeout -

應執行匹配或重寫查詢的最大超時(以毫秒爲單位)。

若是查詢運行的時間超過特定閾值,則會自動終止查詢。 若是未指定timeout,則應用全局變量mysql-default_query_timeout

 

retries - 在執行查詢期間檢測到失敗時須要從新執行查詢的最大次數。 若是未指定重試,則應用全局變量mysql-query_retries_on_failure

delay -

延遲執行查詢的毫秒數。

這本質上是一種限制機制和QoS,容許優先考慮某些查詢而不是其餘查詢。

此值將添加到適用於全部查詢的mysql-default_query_delay全局變量中。 將來版本的ProxySQL將提供更高級的限制機制。

 

mirror_flagOUT和mirror_hostgroup - 與鏡像相關的設置 https://github.com/sysown/proxysql/wiki/Mirroring。

 

error_msg - 將阻止查詢,並將指定的error_msg返回給客戶端

 

OK_msg - 將爲使用已定義規則的查詢返回指定的消息

 

sticky_conn - 還沒有實現

 

multiplex -

若是爲0,則禁用Multiplex。

若是爲1,若是沒有任何其餘條件阻止此操做(如用戶變量或事務),則能夠從新啓用Multiplex。

若是爲2,則不會僅針對當前查詢禁用多路複用。 請參閱wiki默認爲NULL,所以不會修改多路複用策略

gtid_from_hostgroup - 定義哪一個主機組應該用做GTID一致性讀取的領導者(一般是複製主機組對中定義的WRITER主機組)

 

log- 將記錄查詢

 

apply - 當設置爲1時,在匹配和處理此規則後,將再也不評估進一步的查詢(注意:以後不會評估mysql_query_rules_fast_routing規則)

 

comment- 自由格式文本字段,可用於查詢規則的描述性註釋

 

7.    mysql_query_rules_fast_routing

    表mysql_query_rules_fast_routing是mysql_query_rules的擴展,以後會對快速路由策略和屬性進行評估(僅在ProxySQL 1.4.7+中可用)。
 
    字段定義

username - 與用戶名匹配的過濾條件,只有在使用正確的用戶名創建鏈接時,查詢纔會匹配

schemaname - 匹配schemaname的過濾條件,只有當鏈接使用schemaname做爲默認模式時,查詢纔會匹配(在mariadb / mysql schemaname中,這至關於databasename)

flagIN - 與mysql_query_rules中flagin相同,並與mysql_query_rules表中指定的flagout / apply相關聯

destination_hostgroup - 將匹配的查詢路由到此主機組。 

comment- 自由格式文本字段,可用於查詢規則的描述性註釋

8.    global_variables\mysql_collations\scheduler 暫不介紹了,後面會逐步投在功能介紹裏說起

 

Runtime層對應表

        表以runtime_開頭,其他基本與MAIN庫中的表名相同,例如:runtime_mysql_servers 是 內存層 mysql_servers表的對應表
    請注意,若是ProxySQL從新啓動,若是內容未保存在磁盤數據庫中,則內存表(MAIN數據庫)的全部內容都將丟失。
 

Disk層對應表

        「disk」數據庫與「main」數據庫具備徹底相同的表,具備相同的語義。 
        惟一的主要區別是這些表存儲在磁盤上,而不是存儲在內存中。 
        每當從新啓動ProxySQL時,將今後數據庫開始填充內存中的「main」數據庫。
 

監控MGR,須要在MySQL實例中配置一些監控腳本(MySQL 5.7 和 MySQL 8.0略有不一樣)

    該腳本須要配置到sys庫下,因筆記web顯示問題,沒法顯示折行,可是不影響複製,能夠自行復制粘貼出來便可。

    先看看執行效果 

select * from sys.gr_member_routing_candidate_status;
+------------------+-----------+---------------------+----------------------+
| viable_candidate | read_only | transactions_behind | transactions_to_cert |
+------------------+-----------+---------------------+----------------------+
| YES              | NO        |                   0 |                    0 |
+------------------+-----------+---------------------+----------------------+
​
viable_candidate:MGR當前節點是否正常
read_only:當前節點是否開啓了只讀
transactions_behind:MGR應用relay log的隊列中,積壓事務數
transactions_to_cert:MGR當前節點的驗證隊列,積壓事務數

    MySQL5.7,配置腳本爲:

USE sys;
​
DELIMITER $$
​
CREATE FUNCTION IFZERO(a INT, b INT) RETURNS INT DETERMINISTIC RETURN IF(a = 0, b, a)$$
​
CREATE FUNCTION LOCATE2(needle TEXT(10000), haystack TEXT(10000), offset INT) 
RETURNS INT DETERMINISTIC RETURN IFZERO(LOCATE(needle, haystack, offset), LENGTH(haystack) + 1)$$
​
CREATE FUNCTION GTID_NORMALIZE(g TEXT(10000)) 
RETURNS TEXT(10000) DETERMINISTIC RETURN GTID_SUBTRACT(g, '')$$
​
CREATE FUNCTION GTID_COUNT(gtid_set TEXT(10000)) 
RETURNS INT DETERMINISTIC BEGIN DECLARE result BIGINT DEFAULT 0; DECLARE colon_pos INT; 
DECLARE next_dash_pos INT; DECLARE next_colon_pos INT; DECLARE next_comma_pos INT; 
SET gtid_set = GTID_NORMALIZE(gtid_set); SET colon_pos = LOCATE2(':', gtid_set, 1); 
WHILE colon_pos != LENGTH(gtid_set) + 1 DO SET next_dash_pos = LOCATE2('-', gtid_set, colon_pos + 1); 
SET next_colon_pos = LOCATE2(':', gtid_set, colon_pos + 1); SET next_comma_pos = LOCATE2(',', gtid_set, colon_pos + 1); 
IF next_dash_pos < next_colon_pos AND next_dash_pos < next_comma_pos 
THEN SET result = result + SUBSTR(gtid_set, next_dash_pos + 1, 
LEAST(next_colon_pos, next_comma_pos) - (next_dash_pos + 1)) - SUBSTR(gtid_set, colon_pos + 1, next_dash_pos - (colon_pos + 1)) + 1; 
ELSE SET result = result + 1; END IF; 
SET colon_pos = next_colon_pos; 
END WHILE; RETURN result; 
END$$
​
CREATE FUNCTION gr_applier_queue_length() 
RETURNS INT DETERMINISTIC 
BEGIN RETURN 
(SELECT sys.gtid_count( GTID_SUBTRACT( (SELECT Received_transaction_set 
                                        FROM performance_schema.replication_connection_status 
                                        WHERE Channel_name = 'group_replication_applier' ), (SELECT @@global.GTID_EXECUTED) ))); 
END$$
​
CREATE FUNCTION gr_member_in_primary_partition() 
RETURNS VARCHAR(3) DETERMINISTIC BEGIN RETURN (SELECT IF( MEMBER_STATE='ONLINE' AND ((
    SELECT COUNT() FROM performance_schema.replication_group_members WHERE MEMBER_STATE != 'ONLINE') >= ((
        SELECT COUNT() FROM performance_schema.replication_group_members)/2) = 0), 'YES', 'NO' ) 
                                               FROM performance_schema.replication_group_members 
                                               JOIN performance_schema.replication_group_member_stats USING(member_id)); 
END$$
​
CREATE VIEW gr_member_routing_candidate_status AS
    SELECT 
        sys.gr_member_in_primary_partition() AS viable_candidate,
        IF((SELECT 
                    (SELECT 
                                GROUP_CONCAT(variable_value)
                            FROM
                                performance_schema.global_variables
                            WHERE
                                variable_name IN ('read_only' , 'super_read_only')) != 'OFF,OFF'
                ),
            'YES',
            'NO') AS read_only,
        sys.gr_applier_queue_length() AS transactions_behind,
        Count_Transactions_in_queue AS 'transactions_to_cert'
    FROM
        performance_schema.replication_group_member_stats$$
​
DELIMITER ;

    MySQL8.0,配置腳本爲:

USE sys;
​
DELIMITER $$
​
CREATE FUNCTION IFZERO(a INT, b INT)
RETURNS INT
DETERMINISTIC
RETURN IF(a = 0, b, a)$$
​
CREATE FUNCTION LOCATE2(needle TEXT(10000), haystack TEXT(10000), offset INT)
RETURNS INT
DETERMINISTIC
RETURN IFZERO(LOCATE(needle, haystack, offset), LENGTH(haystack) + 1)$$
​
CREATE FUNCTION GTID_NORMALIZE(g TEXT(10000))
RETURNS TEXT(10000)
DETERMINISTIC
RETURN GTID_SUBTRACT(g, '')$$
​
CREATE FUNCTION GTID_COUNT(gtid_set TEXT(10000))
RETURNS INT
DETERMINISTIC
BEGIN
  DECLARE result BIGINT DEFAULT 0;
  DECLARE colon_pos INT;
  DECLARE next_dash_pos INT;
  DECLARE next_colon_pos INT;
  DECLARE next_comma_pos INT;
  SET gtid_set = GTID_NORMALIZE(gtid_set);
  SET colon_pos = LOCATE2(':', gtid_set, 1);
  WHILE colon_pos != LENGTH(gtid_set) + 1 DO
     SET next_dash_pos = LOCATE2('-', gtid_set, colon_pos + 1);
     SET next_colon_pos = LOCATE2(':', gtid_set, colon_pos + 1);
     SET next_comma_pos = LOCATE2(',', gtid_set, colon_pos + 1);
     IF next_dash_pos < next_colon_pos AND next_dash_pos < next_comma_pos THEN
       SET result = result +
         SUBSTR(gtid_set, next_dash_pos + 1,
                LEAST(next_colon_pos, next_comma_pos) - (next_dash_pos + 1)) -
         SUBSTR(gtid_set, colon_pos + 1, next_dash_pos - (colon_pos + 1)) + 1;
     ELSE
       SET result = result + 1;
     END IF;
     SET colon_pos = next_colon_pos;
  END WHILE;
  RETURN result;
END$$
​
CREATE FUNCTION gr_applier_queue_length()
RETURNS INT
DETERMINISTIC
BEGIN
  RETURN (SELECT sys.gtid_count( GTID_SUBTRACT( (SELECT
Received_transaction_set FROM performance_schema.replication_connection_status
WHERE Channel_name = 'group_replication_applier' ), (SELECT
@@global.GTID_EXECUTED) )));
END$$
​
CREATE FUNCTION gr_member_in_primary_partition()
RETURNS VARCHAR(3)
DETERMINISTIC
BEGIN
  RETURN (SELECT IF( MEMBER_STATE='ONLINE' AND ((SELECT COUNT(*) FROM
performance_schema.replication_group_members WHERE MEMBER_STATE != 'ONLINE') >=
((SELECT COUNT(*) FROM performance_schema.replication_group_members)/2) = 0),
'YES', 'NO' ) FROM performance_schema.replication_group_members JOIN
performance_schema.replication_group_member_stats USING(member_id) 
          where performance_schema.replication_group_members.member_host=@@hostname);
END$$
​
CREATE VIEW gr_member_routing_candidate_status AS
    SELECT 
        sys.gr_member_in_primary_partition() AS viable_candidate,
        IF((SELECT 
                    (SELECT 
                                GROUP_CONCAT(variable_value)
                            FROM
                                performance_schema.global_variables
                            WHERE
                                variable_name IN ('read_only' , 'super_read_only')) != 'OFF,OFF'
                ),
            'YES',
            'NO') AS read_only,
        sys.gr_applier_queue_length() AS transactions_behind,
        Count_Transactions_in_queue AS 'transactions_to_cert'
    FROM
        performance_schema.replication_group_member_stats a
            JOIN
        performance_schema.replication_group_members b ON a.member_id = b.member_id
    WHERE
        b.member_host IN (SELECT 
                variable_value
            FROM
                performance_schema.global_variables
            WHERE
                variable_name = 'hostname')$$
​
DELIMITER ;
相關文章
相關標籤/搜索