我已设置 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
编辑:您忘记添加
filters=Cache
到服务定义。这就是为什么它看起来不起作用的原因。默认情况下,过滤器仅适用于使用它们的服务。要将它们投入使用并将它们组合成过滤器链,请将
filters
参数添加到服务中,并将过滤器作为参数添加到服务中,并用竖线字符 (|
) 分隔:cache_data=thread_specific
将为 MaxScale 中的每个工作线程分配一个单独的缓存。这意味着对缓存的访问速度更快,但它减少了连接之间的共享。平均而言,您将看到与 MaxScale 中配置的线程一样多的请求(在您的情况下threads=auto
意味着与 CPU 内核一样多)。如果您想进一步减少最终发送到数据库的查询数量,您可以使用cache_data=shared
.连接计数预计与没有缓存的情况相同:缓存仅在结果级别起作用,而不是连接级别。为避免在缓存提供所有结果时连接到数据库,请
lazy_connect=true
在readwritesplit
服务中使用。这将延迟连接创建,直到请求实际最终发送到数据库。lazy_connect
即使启用并且所有请求都相同,也可能仍然会创建一些后端连接。如果执行更改连接状态的命令(例如SET NAMES utf8mb4
),通常会发生这种情况。缓存不存储这些结果,因为它们不是读取的,这意味着它们总是从数据库中检索。