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

1、ProxySQL的運行機制

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

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

每層的功能與含義以下:sql

   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沒法啓動。ide

2、ProxySQL下添加與修改配置

一、添加配置

須要添加配置時,直接操做的是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中。

二、持久化配置

以上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)

相關文章
相關標籤/搜索