1. 程式人生 > >MySQL-ProxySQL中介軟體(一)| ProxySQL基本概念

MySQL-ProxySQL中介軟體(一)| ProxySQL基本概念

目錄

    MySQL-ProxySQL中介軟體(一)| ProxySQL基本概念: https://www.cnblogs.com/SQLServer2012/p/10972593.html     MySQL-ProxySQL中介軟體(二)| Admin Schemas介紹:https://www.cnblogs.com/SQLServer2012/p/10972761.html

ProxySQL

    ProxySQL作為一款強大的中介軟體為MySQL的架構提供了有力的支援。     目前可以很好的支援 Master Slave\ MGR \ PXC等,並提供連線池、讀寫分離、日誌記錄等功能,當然還有很多其他實用功能,這裡不一一列舉了。     本文都是基礎概念,基本出自官方文件,官方已經解釋的非常清晰,我就不太多加工,彙總一些實用的分享給大家。  

安裝

    ProxySQL安裝非常簡單       

連線ProxySQL

    ProxySQL預設管理埠6032,預設需要127.0.0.1來進入,進入方式和連線MySQL方式一致:      

ProxySQL 執行機制

RUNTIME

    RUNTIME表示處理請求的執行緒使用的ProxySQL的記憶體資料結構。     runtime variables 包含了:         1.    Global variables的實際值
        2.    將後端的伺服器列表分組到hostgroup中。
        3.    讓MySQL 的User們可以連線proxysql
注意:runntime層資料,誰都不能直接修改,必須通過下一層來提交修改。

MEMORY

    MEMORY(有時也稱為main)表示通過MySQL相容介面公開的記憶體資料庫。 使用者可以將MySQL客戶端連線到此介面,並查詢各種ProxySQL配置表/資料庫。        通過此介面可用的配置表是:

mysql_servers - ProxySQL連線到的後端伺服器列表

mysql_users - 連線到ProxySQL的使用者及其憑據列表。 請注意,ProxySQL也將使用相同的憑據連線到後端伺服器!

mysql_query_rules - 將流量路由到各種後端伺服器時評估的查詢規則列表。 這些規則還可以重寫查詢,甚至可以快取已執行查詢的結果。

global_variables - 代理配置使用的全域性變數列表,可在執行時調整。

DISK 和 CONFIG FILE

    DISK表示磁碟上的SQLite3資料庫,預設位置為$(DATADIR)/proxysql.db。 在重新啟動時,未保留的記憶體中配置將丟失。 因此,將配置保留在DISK中非常重要。        

啟動過程

    如果找到資料庫檔案(proxysql.db),ProxySQL將從proxysql.db初始化其記憶體中配置。 因此,磁碟被載入到MEMORY中,然後載入到RUNTIME中。      如果找不到資料庫檔案(proxysql.db)且存在配置檔案(proxysql.cfg),則解析配置檔案並將其內容載入到記憶體資料庫中,然後將其儲存在proxysql.db中並在載入到RUNTIME。      請務必注意,如果找到proxysql.db,則不會解析配置檔案。 也就是說,在正常啟動期間,ProxySQL僅從持久儲存的磁碟資料庫初始化其記憶體配置。

    配置檔案有4個變數,即使存在proxysql.db,也始終會從配置檔案裡去解析:

        1.    datadir:

               定義了ProxySQL datadir的路徑,其中儲存了資料庫檔案,日誌和其他檔案

        2.    restart_on_missing_heartbeats(1.4.4中的新增內容):

               如果MySQL執行緒錯過了restart_on_missing_heartbeats心跳,則proxysql將引發SIGABRT訊號並重新啟動。 預設值為10。 

                詳情請見:https://github.com/sysown/proxysql/wiki/Watchdog。

        3.    execute_on_exit_failure(1.4.4中的新增內容):

               如果設定,ProxySQL父程序將在每次ProxySQL崩潰時執行定義的指令碼。 建議使用此設定生成警報或記錄事件。 

                請注意,在崩潰的情況下,proxysql能夠在幾毫秒內重新啟動,因此其他監視工具可能無法檢測到正常故障。

        4.    errorlog(2.0.0中的新增內容):

               如果設定,ProxySQL將使用定義的檔案作為錯誤日誌。 如果未傳遞此類變數,則errolog將位於datadir / proxysql.log中

   

初始化啟動過程(或--initial)

    在初始啟動時,將從配置檔案中填充記憶體和執行時配置。 此後,配置將保留在ProxySQL的嵌入式SQLite資料庫中。      通過使用--initial標誌執行proxysql可以強制重新發生初始配置,這會將SQLite資料庫檔案重置為其原始狀態(即配置檔案中定義的狀態)並重命名現有的SQLite資料庫檔案      如果需要回滾(如果需要,檢查已定義的資料目錄中的舊檔案)。  

重新載入啟動(或--reload)

    如果使用--reload標誌執行proxysql,它會嘗試將配置檔案中的配置與資料庫檔案的內容合併。 之後,ProxySQL將繼續啟動程式。

    如果配置檔案和資料庫檔案的引數存在衝突,則無法保證ProxySQL將成功管理合並,使用者應始終驗證合併結果是否符合預期。

 

核心配置表

    在執行時修改配置是通過ProxySQL的MySQL管理埠(預設為6032)完成的。      連線到它後,您將看到一個與MySQL相容的介面,用於查詢各種與ProxySQL相關的表:
mysql> show tables;
+-------------------+
| tables            |
+-------------------+
| mysql_servers     |
| mysql_users       |
| mysql_query_rules |
| global_variables  |
| mysql_collations  |
| debug_levels      |
+-------------------+

 

    每個這樣的表都有明確的定義:

        mysql_servers:        包含要連線的ProxySQL的後端伺服器列表

        mysql_users:           包含ProxySQL將用於向後端伺服器進行身份驗證的使用者列表

        mysql_query_rules:    包含用於快取,路由或重寫傳送到ProxySQL的SQL查詢的規則

        global_variables:        包含在伺服器初始配置期間定義的MySQL變數和管理變數

        debug_levels:             僅用於除錯ProxySQL的手動構建

 

在不同層級間移動配置資訊

    為了將配置持久化到磁碟或將配置載入到執行時,可以使用一組不同的管理命令,這些命令可以通過管理介面執行。      一旦理解了三層中的每一層的使用方式,語義都應該清楚。      連同每個命令的說明,每個命令旁邊都有一個編號選項。 該數字對應於下圖中列出的箭頭     

 

    

要重新配置MySQL使用者,請執行以下命令之一:

 

[1]    LOAD MYSQL USERS FROM MEMORY / LOAD MYSQL USERS TO RUNTIME

    將MySQL使用者從MEMORY載入到RUNTIME資料結構,反之亦然

 

[2]    SAVE MYSQL USERS TO MEMORY / SAVE MYSQL USERS FROM RUNTIME

    將MySQL使用者從RUNTIME儲存到MEMORY

 

[3]    LOAD MYSQL USERS TO MEMORY / LOAD MYSQL USERS FROM DISK

    將持久化的MySQL使用者從磁碟資料庫載入到MEMORY

 

[4]    SAVE MYSQL USERS FROM MEMORY / SAVE MYSQL USERS TO DISK

    將MySQL使用者從MEMORY中儲存到DISK

 

[5]    LOAD MYSQL USERS FROM CONFIG

    從配置檔案載入使用者到MEMORY

    常用的命令參考:

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;

注意:關鍵字MEMORY/RUNTIME 都支援縮寫:
MEM for MEMORY
RUN for RUNTIME

 

故障排除

    請注意,只有在將值載入到執行時才會進行最終驗證。      可以設定一個值,該值在儲存到記憶體時不會引發任何型別的警告或錯誤,甚至可以儲存到磁碟。     但是,當執行載入到執行時,會自動將更改恢復為先前已經儲存的狀態。      如果發生這種情況,應該檢查定義的錯誤日誌檔案:     例如:     [WARNING] Impossible to set variable monitor_read_only_interval with value "0". Resetting to current "1500".         

常用的一些命令技巧

1.    限制ProxySQL到後端MySQL的連線數通過權重,來控制ProxySQL到後端MySQL的訪問量

    權重只作用在同一個hostgroup中有效     

 

    

2.    自動迴避複製延遲較大的節點

    如果伺服器將max_replication_lag設定為非零值,則Monitor模組會定期檢查複製延遲         下圖中,當172.16.0.3的複製延遲超過了30秒會自動迴避,設定max_replication_lag = 0,代表不檢查複製延遲 。          注意,max_replication_lag主要來源Seconds_Behind_Master,該引數判斷延遲準確性不高,顧個人建議為參考功能。  

3.    Master Slave,將Master作為Slave的備用讀節點

   在下面的示例中,如果我們將HG1配置為提供讀請求,則99.95%的請求將傳送到172.16.0.2和172.16.0.3,而0.05%的請求將正常傳送到172.16.0.1。     如果172.16.0.2和172.16.0.3不可用,172.16.0.1將獲取所有讀取請求。

   注意:max_replication_lag僅適用於從節點。 如果伺服器未啟用複製,則Monitor不會執行任何操作。

4.    優雅的禁用後端Server

    要正常禁用後端伺服器,需要將其狀態更改為OFFLINE_SOFT。      不會影響當前的活動事務和連線,但不會向該節點發送新流量。  

5.    立即禁用後端Server

    要立即禁用後端伺服器,需要將其狀態更改為OFFLINE_HARD。 所有當前請求將立即終止,並且不會發送新請求。     172.18.0.1 設定了OFFLINE_HARD 會立刻中斷當前的請求。       

6.    重新啟用離線/禁用後端Server

    要在離線後端重新啟用,將其狀態更改回ONLINE就可以了       

7.    刪除後端Server

      注意:         在內部,刪除後端或將其設定為OFFLINE_HARD的方式相同。          當執行LOAD MYSQL SERVERS TO RUNTIME時,Hostgroup_Manager將檢測到後端伺服器已被刪除,並在內部將其標記為OFFLINE_HARD。     

8.    將明文密碼轉換成Hash密碼,配置到ProxySQL中的mysql_users表 

    mysql_users表,支援明文密碼和Hash密碼的寫入,但生產環境,我們還是建議用Hash密碼。     將明文密碼轉換Hash密碼有兩種方式:     1.    通過PASSWORD()            該函式生成Hash密碼,但該函式ProxySQL是不支援的,需要在MySQL資料庫裡自行生成,再貼上加密後的密碼插入到ProxySQL中。     2.    通過變數:admin-hash_passwords(推薦)             此引數預設開啟,明文密碼存放到MEMORY的mysql_user中,一旦load到RUNTIME會自動HASH加密。             然後再SAVE回MEMORY/DISK即可完成明文到Hash密碼的轉換                      

9.    限制User和ProxySQL之間的連線數

  

10.    同個事務內的SQL,禁止被路由到不同節點上

    啟動事務後,可能會根據查詢規則將某些查詢傳送到其他主機組。 為了防止這種情況發生,可以開啟transaction_persistent       還有很多沒有總結,一點點來,基礎知識梳理完成,會對核心功能再進行測試說明,希望對需要的同學有幫助