haproxy +keepalived 原创

Haproxy+keepalived

原理:

HAProxy介绍及其定位

HAProxy提供高可用性负载均衡以及基于TCP和HTTP应用的代理,支持虚拟主机,它是免费、快速并且可靠的一种解决方案。根据官方数据,其最高极限支持10G的并发。

HAProxy特别适用于那些负载特大的web站点, 这些站点通常又需要会话保持或七层处理。HAProxy运行在当前的硬件上,完全可以支持数以万计的并发连接。并且它的运行模式使得它可以很简单安全的整合进您当前的架构中,同时可以保护你的web服务器不被暴露到网络上。

 

其支持从4层至7层的网络交换,即覆盖所有的TCP协议。就是说,Haproxy 甚至还支持 Mysql 的均衡负载。

如果说在功能上,能以proxy反向代理方式实现WEB均衡负载,这样的产品有很多。包括 Nginx,ApacheProxy,lighttpd,Cheroke等。

但要明确一点的,Haproxy 并不是 Http 服务器。以上提到所有带反向代理均衡负载的产品,都清一色是 WEB 服务器。简单说,就是他们能自个儿提供静态(html,jpg,gif..)或动态(php,cgi..)文件的传输以及处理。而Haproxy仅仅,而且专门是一款的用于均衡负载的应用代理。其自身并不能提供http服务。

 

keepalived理论工作原理

keepalived可提供vrrp以及health-check功能,可以只用它提供双机浮动的vip(vrrp虚拟路由功能),这样可以简单实现一个双机热备高可用功能。

keepalived是一个类似于layer3, 4 & 5交换机制的软件,也就是我们平时说的第3层、第4层和第5层交换。Keepalived的作用是检测web 服务器的状态。 Layer3,4&5工作在IP/TCP协议栈的IP层,TCP层,及应用层,原理分别如下:

 

  Layer3:Keepalived使用Layer3的方式工作式时,Keepalived会定期向服务器群中的服务器

 

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

 

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

 

  Layer5:Layer5就是工作在具体的应用层了,比Layer3,Layer4要复杂一点,在网络上占用的带宽也要大一些。Keepalived将根据用户的设定检查服务器程序的运行是否正常,如果与用户的设定不相符,则Keepalived将把服务器从服务器群中剔除。

 

vip即虚拟ip,是附在主机网卡上的,即对主机网卡进行虚拟,此IP仍然是占用了此网段的某个IP。

 

 

拓扑图

 

1 安装

#若tar -C无效,可以用tar -xzf mysql.tar.gz -C /usr/local/mysql --strip-components=1,这个从github上看到的一个实例

#wget 现在好像不能下载了,只能去haproxy 的GitHub上下载了

cd /mnt/ &&wget http://www.haproxy.org/download/1.6/src/haproxy-1.6.5.tar.gz  && tar zxf /mnt/haproxy-1.6.5.gz –C /mnt/

make TARGET=linux2628

make install PREFIX=/usr/local/haproxy
 
mkdir /usr/local/haproxy/conf
 
2配置
 
cat >> /usr/local/haproxy/conf/haproxy.cfg<<EOF
global
    maxconn 51200  
    chroot /usr/local/haproxy
    uid 99
    gid 99
    daemon
    #quiet
    nbproc 1
    pidfile /var/run/haproxy.pid
defaults
mode http
#优化选项
    retries 3
    option redispatch
    #option abortonclose
    timeout connect 5000ms
    timeout client 30000ms
    timeout server 30000ms
    #timeout check 2000
    log 127.0.0.1 local0 info
    balance roundrobin
listen admin_stats
    bind 0.0.0.0:8888
    option httplog
    stats refresh 30s
    stats uri /stats  #监控页面的url
    stats realm Haproxy Manager
    stats auth admin:admin #监控页面的用户名和密码
    stats hide-version
frontend http-in
    bind *:8889
    mode http
    option httplog
    log global
    default_backend httpserver
backend httpserver
    balance roundrobi
    #server web1 192.168.0.78:80 cookie 1  weight 1  check inter  2000 rise 2 fall 3
#server web2 192.168.0.28:80 cookie 1  weight 1  check inter  2000 rise 2 fall 3
option httpchk GET /index.html   #后端服务器检测
#使用stick-table管理客户端session,保持session会话
stick-table type ip size 5000k expire 5m store conn_cur
    stick match src table httpserver
    stick on src table httpserver
    server s8001 192.168.0.227:800 maxconn 500 weight 10 cookie s8001 check
    server s8002 192.168.0.229:800 maxconn 500 weight 10 cookie s8002 check
EOF
 
 
3 haproxy日志
 
sed -i '13,14 s/^#//' /etc/rsyslog.conf
cat >> /etc/rsyslog.conf <<EOF
local3.*         /var/log/haproxy.log
local0.*         /var/log/haproxy.log
EOF
 
service rsyslog restart
 
4 启动haproxy
 
cat >>/etc/init.d/haproxy <<EOF
#!/bin/sh 
#chkconfig: 2345 10 90
#description:haproxy
# confit: /usr/local/haproxy/conf/haproxy.cfg  
# pidfile: /usr/local/haproxy/logs/haproxy.pid  
  
# source function library.  
. /etc/rc.d/init.d/functions  
  
# source networking configuration.  
. /etc/sysconfig/network  
  
# check that networking is up.  
[ "$NETWORKING" = "no" ] && exit 0  
config="/usr/local/haproxy/conf/haproxy.cfg"  
exec="/usr/local/haproxy/sbin/haproxy"  
prog=$(basename $exec)  
  
[ -e /etc/sysconfig/$prog ] && . /etc/sysconfig/$prog  
  
lockfile=/var/lock/subsys/haproxy  
  
check(){  
    $exec -c -V -f $config  
start() {  
    $exec -c -q -f $config  
    if [ $? -ne 0 ]; then  
        echo "Errors in configuration file, check with $prog check."  
        return 1  
    fi  
   
    echo -n $"Starting $prog: "  
    # start it up here, usually something like "daemon $exec"  
    daemon $exec -D -f $config -p /var/run/$prog.pid  
    retval=$?  
    echo  
    [ $retval -eq 0 ] && touch $lockfile  
    return $retval  
  
stop() {  
    echo -n $"Stopping $prog: "  
    # stop it here, often "killproc $prog"  
    killproc $prog   
    retval=$?  
    echo  
    [ $retval -eq 0 ] && rm -f $lockfile  
    return $retval  
  
restart() {  
    $exec -c -q -f $config  
    if [ $? -ne 0 ]; then  
        echo "Errors in configuration file, check with $prog check."  
        return 1  
    fi  
    stop  
    start  
  
reload() {  
    $exec -c -q -f $config  
    if [ $? -ne 0 ]; then  
        echo "Errors in configuration file, check with $prog check."  
        return 1  
    fi  
    echo -n $"Reloading $prog: "  
    $exec -D -f $config -p /var/run/$prog.pid -sf $(cat /var/run/$prog.pid)  
    retval=$?  
    echo  
    return $retval  
  
force_reload() {  
    restart  
  
fdr_status() {  
    status $prog  
  
case "$1" in  
    start|stop|restart|reload)  
        $1  
        ;;  
    force-reload)  
        force_reload  
        ;;  
    checkconfig)  
        check  
        ;;  
    status)  
        fdr_status  
        ;;  
    condrestart|try-restart)  
      [ ! -f $lockfile ] || restart  
    ;;  
    *)  
        echo $"Usage: $0 {start|stop|status|checkconfig|restart|try-restart|reload|force-reload}"  
        exit 2  
esac  
EOF
chmod u+x /etc/init.d/haproxy
Service haproxy start
Chkconfig haproxy on
 
5.keepalived
 
yum install  openssl openssl-devel ipvsadm gcc gcc-c++  kernel-devel install libnl* popt* libnfnetlink-devel -y
cd /mnt &&  wget http://www.keepalived.org/software/keepalived-1.2.20.tar.gz  &&tar zxf keepalived-1.2.20.tar.gz -C /mnt
cd keepalived-1.2.20
./configure --prefix=/usr/local/keepalived --sysconf=/etc --with-kernel-dir=/usr/src/kernels/2.6.32-573.22.1.el6.x86_64/
make && make install
ll /usr/local/keepalived/
ln -s  /usr/local/keepalived/sbin/keepalived /usr/sbin/
cat >>/etc/keepalived/keepalived.conf <<EOF
! Configuration File for keepalived
 
global_defs {
   notification_email {
       root@localhost #设置邮件
   }
   notification_email_from root@localhost
   smtp_server 127.0.0.1
   smtp_connect_timeout 30
   router_id HAProxy_DEVEL
   vrrp_skip_check_adv_addr
   vrrp_strict
}
 
vrrp_script check_haproxy {
   script "/mnt/shell/check_haproxy.sh"
   #interval 2
   #weight 2
}
 
vrrp_instance VI_1 {
    state BACKUP #两边state 都为BACKUP
    interface eth0
    virtual_router_id 78 #id 必须唯一,且不可冲突
    priority 100 #优先级不一样,数字越大,优先级越高
nopreempt            #不主动抢占资源,只在master这台优先级高的设置,backup不设置 
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.0.24
    }
    track_script {
        check_haproxy
    }
}
EOF
service keepalived start
chkconfig keepalived on
 
keepalived 检测haproxy脚本,两种方式取其一:
 
#!/bin/bash
A=`ps -C haproxy --no-header|wc -l`
if [ $A -eq 0 ];then
/etc/init.d/haproxy start
sleep 3
if [ `ps -C haproxy --no-header|wc -l` -eq 0 ];then
/etc/init.d/keepalived stop
fi
fi
 
 
#add new other method
A=`curl -I http://192.168.0.24:8888/stats -u admin:admin|grep HTTP|awk '{print $2}'`
if [ $A -ne 200 ];then
/etc/init.d/haproxy start
sleep 3
if [ `curl -I http://192.168.0.24:8888/stats -u admin:admin|grep HTTP|awk '{print $2}'` -ne 200 ];then
/etc/init.d/keepalived sotp
fi
fi
posted on 2016-05-20 16:35  yang68h  阅读(363)  评论(0编辑  收藏  举报