我有兴趣在我们的 MySQL 环境中使用 HA 代理作为故障转移/负载平衡器。我们有一个 master-master + 2 slaves 设置。
我希望 master/master 设置,即使它们已经设置好了,也只能写入一个 master。这是为了避免裂脑问题。
我确实计划在 HA 代理上有一个单独的端口用于读取和负载平衡。
是否可以仅将 HA 代理用作故障转移,如果可以,您将如何设置?
是否类似于使用轮询进行平衡,但将其中一台服务器的权重设为 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
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处理。