備註:文章編寫時間201904-201905期間,後續官方在github的更新沒有被寫入mysql
~
~git
ProxySQL具備複雜且易於使用的配置系統,適合知足如下需求:github
~
~
3層配置體系以下所示:sql
+------------------------+ | RUNTIME | +-------------------------+ /|\ | | | [1] | [2] | | \|/ +-------------------------+ | MEMORY | +-------------------------+ /|\ | |\ | | \ [3] | [4] | \ [5] | \|/ \ +-------------------------+ +-------------------------+ | DISK | | CONFIG FILE | +-------------------------+ +-------------------------+
說明:
RUNTIME ==>表示處理請求的線程使用的ProxySQL在內存中的數據結構。
它包含以下參數:
1)在全局參數(admin_variables)中定義的實際值;
2)在主機組(hostgroup)中包含的後端服務;
3)能夠鏈接到代理的MySQL用戶列表;
備註:不能直接修改RUNTIME配置部分的內容,由於這些是靠近底層的信息;
~
~
MEMORY ==>它有時也被稱爲main;表明了能夠經過MySQL兼容接口使用的內存中的數據庫(proxysql實例)。用戶可使用MySQL客戶端
鏈接到此接口,並查詢各類ProxySQL配置表/數據庫。
~
~
經過該接口,可用使用的參數表包括:
1)mysql_servers-->保存ProxySQL可鏈接的後端服務器的列表;
2)mysql_users -->保存能夠鏈接到ProxySQL的用戶及其憑據列表;注意:ProxySQL也將使用這些憑證去鏈接後端服務;
3)mysql_query_rules-->保存將流量路由到各個後端服務器時依據的查詢規則列表;
4)global_variables -->保存ProxySQL配置的可被動態調整的全局參數;好比下面這些:數據庫
Admin>select * from global_variables limit 3; +--------------------------------+----------------+ | variable_name | variable_value | +--------------------------------+----------------+ | mysql-shun_on_failures | 5 | | mysql-shun_recovery_time_sec | 10 | | mysql-query_retries_on_failure | 1 | +--------------------------------+----------------+ 3 rows in set (0.01 sec)
5)mysql_collations -->保存可供ProxySQL使用的MySQL排序規則的列表。這些是直接從客戶端庫中提取的。
6)debug_levels -->保存ProxySQL在debug輸出信息時可被輸出的debug語句的類型列表。能夠根據debug來動態配置,
並將結果輸出到日誌中。注意:這類參數只能在調試時使用,由於影響性能!
~
~
DISK和CONFIG FILE
DISK -->表明在磁盤上的SQLite3類型的數據庫,默認位置爲$(DATADIR)/proxysql.db。因爲在重啓時,內存中未保存的配置將會丟失。
於是由它來將這些配置保存到磁盤。
CONFIG FILE-->表明配置文件。後端
~
~服務器
在正常啓動時,ProxySQL首先將讀取它的配置文件來肯定數據目錄位置(datadir)[其餘配置信息暫時不讀取];然後根據數據庫(SQLite3)文件
是否存在來決定後面的動做。數據結構
備註:
1)在ProxySQL 1.4.4時引入了2個通用參數,它們只能從配置文件值獲取:restart_on_missing_heartbeats和execute_on_exit_failure;
2)在ProxySQL 2.0.0時又引入了1個通用參數,該參數也只能從配置文件值獲取:errorlog;架構
~
~ide
在初始啓動模式下,內存和運行時配置信息將用配置文件來填充;而後這些配置信息將固化到ProxySQL自帶的SQLite數據庫中。
經過使用--initial選項運行ProxySQL能夠強制從新進行初始配置,這會將SQLite數據庫文件重置爲原始狀態(即配置文件中定義的狀態)
並重命名現有的SQLite數據庫文件,以便往後回退(若是須要回退能夠檢查數據目錄中的舊文件)。
~
~
若是使用--reload選項執行proxysql,它會嘗試將配置文件中的配置與數據庫文件的內容合併。而後,再執行常規啓動程序。
但要注意,這裏不保證再2個配置內容衝突時ProxySQL能夠正確的合併內容;所以,這時須要人爲的進行確認合併是否達到預期。
~
~
使用MySQL客戶端連入ProxySQL(6032)後,經過查詢、更新各個ProxySQL配置相關的表便可實現動態的修改配置。
配置得相關的表都有明確的名稱:
mysql_servers、mysql_users、mysql_query_rules、global_variables、debug_levels(僅用於調試ProxySQL時手動構建)
以上各表的內容,參看文章第一段的‘多層次配置系統’。
~
~
爲了讓配置信息持久化到磁盤或載入到runtime層,有一系列的管理命令能夠被使用。這些命令須要對應'3層配置體系'圖來理解。
如下給出相關的命令,命令即變化對應'3層配置體系'圖中的編號:
~
~
3層配置體系以下所示:
+------------------------+ | RUNTIME | +-------------------------+ /|\ | | | [1] | [2] | | \|/ +-------------------------+ | MEMORY | +-------------------------+ /|\ | |\ | | \ [3] | [4] | \ [5] | \|/ \ +-------------------------+ +-------------------------+ | DISK | | CONFIG FILE | +-------------------------+ +-------------------------+
[1] LOAD MYSQL USERS FROM MEMORY / LOAD MYSQL USERS TO RUNTIME
做用:將MEMORY層數據庫中的MySQL用戶配置載入到RUNTIME層。
~
[2] SAVE MYSQL USERS TO MEMORY / SAVE MYSQL USERS FROM RUNTIME
做用:將RUNTIME層中的MySQL用戶配置寫入到MEMORY層的數據庫中。
~
[3] LOAD MYSQL USERS TO MEMORY / LOAD MYSQL USERS FROM DISK
做用:將DISK數據庫文件中的MySQL用戶配置載入到MEMORY層的數據庫中。
~
[4] SAVE MYSQL USERS FROM MEMORY / SAVE MYSQL USERS TO DISK
做用:將MEMORY層數據庫中的MySQL用戶配置寫入DISK的數據庫文件進行持久化。
~
[5] LOAD MYSQL USERS FROM CONFIG
做用:從CONFIG FILE(配置文件)中加載用戶到MEMORY層的數據庫中。
[1] LOAD MYSQL SERVERS FROM MEMORY / LOAD MYSQL SERVERS TO RUNTIME
做用:將MEMORY層數據庫中的MySQL服務器配置載入到RUNTIME層。
~
[2] SAVE MYSQL SERVERS TO MEMORY / SAVE MYSQL SERVERS FROM RUNTIME
做用:將RUNTIME層中的MySQL服務器配置寫入到MEMORY層的數據庫中。
~
[3] LOAD MYSQL SERVERS TO MEMORY / LOAD MYSQL SERVERS FROM DISK
做用:將DISK數據庫文件中的MySQL服務器配置載入到MEMORY層的數據庫中。
~
[4] SAVE MYSQL SERVERS FROM MEMORY / SAVE MYSQL SERVERS TO DISK
做用:將MEMORY層數據庫中的MySQL服務器配置寫入DISK的數據庫文件進行持久化。
~
[5] LOAD MYSQL SERVERS FROM CONFIG
做用:從CONFIG FILE(配置文件)中加載MySQL服務器配置到MEMORY層的數據庫中。
~
~
[1] LOAD MYSQL QUERY RULES FROM MEMORY / LOAD MYSQL QUERY RULES TO RUNTIME
做用:將MEMORY層數據庫中的MySQL查詢規則配置載入到RUNTIME層。
~
[2] SAVE MYSQL QUERY RULES TO MEMORY / SAVE MYSQL QUERY RULES FROM RUNTIME
做用:將RUNTIME層中的MySQL查詢規則配置寫入到MEMORY層的數據庫中。
~
[3] LOAD MYSQL QUERY RULES TO MEMORY / LOAD MYSQL QUERY RULES FROM DISK
做用:將DISK數據庫文件中的MySQL查詢規則配置載入到MEMORY層的數據庫中。
~
[4] SAVE MYSQL QUERY RULES FROM MEMORY / SAVE MYSQL QUERY RULES TO DISK
做用:將MEMORY層數據庫中的MySQL查詢規則配置寫入DISK的數據庫文件進行持久化。
~
[5] LOAD MYSQL QUERY RULES FROM CONFIG
做用:從CONFIG FILE(配置文件)中加載MySQL查詢規則配置到MEMORY層的數據庫中。
~
~
[1] LOAD MYSQL VARIABLES FROM MEMORY / LOAD MYSQL VARIABLES TO RUNTIME
做用:將MEMORY層數據庫中的MySQL參數配置載入到RUNTIME層。
~
[2] SAVE MYSQL VARIABLES TO MEMORY / SAVE MYSQL VARIABLES FROM RUNTIME
做用:將RUNTIME層中的MySQL參數配置寫入到MEMORY層的數據庫中。
~
[3] LOAD MYSQL VARIABLES TO MEMORY / LOAD MYSQL VARIABLES FROM DISK
做用:將DISK數據庫文件中的MySQL參數配置載入到MEMORY層的數據庫中。
~
[4] SAVE MYSQL VARIABLES FROM MEMORY / SAVE MYSQL VARIABLES TO DISK
做用:將MEMORY層數據庫中的MySQL參數配置寫入DISK的數據庫文件進行持久化。
~
[5] LOAD MYSQL VARIABLES FROM CONFIG
做用:從CONFIG FILE(配置文件)中加載MySQL參數配置到MEMORY層的數據庫中。
~
~
[1] LOAD ADMIN VARIABLES FROM MEMORY / LOAD ADMIN VARIABLES TO RUNTIME
做用:將MEMORY層數據庫中的admin參數配置載入到RUNTIME層。
~
[2] SAVE ADMIN VARIABLES TO MEMORY / SAVE ADMIN VARIABLES FROM RUNTIME
做用:將RUNTIME層中的admin參數配置寫入到MEMORY層的數據庫中。
~
[3] LOAD ADMIN VARIABLES TO MEMORY / LOAD ADMIN VARIABLES FROM DISK
做用:將DISK數據庫文件中的admin參數配置載入到MEMORY層的數據庫中。
~
[4] SAVE ADMIN VARIABLES FROM MEMORY / SAVE ADMIN VARIABLES TO DISK
做用:將MEMORY層數據庫中的admin參數配置寫入DISK的數據庫文件進行持久化。
~
[5] LOAD ADMIN VARIABLES FROM CONFIG
做用:從CONFIG FILE(配置文件)中加載admin參數配置到MEMORY層的數據庫中。
~
備註:以上的命令支持如下簡寫方式:
MEM <==> MEMORY
RUN <==> RUNTIME
~
~
到此爲止,已經基本瞭解了系統是如何工做的了,下面給出一些經常使用的命令;它們與如何激活更改後的配置(RUNTIME)
以及如何將配置永久保存到磁盤(DISK)有關。特別注意:在將配置加載到RUNTIME層以前,不會激活任何更改。
LOAD MYSQL USERS TO RUNTIME; SAVE MYSQL USERS TO DISK; LOAD MYSQL SERVERS TO RUNTIME; SAVE MYSQL SERVERS TO DISK; LOAD MYSQL QUERY RULES TO RUNTIME; SAVE MYSQL QUERY RULES TO DISK; LOAD MYSQL VARIABLES TO RUNTIME; SAVE MYSQL VARIABLES TO DISK; LOAD ADMIN VARIABLES TO RUNTIME; SAVE ADMIN VARIABLES TO DISK;
~
~
特別注意:只有在將參數值加載到RUNTIME層時纔會進行最終的驗證。
你能夠設置一個值,該值在保存到MEMORY層時不會引起任何類型的警告或錯誤,甚至能夠保存到DISK。
可是,當執行加載到RUNTIME層時,參數值卻恢復到了先前保存的狀態;若是發生這種狀況,就應該檢查定義的錯誤日誌。
例如:
[WARNING] Impossible to set variable monitor_read_only_interval with value "0".
解決辦法:從新設置monitor_read_only_interval的值。
~~完畢!