Verificação de saúde do escravo do MySQL

3

Estou trabalhando em um projeto como criar a configuração do banco de dados, ter uma matriz de réplicas de leitura para a instância mysql e manter uma conexão aberta a cada uma e manter suas estatísticas nesse serviço, assim quando um cliente tenta conectar uma réplica de leitura é suposto retornar menos ocupado.

Minhas perguntas são qual deve ser a fórmula para isso?

Eu tenho apenas 2 variáveis até agora, quaisquer melhorias para essas variáveis são bem-vindas também.

  1. O servidor remoto está ativo
  2. Quantas conexões ativas ela tem com Threads_connected
  3. A replicação está saudável
por Kevin Lee 24.08.2011 / 03:54

2 respostas

1

Eu projetei sistemas que direcionam o volume de consultas em um cenário semelhante. Pode ser interessante incluir várias outras coisas:

  • tempo médio de resposta para o tráfego real para o candidato (não apenas uma consulta de monitoramento)
  • número de consultas no último período de tempo (60s, etc)
  • utilização da memória / cpu / disco durante um período de tempo anterior

Eu já dei um peso a cada um dos recursos e basicamente os somei. Então, em um único servidor, você pode voltar:

memory 50(%)
cpu 40(%)
disk 4000 (iops, if you know the limit here making it a % is good)
ms 300 (msecs average response time)

o peso deste servidor seria 4390 (maior seria pior aqui). Você pode ver aqui onde, talvez, se a CPU é menos preocupante, você pode alterar seu 'peso' no cálculo para tomar a decisão de qual cliente usar com mais precisão para o seu ambiente.

O modo como você coleta isso pode fazer a diferença com a frequência com que pode ser coletado e com a confiabilidade dele (talvez um nó tenha morrido desde que você fez a lista de servidores menos usados). Uma abordagem é executar um daemon de relatórios em cada candidato e consultá-lo quando você receber uma solicitação do cliente, talvez por meio de multicast. O daemon de relatórios pode coletar estatísticas com muita frequência para tornar as informações de decisão mais precisas possíveis.

Não está claro o quão transitória é a configuração que você está gerando, o que é uma consideração importante ao fazer a distribuição. Você terá clientes conectados por longos períodos de tempo? É possível que você precise desconectar e redistribuir clientes porque um servidor ficou sobrecarregado? Talvez algo que você já tenha considerado.

Dependendo de quão transitória você é e quanto você sabe sobre as consultas, você também pode adicionar mais dados às métricas de decisão:

  • o peso esperado do cliente atualmente sendo atendido pelo candidato (se você também der pesos aos clientes)
  • conjunto de dados já na memória (se o tamanho dos dados exceder a capacidade de memória do servidor e você tiver mais do que alguns servidores, poderá melhorar a utilização da RAM equilibrando consultas para conjuntos de dados específicos para servidores que já os possuem na memória)
  • tempo de atividade do servidor (uma caixa nova totalmente descarregada geralmente será esmagada em cenários baseados em peso, em que as decisões são tomadas com frequência)

Espero que isso ajude! É um problema interessante.

    
por 24.08.2011 / 07:51
1

Você pode fazer isso com um script simples ou usar os plug-ins do Nagios.

  1. check_ping ou check_icmp

  2. check_mysql_health , algo assim:

    define command{
        command_name    check_mysql_health
        command_line    $USER1$/check_mysql_health -t 20 --hostname $HOSTADDRESS$ --port $ARG1$ --username $ARG2$ --password $ARG3$ --mode $ARG4$ --warning $ARG5$ --critical $ARG6$
    }

    define service{
            use                     generic-service
            host_name               mysql_slave
            service_description     MySQL_threads-connected
            check_command           check_mysql_health!3306!user!password!threads-connected!30!40
    }
    3

    define service{
            use                     critical-service
            host_name               mysql_slave
            service_description     MySQL_slave-io-running
            check_command           check_mysql_health!3307!user!password!slave-io-running
            contact_groups          admin-sms
    }

    define service{
            use                     critical-service
            host_name               mysql_slave
            service_description     MySQL_slave-sql-running
            check_command           check_mysql_health!3307!user!password!slave-sql-running
            contact_groups          admin-sms
    }
    
por 24.08.2011 / 04:26