ProxySQL 常見表配置


ProxySQL 常見表配置

[root@mgr1 opt]# rpm -ivh proxysql-1.4.14-1.1.el6.x86_64.rpm 
warning: proxysql-1.4.14-1.1.el6.x86_64.rpm: Header V4 RSA/SHA256 Signature, key ID 8507efa5: NOKEY
Preparing...                ########################################### [100%]
   1:proxysql               ########################################### [100%]
ProxySQL默認配置文件為/etc/proxysql.cnf,只在第一次啟動的時候有用,后續的所有配置都是通過對SQLite數據庫的操作,並且不會更新到proxysql中,而是存儲在/var/lib/proxysql/proxysql.db中
[root@mgr1 opt]# proxysql --version ##版本查詢
ProxySQL version 1.4.14-percona-1.1, codename Truls
[root@mgr1 opt]# rpm -ql proxysql  ##查看具體安裝內容
/etc/init.d/proxysql               ##啟動腳本
/etc/logrotate.d/proxysql-logrotate
/etc/proxysql-admin.cnf             ##配置文件
/etc/proxysql.cnf                   ##默認配置文件
/usr/bin/proxysql                   ##執行文件
/usr/bin/proxysql-admin
/usr/bin/proxysql-status
/usr/bin/proxysql_galera_checker    ##ProxySQL調度程序檢查pxc_maint_mode參數狀態,持續檢測各個節點的狀態
/usr/bin/proxysql_node_monitor
/usr/share/doc/proxysql-1.4.14
/usr/share/doc/proxysql-1.4.14/LICENSE
/var/lib/proxysql
/var/run/proxysql
/var/lib/proxysql/proxysql.db   ##SQLite數據文件
/var/lib/proxysql/proxysql.log  ##日志文件
備注:如果存在proxysql.db數據文件,則ProxySQL啟動過程中將不會讀取proxysql.cnf配置文件的內容來初始化ProxySQL

登錄數據庫

[mysql@mgr1 ~]$ mysql -uadmin -padmin -h127.0.0.1 -P6032
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
(admin@127.0.0.1:6032) [(none)]> show databases;
+-----+---------------+-------------------------------------+
| seq | name          | file                                |
+-----+---------------+-------------------------------------+
| 0   | main          |                                     |
| 2   | disk          | /var/lib/proxysql/proxysql.db       |
| 3   | stats         |                                     |
| 4   | monitor       |                                     |
| 5   | stats_history | /var/lib/proxysql/proxysql_stats.db |
+-----+---------------+-------------------------------------+

內置庫
main:默認數據庫名,用於存放后端db實例、用戶認證、路由規則等信息。
           表名以runtime開頭的表示proxysql當前運行的配置內容,不能通過dml語句修改。
           只能修改對應的不以runtime開頭的(在內存)里的表,然后LOAD使其生效,SAVE使其存到硬盤以供下次重啟加載。
disk:是持久化到硬盤的配置,sqlite數據文件。
stats:是proxysql運行抓取的統計信息,包括到后端各命令的執行次數、流量、processlist、查詢各類匯總、執行時間等。
monitor:庫存儲monitor模塊收集的信息,主要是對后端db的健康、延遲檢查。

main庫
runtime_表

(admin@127.0.0.1:6032) [(none)]> use main
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
(admin@127.0.0.1:6032) [main]> show tables;
+--------------------------------------------+
| tables                                     |
+--------------------------------------------+
| global_variables                           |
| mysql_collations                           |
| mysql_group_replication_hostgroups         |
| mysql_query_rules                          |
| mysql_query_rules_fast_routing             |
| mysql_replication_hostgroups               |
| mysql_servers                              |
| mysql_users                                |
| proxysql_servers                           |
| runtime_checksums_values                   |
| runtime_global_variables                   |
| runtime_mysql_group_replication_hostgroups |
| runtime_mysql_query_rules                  |
| runtime_mysql_query_rules_fast_routing     |
| runtime_mysql_replication_hostgroups       |
| runtime_mysql_servers                      |
| runtime_mysql_users                        |
| runtime_proxysql_servers                   |
| runtime_scheduler                          |
| scheduler                                  |
+--------------------------------------------+
20 rows in set (0.00 sec)
runtime_global_variables:global_variables的運行時版本
runtime_mysql_group_replication_hostgroups:mysql_group_replication_hostgroups的運行時版本
runtime_mysql_query_rules:mysql_query_rules的運行時版本
runtime_mysql_replication_hostgroups:mysql_replication_hostsgroups的運行時版本
runtime_mysql_servers:mysql_servers的運行時版本
runtime_mysql_users:mysql_users的運行時版本
runtime_scheduler:scheduler調度程序的運行時版本
CREATE TABLE runtime_checksums_values (
    name VARCHAR NOT NULL,
    version INT NOT NULL,
    epoch INT NOT NULL,
    checksum VARCHAR NOT NULL,
    PRIMARY KEY (name))

內置參數表,參考下文
mysql_servers表

(admin@127.0.0.1:6032) [main]> show create table mysql_servers\G
*************************** 1. row ***************************
       table: mysql_servers
Create Table: CREATE TABLE mysql_servers (
    hostgroup_id INT CHECK (hostgroup_id>=0) NOT NULL DEFAULT 0,
    hostname VARCHAR NOT NULL,
    port INT NOT NULL DEFAULT 3306,
    status VARCHAR CHECK (UPPER(status) IN ('ONLINE','SHUNNED','OFFLINE_SOFT', 'OFFLINE_HARD')) NOT NULL DEFAULT 'ONLINE',
    weight INT CHECK (weight >= 0) NOT NULL DEFAULT 1,
    compression INT CHECK (compression >=0 AND compression <= 102400) NOT NULL DEFAULT 0,
    max_connections INT CHECK (max_connections >=0) NOT NULL DEFAULT 1000,
    max_replication_lag INT CHECK (max_replication_lag >= 0 AND max_replication_lag <= 126144000) NOT NULL DEFAULT 0,
    use_ssl INT CHECK (use_ssl IN(0,1)) NOT NULL DEFAULT 0,
    max_latency_ms INT UNSIGNED CHECK (max_latency_ms>=0) NOT NULL DEFAULT 0,
    comment VARCHAR NOT NULL DEFAULT '',
    PRIMARY KEY (hostgroup_id, hostname, port) )
1 row in set (0.00 sec)
	hostgroup_id:ProxySQL通過hostgroup的形式組織后端db實例,一個hostgroup代表同屬於一個角色。
	表的主鍵是(hostgroup_id, hostname, port),以hostname:port在多個hostgroup中存在。
	一個hostgroup可以有多個實例,即是多個從庫,可能通過weight分配權重。
	hostgroup_id 0是一個特殊的hostgroup,路由查詢的時候,沒有匹配到規則則默認選擇hostgroup 0
status:
ONLINE:當前后端實例狀態正常。
SHUNNED:臨時被剔除,可能因為后端too many connection error,或者超過了max_replication_lag。
OFFLINE_SOFT:軟離線狀態,不再接受新的連接,但已建立的連接會等待活躍事務完成。
OFFLINE_HARD:硬離線狀態,不再接受新的連接,已建立的連接或被強制中斷,當后端實例宕機或網絡不可達,會出現。
weight :權重,默認為1
max_connections:允許連接到該后端實例的最大連接數,不要大於MySQL的max_connections。
如果后端實例hostname:port在多個hostgroup里,以較大者為准,而不是各自獨立允許的最大連接數。
max_replication_lag:允許的最大延遲,主庫不受影響,默認為0,如果>0,monitor模塊監控主從延遲大於閾值時,會臨時把它的狀態變更為SHUNNED。
max_latency_ms:mysql_ping響應時間,大於這個閾值會把它從連接池剔除,即使是ONLINE。
comment:備注,不建設為空。

mysql_uses表

(admin@127.0.0.1:6032) [main]> show create table mysql_users\G
*************************** 1. row ***************************
       table: mysql_users
Create Table: CREATE TABLE mysql_users (
    username VARCHAR NOT NULL,
    password VARCHAR,
    active INT CHECK (active IN (0,1)) NOT NULL DEFAULT 1,
    use_ssl INT CHECK (use_ssl IN (0,1)) NOT NULL DEFAULT 0,
    default_hostgroup INT NOT NULL DEFAULT 0,
    default_schema VARCHAR,
    schema_locked INT CHECK (schema_locked IN (0,1)) NOT NULL DEFAULT 0,
    transaction_persistent INT CHECK (transaction_persistent IN (0,1)) NOT NULL DEFAULT 1,
    fast_forward INT CHECK (fast_forward IN (0,1)) NOT NULL DEFAULT 0,
    backend INT CHECK (backend IN (0,1)) NOT NULL DEFAULT 1,
    frontend INT CHECK (frontend IN (0,1)) NOT NULL DEFAULT 1,
    max_connections INT CHECK (max_connections >=0) NOT NULL DEFAULT 10000,
    PRIMARY KEY (username, backend),
    UNIQUE (username, frontend))
1 row in set (0.00 sec)
username,password:連接到后端MySQL或ProxySQL實例的憑證,參考密碼管理。
     密碼可插入明文,也可通過PASSWORD()插入密文,proxysql以*開頭判斷插入是否是密文。
     但是runtime_mysql_users里統一是密文,所以明文插入,再SAVE MYSQL USERS TO MEM,此時看到的也是HASH密文。
active:是否生效該用戶,active=0的用戶將在數據庫中被跟蹤,但不會加載到內存中的數據結構中。
default_hostgroup:這個用戶的請求沒有匹配到規則時,默認發到hostgroup,默認0。
default_schema:這個用戶連接時沒有指定schema時,默認使用的schema。
    默認為NULL,實際上受變量mysql-default_schema的影響,默認為information_schema。
transaction_persistent: 如果設置為1,連接上ProxySQL的會話后,如果在一個hostgroup上開啟了事務,那么后續的sql都繼續維持在這個hostgroup上,不論是否會匹配上其它路由規則,直到事務結束。
frontend:如果設置為1,則用戶名、密碼對ProxySQL進行身份驗證。
backend:如果設置為1,則用戶名、密碼根據任何主機組向mysqld服務器進行身份驗證。
  注意,目前所有用戶都需要將“前端”和“后端“都設置為1,未來版本的ProxySQL將分離前端和后端之間的crendentials。
  以這種方式,前端將永遠不會知道直接連接到后端的憑據,強制所有通過ProxySQL的連接並增加系統的安全性。

mysql_replication_hostgroups 表

(admin@127.0.0.1:6032) [main]> show create table mysql_replication_hostgroups\G
*************************** 1. row ***************************
       table: mysql_replication_hostgroups
Create Table: CREATE TABLE mysql_replication_hostgroups (
    writer_hostgroup INT CHECK (writer_hostgroup>=0) NOT NULL PRIMARY KEY,
    reader_hostgroup INT NOT NULL CHECK (reader_hostgroup<>writer_hostgroup AND reader_hostgroup>0),
    comment VARCHAR NOT NULL DEFAULT '', UNIQUE (reader_hostgroup))
1 row in set (0.00 sec)
定義hostgroup的主從關系。ProxySQL monitor模塊會監控hostgroup后端所有servers的read_only變量,如果發現從庫的read_only變為0、主庫變為1,則認為角色互換了,
自動改寫mysql_servers表里面hostgroup關系,達到failover效果。

mysql_query_rules查詢規則表

(admin@127.0.0.1:6032) [main]> show create table mysql_query_rules\G 
*************************** 1. row ***************************
       table: mysql_query_rules
Create Table: CREATE TABLE mysql_query_rules (
    rule_id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
    active INT CHECK (active IN (0,1)) NOT NULL DEFAULT 0,
    username VARCHAR,
    schemaname VARCHAR,
    flagIN INT NOT NULL DEFAULT 0,
    client_addr VARCHAR,
    proxy_addr VARCHAR,
    proxy_port INT,
    digest VARCHAR,
    match_digest VARCHAR,
    match_pattern VARCHAR,
    negate_match_pattern INT CHECK (negate_match_pattern IN (0,1)) NOT NULL DEFAULT 0,
    re_modifiers VARCHAR DEFAULT 'CASELESS',
    flagOUT INT,
    replace_pattern VARCHAR,
    destination_hostgroup INT DEFAULT NULL,
    cache_ttl INT CHECK(cache_ttl > 0),
    reconnect INT CHECK (reconnect IN (0,1)) DEFAULT NULL,
    timeout INT UNSIGNED,
    retries INT CHECK (retries>=0 AND retries <=1000),
    delay INT UNSIGNED,
    next_query_flagIN INT UNSIGNED,
    mirror_flagOUT INT UNSIGNED,
    mirror_hostgroup INT UNSIGNED,
    error_msg VARCHAR,
    OK_msg VARCHAR,
    sticky_conn INT CHECK (sticky_conn IN (0,1)),
    multiplex INT CHECK (multiplex IN (0,1,2)),
    log INT CHECK (log IN (0,1)),
    apply INT CHECK(apply IN (0,1)) NOT NULL DEFAULT 0,
    comment VARCHAR)
1 row in set (0.00 sec)
rule_id:表主鍵,自增,規則處理是以rule_id為順序進行。
active:只有active=1時的規則才會參與匹配。
username:過濾匹配用戶名的條件,如果是非空值,則僅當連接使用正確的用戶名時,查詢才匹配。
schemaname:匹配schemaname的過濾條件,如果是非空值,則僅當連接schemaname用作默認模式時,查詢才匹配。
flagIN,flagOUT,apply:用來定義路由鏈chains of rules
	首先會檢查flagIN=0的規則,以rule_id的順序;如果沒有匹配上,則走這個用戶的default_hostgroup。
	當匹配一條規則后,會檢查flagOUT。
	如果不為NULL,並且flagIN!=flagOUT,則進入以flagIN為上一個flagOUT值的新規則鏈。
	如果不為NULL,並且flagIN=flagOUT,則應用這條規則。
	如果為NULL,或者apply=1,則結束,應用這條規則。
	如果最終沒有匹配到,則找到這個用戶的default_hostgroup。
client_addr:匹配客戶端來源IP。
proxy_addr,proxy_port:匹配本地proxysql的ip、端口。
digest:精確匹配的查詢。
match_digest:正則匹配查詢。query,digest是指對查詢去掉具體值后進行”模糊化“后的查詢,類似pt-query-digest的效果。
match_pattern:正則匹配查詢。
	以上都是匹配查詢的規則,1.4版本可以通過變量mysql-query_processor_regex設置,支持RE2和PCRE,1.4版本開始默認為PCRE。
negate_match_pattern:反向匹配,相當於對match_digest/match_pattern的匹配取反。
re_modifiers:修改正則匹配的參數,比如默認的:忽略大小寫CASELESS、禁用GLOBAL。
下面是匹配后的行為:
replace_pattern:查詢重寫,默認為空。
destination_hostgroup:路由查詢到這個hostgroup,當然如果用戶顯式start transaction且transaction_persistent=1,那么即使匹配到了,也依然按照事務里第一條sql的路由規則去走的。
cache_ttl:查詢結果緩存的毫秒數。
timeout:這一類查詢執行的的最大時間(毫秒),超時則自動kill。
	這是對后端DB的保護機制,相當於阿里雲RDS的loose_max_statement_time變量的功能,但不同的是,阿里雲這個變量的時間時不包括DML操作出現InnoDB行鎖等待的時間,
	而ProxySQL的這個timeout是計算從發送sql到等待響應的時間。默認mysql-default_query_timeout是10h。
retries:語句在執行失敗時,重試次數。默認由mysql-query_retries_on_failure變量指定,為1。建議不要重試,有風險。
delay:查詢延遲執行,這是ProxySQL提供的限流機制,會讓其它的查詢優先執行。
	默認值mysql-default_query_delay為0。
mirror_flagOUT,mirror_hostgroup:與鏡像相關的設置。
error_msg:默認為NULL,如果指定了則這個查詢直接被block掉,將error_msg返回給客戶端。
multiplex:連接是否利用,請參考文章。
log:是否記錄查詢日志,可以看到log是否記錄的對象是根據規則。
	要開啟日志記錄,需要設置變量mysql-eventslog_filename來指定文件名,然后這個log標記為1。但是目前proxysql記錄的日志是二進制格式,需要特定的工具才能讀取:
eventslog_reader_sample。這個工具在源碼目錄 tools下面。

 scheduler調度表

(admin@127.0.0.1:6032) [main]> show create table scheduler\G
*************************** 1. row ***************************
       table: scheduler
Create Table: CREATE TABLE scheduler (
    id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
    active INT CHECK (active IN (0,1)) NOT NULL DEFAULT 1,
    interval_ms INTEGER CHECK (interval_ms>=100 AND interval_ms<=100000000) NOT NULL,
    filename VARCHAR NOT NULL,
    arg1 VARCHAR,
    arg2 VARCHAR,
    arg3 VARCHAR,
    arg4 VARCHAR,
    arg5 VARCHAR,
    comment VARCHAR NOT NULL DEFAULT '')
1 row in set (0.00 sec)
id:調度程序作業的唯一標識符。
active:如果設置為1,則作業處於活動狀態。
interval_ms:工作的開始頻率(以毫秒為單位),最小interval_ms為100毫秒。
filename:可執行文件的完整路徑。
arg1-arg5:傳遞作業的參數。最多5個。
comment:注釋。

disk庫

(admin@127.0.0.1:6032) [main]> show tables from disk;
+------------------------------------+
| tables                             |
+------------------------------------+
| global_variables                   |
| mysql_collations                   |
| mysql_group_replication_hostgroups |
| mysql_query_rules                  |
| mysql_query_rules_fast_routing     |
| mysql_replication_hostgroups       |
| mysql_servers                      |
| mysql_users                        |
| proxysql_servers                   |
| scheduler                          |
+------------------------------------+
10 rows in set (0.00 sec)
##具體的表介紹和main庫一致

stats庫

(admin@127.0.0.1:6032) [main]> show tables from stats;
+--------------------------------------+
| tables                               |
+--------------------------------------+
| global_variables                     |
| stats_memory_metrics                 |
| stats_mysql_commands_counters        |
| stats_mysql_connection_pool          |
| stats_mysql_connection_pool_reset    |
| stats_mysql_global                   |
| stats_mysql_prepared_statements_info |
| stats_mysql_processlist              |
| stats_mysql_query_digest             |
| stats_mysql_query_digest_reset       |
| stats_mysql_query_rules              |
| stats_mysql_users                    |
| stats_proxysql_servers_checksums     |
| stats_proxysql_servers_metrics       |
| stats_proxysql_servers_status        |
+--------------------------------------+
15 rows in set (0.00 sec)

stats_mysql_commands_counters表

(admin@127.0.0.1:6032) [stats]> show create table stats.stats_mysql_commands_counters\G
*************************** 1. row ***************************
       table: stats_mysql_commands_counters
Create Table: CREATE TABLE stats_mysql_commands_counters (
    Command VARCHAR NOT NULL PRIMARY KEY,
    Total_Time_us INT NOT NULL,
    Total_cnt INT NOT NULL,
    cnt_100us INT NOT NULL,
    cnt_500us INT NOT NULL,
    cnt_1ms INT NOT NULL,
    cnt_5ms INT NOT NULL,
    cnt_10ms INT NOT NULL,
    cnt_50ms INT NOT NULL,
    cnt_100ms INT NOT NULL,
    cnt_500ms INT NOT NULL,
    cnt_1s INT NOT NULL,
    cnt_5s INT NOT NULL,
    cnt_10s INT NOT NULL,
    cnt_INFs)
1 row in set (0.00 sec)
command:已執行的SQL命令的類型,如FLUSH、INSERT、KILL、SELECT FOR UPDATE等。
Total_Time_us:執行該類型命令的總時間(以毫秒為單位)。
Total_cnt:執行該類型的命令的總數。
cnt_100us-cnt_INFs:在指定的時間限制內執行的給定類型的命令總數和前一個命令的總數。

stats_mysql_connection_pool表

(admin@127.0.0.1:6032) [stats]> show create table stats.stats_mysql_connection_pool \G 
*************************** 1. row ***************************
       table: stats_mysql_connection_pool
Create Table: CREATE TABLE stats_mysql_connection_pool (
    hostgroup INT,
    srv_host VARCHAR,
    srv_port INT,
    status VARCHAR,
    ConnUsed INT,
    ConnFree INT,
    ConnOK INT,
    ConnERR INT,
    Queries INT,
    Bytes_data_sent INT,
    Bytes_data_recv INT,
    Latency_us INT)
1 row in set (0.84 sec)
hostgroup:后端服務器所屬的主機組,單個后端服務器可以屬於多個主機組。
srv_host,srv_port:mysqld后端服務器正在偵聽連接的TCP端點的IP和Port。
status:后端服務器的狀態。可以有ONLINE,SHUNNED,OFFLINE_SOFT,OFFLINE_HARD。
ConnUsed:ProxySQL當前使用多少個連接來向后端服務器發送查詢。
ConnFree:目前有多少個連接是空閑。
ConnOK:成功建立了多少個連接。
ConnERR:沒有成功建立多少個連接。
Queries:路由到此特定后端服務器的查詢數。
Bytes_data_sent:發送到后端的數據量。
Bytes_data_recv:從后端接收的數據量。
Latency_ms:從Monitor報告的當前ping以毫秒為單位的延遲時間。

stats_mysql_global表

(admin@127.0.0.1:6032) [stats]> show create table stats.stats_mysql_global\G 
*************************** 1. row ***************************
       table: stats_mysql_global
Create Table: CREATE TABLE stats_mysql_global (
    Variable_Name VARCHAR NOT NULL PRIMARY KEY,
    Variable_Value VARCHAR NOT NULL)
1 row in set (0.09 sec)
Variable_Name:代表與MySQL相關的代理級別的全局統計
如Client_Connections_aborted:由於無效憑據或max_connections而導致的前端連接數已達到;
如Client_Connections_connected:當前連接的前端連接數。
如Client_Connections_created:到目前為止創建的前端連接數。等等。

stats_mysql_processlist表

(admin@127.0.0.1:6032) [stats]> show create table stats.stats_mysql_processlist\G
*************************** 1. row ***************************
       table: stats_mysql_processlist
Create Table: CREATE TABLE stats_mysql_processlist (
    ThreadID INT NOT NULL,
    SessionID INTEGER PRIMARY KEY,
    user VARCHAR,
    db VARCHAR,
    cli_host VARCHAR,
    cli_port INT,
    hostgroup INT,
    l_srv_host VARCHAR,
    l_srv_port INT,
    srv_host VARCHAR,
    srv_port INT,
    command VARCHAR,
    time_ms INT NOT NULL,
    info VARCHAR)
1 row in set (0.00 sec)
ThreadID:ProxySQL線程的內部ID。
SessionID:ProxySQL會話ID,通過這個ID可以進行kill操作。
user:與MySQL客戶端連接到ProxySQL的用戶。
db:當前選擇的數據庫。
cli_host,cli_port:連接ProxySQL的IP和TCP端口。
hostgroup:當前主機組。如果正在處理查詢,則是查詢已被路由或將要路由的主機組,或默認主機組。可以通過這個查看該SQL到底是到哪個HG里。
l_srv_host,l_srv_port:ProxySQL的IP和TCP端口。
srv_host,srv_port:后端MySQL服務器的IP和端口。
command:正在執行的MySQL查詢的類型。
time_ms:命令執行的時間(以毫秒為單位)。
info:正在執行的SQL。

stats_mysql_query_digest表

(admin@127.0.0.1:6032) [stats]> show create table stats.stats_mysql_query_digest\G
*************************** 1. row ***************************
       table: stats_mysql_query_digest
Create Table: CREATE TABLE stats_mysql_query_digest (
    hostgroup INT,
    schemaname VARCHAR NOT NULL,
    username VARCHAR NOT NULL,
    digest VARCHAR NOT NULL,
    digest_text VARCHAR NOT NULL,
    count_star INTEGER NOT NULL,
    first_seen INTEGER NOT NULL,
    last_seen INTEGER NOT NULL,
    sum_time INTEGER NOT NULL,
    min_time INTEGER NOT NULL,
    max_time INTEGER NOT NULL,
    PRIMARY KEY(hostgroup, schemaname, username, digest))
1 row in set (0.06 sec)
hostgroup:發送查詢的主機組。值-1表示查詢查詢緩存。
schemaname:查詢的數據庫。
user:連接ProxySQL的用戶名。
digest:一個十六進制散列,表示其參數剝離的SQL。
digest_text:參數剝離的實際SQL文本
count_star:執行查詢的總次數(參數的值不同)。
first_seen:unix時間戳,是通過代理路由查詢的第一時刻。
last_seen:unix時間戳,當查詢通過代理路由時的最后一刻(到目前為止)。
sum_time:執行此類查詢的總時間(以微秒為單位)。
這對於確定應用程序工作負載中花費的最多時間在哪里是非常有用的,並為改進的地方提供了一個良好的起點。
min_time,max_time - 執行此類查詢時期望的持續時間范圍。
min_time是到目前為止所看到的最小執行時間,而max_time表示最大執行時間,以微秒為單位。

stats_mysql_query_rules表

(admin@127.0.0.1:6032) [stats]> show create table stats.stats_mysql_query_rules\G 
*************************** 1. row ***************************
       table: stats_mysql_query_rules
Create Table: CREATE TABLE stats_mysql_query_rules (
    rule_id INTEGER PRIMARY KEY,
    hits INT NOT NULL)
1 row in set (0.00 sec)
rule_id:路由規則的ID與main.mysql_query_rules的id對應。
hits:此路由規則的匹配總數。 如果當前傳入的查詢符合規則,則會記錄一次命中。

monitor庫
對后端MySQL的健康檢查,由變量mysql-monitor_enabled來確定是否開啟Monitor模塊。

(admin@127.0.0.1:6032) [stats]> show tables from monitor;
+------------------------------------+
| tables                             |
+------------------------------------+
| mysql_server_connect_log           |
| mysql_server_group_replication_log |
| mysql_server_ping_log              |
| mysql_server_read_only_log         |
| mysql_server_replication_lag_log   |
+------------------------------------+
5 rows in set (0.04 sec)

mysql_server_connect/mysql_server_connect_log表
連接到所有MySQL服務器以檢查它們是否可用,該表用來存放檢測連接的日志。由變量mysql-monitor_connect_interval來控制其檢測的時間間隔,
由參數mysql-monitor_connect_timeout控制連接是否超時(默認200毫秒)。

mysql_server_ping/mysql_server_ping_log表
使用mysql_ping API ping后端MySQL服務器檢查它們是否可用,該表用來存放ping的日志。由變量mysql-monitor_ping_interval控制ping的時間間隔,默認值:10000(毫秒,相當於10秒)

mysql_server_replication_lag_log表
后端MySQL服務主從延遲的檢測。由參數mysql-monitor_replication_lag_interval控制檢測間隔時間, 如果復制滯后太大,可以暫時關閉從。
由mysql_servers.max_replication_lag列控制。默認值:10000(毫秒,相當於10秒)。

內置參數
global_variables 1.4.14版本中有128個參數,參數較多,解釋請參考文檔
(admin@127.0.0.1:6032) [monitor]> show variables;

ProxySQL多層配置設計
ProxySQL設計模型介紹
ProxySQL使用多層配置系統,適合滿足以下需求:

允許自動更新配置,與MySQL兼容管理界面;
允許在線修改配置,不用重啟ProxySQL;
允許回滾配置;
多層配置系統的實現,如下圖:

+-------------------------+
|         RUNTIME         |
+-------------------------+
       /|\          |
        |           |
    [1] |       [2] |
        |          \|/
+-------------------------+
|         MEMORY          |
+-------------------------+ _
       /|\          |      |\
        |           |        \
    [3] |       [4] |         \ [5]
        |          \|/         \
+-------------------------+  +-------------------------+
|          DISK           |  |       CONFIG FILE       |
+-------------------------+  +-------------------------+

RUNTIME代表ProxySQL當前生效的配置,包括global_variables、mysql_servers、mysql_users、mysql_query_rules。無法直接修改這里的配置,必須要從下一層load過來。

MEMORY(main)代表平時在mysql命令行修改的main里的配置,可以認為是SQLite數據庫在內存的鏡像。可修改以下:

mysql_server 后端服務器列表
mysql_users 連接到ProxySQL的用戶列表及其憑據
mysql_query_rules 將流量路由到不同的后端服務器的規則列表
global_variables 全局變量列表
mysql_collat MySQL排序規則列表
DISK和CONFIG FILE表示磁盤上SQLite數據庫,默認位置在$datadir/proxysql.db,在重新啟動過程中,內存中未被保存的配置將丟失。
/etc/proxysql.cnf文件只在第一次初始化的時候用到。如要修改端口,還是需要在管理命令行里修改,再save到磁盤。

ProxySQL多層配置修改示例
mysql users

LOAD MYSQL USERS TO RUNTIME / LOAD MYSQL USERS FROM MEMORY
SAVE MYSQL USERS TO MEMORY / SAVE MYSQL USERS FROM RUNTIME
LOAD MYSQL USERS TO MEMORY / LOAD MYSQL USERS FROM DISK
SAVE MYSQL USERS TO DISK /  SAVE MYSQL USERS FROM MEMORY
LOAD MYSQL USERS FROM CONFIG
mysql servers

LOAD MYSQL SERVERS TO RUNTIME   讓修改的配置生效
SAVE MYSQL SERVERS TO MEMORY
LOAD MYSQL SERVERS TO MEMORY
SAVE MYSQL SERVERS TO DISK      將修改的配置持久化
LOAD MYSQL SERVERS FROM CONFIG
mysql query rules

load mysql query rules to run
save mysql query rules to mem
load mysql query rules to mem
save mysql query rules to disk
load mysql query rules from config
mysql variables

load mysql variables to runtime
save mysql variables to memory
load mysql variables to memory
save mysql variables to disk
load mysql variables from config
admin variables

load admin variables to runtime
save admin variables to memory
load admin variables to memory
save admin variables to disk
load admin variables from config

ProxySQL讀寫分離示例

添加后端DB服務

(admin@127.0.0.1:6032) [main]> insert into mysql_servers(hostgroup_id,hostname,port,weight,comment) values (100,'10.15.7.29',3306,1,'db0,ReadWrite');

添加訪問用戶
登錄Master主庫設置監控用戶和程序用戶(由於是測試使用,權限較大,主機允許所有):

> create user 'monitor'@'%' identified by 'monitor';
> grant select,super,process,show databases,replication client,replication slave on *.* to 'monitor'@'%';
> create user 'user0'@'%' identified by 'password0';
> GRANT SELECT, RELOAD, PROCESS, SHOW DATABASES, SUPER, LOCK TABLES, EXECUTE, SHOW VIEW, TRIGGER, EVENT ON *.* TO 'read0'@'%';

登錄ProxySQL管理端設置

> INSERT INTO mysql_users (username, password, active, default_hostgroup, max_connections) VALUES ('user0', 'password0', 1, 100, 1000);

添加復制關系
登錄ProxySQL管理端設置

> INSERT INTO mysql_replication_hostgroups VALUES(100,101,'db0');
> load mysql variables to runtime;
> save mysql variables to disk;
> SELECT * FROM monitor.mysql_server_read_only_log ORDER BY time_start_us DESC LIMIT 10;

修改全局變量
登錄ProxySQL管理端設置

> set mysql-query_retries_on_failure=0;
> set mysql-max_stmts_per_connection=1000;
> set mysql-eventslog_filename='queries.log';
> set mysql-monitor_slave_lag_when_null=7200;
> set mysql-ping_timeout_server=1500;
> set mysql-monitor_connect_timeout=1000;
> set mysql-default_max_latency_ms=2000;
> set mysql-monitor_username='monitor';
> set mysql-monitor_password='monitor';
> set mysql-server_version='5.7.27';

全局變量生效並保存到磁盤:
登錄ProxySQL管理端設置:

> load mysql users to runtime;
> load mysql servers to runtime;
> load mysql variables to runtime;
> save mysql users to disk;
> save mysql servers to disk;
> save mysql variables to disk;
> save mysql users to mem;  -- 可以屏蔽看到的明文密碼

路由規則
ProxySQL使用查詢規則來確定路由,如果沒有規則用於查詢,默認會訪問hostgroup 0主機組,會報以下錯誤

[root@mysql_slave ~]# mysql -uuser0 -ppassword0 -h 127.0.0.1 -P6033 -e “SELECT 1”
mysql: [Warning] Using a password on the command line interface can be insecure.
ERROR 9001 (HY000) at line 1: Max connect timeout reached while reaching hostgroup 1 after 2000ms

設置路由規則:

> use main;
> INSERT INTO mysql_query_rules (active, match_pattern, destination_hostgroup, cache_ttl) VALUES (1, '^.*', 101, NULL);
> INSERT INTO mysql_query_rules (active, match_pattern, destination_hostgroup, cache_ttl) VALUES (1, '^SELECT .* FOR UPDATE', 100, NULL);
> INSERT INTO mysql_query_rules (active, match_pattern, destination_hostgroup, cache_ttl) VALUES (1, '^SELECT .*', 101, NULL);
> load mysql query rules to run;
> save mysql query rules to disk;

常用查詢
查詢連接日志

(admin@127.0.0.1:6032) [main]> SELECT * FROM monitor.mysql_server_connect_log ORDER BY time_start_us DESC LIMIT 10;
+------------+------+------------------+-------------------------+---------------+
| hostname   | port | time_start_us    | connect_success_time_us | connect_error |
+------------+------+------------------+-------------------------+---------------+
| 10.15.7.29 | 3306 | 1565147207491345 | 1788                    | NULL          |
| 10.15.7.27 | 3306 | 1565147206844358 | 2356                    | NULL          |
| 10.15.7.28 | 3306 | 1565147206197450 | 1153                    | NULL          |
| 10.15.7.28 | 3306 | 1565147147638727 | 39869                   | NULL          |
| 10.15.7.29 | 3306 | 1565147146917152 | 1191                    | NULL          |
| 10.15.7.27 | 3306 | 1565147146195486 | 21771                   | NULL          |
| 10.15.7.27 | 3306 | 1565147087459233 | 1947                    | NULL          |
| 10.15.7.29 | 3306 | 1565147086827078 | 1496                    | NULL          |
| 10.15.7.28 | 3306 | 1565147086194835 | 1285                    | NULL          |
| 10.15.7.27 | 3306 | 1565147027405905 | 1330                    | NULL          |
+------------+------+------------------+-------------------------+---------------+

查詢ping日志

(admin@127.0.0.1:6032) [main]> SELECT * FROM monitor.mysql_server_ping_log ORDER BY time_start_us DESC LIMIT 10;
+------------+------+------------------+----------------------+------------+
| hostname   | port | time_start_us    | ping_success_time_us | ping_error |
+------------+------+------------------+----------------------+------------+
| 10.15.7.27 | 3306 | 1565147226243086 | 537                  | NULL       |
| 10.15.7.29 | 3306 | 1565147226160895 | 697                  | NULL       |
| 10.15.7.28 | 3306 | 1565147226082449 | 738                  | NULL       |
| 10.15.7.29 | 3306 | 1565147216308009 | 545                  | NULL       |
| 10.15.7.28 | 3306 | 1565147216195185 | 32975                | NULL       |
| 10.15.7.27 | 3306 | 1565147216082403 | 601                  | NULL       |
| 10.15.7.27 | 3306 | 1565147206248282 | 414                  | NULL       |
| 10.15.7.28 | 3306 | 1565147206163814 | 425                  | NULL       |
| 10.15.7.29 | 3306 | 1565147206082325 | 549                  | NULL       |
| 10.15.7.29 | 3306 | 1565147196274601 | 581                  | NULL       |
+------------+------+------------------+----------------------+------------+
10 rows in set (0.00 sec)

查詢后端DB狀態

(admin@127.0.0.1:6032) [main]> SELECT * FROM mysql_servers;
+--------------+------------+------+--------+--------+-------------+-----------------+---------------------+---------+----------------+---------+
| hostgroup_id | hostname   | port | status | weight | compression | max_connections | max_replication_lag | use_ssl | max_latency_ms | comment |
+--------------+------------+------+--------+--------+-------------+-----------------+---------------------+---------+----------------+---------+
| 1            | 10.15.7.27 | 3306 | ONLINE | 1      | 0           | 1000            | 0                   | 0       | 0              |         |
| 2            | 10.15.7.27 | 3306 | ONLINE | 1      | 0           | 1000            | 0                   | 0       | 0              |         |
| 2            | 10.15.7.28 | 3306 | ONLINE | 1      | 0           | 1000            | 0                   | 0       | 0              |         |
| 1            | 10.15.7.29 | 3306 | ONLINE | 1      | 0           | 1000            | 0                   | 0       | 0              |         |
| 1            | 10.15.7.28 | 3306 | ONLINE | 1      | 0           | 1000            | 0                   | 0       | 0              |         |
| 2            | 10.15.7.29 | 3306 | ONLINE | 1      | 0           | 1000            | 0                   | 0       | 0              |         |
+--------------+------------+------+--------+--------+-------------+-----------------+---------------------+---------+----------------+---------+
6 rows in set (0.00 sec)

查詢監控狀態

(admin@127.0.0.1:6032) [main]> SELECT * FROM monitor.mysql_server_read_only_log ORDER BY time_start_us DESC LIMIT 10;
+------------+------+------------------+-----------------+-----------+-------+
| hostname   | port | time_start_us    | success_time_us | read_only | error |
+------------+------+------------------+-----------------+-----------+-------+
| 10.15.7.28 | 3306 | 1565147280195308 | 635             | 0         | NULL  |
| 10.15.7.27 | 3306 | 1565147280177820 | 571             | 0         | NULL  |
| 10.15.7.29 | 3306 | 1565147280160274 | 971             | 0         | NULL  |
| 10.15.7.28 | 3306 | 1565147278681256 | 467             | 0         | NULL  |
| 10.15.7.29 | 3306 | 1565147278670869 | 491             | 0         | NULL  |
| 10.15.7.27 | 3306 | 1565147278660435 | 645             | 0         | NULL  |
| 10.15.7.28 | 3306 | 1565147277182260 | 23757           | 0         | NULL  |
| 10.15.7.29 | 3306 | 1565147277170779 | 451             | 0         | NULL  |
| 10.15.7.27 | 3306 | 1565147277160077 | 803             | 0         | NULL  |
| 10.15.7.28 | 3306 | 1565147275683734 | 537             | 0         | NULL  |
+------------+------+------------------+-----------------+-----------+-------+
10 rows in set (0.00 sec)

查詢用戶信息

(admin@127.0.0.1:6032) [main]> SELECT * FROM mysql_users;
+----------+----------+--------+---------+-------------------+----------------+---------------+------------------------+--------------+---------+----------+-----------------+
| username | password | active | use_ssl | default_hostgroup | default_schema | schema_locked | transaction_persistent | fast_forward | backend | frontend | max_connections |
+----------+----------+--------+---------+-------------------+----------------+---------------+------------------------+--------------+---------+----------+-----------------+
| proxysql | proxysql | 1      | 0       | 1                 | NULL           | 0             | 1                      | 0            | 1       | 1        | 10000           |
+----------+----------+--------+---------+-------------------+----------------+---------------+------------------------+--------------+---------+----------+-----------------+
1 row in set (0.00 sec)

查詢連接池

(admin@127.0.0.1:6032) [main]> SELECT * FROM stats.stats_mysql_connection_pool;
+-----------+------------+----------+--------+----------+----------+--------+---------+---------+-----------------+-----------------+------------+
| hostgroup | srv_host   | srv_port | status | ConnUsed | ConnFree | ConnOK | ConnERR | Queries | Bytes_data_sent | Bytes_data_recv | Latency_us |
+-----------+------------+----------+--------+----------+----------+--------+---------+---------+-----------------+-----------------+------------+
| 1         | 10.15.7.27 | 3306     | ONLINE | 0        | 2        | 2      | 18      | 23      | 645             | 52015           | 582        |
| 1         | 10.15.7.28 | 3306     | ONLINE | 0        | 0        | 1      | 24      | 130     | 6412            | 556975          | 943        |
| 1         | 10.15.7.29 | 3306     | ONLINE | 0        | 0        | 0      | 0       | 0       | 0               | 0               | 662        |
| 2         | 10.15.7.29 | 3306     | ONLINE | 0        | 1        | 1      | 0       | 9       | 153             | 95              | 662        |
| 2         | 10.15.7.28 | 3306     | ONLINE | 0        | 1        | 1      | 0       | 1       | 17              | 9               | 943        |
| 2         | 10.15.7.27 | 3306     | ONLINE | 0        | 1        | 1      | 0       | 10      | 188             | 277             | 582        |
+-----------+------------+----------+--------+----------+----------+--------+---------+---------+-----------------+-----------------+------------+
6 rows in set (0.00 sec)

查詢執行命令統計信息

(admin@127.0.0.1:6032) [main]> SELECT * FROM stats_mysql_commands_counters WHERE Total_cnt;
+-------------------+---------------+-----------+-----------+-----------+---------+---------+----------+----------+-----------+-----------+--------+--------+---------+----------+
| Command           | Total_Time_us | Total_cnt | cnt_100us | cnt_500us | cnt_1ms | cnt_5ms | cnt_10ms | cnt_50ms | cnt_100ms | cnt_500ms | cnt_1s | cnt_5s | cnt_10s | cnt_INFs |
+-------------------+---------------+-----------+-----------+-----------+---------+---------+----------+----------+-----------+-----------+--------+--------+---------+----------+
| ALTER_TABLE       | 33365         | 1         | 0         | 0         | 0       | 0       | 0        | 1        | 0         | 0         | 0      | 0      | 0       | 0        |
| COMMIT            | 0             | 1         | 1         | 0         | 0       | 0       | 0        | 0        | 0         | 0         | 0      | 0      | 0       | 0        |
| CREATE_TABLE      | 132150        | 2         | 0         | 0         | 0       | 0       | 0        | 0        | 2         | 0         | 0      | 0      | 0       | 0        |
| INSERT            | 652776        | 17        | 0         | 0         | 5       | 2       | 2        | 4        | 2         | 2         | 0      | 0      | 0       | 0        |
| SELECT            | 949845        | 119       | 31        | 5         | 30      | 31      | 3        | 13       | 4         | 2         | 0      | 0      | 0       | 0        |
| SET               | 249089        | 28        | 5         | 0         | 14      | 4       | 0        | 3        | 2         | 0         | 0      | 0      | 0       | 0        |
| SHOW_TABLE_STATUS | 35797         | 5         | 0         | 0         | 3       | 1       | 0        | 1        | 0         | 0         | 0      | 0      | 0       | 0        |
| SHOW              | 2357729       | 110       | 0         | 16        | 34      | 36      | 1        | 11       | 6         | 5         | 1      | 0      | 0       | 0        |
+-------------------+---------------+-----------+-----------+-----------+---------+---------+----------+----------+-----------+-----------+--------+--------+---------+----------+
8 rows in set (0.00 sec)

查詢路由規則的詳情

(admin@127.0.0.1:6032) [main]> SELECT * FROM stats_mysql_query_digest ORDER BY sum_time DESC;
+-----------+--------------------+----------+--------------------+-----------------------------------------+------------+------------+------------+----------+----------+----------+
| hostgroup | schemaname         | username | digest             | digest_text                             | count_star | first_seen | last_seen  | sum_time | min_time | max_time |
+-----------+--------------------+----------+--------------------+-----------------------------------------+------------+------------+------------+----------+----------+----------+
| 2         | information_schema | proxysql | 0x82A12D4C4E7B0A28 | select @@hostname                       | 17         | 1565143761 | 1565144220 | 107599   | 341      | 95173    |
| 2         | information_schema | proxysql | 0x630BEE5AF5572801 | select * from db.tb                     | 1          | 1565143743 | 1565143743 | 2157     | 2157     | 2157     |
| 2         | information_schema | proxysql | 0x620B328FE9D6D71A | SELECT DATABASE()                       | 1          | 1565144104 | 1565144104 | 835      | 835      | 835      |
| 2         | information_schema | proxysql | 0x3A53616B087A2CBC | select * from test.proxysql_test1       | 1          | 1565143753 | 1565143753 | 828      | 828      | 828      |
| 1         | test               | proxysql | 0xBD5AB6A13899C7D9 | select * from proxysql_test1 for update | 1          | 1565144119 | 1565144119 | 796      | 796      | 796      |
| 1         | test               | proxysql | 0x02033E45904D3DF0 | show databases                          | 1          | 1565144104 | 1565144104 | 691      | 691      | 691      |
| 1         | test               | proxysql | 0x99531AEFF718C501 | show tables                             | 1          | 1565144104 | 1565144104 | 370      | 370      | 370      |
| 1         | test               | proxysql | 0xDB3A841EF5443C35 | commit                                  | 1          | 1565144130 | 1565144130 | 0        | 0        | 0        |
| 1         | information_schema | proxysql | 0x594F2C744B698066 | select USER()                           | 1          | 1565143735 | 1565143735 | 0        | 0        | 0        |
| 1         | information_schema | proxysql | 0x226CD90D52A2BA0B | select @@version_comment limit ?        | 13         | 1565143735 | 1565144220 | 0        | 0        | 0        |
+-----------+--------------------+----------+--------------------+-----------------------------------------+------------+------------+------------+----------+----------+----------+
10 rows in set (0.01 sec)
> SELECT hostgroup hg, sum_time, count_star, digest_text FROM stats_mysql_query_digest ORDER BY sum_time DESC;

查詢路由規則

(admin@127.0.0.1:6032) [main]> SELECT rule_id, match_digest, match_pattern, replace_pattern, cache_ttl, apply FROM mysql_query_rules ORDER BY rule_id;
+---------+--------------+----------------------+-----------------+-----------+-------+
| rule_id | match_digest | match_pattern        | replace_pattern | cache_ttl | apply |
+---------+--------------+----------------------+-----------------+-----------+-------+
| 1       | NULL         | ^SELECT.*FOR UPDATE$ | NULL            | NULL      | 1     |
| 2       | NULL         | ^SELECT              | NULL            | NULL      | 1     |
+---------+--------------+----------------------+-----------------+-----------+-------+
2 rows in set (0.00 sec)

啟用Web統計功能

(admin@127.0.0.1:6032) [main]>  select * from global_variables where variable_name like 'admin-web%';
+-------------------+----------------+
| variable_name     | variable_value |
+-------------------+----------------+
| admin-web_enabled | false          |
| admin-web_port    | 6080           |
+-------------------+----------------+
啟用變量admin-web_enabled
(admin@127.0.0.1:6032) [main]> set admin-web_enabled='true';
Query OK, 1 row affected (0.00 sec)
(admin@127.0.0.1:6032) [main]> load admin variables to runtime;
Query OK, 0 rows affected (0.00 sec)
(admin@127.0.0.1:6032) [main]> save admin variables to disk;
Query OK, 31 rows affected (0.01 sec)
(admin@127.0.0.1:6032) [main]>  select * from global_variables where variable_name like 'admin-web%';
+-------------------+----------------+
| variable_name     | variable_value |
+-------------------+----------------+
| admin-web_enabled | true           |
| admin-web_port    | 6080           |
+-------------------+----------------+
查看登錄Web界面的用戶名、密碼和端口
(admin@127.0.0.1:6032) [main]> select * from global_variables where variable_name like 'admin-web%' or variable_name LIKE 'admin-stats%';
+-----------------------------------+----------------+
| variable_name                     | variable_value |
+-----------------------------------+----------------+
| admin-stats_credentials           | stats:stats    |
| admin-stats_mysql_connections     | 60             |
| admin-stats_mysql_connection_pool | 60             |
| admin-stats_mysql_query_cache     | 60             |
| admin-stats_system_cpu            | 60             |
| admin-stats_system_memory         | 60             |
| admin-web_enabled                 | true           |
| admin-web_port                    | 6080           |
+-----------------------------------+----------------+
8 rows in set (0.01 sec)

 參考:

http://idber.github.io/2018/08/28-ProxySQL%20%E5%AE%89%E8%A3%85%E9%85%8D%E7%BD%AE%E8%AF%A6%E8%A7%A3%E5%8F%8A%E8%AF%BB%E5%86%99%E5%88%86%E7%A6%BB%E3%80%81%E8%B4%9F%E8%BD%BD%E5%9D%87%E8%A1%A1.html


免責聲明!

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



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