MySQL 的 HA 代理 - 仅限故障转移

Jon*_*han 6 mysql haproxy

我有兴趣在我们的 MySQL 环境中使用 HA 代理作为故障转移/负载平衡器。我们有一个 master-master + 2 slaves 设置。

我希望 master/master 设置,即使它们已经设置好了,也只能写入一个 master。这是为了避免裂脑问题。

我确实计划在 HA 代理上有一个单独的端口用于读取和负载平衡。

是否可以仅将 HA 代理用作故障转移,如果可以,您将如何设置?

是否类似于使用轮询进行平衡,但将其中一台服务器的权重设为 1,另一台服务器的权重设为 0?想法是如果第一台服务器离线,无论其重量如何,第二台都将被使用?

qua*_*nta 7

是否可以仅将 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
Run Code Online (Sandbox Code Playgroud)

端口 9199 用于监控 MySQL 状态:

/etc/services

mysqlchk    9199/tcp            # mysqlchk
Run Code Online (Sandbox Code Playgroud)

/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
}
Run Code Online (Sandbox Code Playgroud)

/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
Run Code Online (Sandbox Code Playgroud)

资料来源:http : //sysbible.org/2008/12/04/have-haproxy-check-mysql-status-through-a-xinetd-script/


但是等等,当一个master失败时,你如何将slaves指向新的master?您最好使用 HAProxy 对读取操作进行负载平衡,并将写入操作(包括故障转移)交给Percona Pacemaker Resource Agents处理。