我有一个具有三个 MariaDB 节点的 Galera Replication 集群,其中前面的 Maxscale Active-Passive 集群为 tis 客户端提供单节点映像。
我有一个行为不端的客户端,它打开连接而不关闭它们。在数据库限制达到之前,连接数一直在增加。为了限制我在两个参数下配置的连接数
max_connections=
max_user_connections=
我的情况是这样,当我只配置了 max_connections 时,只要达到限制,Galera 节点就会停止接受更多连接,并出现“连接太多”错误。当 Maxscale 看到此连接拒绝 n 次时,它会将服务器置于维护模式。我可以理解这种行为,这是意料之中的。当我配置 max_user_connections 时,由于应用程序表现不佳并尝试不断建立新连接,当用户特定限制达到进一步的连接尝试时,后端的 mariadb 节点会失败。Maxscale 观察到这些故障,并再次将服务器置于维护模式。我相信在这段时间内它只会看到来自坏客户端的连接尝试,没有其他应用程序尝试连接。
通过这种方式,MaxScale 会随着时间的推移将所有三个节点都置于维护模式,这使得完整的数据库服务不可用。
对于作为管理员的我来说,情况变得相同,设置用户特定的限制并不能实现任何目标。这里想问两点
Q1。如何防止只有一个用户连接失败将后端 mariadb 节点投入维护?
Q2。关于 MaxScale 如何以及何时决定将服务器置于维护模式的任何文档或教程、文章参考?
以下是有关环境的详细信息
Galera - 25.3.23,MariaDB - 10.3.12,MaxScale - 2.4.11,操作系统 - RHEL 7.4 (Maipo)
这是我的配置
MariaDB Galera 配置
[server]
# this is only for the mysqld standalone daemon
[mysqld]
#user statistics
userstat=1
performance_schema
#wait_timeout=600
max_allowed_packet=1024M
#
lower_case_table_names=1
#
max_connections=1500
max_user_connections=200
#
# * Galera-related settings
#
[galera]
# Mandatory settings
wsrep_on=ON
wsrep_provider=/usr/lib64/galera/libgalera_smm.so
wsrep_provider_options="gcache.size=300M; gcache.page_size=300M; pc.ignore_sb=false; pc.ignore_quorum=false"
#wsrep_cluster_address defines members of the cluster
wsrep_cluster_address=gcomm://x.x.x.1,x.x.x.2,x.x.x.3
wsrep_cluster_name="mariadb-cluster"
wsrep_node_address=x.x.x.1
wsrep_node_incoming_address=x.x.x.1
wsrep_debug=OFF
#
binlog_format=row
default_storage_engine=InnoDB
innodb_autoinc_lock_mode=2
innodb_doublewrite=1
query_cache_size=0
innodb_flush_log_at_trx_commit=0
innodb_buffer_pool_size=5G
#
bind-address=x.x.x.1
#
[mariadb]
#performance
wait_timeout=31536000
#
#query logging
log_output=FILE
#slow queries
slow_query_log
slow_query_log_file=/var/log/mariadb/mariadb-slow.log
long_query_time=10.0
log_queries_not_using_indexes=ON
min_examined_row_limit=1000
log_slow_rate_limit=1
log_slow_verbosity=query_plan,explain
#
#error logs
log_error=/var/log/mariadb/mariadb-error.log
log_warnings=2
同样配置所有三个 Galera 节点。
MaxScale 配置
[maxscale]
threads=auto
# Server definitions
[mariadb1]
type=server
address=x.x.x.1
port=3306
protocol=MariaDBBackend
#priority=0
[mariadb2]
type=server
address=x.x.x.2
port=3306
protocol=MariaDBBackend
#priority=1
[mariadb3]
type=server
address=x.x.x.3
port=3306
protocol=MariaDBBackend
#priority=1
# Monitor for the servers
#
[Galera-Monitor]
type=monitor
module=galeramon
servers=mariadb1, mariadb2, mariadb3
user=xxx
password=xxx
#disable_master_role_setting=true
monitor_interval=1000
#use_priority=true
#
disable_master_failback=true
available_when_donor=true
# Service definitions
[Galera-Service]
type=service
router=readwritesplit
master_accept_reads=true
connection_keepalive=300s
master_reconnection=true
master_failure_mode=error_on_write
connection_timeout=3600s
servers=mariadb1, mariadb2, mariadb3
user=xxx
password=xxx
#filters=Query-Log-Filter
#Listener
[Galera-Listener]
type=listener
service=Galera-Service
protocol=MariaDBClient
port=4306