靈活強大的MySQL代理中間件ProxySQL應用實戰(2)

一、ProxySQL的運行機制

ProxySQL有一個完備的配置系統,配置ProxySQL是基於sql命令的方式完成的。ProxySQL支持配置修改之後的在線保存、應用,不需要重啓即可生效。整個配置系統分三層設計。
整個配置系統分爲三層,如下圖所示:
靈活強大的MySQL代理中間件ProxySQL應用實戰(2)

配置系統分爲三層的目的有三個:
(1).自動更新
(2).儘可能的不重啓proxysql就可以修改配置
(3).方便回滾錯誤配置

每層的功能與含義如下:

   RUNTIME層
代表的是ProxySQL當前生效的正在使用的配置,包括global_variables, mysql_servers, mysql_users, mysql_query_rules表。無法直接修改這裏的配置,必須要從下一層load進來。也就是說RUNTIME這個頂級層,是proxysql運行過程中實際使用的那一份配置,這一份配置會直接影響到生產環境的,所以要將配置加載進RUNTIME層時需要三思而行。
   MEMORY層
用戶可以通過MySQL客戶端連接到此接口(admin接口),然後可以在mysql命令行查詢不同的表和數據庫,並修改各種配置,可以認爲是SQLite數據庫在內存的鏡像。也就是說MEMORY這個中間層,上面接着生產環境層RUNTIME,下面接着持久化層DISK和CONFIG FILE。
   MEMORY層
是我們修改proxysql的唯一正常入口。一般來說在修改一個配置時,首先修改Memory層,確認無誤後再接入RUNTIME層,最後持久化到DISK和CONFIG FILE層。也就是說memeory層裏面的配置隨便改,不影響生產,也不影響磁盤中保存的數據。通過admin接口可以修改mysql_servers、mysql_users、mysql_query_rules、global_variables等表的數據。
   DISK/CONFIG FILE層
表示持久存儲的那份配置,持久層對應的磁盤文件是$(DATADIR)/proxysql.db,在重啓ProxySQL的時候,會從proxysql.db文件中加載信息。而 /etc/proxysql.cnf文件只在第一次初始化的時候使用,之後如果要修改配置,就需要在管理端口的SQL命令行裏進行修改,然後再save到硬盤。 也就是說DISK和CONFIG FILE這一層是持久化層,我們做的任何配置更改,如果不持久化下來,重啓後,配置都將丟失。

需要注意的是:proxysql的每一個配置項在三層中都存在,但是這三層是互相獨立的,也就是說,proxysql可以同時擁有三份配置,每層都是獨立的,可能三份配置都不一樣,也可能三份都一樣。

下面總結下proxysql的啓動過程:

當proxysql啓動時,首先讀取配置文件CONFIG FILE(/etc/proxysql.cnf),然後從該配置文件中獲取datadir,datadir中配置的是sqlite的數據目錄。如果該目錄存在,且sqlite數據文件存在,那麼正常啓動,將sqlite中的配置項讀進內存,並且加載進RUNTIME,用於初始化proxysql的運行。如果datadir目錄下沒有sqlite的數據文件,proxysql就會使用config file中的配置來初始化proxysql,並且將這些配置保存至數據庫。sqlite數據文件可以不存在,/etc/proxysql.cnf文件也可以爲空,但/etc/proxysql.cnf配置文件必須存在,否則,proxysql無法啓動。

二、ProxySQL下添加與修改配置

1、添加配置

需要添加配置時,直接操作的是MEMORAY,例如:添加一個程序用戶,在mysql_users表中執行一個插入操作:

MySQL [(none)]> insert into mysql_users(username,password,active,default_hostgroup,transaction_persistent) values('myadmin','mypass',1,0,1);

這樣就完成了一個用戶的添加。要讓這個insert生效,還需要執行如下操作:

MySQL [(none)]>load mysql users to runtime;
表示將修改後的配置(MEMORY層)用到實際生產環境(RUNTIME層)

如果想保存這個設置永久生效,還需要執行如下操作:

MySQL [(none)]>save mysql users to disk;
表示將memoery中的配置保存到磁盤中去。

除了上面兩個操作,還可以執行如下操作:

MySQL [(none)]>load mysql users to memory;
表示將磁盤中持久化的配置拉一份到memory中來。

MySQL [(none)]>load mysql users from config;
表示將配置文件中的配置加載到memeory中。

2、持久化配置

以上SQL命令是對mysql_users進行的操作,同理,還可以對mysql_servers表、mysql_query_rules表、global_variables表等執行類似的操作。
如對mysql_servers表插入完成數據後,要執行保存和加載操作,可執行如下SQL命令:

MySQL [(none)]> load mysql servers to runtime;
MySQL [(none)]> save mysql servers to disk;

對mysql_query_rules表插入完成數據後,要執行保存和加載操作,可執行如下SQL命令:

MySQL [(none)]> load mysql query rules to runtime;
MySQL [(none)]> save mysql query rules to disk;

對global_variables表插入完成數據後,要執行保存和加載操作,可執行如下SQL命令:

以下命令加載或保存mysql variables(global_variables):

MySQL [(none)]>load mysql variables to runtime
MySQL [(none)]>save mysql variables to disk

以下命令加載或保存admin variables(select * from global_variables where variable_name like 'admin-%'):

MySQL [(none)]> load admin variables to runtime
MySQL [(none)]>save admin variables to disk

待續!

覺得不過癮,後續還有一些列文章在等着呢:

原新浪網、阿里雲(原萬網)系統架構師,Linux暢銷書《循序漸進linux》作者、51CTO博客博客專家博主、51CTO特級講師,我的最新專欄: 輕鬆玩轉ELK海量可視化日誌分析系統,連載更新中,猛戳查看:
《輕鬆玩轉ELK海量可視化日誌分析系統》
靈活強大的MySQL代理中間件ProxySQL應用實戰(2)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章