AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / dba / Perguntas / 286204
Accepted
Amit P
Amit P
Asked: 2021-03-01 23:22:28 +0800 CST2021-03-01 23:22:28 +0800 CST 2021-03-01 23:22:28 +0800 CST

Como limitar o impacto de um aplicativo ruim no MariaDB Galera Cluster com MaxScale?

  • 772

Eu tenho um cluster Galera Replication com três nós MariaDB onde um cluster Maxscale Active-Passive na frente fornece uma imagem de nó único para clientes tis.

Eu tenho um cliente de mau comportamento, que abre conexões e não as fecha. O número de conexões continua aumentando até que os limites do banco de dados sejam atingidos. Para limitar o número de conexões que configurei abaixo de dois parâmetros

max_connections=
max_user_connections=

Minha situação é essa, quando tenho apenas max_connections configurados, sempre que os limites são atingidos o nó Galera deixa de aceitar mais conexão com erro de "Too many connections". Quando o Maxscale vê essas rejeições de conexão n vezes, ele coloca o servidor em modo de manutenção . Eu posso entender esse comportamento, é esperado. Quando configuro max_user_connections, e porque o aplicativo está se comportando mal e tentando fazer novas conexões continuamente, quando o limite específico do usuário atinge mais tentativas de conexões falham nos nós mariadb no backend. O Maxscale observa essas falhas e novamente coloca o servidor no modo Manutenção . Acredito que durante esse tempo ele veja apenas tentativas de conexão do cliente ruim, nenhum outro aplicativo tentou se conectar.

E desta forma, MaxScale coloca todos os três nós no modo de Manutenção ao longo do tempo, o que torna o serviço DB completo indisponível.

Para mim como administrador, a situação se torna a mesma, colocar um limite específico de usuário não alcança nada. Eu gostaria de perguntar dois pontos aqui

Q1. Como posso evitar que apenas uma falha de conexão de usuário coloque o nó mariadb de back-end em manutenção?

Q2. Alguma documentação, ou tutoriais, referência de artigo sobre como e quando MaxScale decide colocar um servidor em modo de manutenção?

Abaixo estão os detalhes sobre o ambiente

Galera - 25.3.23, MariaDB - 10.3.12, MaxScale - 2.4.11, OS - RHEL 7.4 (Maipo)

Aqui está minha configuração

Configuração da Galeria MariaDB

[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

Da mesma forma, todos os três nós Galera são configurados.

Configuração 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

mariadb galera
  • 2 2 respostas
  • 454 Views

2 respostas

  • Voted
  1. dbdemon
    2021-03-22T10:39:46+08:002021-03-22T10:39:46+08:00

    Não acho que MaxScale seja o componente que você deseja usar para corrigir esse problema. É possível fazer isso no próprio servidor MariaDB. Eu experimentei exatamente o mesmo problema e o resolvi impondo limites aos usuários do banco de dados usando a max_user_connectionsconfiguração.

    wait_timeout=31536000

    Por que esse valor é tão grande? Seus aplicativos mantêm as conexões abertas em vez de criar novas? Embora isso possa parecer uma boa ideia, significa que as conexões deixadas acidentalmente abertas/ociosas não serão fechadas até muito mais tarde.

    Para mim como administrador, a situação se torna a mesma, colocar um limite específico de usuário não alcança nada.

    Eu não acho que isso é correto.

    Q1. Como posso evitar que apenas uma falha de conexão de usuário coloque o nó mariadb de back-end em manutenção?

    Se você limitar os usuários do banco de dados para que a soma de max_user_connectionpara todos os usuários < max_connectionspara cada um dos nós, os usuários não poderão atingir o max_connectionslimite.

    Q2. Alguma documentação, ou tutoriais, referência de artigo sobre como e quando MaxScale decide colocar um servidor em modo de manutenção?

    Eu não acho que haja um único documento para isso, mas está espalhado pela documentação do MaxScale. Acho que o modo de manutenção começou como uma maneira de o administrador agendar o tempo de inatividade planejado, mas desde então também foi usado para outras coisas, veja, por exemplo, maintenance_on_low_disk_space

    • 0
  2. Best Answer
    Amit P
    2021-10-28T22:50:00+08:002021-10-28T22:50:00+08:00

    Eu tentei connection_timeout, max_connections, max_user_connectionsconfigurações nos nós do servidor de banco de dados, mas não ajudou. Quando o aplicativo inválido está fazendo tentativas de conexão e atinge o limite, os servidores de banco de dados descartam as conexões com "Too many connections". Maxscale observa isso por algum tempo e coloca os servidores de back-end em Maintenance. A configuração max_users_connectionspara algum valor, digamos: 200, faz com que o servidor de back-end rejeite conexões quando o limite atinge um único usuário. Agora, quando houver várias Too many connectionsfalhas devido ao estado 'max_users_connections limit threshold breach due to bad application, Maxscale again marks the server inMaintenance'. Não diferencia que as tentativas sejam de um único usuário ou de muitos usuários coletivamente. Ele apenas vê as falhas 'Muitas conexões' do servidor.

    Para resolver a situação, criei um serviço separado em Maxscale para o aplicativo de mau comportamento com o max_connectionslimite definido. Criou um listener separado em um número de porta diferente para o serviço.

    Devido a um serviço separado, sempre que o max_connectionslimite atinge em MAxscale, outros clientes não são afetados. Além disso, cuidou para que o max_connectionslimite nos servidores MariadB no back-end fosse maior do que o valor configurado no Maxscale, para que o limite atinja mais cedo no Maxscale e nunca coloque os servidores back-end no Maintenance mode. O novo bloco de configuração para Maxscale é como abaixo -

    [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
    
    
    
    • 0

relate perguntas

  • Erro de cabeçalho do MariaDB

  • Erro 1046 Mariadb: nenhum banco de dados selecionado

  • Você ainda usa o MyISAM ou prefere o mecanismo de armazenamento Aria?

  • Como posso melhorar minha instrução SQL com resultados semanais com semana começando na quinta-feira ou em qualquer outro dia da semana?

  • Quando é o momento certo para usar o MariaDB em vez do MySQL e por quê?

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host

    • 12 respostas
  • Marko Smith

    Como fazer a saída do sqlplus aparecer em uma linha?

    • 3 respostas
  • Marko Smith

    Selecione qual tem data máxima ou data mais recente

    • 3 respostas
  • Marko Smith

    Como faço para listar todos os esquemas no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Listar todas as colunas de uma tabela especificada

    • 5 respostas
  • Marko Smith

    Como usar o sqlplus para se conectar a um banco de dados Oracle localizado em outro host sem modificar meu próprio tnsnames.ora

    • 4 respostas
  • Marko Smith

    Como você mysqldump tabela (s) específica (s)?

    • 4 respostas
  • Marko Smith

    Listar os privilégios do banco de dados usando o psql

    • 10 respostas
  • Marko Smith

    Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Como faço para listar todos os bancos de dados e tabelas usando o psql?

    • 7 respostas
  • Martin Hope
    Jin conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane Como faço para listar todos os esquemas no PostgreSQL? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh Por que o log de transações continua crescendo ou fica sem espaço? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland Listar todas as colunas de uma tabela especificada 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney O MySQL pode realizar consultas razoavelmente em bilhões de linhas? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx Como posso monitorar o andamento de uma importação de um arquivo .sql grande? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison Como você mysqldump tabela (s) específica (s)? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas Como posso cronometrar consultas SQL usando psql? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas Como faço para listar todos os bancos de dados e tabelas usando o psql? 2011-02-18 00:45:49 +0800 CST

Hot tag

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve