设为首页 收藏本站
查看: 1182|回复: 0

[经验分享] MySQL从库集群方案之HAProxy篇

[复制链接]

尚未签到

发表于 2015-9-4 14:03:55 | 显示全部楼层 |阅读模式

HAProxy 反向代理服务器支持双机热备支持虚拟主机,其配置简单,拥有非常不错的服务器健康检查功能。当其代理的后端服务器出现故障,HAProxy会自动将该服务器摘除,故障恢复后再自动将该服务器加入。本文介绍如何通过两台HAProxy服务器实现MySQL热备的集群方案。


【51CTO独家特稿】HAProxy反向代理服务器支持双机热备支持虚拟主机,其配置简单,拥有非常不错的服务器健康检查功能。当其代理的后端服务器出现故障,HAProxy会自动将该服务器摘除,故障恢复后再自动将该服务器加入。

这里有两台HAProxy机器,分别安装keepalived,组成热备形式。作用:当一台有问题,另一台可以在1秒内接管。

xinetd服务的作用是检测端口,本文中使用8890端口。HAProxy用http协议检测这个端口是否正常。

MySQL同步状态脚本,是放在从库本地,由xinetd服务来激活脚本,正常就会输出200状态码给HAProxy,证明从库正常;否则,就剔除。(这里就可以加上短信报警了)

系统架构图



使用软件


  • HAProxy 1.4.16
  • Keepalived 1.1.20
  • Xinetd 2.3.14
  • MySQL 同步状态脚本 0.2
一、系统约定

系统环境


  • OS:CentOS 5.6 x86_64
  • MASTER:192.168.1.65
  • BACKUP:192.168.1.66
  • VIP:192.168.1.67
  • serivce Port:3306
工作流程

准备工作:应用配置好slave的VIP 192.168.1.67 端口3306

(1)应用服务器

(2)连接HAProxy的vip 192.168.1.67:3306,根据算法,分配到一台slave。

(3)检测slave的8890端口是否返回http 200状态码。

(4)返回200 状态码,HAProxy 返回正常,继续服务。

(5)返回503,剔除该slave,并将mysql请求转发到另外一台slave。

(6)有问题的slave,发送短信报警,相关人员检查。

二、Keepalived 1.1.20的安装于配置

#cd /var/tmp/

#wget http://www.keepalived.org/software/keepalived-1.1.20.tar.gz

#tar zxvf keepalived-1.1.20.tar.gz

#cd keepalived-1.1.20

#./configure –prefix=/usr

#make && make install

#cp /usr/etc/rc.d/init.d/keepalived /etc/rc.d/init.d/

#cp /usr/etc/sysconfig/keepalived /etc/sysconfig/

#mkdir /etc/keepalived



vim /etc/keepalived/keepalived.conf

! Configuration File for keepalived


global_defs {

   notification_email {

    coralzd@gmail.com

   }

   notification_email_from coralzd@gmail.com

   smtp_server 192.168.1.1

   smtp_connect_timeout 30

   router_id LVS_DEVEL

}


vrrp_script chk_HAProxy {  

    script "killall -0 HAProxy"

    interval 2  

    weight 2  

}

vrrp_instance VI_1 {

    state MASTER

    interface eth0

    virtual_router_id 50

    priority 150

    advert_int 1

    authentication {

        auth_type PASS

        auth_pass 1111

    }

    track_interface {  

       eth0  

         

    }

    virtual_ipaddress {

        192.168.1.67

      

    }

    track_script {  

        chk_HAProxy  

    }

}

三、HAProxy 1.4.16的安装与配置

#cd /var/tmp/

#wget http://HAProxy.1wt.eu/download/1.4/src/HAProxy-1.4.16.tar.gz

#tar -zxvf HAProxy-1.4.16.tar.gz

#cd HAProxy-1.4.16

#make install

#mkdir -p /usr/local/HAProxy/etc

#mkdir -p /usr/local/HAProxy/sbin

#cp examples/HAProxy.cfg /usr/local/HAProxy/etc

#ln -s /usr/local/sbin/HAProxy /usr/local/HAProxy/sbin/HAProxy

#mkdir /usr/share/HAProxy


/etc/HAProxy/HAProxy.cfg


global

        log 127.0.0.1   local1 notice

        maxconn 4096

        chroot /usr/share/HAProxy

        uid 99

        gid 99

        daemon

        #debug

        #quiet


defaults

        log     global

        mode    http

        #option httplog

        option  dontlognull

        retries 3

        option  redispatch

        maxconn 2000

        contimeout      5000

        clitimeout      50000

        srvtimeout      50000


listen  DZW_MYSQL_SLAVE  192.168.1.67:3306

        #cookie SERVERID rewrite

        mode tcp

        maxconn 200

        balance roundrobin

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

        server  mysql_192_168_1_23 192.168.1.23:3306  check port 8890 inter 5s rise 2 fall 3

        server  mysql_192_168_1_24 192.168.1.24:3306  check port 8890 inter 5s rise 2 fall 3

     

        srvtimeout      20000

listen  admin_status

        mode  http

        bind 192.168.1.65:8899

        option httplog

        log global

        stats enable

        stats refresh 10s

        stats hide-version

        stats realm Haproxy\ Statistics

        stats uri  /admin-status

        stats auth  admin:123456

        stats admin if TRUE

HAProxy 启动脚本

/etc/init.d/HAProxy


#!/bin/sh

#

# chkconfig: - 85 15

# description: HA-Proxy is a TCP/HTTP reverse proxy which is particularly suited \

#              for high availability environments.

# processname: HAProxy

# config: /etc/HAProxy/HAProxy.cfg

# pidfile: /var/run/HAProxy.pid


# Script Author: Simon Matter <simon.matter@invoca.ch>

# Version: 2004060600


# Source function library.

if [ -f /etc/init.d/functions ]; then

  . /etc/init.d/functions

elif [ -f /etc/rc.d/init.d/functions ] ; then

  . /etc/rc.d/init.d/functions

else

  exit 0

fi


# Source networking configuration.

. /etc/sysconfig/network


# Check that networking is up.

[ ${NETWORKING} = "no" ] && exit 0


# This is our service name

BASENAME=HAProxy

if [ -L $0 ]; then

  BASENAME=`find $0 -name $BASENAME -printf %l`

  BASENAME=`basename $BASENAME`

fi


[ -f /etc/$BASENAME/$BASENAME.cfg ] || exit 1


RETVAL=0


start() {

  /usr/sbin/$BASENAME -c -q -f /etc/$BASENAME/$BASENAME.cfg

  if [ $? -ne 0 ]; then

    echo "Errors found in configuration file, check it with '$BASENAME check'."

    return 1

  fi


  echo -n "Starting $BASENAME: "

  daemon /usr/sbin/$BASENAME -D -f /etc/$BASENAME/$BASENAME.cfg -p /var/run/$BASENAME.pid

  RETVAL=$?

  echo

  [ $RETVAL -eq 0 ] && touch /var/lock/subsys/$BASENAME

  return $RETVAL

}


stop() {

  echo -n "Shutting down $BASENAME: "

  killproc $BASENAME -USR1

  RETVAL=$?

  echo

  [ $RETVAL -eq 0 ] && rm -f /var/lock/subsys/$BASENAME

  [ $RETVAL -eq 0 ] && rm -f /var/run/$BASENAME.pid

  return $RETVAL

}


restart() {

  /usr/sbin/$BASENAME -c -q -f /etc/$BASENAME/$BASENAME.cfg

  if [ $? -ne 0 ]; then

    echo "Errors found in configuration file, check it with '$BASENAME check'."

    return 1

  fi

  stop

  start

}


reload() {

  /usr/sbin/$BASENAME -c -q -f /etc/$BASENAME/$BASENAME.cfg

  if [ $? -ne 0 ]; then

    echo "Errors found in configuration file, check it with '$BASENAME check'."

    return 1

  fi

  /usr/sbin/$BASENAME -D -f /etc/$BASENAME/$BASENAME.cfg -p /var/run/$BASENAME.pid -sf $(cat /var/run/$BASENAME.pid)

}


check() {

  /usr/sbin/$BASENAME -c -q -V -f /etc/$BASENAME/$BASENAME.cfg

}


rhstatus() {

  status $BASENAME

}


condrestart() {

  [ -e /var/lock/subsys/$BASENAME ] && restart || :

}


# See how we were called.

case "$1" in

  start)

    start

    ;;

  stop)

    stop

    ;;

  restart)

    restart

    ;;

  reload)

    reload

    ;;

  condrestart)

    condrestart

    ;;

  status)

    rhstatus

    ;;

  check)

    check

    ;;

  *)

    echo $"Usage: $BASENAME {start|stop|restart|reload|condrestart|status|check}"

    exit 1

esac


exit $?


chkconfig –add HAProxy

chkconfig HAProxy on

service HAProxy start

四、xinetd安装和配置

yum install -y xinetd

vim /etc/xinetd.d/mysql_status.sh

service mysqlrep_status

{

        flags           = REUSE

        socket_type     = stream

        port            = 8890

        wait            = no

        user            = nobody

        server          = /usr/local/bin/mysqlrep_status.sh

        log_on_failure  += USERID

        disable         = no

      

}

重启xinetd

service xinetd restart

MySQL同步检测脚本(脚本检测同步sql和IO进程是否都为真,以及select是否达到20个进程以上)

#!/bin/bash

#

# /usr/local/bin/mysqlchk_status.sh

#

# 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 503 Internal Server Error\r" (else)

#


MYSQL_HOST="localhost"

MYSQL_PORT="3306"

MYSQL_USERNAME="repdb63"

MYSQL_PASSWORD="mylqs9eyex7s"

#

# We perform a simple query that should return a few results

#/usr/local/mysql/bin/mysql  -hlocalhost –urepdb63 –pmylqs9eyex7s -e "show slave status\G;"   > /tmp/rep.txt

mysql -urepdb63 -pmylqs9eyex7s -e "show full processlist;" >/tmp/processlist.txt

mysql -urepdb63 -pmylqs9eyex7s -e "show slave status\G;" >/tmp/rep.txt

iostat=`grep "Slave_IO_Running" /tmp/rep.txt  |awk '{print $2}'`           

sqlstat=`grep "Slave_SQL_Running" /tmp/rep.txt |awk '{print $2}'`         

result=$(cat /tmp/processlist.txt|wc -l)

#echo iostat:$iostat and sqlstat:$sqlstat

# if slave_IO_Running and Slave_sql_Running ok,then return 200 code

if [ "$result" -lt "20" ] && [ "$iostat" = "Yes" ] && [ "$sqlstat" = "Yes" ];


then

        # mysql is fine, return http 200

        /bin/echo -e "HTTP/1.1 200 OK\r\n"

      

else

        # mysql is down, return http 503

        /bin/echo -e "HTTP/1.1 503 Service Unavailable\r\n"

      

fi

注意:在mysql slave另行建立一个具有process和slave_client权限的账号。

作者简介:崔晓辉,网名coralzd,大众网系统管理员,精通网站系统架构、Unix技术。gtalk:coralzd@gmail.com

  

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-109445-1-1.html 上篇帖子: haproxy Consistent Hash浅析 下篇帖子: 重启haproxy
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表