Mariadb

MariaDB Maxscale 記憶體不起作用

  • January 31, 2022

我已設置 Maxscale (v6.2) 並已連接到 Galera 集群(3 個節點 - MariaDB 10.5)。我正在嘗試使用記憶體過濾器,但它似乎不起作用。我為所有節點啟用了通用日誌,每當我執行查詢時,我都可以看到查詢是從節點而不是 Maxscale 記憶體中提供的。

我還注意到,當我使用並發 10 的 mysqlslap 時,我發現每個節點中的通用日誌文件顯示 10 次連接,實際查詢命中為 3。當我使用 Haproxy 進行類似操作時,通用日誌顯示 3 次連接並命中還有 3. 不確定 Maxscale 是否需要正確設置任何內容。

這是我的 maxscale.cnf

# MaxScale documentation:
# https://mariadb.com/kb/en/mariadb-maxscale-25/

# Global parameters
#
# Complete list of configuration options:
# https://mariadb.com/kb/en/mariadb-maxscale-25-mariadb-maxscale-configuration-guide/

[maxscale]
threads=auto
log_info=true

# Server definitions
#
# Set the address of the server to the network
# address of a MariaDB server.
#

[server1]
type=server
address=1.1.1.1
port=3306
protocol=MariaDBBackend

[server2]
type=server
address=1.1.1.2
port=3306
protocol=MariaDBBackend

[server3]
type=server
address=1.1.1.3
port=3306
protocol=MariaDBBackend

# Monitor for the servers
#
# This will keep MaxScale aware of the state of the servers.
# MariaDB Monitor documentation:
# https://mariadb.com/kb/en/maxscale-25-monitors/

[Galera-Monitor]
type=monitor
module=galeramon
servers=server1,server2,server3
user=maxscale
password=XXXXXXXX
monitor_interval=2000

#Galera router service
[Galera-Service]
type=service
router=readwritesplit
servers=server1,server2,server3
user=maxscale
password=XXXXXXXX
lazy_connect=true

#Galera cluster listener
[Galera-Listener]
type=listener
service=Galera-Service
protocol=MariaDBClient
address=0.0.0.0
port=3306

#cache
[Cache]
type=filter
module=cache
storage=storage_inmemory
soft_ttl=300s
hard_ttl=600s
cached_data=shared

下圖顯示了查詢被路由到伺服器而不是從記憶體中提供服務的 maxscale 日誌。在此處輸入圖像描述

**編輯:**您忘記添加filters=Cache到服務定義。這就是為什麼它看起來不起作用的原因。

預設情況下,過濾器僅適用於使用它們的服務。要將它們投入使用並將它們組合成過濾器鏈,請將filters參數添加到服務中,並將過濾器作為參數添加到服務中,並用豎線字元 ( |) 分隔:

filter=FirstFilter|SecondFilter

cache_data=thread_specific將為 MaxScale 中的每個工作執行緒分配一個單獨的記憶體。這意味著對記憶體的訪問速度更快,但它減少了連接之間的共享。平均而言,您將看到與 MaxScale 中配置的執行緒一樣多的請求(在您的情況下threads=auto意味著與 CPU 核心一樣多)。如果您想進一步減少最終發送到數據庫的查詢數量,您可以使用cache_data=shared.

連接計數預計與沒有記憶體的情況相同:記憶體僅在結果級別起作用,而不是連接級別。為避免在記憶體提供所有結果時連接到數據庫,請lazy_connect=truereadwritesplit服務中使用。這將延遲連接創建,直到請求實際最終發送到數據庫。

lazy_connect即使啟用並且所有請求都相同,也可能仍然會創建一些後端連接。如果執行更改連接狀態的命令(例如SET NAMES utf8mb4),通常會發生這種情況。記憶體不儲存這些結果,因為它們不是讀取的,這意味著它們總是從數據庫中檢索。

引用自:https://dba.stackexchange.com/questions/306174