Keepalived+HAProxy实现MySQL高可用负载均衡的配置_Mysql

 Keepalived

由于在生产环境使用了mysqlcluster,需要实现高可用负载均衡,这里提供了keepalived+haproxy来实现.

      keepalived主要功能是实现真实机器的故障隔离及负载均衡器间的失败切换.可在第3,4,5层交换.它通过VRRPv2(Virtual Router Redundancy Protocol) stack实现的.

      Layer3:Keepalived会定期向服务器群中的服务器.发送一个ICMP的数据包(既我们平时用的Ping程序),如果发现某台服务的IP地址没有激活,Keepalived便报告这台服务器失效,并将它从服务器群中剔除,这种情况的典型例子是某台服务器被非法关机。Layer3的方式是以服务器的IP地址是否有效作为服务器工作正常与否的标准。

     Layer4:主要以TCP端口的状态来决定服务器工作正常与否。如web server的服务端口一般是80,如果Keepalived检测到80端口没有启动,则Keepalived将把这台服务器从服务器群中剔除。

     Layer5:在网络上占用的带宽也要大一些。Keepalived将根据用户的设定检查服务器程序的运行是否正常,如果与用户的设定不相符,则Keepalived将把服务器从服务器群中剔除。

Software Design

keepalived启动后会有单个进程

8352 ?    Ss   0:00 /usr/sbin/keepalived
8353 ?    S   0:00 \_ /usr/sbin/keepalived
8356 ?    S   0:01 \_ /usr/sbin/keepalived

父进程:内存管理,子进程管理等等

子进程:VRRP子进程

子进程:Healthchecking 子进程
实例

2台mysqlcluster 10.1.6.203 master  10.1.6.205 backup

vip 10.1.6.173

目的访问10.1.6.173 3366端口 分别轮询通过haproxy转发到10.1.6.203 3306 和10.1.6.205 3306

mysqlcluster搭建参照之前博客,这里在2台机上安装keepalived

root@10.1.6.203:~# apt-get install keepalived
root@10.1.6.203:~# cat /etc/keepalived/keepalived.conf
vrrp_script chk_haproxy {
    script "killall -0 haproxy"  # verify the pid existance
    interval 2          # check every 2 seconds
    weight -2          # add 2 points of prio if OK
}

vrrp_instance VI_1 {
    interface eth1        # interface to monitor
    state MASTER
    virtual_router_id 51     # Assign one ID for this route
    priority 101         # 101 on master, 100 on backup
    nopreempt
    debug

    virtual_ipaddress {
        10.1.6.173
    }

    track_script {    #注意大括号空格
        chk_haproxy
    }

    notify_master /etc/keepalived/scripts/start_haproxy.sh #表示当切换到master状态时,要执行的脚本
    notify_fault /etc/keepalived/scripts/stop_keepalived.sh #故障时执行的脚本
    notify_stop  /etc/keepalived/scripts/stop_haproxy.sh #keepalived停止运行前运行notify_stop指定的脚本 }

VRRPD配置包括三个类:

  • VRRP同步组(synchroization group)
  • VRRP实例(VRRP Instance)
  • VRRP脚本

这里使用了 VRRP实例, VRRP脚本

注意配置选项:

stat:指定instance(Initial)的初始状态,就是说在配置好后,这台服务器的初始状态就是这里指定的,但这里指定的不算,还是得要通过竞选通过优先级来确定,里如果这里设置为master,但如若他的优先级不及另外一台,那么这台在发送通告时,会发送自己的优先级,另外一台发现优先级不如自己的高,那么他会就回抢占为master

  • interface:实例绑定的网卡,因为在配置虚拟IP的时候必须是在已有的网卡上添加的
  • priority 101:设置本节点的优先级,优先级高的为master
  • debug:debug级别
  • nopreempt:设置为不抢占
vrrp_script chk_haproxy {
    script "killall -0 haproxy"  # verify the pid existance
    interval 2          # check every 2 seconds 脚本执行间隔
    weight -2          # add 2 points of prio if OK 脚本结果导致的优先级变更:2表示优先级+2;-2则表示优先级-2
}

然后在实例(vrrp_instance)里面引用,有点类似脚本里面的函数引用一样:先定义,后引用函数名

    track_script {
        chk_haproxy
    }

注意:VRRP脚本(vrrp_script)和VRRP实例(vrrp_instance)属于同一个级别

root@10.1.6.203:scripts# cat start_haproxy.sh
#!/bin/bash

sleep 5
get=`ip addr |grep 10.1.6.173 |wc -l`
echo $get >> /etc/keepalived/scripts/start_ha.log

if [ $get -eq 1 ]
then
    echo "`date +%c` success to get vip" >> /etc/keepalived/scripts/start_ha.log
    /usr/local/sbin/haproxy -f /etc/haproxy/haproxy.cfg
else
    echo "`date +%c` can not get vip" >> /etc/keepalived/scripts/start_ha.log
fi
root@10.1.6.203:scripts# cat stop_keepalived.sh
#!/bin/bash

pid=`pidof keepalived`
if [ $pid == "" ]
then
  echo "`date +%c` no keepalived process id" >> /etc/keepalived/scripts/stop_keep.log
else
  echo "`date +%c` will stop keepalived " >> /etc/keepalived/scripts/stop_keep.log
  /etc/init.d/keepalived stop
fi

/etc/init.d/keepalived stop

root@10.1.6.203:scripts# cat stop_haproxy.sh
#!/bin/bash

pid=`pidof haproxy`
echo "`date +%c` stop haproxy" >> /etc/keepalived/scripts/stop_ha.log
kill -9 $pid

同理配置10.1.6.205

root@10.1.6.205:~# cat /etc/keepalived/keepalived.conf
vrrp_script chk_haproxy {
  script "killall -0 haproxy"  # verify the pid existance
  interval 2          # check every 2 seconds
  weight 2           # add 2 points of prio if OK
}

vrrp_instance VI_1 {
  interface eth1        # interface to monitor
  state BACKUP
  virtual_router_id 51     # Assign one ID for this route
  priority 100         # 101 on master, 100 on backup
  virtual_ipaddress {
    10.1.6.173
  }

  track_script {
    chk_haproxy
  }

notify_master /etc/keepalived/scripts/start_haproxy.sh
notify_fault /etc/keepalived/scripts/stop_keepalived.sh
notify_stop /etc/keepalived/scripts/stop_haproxy.sh

}

 HAProxy

下面再介绍下haproxy

       HAProxy是一款基于TCP(第四层)和HTTP(第七层)应用的代理软件,它也可作为负载均衡器.可以支持数以万计的并发连接.同时可以保护服务器不暴露到网络上,通过端口映射.它还自带监控服务器状态的页面.

      安装haproxy

wget -O/tmp/haproxy-1.4.22.tar.gz http://haproxy.1wt.eu/download/1.4/src/haproxy-1.4.22.tar.gz
tar xvfz /tmp/haproxy-1.4.22.tar.gz -C /tmp/
cd /tmp/haproxy-1.4.22
make TARGET=linux26
make install

      haproxy需要对每一个mysqlcluster服务器进行健康检查

1.在2台主机分别配置haproxy.cfg

root@10.1.6.203:scripts# cat /etc/haproxy/haproxy.cfg
global
    maxconn 51200 #默认最大连接数
    #uid 99
    #gid 99
    daemon    #以后台形式运行haproxy
    #quiet
    nbproc 1   #进程数量(可以设置多个进程提高性能)
    pidfile /etc/haproxy/haproxy.pid #haproxy的pid存放路径,启动进程的用户必须有权限访问此文件 

defaults
    mode tcp      #所处理的类别 (#7层 http;4层tcp )
    option redispatch  #serverId对应的服务器挂掉后,强制定向到其他健康的服务器
    option abortonclose #当服务器负载很高的时候,自动结束掉当前队列处理比较久的连接
    timeout connect 5000s  #连接超时
    timeout client 50000s #客户端超时
    timeout server 50000s  #服务器超时
    log 127.0.0.1 local0  #错误日志记录
    balance roundrobin  #默认的负载均衡的方式,轮询方式 

listen proxy
    bind 10.1.6.173:3366  #监听端口
    mode tcp        #http的7层模式
    option httpchk    #心跳检测的文件
    server db1 10.1.6.203:3306 weight 1 check port 9222 inter 12000 rise 3 fall 3   #服务器定义,check inter 12000是检测心跳频率 rise 3是3次正确认为服务器可用, fall 3是3次失败认为服务器不可用,weight代表权重
    server db2 10.1.6.205:3306 weight 1 check port 9222 inter 12000 rise 3 fall 3

listen haproxy_stats
    mode http
    bind 10.1.6.173:8888
    option httplog
    stats refresh 5s
    stats uri /status #网站健康检测URL,用来检测HAProxy管理的网站是否可以用,正常返回200,不正常返回503
    stats realm Haproxy Manager
    stats auth admin:p@a1SZs24 #账号密码

root@10.1.6.205:~$ cat /etc/haproxy/haproxy.cfg
global
    maxconn 51200
    #uid 99
    #gid 99
    daemon
    #quiet
    nbproc 1
    pidfile /etc/haproxy/haproxy.pid

defaults
    mode tcp
    option redispatch
    option abortonclose
    timeout connect 5000s
    timeout client 50000s
    timeout server 50000s
    log 127.0.0.1 local0
    balance roundrobin 

listen proxy
    bind 10.1.6.173:3366
    mode tcp
    option httpchk
    server db1 10.1.6.203:3306 weight 1 check port 9222 inter 12000 rise 3 fall 3
    server db2 10.1.6.205:3306 weight 1 check port 9222 inter 12000 rise 3 fall 3

listen haproxy_stats
    mode http
    bind 10.1.6.173:8888
    option httplog
    stats refresh 5s
    stats uri /status
    stats realm Haproxy Manager
    stats auth admin:p@a1SZs24

2.安装xinetd

root@10.1.6.203:~# apt-get install xinetd

3.在每个节点添加xinetd服务脚本和mysqlchk端口号

root@10.1.6.203:~# vim /etc/xinetd.d/mysqlchk
# default: on
# description: mysqlchk
service mysqlchk         #需要在servive定义
{
    flags      = REUSE
    socket_type   = stream
    port      = 9222
    wait      = no
    user      = nobody
    server     = /opt/mysqlchk
    log_on_failure += USERID
    disable     = no
    per_source   = UNLIMITED
    bind      = 10.1.6.173
}

root@10.1.6.203:~# vim /etc/services
mysqlchk    9222/tcp            # mysqlchk

4.编写mysqlchk监控服务脚本

root@10.1.6.203:~# ls -l /opt/mysqlchk
-rwxr--r-- 1 nobody root 1994 2013-09-17 11:27 /opt/mysqlchk
root@10.1.6.203:~# cat /opt/mysqlchk
#!/bin/bash
#
# 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
#

MYSQL_HOST="localhost"
MYSQL_SOCKET="/var/run/mysqld/mysqld.sock"
MYSQL_USERNAME="mysqlchkusr"   #该账户密码需要在mysql里添加
MYSQL_PASSWORD="secret"
MYSQL_OPTS="-N -q -A"
TMP_FILE="/dev/shm/mysqlchk.$$.out"
ERR_FILE="/dev/shm/mysqlchk.$$.err"
FORCE_FAIL="/dev/shm/proxyoff"
MYSQL_BIN="/opt/mysqlcluster/mysql-cluster-gpl-7.2.6-linux2.6-x86_64/bin/mysql"
CHECK_QUERY="select 1"

preflight_check()
{
  for I in "$TMP_FILE" "$ERR_FILE"; do
    if [ -f "$I" ]; then
      if [ ! -w $I ]; then
        echo -e "HTTP/1.1 503 Service Unavailable\r\n"
        echo -e "Content-Type: Content-Type: text/plain\r\n"
        echo -e "\r\n"
        echo -e "Cannot write to $I\r\n"
        echo -e "\r\n"
        exit 1
      fi
    fi
  done
}

return_ok()
{
  echo -e "HTTP/1.1 200 OK\r\n"
  echo -e "Content-Type: text/html\r\n"
  echo -e "Content-Length: 43\r\n"
  echo -e "\r\n"
  echo -e "<html><body>MySQL is running.</body></html>\r\n"
  echo -e "\r\n"
  rm $ERR_FILE $TMP_FILE
  exit 0
}
return_fail()
{
  echo -e "HTTP/1.1 503 Service Unavailable\r\n"
  echo -e "Content-Type: text/html\r\n"
  echo -e "Content-Length: 42\r\n"
  echo -e "\r\n"
  echo -e "<html><body>MySQL is *down*.</body></html>\r\n"
  sed -e 's/\n$/\r\n/' $ERR_FILE
  echo -e "\r\n"
  rm $ERR_FILE $TMP_FILE
  exit 1
}
preflight_check
if [ -f "$FORCE_FAIL" ]; then
    echo "$FORCE_FAIL found" > $ERR_FILE
    return_fail;
fi
$MYSQL_BIN $MYSQL_OPTS --host=$MYSQL_HOST --socket=$MYSQL_SOCKET --user=$MYSQL_USERNAME --password=$MYSQL_PASSWORD -e "$CHECK_QUERY" > $TMP_FILE 2> $ERR_FILE
if [ $? -ne 0 ]; then
    return_fail;
fi
return_ok;

测试

2个节点开启keepalived(主节点会获得vip,自动拉起haproxy),xinetd

root@10.1.6.203:~# ip add
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN
  link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
  inet 127.0.0.1/8 scope host lo
2: eth0: <BROADCAST,MULTICAST> mtu 1500 qdisc pfifo_fast state DOWN qlen 1000
  link/ether 00:26:b9:36:0f:81 brd ff:ff:ff:ff:ff:ff
  inet 211.151.105.186/26 brd 211.151.105.191 scope global eth0
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
  link/ether 00:26:b9:36:0f:83 brd ff:ff:ff:ff:ff:ff
  inet 10.1.6.203/24 brd 10.1.6.255 scope global eth1
  inet 10.1.6.173/32 scope global eth1
4: eth2: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN qlen 1000
  link/ether 00:26:b9:36:0f:85 brd ff:ff:ff:ff:ff:ff
5: eth3: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN qlen 1000
  link/ether 00:26:b9:36:0f:87 brd ff:ff:ff:ff:ff:ff
root@10.1.6.203:~# netstat -tunlp | grep ha
tcp    0   0 10.1.6.173:3366   0.0.0.0:*        LISTEN   1042/haproxy
tcp    0   0 10.1.6.203:8888   0.0.0.0:*        LISTEN   1042/haproxy
udp    0   0 0.0.0.0:56562      0.0.0.0:*              1042/haproxy
root@10.1.6.203:~# netstat -tunlp | grep xine
tcp    0   0 10.1.6.203:9222   0.0.0.0:*        LISTEN   30897/xinetd
root@10.1.6.203:~# ps -ef | grep haproxy
root   1042   1 0 Sep17 ?    00:00:00 /usr/local/sbin/haproxy -f /etc/haproxy/haproxy.cfg

测试:

通过vip10.1.6.173 3366访问cluster数据库(注意账户dave权限需要加3个ip10.1.6.203,10.1.6.205,10.1.6.173)

root@10.1.6.203:mgm# mysql -udave -p -h 10.1.6.173 -P 3366
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 1344316
Server version: 5.5.22-ndb-7.2.6-gpl-log MySQL Cluster Community Server (GPL)

Type 'help;' or '\h' for help. Type '\c' to clear the buffer.

mysql> show databases;
+--------------------+
| Database      |
+--------------------+
| information_schema |
| dave       |
| test        |
+--------------------+
3 rows in set (0.01 sec)

mysql>

手动分别使keepalive,haproxy,数据库挂掉.vip10.1.6.173会自动漂到10.1.6.205从上,并不影响vip的访问

通过vip,haproxy查看各节点状态

http://10.1.6.173:8888/status

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索mysql
, 负载均衡
, keepalived
, haproxy
高可用
keepalived负载均衡、haproxy负载均衡原理、haproxy tcp 负载均衡、haproxy 负载均衡、haproxy udp 负载均衡,以便于您获取更多的相关知识。

时间: 2024-09-19 09:52:14

Keepalived+HAProxy实现MySQL高可用负载均衡的配置_Mysql的相关文章

CentOS6.4 LVS+keepalived高可用负载均衡服务配置

CentOS6.4 LVS+keepalived高可用负载均衡服务配置     一:测试环境信息 服务器DELL-R720 虚拟化 KVM 虚拟机4台: ipvs01,ipvs02,web01,web02 [root@KVM01~]# virsh list  Id    Name                           State ----------------------------------------------------  1     SN-web01         

LVS+Keepalived构建高可用负载均衡的配置

一. LVS简介 LVS是Linux Virtual Server的简称,也就是Linux虚拟服务器, 是一个由 章文嵩博士发起的自由软件项目,它的官方站点是www.linuxvirtualserver.org .现在LVS已经是 Linux标准内核的一部分,在Linux2.4内核以前,使用LVS时必 须要重新编译内核以支持LVS功能模块,但是从Linux2.4内核以后,已经完全内置 了LVS的各个功能模块,无需给内核打任何补丁,可以直接使用LVS提供的各种功 能.使用LVS技术要达到的目标是:

haproxy+keepalived实现高可用负载均衡(实例配置)_Linux

作者:split_two 环境四台机器都是RedHat4.8(64位)版本: IP地址             用处192.168.5.55       MASTER192.168.2.73       BACKUP192.168.5.54       负载A192.168.5.57       负载B192.168.2.100      VIP 1.MASTER上安装haproxy 复制代码 代码如下: wget http://haproxy.1wt.eu/download/1.3/src/h

haproxy+keepalived实现高可用负载均衡(理论篇)_Linux

HAProxy相比LVS的使用要简单很多,功能方面也很丰富.当 前,HAProxy支持两种主要的代理模式:"tcp"也即4层(大多用于邮件服务器.内部协议通信服务器等),和7层(HTTP).在4层模式 下,HAProxy仅在客户端和服务器之间转发双向流量.7层模式下,HAProxy会分析协议,并且能通过允许.拒绝.交换.增加.修改或者删除请求 (request)或者回应(response)里指定内容来控制协议,这种操作要基于特定规则. 我现在用HAProxy主要在于它有以下优点,这里我

Nginx+Keepalived(双机热备)搭建高可用负载均衡环境(HA)

基于 Nginx+Tomcat+Redis负载均衡Session共享来实现后续的功能 个人微信小程序.是关于人工智能的.应用是百度大脑 和 腾讯优图的人脸识别 有问题加QQ:783021975 验证问题写明在哪知道的QQ.直接说问的问题.会在不忙的时候回复你.毕竟我也有自己的工作要做. 一张简单的图说下大概的意思 安装Keepalived到CentOS虚拟机环境(2个虚拟机都安装) 使用的版本为keepalived-1.2.24.tar.gz 为了方便安装,在系统里面提前下载好相关的库 yum

RHEL 5.4下部署LVS(DR)+keepalived实现高性能高可用负载均衡

原文地址:http://www.cnblogs.com/mchina/archive/2012/05/23/2514728.html 一.简介 LVS是Linux Virtual Server的简写,意即Linux虚拟服务器,是一个虚拟的服务器集群系统.本项目在1998年5月由章文嵩博士成立,是中国国内最早出现的自由软件项目之一. 目前有三种IP负载均衡技术(VS/NAT.VS/TUN和VS/DR):十种调度算法(rr|wrr|lc|wlc|lblc|lblcr|dh|sh|sed|nq). K

tengine + tomcat 安装整合实现高可用负载均衡

先介绍下tengine Tengine是由淘宝网发起的Web服务器项目.它在Nginx的基础上,针对大访问量网站的需求,添加了很多高级功能和特性.Tengine的性能和稳定性已经在大型的网站如淘宝网,天猫商城等得到了很好的检验.它的最终目标是打造一个高效.稳定.安全.易用的Web平台. 好,在做之前呢,说下为什么要做这个东西 1.nginx反向代理不需要tomcat的IP是否为外网IP,只要nginx server能和tomcat进行通讯,安全的同时减少了不必要的外网ip 2.当tomcat宕掉

heartbeat+lvs构建高可用负载均衡集群

heartbeat+lvs实现高可用负载均衡原理: 两台heartbeat(ldirectord)主机构成高可用集群,同时监管着lvs(负载均衡集群)整体构成了heartbeat+lvs的高可用负载均衡集群.在使用heartbeat的时候加载了watchdog模块,用来检测heartbeat服务,当heartbeat服务出现故障,会进行重启主机. 注意:但是,当内核崩溃了,watchdog也无能了(modprobe softdog),因为watchdog是基于内核级别的软件服务(相当于软fenc

LVS+Keepalived构建高可用负载均衡(测试篇)_Linux

一. 启动LVS高可用集群服务 首先,启动每个real server节点的服务: [root@localhost ~]# /etc/init.d/lvsrs start start LVS of REALServer 然后,分别在主备Director Server启动Keepalived服务: [root@DR1 ~]#/etc/init.d/Keepalived start [root@DR1 ~]#/ ipvsadm -L IP Virtual Server version 1.2.1 (s