HA Proxy for MySQL - Apenas Failover

5

Estou interessado em usar o HA Pro como um balanceador de failover / carga em nosso ambiente MySQL. Nós temos uma configuração master-master + 2 slaves.

Eu gostaria que a configuração do mestre / mestre, mesmo que eles fossem configurados para isso, apenas escrevesse para um mestre. Isso é para evitar problemas com o cérebro dividido.

Eu planejo ter uma porta separada no proxy HA para as leituras e para que ela seja carregada de maneira balanceada.

É possível usar o proxy HA como um failover e, em caso afirmativo, como você o configuraria?

É algo como equilíbrio com roundrobin, mas dá a um dos servidores um peso de 1 e o outro um peso de 0? Com a ideia de que, se o primeiro servidor ficar offline, o segundo será usado, independentemente do peso?

    
por Jonathan 12.08.2012 / 04:34

2 respostas

6

Is it possible use HA proxy as a fail over only and if so, how would you set it?

Sim, é possível adicionar a opção backup o fim da linha server , algo assim:

frontend FE_mysql_writer
    bind V.I.P.A:3306
    default_backend BE_mysql_writer

backend BE_mysql_writer
    mode tcp
    balance roundrobin
    option tcpka
    option httpchk
    server mysql1 ip1:3306 weight 1 check port 9199 inter 12000 rise 3 fall 3
    server mysql2 ip2:3306 weight 1 check port 9199 inter 12000 rise 3 fall 3 backup

A porta 9199 é usada para monitorar o status do MySQL:

/etc/services

mysqlchk    9199/tcp            # mysqlchk

/etc/xinetd.d/mysqlchk

# /etc/xinetd.d/mysqlchk
# default: on
# description: mysqlchk
service mysqlchk
{
        flags           = REUSE
        socket_type     = stream
        port            = 9199
        wait            = no
        user            = nobody
        server          = /opt/mysqlchk
        log_on_failure  += USERID
        disable         = no
        only_from       = 0.0.0.0/0 # recommended to put the IPs that need
                                    # to connect exclusively (security purposes)
        per_source      = UNLIMITED # Recently added (May 20, 2010)
                                    # Prevents the system from complaining
                                    # about having too many connections open from
                                    # the same IP. More info:
                                    # http://www.linuxfocus.org/English/November2000/article175.shtml
}

/opt/mysqlchk

#!/bin/bash
# /opt/mysqlchk 
# This script checks if a mysql server is healthy running on localhost. It will
# return:
#
# "HTTP/1.x 200 OK\r" (if mysql is running smoothly)
#
# - OR -
#
# "HTTP/1.x 500 Internal Server Error\r" (else)
#
# The purpose of this script is make haproxy capable of monitoring mysql properly
#
# Author: Unai Rodriguez
#
# It is recommended that a low-privileged-mysql user is created to be used by
# this script. Something like this:
#
# mysql> GRANT SELECT on mysql.* TO 'mysqlchkusr'@'localhost' \
#     -> IDENTIFIED BY '257retfg2uysg218' WITH GRANT OPTION;
# mysql> flush privileges;

MYSQL_HOST="localhost"
MYSQL_PORT="3306"
MYSQL_USERNAME="mysqlchkusr"
MYSQL_PASSWORD="pa$$w0rd"

TMP_FILE="/tmp/mysqlchk.out"
ERR_FILE="/tmp/mysqlchk.err"

#
# We perform a simple query that should return a few results :-p
#
/usr/bin/mysql --host=$MYSQL_HOST --port=$MYSQL_PORT --user=$MYSQL_USERNAME \
    --password=$MYSQL_PASSWORD -e"show databases;" > $TMP_FILE 2> $ERR_FILE

#
# Check the output. If it is not empty then everything is fine and we return
# something. Else, we just do not return anything.
#
if [ "$(/bin/cat $TMP_FILE)" != "" ]
then
    # mysql is fine, return http 200
    /bin/echo -e "HTTP/1.1 200 OK\r\n"
    /bin/echo -e "Content-Type: Content-Type: text/plain\r\n"
    /bin/echo -e "\r\n"
    /bin/echo -e "MySQL is running.\r\n"
    /bin/echo -e "\r\n"
else
    # mysql is fine, return http 503
    /bin/echo -e "HTTP/1.1 503 Service Unavailable\r\n"
    /bin/echo -e "Content-Type: Content-Type: text/plain\r\n"
    /bin/echo -e "\r\n"
    /bin/echo -e "MySQL is *down*.\r\n"
    /bin/echo -e "\r\n"
fi

Fonte: link

Mas espere, quando um mestre falha, como você aponta os escravos para o novo mestre? É melhor usar o HAProxy para balancear as operações de leitura e deixar a operação de gravação (incluindo o failover) para o Agentes de Recursos do Pacemaker Percona .

    
por 12.08.2012 / 12:17
1

Observe que algumas implementações de cliente do mysql (como o conector JDBC oficial) suportam isso sem usar carga software balanceador. Se acontecer de você ter tanta sorte (ou azar) que você tenha esse conector e controle sobre sua configuração, existem alguns benefícios, a saber:

  • Failover do lado do cliente. Um exemplo a menos em que algo pode dar errado.

  • Aumento do desempenho de leitura usando os nós de failover para leituras.

  • Baixa latência (o que é mais difícil, mas muito importante em algumas configurações)

Veja os exemplos para o JDBC.

E há mysqlproxy que resolve mais ou menos da mesma maneira que o ha-proxy.

    
por 12.08.2012 / 14:44

Tags