如何使用 MaxScale 限制不良應用程序對 MariaDB Galera 集群的影響?
我有一個具有三個 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
我
connection_timeout, max_connections, max_user_connections
在數據庫伺服器節點上嘗試過配置,但沒有幫助。當錯誤的應用程序進行連接嘗試並且達到門檻值時,數據庫伺服器會斷開與"Too many connections"
. Maxscale 觀察了一段時間,並將後端伺服器置於Maintenance
. 設置max_users_connections
某個值說:200,導致後端伺服器在單個使用者達到限制時拒絕連接。現在,當Too many connections
由於“max_users_connectionslimit threshold breach due to bad application, Maxscale again marks the server in
維護”狀態而出現多次故障時。它不區分嘗試來自單個使用者或多個使用者的集體。它只看到來自伺服器的“連接過多”故障。為了解決這種情況,我在 Maxscale 下為
max_connections
設置了限制的不良行為應用程序創建了一個單獨的服務。在服務的不同埠號上創建了一個單獨的偵聽器。由於單獨的服務,只要
max_connections
達到 MAxscale 的門檻值,其他客戶端不受影響。此外,請注意max_connections
後端 MariadB 伺服器的限制大於 Maxscale 上配置的值,因此 Maxscale 上的門檻值更早達到,並且它永遠不會將後端伺服器放入Maintenance mode
. Maxscale 的新配置塊如下 -[Galera-Service] type=service router=readwritesplit master_accept_reads=true connection_keepalive=300s master_reconnection=true master_failure_mode=error_on_write connection_timeout=300s max_connections=2500 servers=mariadb1, mariadb2, mariadb3 user=user password=password [Galera-Service-Bad-App] type=service router=readwritesplit master_accept_reads=true connection_keepalive=300s master_reconnection=true master_failure_mode=error_on_write connection_timeout=300s max_connections=250 servers=mariadb1, mariadb2, mariadb3 user=user password=password # [Galera-Listener] type=listener service=Galera-Service protocol=MariaDBClient port=4306 [Galera-Listener-astro] type=listener service=Galera-Service-Badd-App protocol=MariaDBClient port=4307
我不認為 MaxScale 是您要用來解決此問題的組件。可以在 MariaDB 伺服器本身中執行此操作。我遇到了完全相同的問題,並通過使用該
max_user_connections
設置對數據庫使用者施加限制來解決它。wait_timeout=31536000
為什麼這個值這麼大?您的應用程序是否保持連接打開而不是創建新連接?雖然這聽起來像是個好主意,但這意味著連接意外保持打開/空閒狀態直到很久以後才會關閉。
對於作為管理員的我來說,情況變得相同,設置使用者特定的限制並不能實現任何目標。
我不認為這是正確的。
Q1。如何防止只有一個使用者連接失敗將後端 mariadb 節點投入維護?
如果您限制數據庫使用者,使得
max_user_connection
所有使用者的總和 <max_connections
每個節點的總和,那麼使用者將無法達到max_connections
限制。Q2。關於 MaxScale 如何以及何時決定將伺服器置於維護模式的任何文件或教程、文章參考?
我認為沒有一個單獨的文件,而是分散在 MaxScale 文件中。我認為維護模式最初是作為管理員安排計劃停機時間的一種方式,但後來也被用於其他事情,請參閱如maintenance_on_low_disk_space