返回ProxySQL系列文章:http://www.cnblogs.com/f-ck-need-u/p/7586194.htmlhtml
使用ProxySQL的Admin管理接口連上ProxySQL,可查看ProxySQL擁有的庫。mysql
mysql -uadmin -padmin -h127.0.0.1 -P6032 --prompt 'admin> '
admin> 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 | +-----+---------------+-------------------------------------+
其中:sql
$DATADIR/proxysql.db
。$DATADIR/proxysql_stats.db
。ProxySQL內部使用的是SQLite3數據庫,不管是內存數據庫仍是磁盤數據庫,都是經過SQLite3引擎進行解析、操做的。它和MySQL的語法可能稍有不一樣,但ProxySQL會對不兼容的語法自動進行調整,最大程度上保證MySQL語句的有效率。shell
上面描述main庫的時候,只是說了內存數據庫須要持久化到disk庫才能永久保存配置。但實際上,修改了main庫中的配置後,並不會當即生效,它還須要load到runtime的數據結構中才生效,只有在runtime數據結構中的配置纔是對ProxySQL當前有效的配置。請看下面的"多層配置系統"。數據庫
ProxySQL的配置系統很是強大,它能在線修改幾乎全部配置(僅有的兩個須要重啓才能生效的變量爲mysql-threads
和mysql-stacksize
),並在線生效、持久化保存。這得益於它採用的多層配置系統。後端
多層配置系統結構以下:session
+-------------------------+ | RUNTIME | +-------------------------+ /|\ | | | [1] | [2] | | \|/ +-------------------------+ | MEMORY | +-------------------------+ _ /|\ | |\ | | \ [3] | [4] | \ [5] | \|/ \ +-------------------------+ +---------------+ | DISK | | CONFIG FILE | +-------------------------+ +---------------+
解釋下這個3層的配置系統。數據結構
最底層的是disk庫和config file。這裏須要注意,這裏的config file就是傳統的配置文件,默認爲/etc/proxysql.cnf,ProxySQL啓動時,主要是從disk庫中讀取配置加載到內存並最終加載到runtime生效,只有極少的幾個特定配置內容是從config file中加載的,除非是第一次初始化ProxySQL運行環境(或者disk庫爲空)。app
中間層的是memory,表示的是內存數據庫,其實就是main庫。經過管理接口修改的全部配置,都保存在內存數據庫(main)中。當ProxySQL重啓或者崩潰時,這個內存數據庫中的數據會丟失,因此須要save到disk庫中。工具
最上層的是runtime,它是ProxySQL有關線程運行時讀取的數據結構。換句話說,該數據結構中的配置都是已生效的配置。因此,修改了main庫中的配置後,必須load到runtime數據結構中才能使其生效。
在上面的多層配置系統圖中,標註了[1]、[2]、[3]、[4]、[5]的序號。每一個序號都有兩個操做方向from/to b
,其實只是所站角度不一樣而已。如下是各序號對應的操做:
[1] :將內存數據庫中的配置加載到RUNTIME數據結構中 LOAD XXX FROM MEMORY LOAD XXX TO RUNTIME [2] :將RUNTIME數據結構中的配置持久化到內存數據庫中 SAVE XXX FROM RUNTIME SAVE XXX TO MEMORY [3] :將磁盤數據庫中的配置加載到內存數據庫中 LOAD XXX FROM DISK LOAD XXX TO MEMORY [4] :將內存數據庫中的配置持久化到磁盤數據庫中 SAVE XXX FROM MEMORY SAVE XXX TO DISK [5] :從傳統配置文件中讀取配置加載到內存數據庫中 LOAD XXX FROM CONFIG
DISK/MEMORY/RUNTIME/CONFIG能夠縮寫,只要能識別便可。例如MEMORY
能夠縮寫爲MEM
,runtime
能夠縮寫爲run
。
另外,上面的XXX
是什麼?這表示要加載/保存的是哪類配置。目前的ProxySQL支持如下幾種:
這些從main庫或disk庫中就能夠查看到。
admin> show tables from disk; +------------------------------------+ | tables | +------------------------------------+ | global_variables | # (1) | mysql_collations | # (N) | mysql_group_replication_hostgroups | # (2) | mysql_query_rules | # (3) | mysql_query_rules_fast_routing | # (4) | mysql_replication_hostgroups | # (5) | mysql_servers | # (6) | mysql_users | # (7) | proxysql_servers | # (8) | scheduler | # (9) +------------------------------------+
其中:
(1)
中包含兩類變量,以amdin-
開頭的表示admin variables,以mysql-
開頭的表示mysql variables。修改哪類變量,前文的XXX
就表明哪類。(2,5,6)
對應的都是mysql servers。(3,4)
對應的是mysql query rules。(7)
對應的mysql users。(9)
對應的scheduler。(N)
只是一張表,保存的是ProxySQL支持的字符集和排序規則,它是不用修改的。(8)
是ProxySQL的集羣配置表,該功能目前還處於實驗階段。若是想要配置該功能,則load/save proxysql_servers to/from ...
。如下是幾個示例:注意,幾乎全部配置都是在admin管理接口上修改的,這也是建議的配置方式。
(1).向ProxySQL的mysql_servers
表中添加了一個後端節點。
load mysql servers to runtime; # 加載到runtime使該節點的配置生效 save mysql servers to disk; # 將該節點的配置持久化到磁盤數據庫中
上面兩句和下面兩句是等價的,只是操做方向不一樣(還使用了縮寫):
load mysql servers from mem; save mysql servers from mem;
(2).向ProxySQL的mysql_users
表中添加了用於發送、處理SQL語句的用戶。
load mysql users to runtime; save mysql users to disk;
(3).修改了以admin-
開頭的變量。
load admin variables to runtime; save admin variables to disk;
若是ProxySQL是剛安裝的,或者磁盤數據庫文件爲空(甚至不存在),或者啓動ProxySQL時使用了選項--initial
,這幾種狀況啓動ProxySQL時,都會從傳統配置文件config file中讀取配置加載到內存數據庫,並自動load到runtime數據結構、save到磁盤數據庫,這是初始化ProxySQL運行環境的過程。
若是不是第一次啓動ProxySQL,因爲已經存在磁盤數據庫文件,這時ProxySQL會從磁盤數據庫中讀取幾乎全部的配置(即便傳統配置文件中配置了某項,也不會去解析),但有3項是必須從傳統配置文件中讀取的。這3項是:
datadir
:ProxySQL啓動時,必須從配置文件中肯定它的數據目錄,由於磁盤數據庫文件、日誌以及其它一些文件是存放在數據目錄下的。若是使用/etc/init.d/proxysql管理ProxySQL,則除了修改/etc/proxysql.cnf的datadir,還須要修改該腳本中的datadir。restart_on_missing_heartbeats
:MySQL線程丟失多少次心跳,就會殺掉這個線程並重啓它。默認值爲10。execute_on_exit_failure
:若是設置了該變量,ProxySQL父進程將在每次ProxySQL崩潰的時候執行已經定義好的腳本。建議使用它來生成一些崩潰時的警告和日誌。注意,ProxySQL的重啓速度可能只有幾毫秒,所以不少其它的監控工具可能沒法探測到ProxySQL的一次普通故障,此時可以使用該變量。
傳統配置文件默認路徑爲/etc/proxysql.cnf,也能夠在二進制程序proxysql上使用-c
或--config
來手動指定配置文件。
ProxySQL的傳統配置文件示例以下:瀏覽下便可,幾乎不須要手動去配置proxysql.cnf。
datadir="/var/lib/proxysql" admin_variables= { admin_credentials="admin:admin" # mysql_ifaces="127.0.0.1:6032;/tmp/proxysql_admin.sock" mysql_ifaces="0.0.0.0:6032" # refresh_interval=2000 # debug=true } mysql_variables= { threads=4 max_connections=2048 default_query_delay=0 default_query_timeout=36000000 have_compress=true poll_timeout=2000 # interfaces="0.0.0.0:6033;/tmp/proxysql.sock" interfaces="0.0.0.0:6033" default_schema="information_schema" stacksize=1048576 server_version="5.5.30" connect_timeout_server=3000 # make sure to configure monitor username and password monitor_username="monitor" monitor_password="monitor" monitor_history=600000 monitor_connect_interval=60000 monitor_ping_interval=10000 monitor_read_only_interval=1500 monitor_read_only_timeout=500 ping_interval_server_msec=120000 ping_timeout_server=500 commands_stats=true sessions_sort=true connect_retries_on_failure=10 } # defines all the MySQL servers mysql_servers = ( # { # address = "127.0.0.1" # no default, required . If port is 0 , address is interpred as a Unix Socket Domain # port = 3306 # no default, required . If port is 0 , address is interpred as a Unix Socket Domain # hostgroup = 0 # no default, required # status = "ONLINE" # default: ONLINE # weight = 1 # default: 1 # compression = 0 # default: 0 # max_replication_lag = 10 # default 0 . If greater than 0 and replication lag passes such threshold, the server is shunned # }, # { # address = "/var/lib/mysql/mysql.sock" # port = 0 # hostgroup = 0 # }, # { # address="127.0.0.1" # port=21891 # hostgroup=0 # max_connections=200 # }, # { address="127.0.0.2" , port=3306 , hostgroup=0, max_connections=5 }, # { address="127.0.0.1" , port=21892 , hostgroup=1 }, # { address="127.0.0.1" , port=21893 , hostgroup=1 } # { address="127.0.0.2" , port=3306 , hostgroup=1 }, # { address="127.0.0.3" , port=3306 , hostgroup=1 }, # { address="127.0.0.4" , port=3306 , hostgroup=1 }, # { address="/var/lib/mysql/mysql.sock" , port=0 , hostgroup=1 } ) # defines all the MySQL users mysql_users: ( # { # username = "username" # no default , required # password = "password" # default: '' # default_hostgroup = 0 # default: 0 # active = 1 # default: 1 # }, # { # username = "root" # password = "" # default_hostgroup = 0 # max_connections=1000 # default_schema="test" # active = 1 # }, # { username = "user1" , password = "password" , default_hostgroup = 0 , active = 0 } ) #defines MySQL Query Rules mysql_query_rules: ( # { # rule_id=1 # active=1 # match_pattern="^SELECT .* FOR UPDATE$" # destination_hostgroup=0 # apply=1 # }, # { # rule_id=2 # active=1 # match_pattern="^SELECT" # destination_hostgroup=1 # apply=1 # } ) scheduler= ( # { # id=1 # active=0 # interval_ms=10000 # filename="/var/lib/proxysql/proxysql_galera_checker.sh" # arg1="0" # arg2="0" # arg3="0" # arg4="1" # arg5="/var/lib/proxysql/proxysql_galera_checker.log" # } ) mysql_replication_hostgroups= ( # { # writer_hostgroup=30 # reader_hostgroup=40 # comment="test repl 1" # }, # { # writer_hostgroup=50 # reader_hostgroup=60 # comment="test repl 2" # } )