Назад | Перейти на главную страницу

HA Proxy для MySQL - только отработка отказа

Я заинтересован в использовании HA-прокси в качестве средства восстановления после отказа / балансировки нагрузки в нашей среде MySQL. У нас есть настройка master-master + 2 slave.

Я бы хотел, чтобы настройки master / master, даже если они настроены для этого, записывались только в один мастер. Это сделано для того, чтобы избежать проблем с разделенным мозгом.

Я планирую создать отдельный порт на прокси-сервере HA для чтения и балансировки нагрузки.

Можно ли использовать прокси-сервер HA только для отработки отказа, и если да, то как бы вы его установили?

Это что-то вроде баланса с roundrobin, но дать одному из серверов вес 1, а другому - 0? Идея в том, что если первый сервер отключится, второй будет использоваться независимо от его веса?

Можно ли использовать прокси-сервер HA только для отработки отказа, и если да, то как бы вы его установили?

Да, это возможно, добавив backup вариант до конца server строка, примерно так:

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

Порт 9199 используется для мониторинга состояния 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

Источник: http://sysbible.org/2008/12/04/having-haproxy-check-mysql-status-through-a-xinetd-script/


Но подождите, когда ведущий выходит из строя, как вы направите ведомые устройства на нового мастера? Вам лучше использовать HAProxy для балансировки нагрузки операций чтения и позволить операции записи (включая переключение) на Ресурсные агенты Percona Pacemaker ручка.

Обратите внимание, что некоторые клиентские реализации mysql (например, официальная Разъем JDBC) поддерживает это без использования программного обеспечения балансировки нагрузки. Если вам так повезло (или не повезло), что у вас есть такой коннектор и вы можете контролировать его конфигурацию, есть несколько преимуществ, а именно:

  • Отказоустойчивость на стороне клиента. На один случай меньше, когда что-то может пойти не так.

  • Повышенная производительность чтения за счет использования отказоустойчивых узлов для чтения.

  • Более низкая задержка (в основном это придирки, но очень важно в некоторых настройках)

Видеть Примеры для JDBC.

И есть mysqlproxy который решает это более или менее так же, как ha-proxy.