MySQL中間件之ProxySQL(4):多層配置系統

来源:https://www.cnblogs.com/f-ck-need-u/archive/2018/07/08/9280793.html
-Advertisement-
Play Games

1.ProxySQL中的庫 使用ProxySQL的Admin管理介面連上ProxySQL,可查看ProxySQL擁有的庫。 其中: main庫是ProxySQL最主要的庫,是 需要修改配置時使用的庫 ,它其實是一個 記憶體資料庫系統 。所以,修改main庫中的配置後,必須將其持久化到disk上才能永久 ...


1.ProxySQL中的庫

使用ProxySQL的Admin管理介面連上ProxySQL,可查看ProxySQL擁有的庫。

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 |
+-----+---------------+-------------------------------------+

其中:

  • main庫是ProxySQL最主要的庫,是需要修改配置時使用的庫,它其實是一個記憶體資料庫系統。所以,修改main庫中的配置後,必須將其持久化到disk上才能永久保存。
  • disk庫是磁碟資料庫,該資料庫結構和記憶體資料庫完全一致。當持久化記憶體資料庫中的配置時,其實就是寫入到disk庫中。磁碟資料庫的預設路徑為$DATADIR/proxysql.db
  • stats庫是統計信息庫。這個庫中的數據一般是在檢索其內數據時臨時填充的,它保存在記憶體中。因為沒有相關的配置項,所以無需持久化。
  • monitor庫是監控後端MySQL節點相關的庫,該庫中只有幾個log類的表,監控模塊收集到的監控信息全都存放到對應的log表中。
  • stats_history庫是1.4.4版新增的庫,用於存放歷史統計數據。預設路徑為$DATADIR/proxysql_stats.db

ProxySQL內部使用的是SQLite3資料庫,無論是記憶體資料庫還是磁碟資料庫,都是通過SQLite3引擎進行解析、操作的。它和MySQL的語法可能稍有不同,但ProxySQL會對不相容的語法自動進行調整,最大程度上保證MySQL語句的有效率。

上面描述main庫的時候,只是說了記憶體資料庫需要持久化到disk庫才能永久保存配置。但實際上,修改了main庫中的配置後,並不會立即生效,它還需要load到runtime的數據結構中才生效,只有在runtime數據結構中的配置才是對ProxySQL當前有效的配置。請看下麵的"多層配置系統"。

2.ProxySQL的多層配置系統

ProxySQL的配置系統非常強大,它能線上修改幾乎所有配置(僅有的兩個需要重啟才能生效的變數mysql-threadsmysql-stacksize),並線上生效、持久化保存。這得益於它採用的多層配置系統。

多層配置系統結構如下:

       +-------------------------+
       |         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庫為空)。

中間層的是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可以縮寫為MEMruntime可以縮寫為run

另外,上面的XXX是什麼?這表示要載入/保存的是哪類配置。目前的ProxySQL支持以下幾種:

  • [x] mysql users
  • [x] mysql servers
  • [x] mysql variables
  • [x] mysql query rules
  • [x] admin variables
  • [x] scheduler
  • [ ] proxysql_servers:目前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;

3.啟動ProxySQL時如何載入配置

如果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的一次普通故障,此時可使用該變數。

    4.關於傳統配置文件

傳統配置文件預設路徑為/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"
#        }
)

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 一、概述 在前面的文章中介紹過了redis的主從和哨兵兩種集群方案,redis從3.0版本開始引入了redis-cluster(集群)。可以說從主從-哨兵-集群可以看到redis的不斷完善;主從複製是最簡單的節點同步方案無法主從自動故障轉移。哨兵可以同時管理多個主從同步方案同時也可以處理主從自動故障 ...
  • 主要: DDL: Data Definition Language 數據定義語言 資料庫操作語句 創建庫 創建資料庫: create database dbname [charset 字元編碼] [collate 排序規則]; 如: 查詢庫 1) 查看所有可用的字元編碼: show charset; ...
  • 占座 ...
  • 1. 官網下載安裝 MongoDB https://www.mongodb.com/ 2. 環境變數設置 把 mongod.exe 所在路徑加入到環境變數的PATH, 我這裡安裝的路徑是 D:\db\MongoDB\Server\3.4\bin 3.註冊為windows服務 在cmd命令視窗下執行 ...
  • 今天使用ide連接線下MySQL報錯Can not connect to MySQL server. Too many connections,報錯很明確,與MySQL的連接數滿了。想想也是,每起一個服務都會創建MySQL連接池,占用不少的長連接。用ide查看了一下,原來最大連接數才151,看來有必 ...
  • 1.ProxySQL的Admin管理介面 當ProxySQL啟動後,將監聽兩個埠: (1).admin管理介面,預設埠為6032。該埠用於查看、配置ProxySQL。 (2).接收SQL語句的介面,預設埠為6033,這個介面類似於MySQL的3306埠。 ProxySQL的admin管理接 ...
  • DDL 數據定義語言 CREATE ALTER DROP DML 數據操作語言 INSERT UPDATE DELETE DQL 數據查詢語言 SELECT TCL 事務控制語言 COMMIT ROLLBACK DCL 數據控制語言 GRANT REVOKE 視圖: 1.簡化SQL語句;2.提供了一 ...
  • Oracle的集合運算符有並集union、union all,交集intersect,差集minus 先建表myemp,進行集合運算的測試 並集 union all不過濾掉集合中重覆的數據 union過濾掉集合中重覆的數據 交集 返回兩個集合中相同的數據組成新的查詢結果 差集 返回集合1中獨有而集合 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...