在Linux 下 用HAProxy给MySQL做负载均衡

  • Post author:
  • Post category:linux







写在前面:由于mysql master 主机上的xinet传给Haproxy的状态不稳定,haproxy会不停的切换mysql主机,造成网站应用反应慢,建议做mysql主从服务器者谨用(用mysql-proxy读写分离代替),mysql cluster方案可以用。




1. 添加监控MySQL状态的端口

在db服务器上(每台都一样)

安装xinetd


# yum

install xinetd

# vi /etc/services

================================================

mysqlcheck





6033/tcp























# MySQL status check

2. 使用xinetd守护进程运行MySQL状态检测

在db服务器上

# cat /etc/xinetd.d/mysqlchk

=================================================

service mysqlcheck

{









disable








= no








flags










= REUSE








socket_type




= stream








port











= 6033








wait











= no








user











= root








server









= /usr/local/haproxy/sbin/mysqlchk_status.sh








log_on_failure

+= USERID








only_from






= 192.168.3.0/24 # recommended to put the IPs that need




































# to connect exclusively (security purposes)

}

3. 状态检测脚本

在db服务器上

# vi /usr/local/haproxy/sbin/mysqlchk_status.sh

================================================


#/bin/bash

MYSQL_HOST=”localhost”

MYSQL_PORT=”3306″

MYSQL_USERNAME=”root”

MYSQL_PASSWORD=”123456″



#ERROR_MSG=/usr/bin/mysql –host=$MYSQL_HOST –port=$MYSQL_PORT –user=$MYSQL_USERNAME –password=$MYSQL_PASSWORD -e “show databases;”



ERROR_MSG=`ps -e | grep mysqld |wc -l`

if [ “$ERROR_MSG” != “0” ]

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


==================================================================

# chmod +x

/usr/local/haproxy/sbin/mysqlchk_status.sh

# service xinetd stop

# service xinetd start

# chown haproxy.haproxy /usr/local/haproxy/sbin/mysqlchk_status.sh

4. HAproxy日志

# touch /var/log/haproxy.log

# chown haproxy.haproxy /var/log/haproxy.log

编辑/etc/syslog.conf文件,添加如下语句

local0.*















































/var/log/haproxy.log

5. HAProxy配置文件

在均衡服务器上

[root@localhost htdocs]# cat /usr/local/haproxy/conf/haproxy.conf

================================================================

global








maxconn 4096








daemon








pidfile /usr/local/haproxy/run/haproxy.pid








#debug








#quiet








user haproxy








group haproxy



defaults








log




global








mode



http








option

httplog








option

dontlognull








log 127.0.0.1 local0








retries 3








option redispatch








maxconn 2000








contimeout





5000








clitimeout





50000

#如果程序执行时间很长,把这个值调大一些 我在后面多加两个0改成5000000 毫秒








srvtimeout





50000



listen

admin_stats 192.168.0.1:80








mode







http








stats uri


/dbs








stats realm




Global\ statistics








stats auth

test:123456



listen

proxy-mysql 0.0.0.0:23306








mode tcp








balance roundrobin








option httpchk OPTIONS * HTTP/1.1\r\nHost:\ www








server db01 192.168.0.1:3306 weight 1 check port 6033 inter 1s rise 2 fall 2








server db02 192.168.0.2:3306 weight 1 check port 6033 inter 1s rise 2 fall 2








option tcpka

===================================================

6. HAProxy启动脚本

在均衡服务器上

# cat /etc/init.d/haproxy

===================================================


#! /bin/sh

set -e



PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/haproxy/sbin

PROGDIR=/usr/local/haproxy

PROGNAME=haproxy

DAEMON=$PROGDIR/sbin/$PROGNAME

CONFIG=$PROGDIR/conf/$PROGNAME.conf

PIDFILE=$PROGDIR/run/$PROGNAME.pid

DESC=”HAProxy daemon”

SCRIPTNAME=/etc/init.d/$PROGNAME



# Gracefully exit if the package has been removed.

test -x $DAEMON || exit 0



start()

{









echo -n “Starting $DESC: $PROGNAME”








$DAEMON -f $CONFIG








echo “.”

}



stop()

{









echo -n “Stopping $DESC: $PROGNAME”








haproxy_pid=cat $PIDFILE








kill $haproxy_pid








echo “.”

}



restart()

{









echo -n “Restarting $DESC: $PROGNAME”








$DAEMON -f $CONFIG -p $PIDFILE -sf $(cat $PIDFILE)








echo “.”

}



case “$1” in


start)








start








;;


stop)








stop








;;


restart)








restart








;;


*)








echo “Usage: $SCRIPTNAME {start|stop|restart}” >&2








exit 1








;;

esac



exit 0