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:包含從代理的內部功能收集的運行時指標。
示例度量標準包括每一個查詢規則匹配的次數,當前運行的查詢等。sqlmonitor:包含與ProxySQL鏈接的後端服務器相關的監控指標。
示例度量標準包括鏈接到後端服務器或對其進行ping操做的最短和最長時間。數據庫myhgm:僅在調試版本中啓用
此外,使用這兩種類型的用戶使用這些默認憑據訪問管理數據庫:user:admin / password:admin - 具備對全部表的讀寫訪問權限
user:stats / password:stats - 具備對統計表的只讀訪問權限。 這用於從ProxySQL中提取指標,而不會暴露太多的數據庫
上述的訪問憑據,可經過變量admin-admin_credentials和admin-stats_credentials進行配置。
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。
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。
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。
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。
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進行全部鏈接並提升系統的安全性。
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裏的配置相同
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- 自由格式文本字段,可用於查詢規則的描述性註釋
username - 與用戶名匹配的過濾條件,只有在使用正確的用戶名創建鏈接時,查詢纔會匹配
schemaname - 匹配schemaname的過濾條件,只有當鏈接使用schemaname做爲默認模式時,查詢纔會匹配(在mariadb / mysql schemaname中,這至關於databasename)
flagIN - 與mysql_query_rules中flagin相同,並與mysql_query_rules表中指定的flagout / apply相關聯
destination_hostgroup - 將匹配的查詢路由到此主機組。
comment- 自由格式文本字段,可用於查詢規則的描述性註釋
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當前節點的驗證隊列,積壓事務數
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 ;
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 ;