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

haproxy +keepalived 原创的更多相关文章

  1. HaProxy+Keepalived+Mycat高可用群集配置

    概述 本章节主要介绍配置HaProxy+Keepalived高可用群集,Mycat的配置就不在这里做介绍,可以参考我前面写的几篇关于Mycat的文章. 部署图: 配置  HaProxy安装 181和1 ...

  2. haproxy+keepalived实现高可用负载均衡

    软件负载均衡一般通过两种方式来实现:基于操作系统的软负载实现和基于第三方应用的软负载实现.LVS就是基于Linux操作系统实现的一种软负载,HAProxy就是开源的并且基于第三应用实现的软负载. HA ...

  3. HaProxy+keepalived实现负载均衡

    HAProxy提供高可用性.负载均衡以及基于TCP和HTTP应用的代理,支持虚拟主机,它是免费.快速并且可靠的一种解决方案.HAProxy特别适用于那些负载特大的web站点,这些站点通常又需要会话保持 ...

  4. Haproxy+Keepalived搭建Weblogic高可用负载均衡集群

    配置环境说明: KVM虚拟机配置 用途 数量 IP地址 机器名 虚拟IP地址 硬件 内存3G  系统盘20G cpu 4核 Haproxy keepalived 2台 192.168.1.10 192 ...

  5. 实现基于Haproxy+Keepalived负载均衡高可用架构

    1.项目介绍: 上上期我们实现了keepalived主从高可用集群网站架构,随着公司业务的发展,公司负载均衡服务已经实现四层负载均衡,但业务的复杂程度提升,公司要求把mobile手机站点作为单独的服务 ...

  6. Haproxy+Keepalived负载均衡

    Haproxy介绍 HAProxy是一个特别适用于高可用性环境的TCP/HTTP开源的反向代理和负载均衡软件.在7层负载均衡方面的功能很强大(支持cookie track, header rewrit ...

  7. 案例一(haproxy+keepalived高可用负载均衡系统)【转】

    1.搭建环境描述: 操作系统: [root@HA-1 ~]# cat /etc/redhat-release CentOS release 6.7 (Final) 地址规划: 主机名 IP地址 集群角 ...

  8. haproxy+keepalived(涵盖了lvs,nginx.haproxy比较)

    文章转载自: haproxy+keepalived    https://cloud.tencent.com/developer/article/1026385 网络四层和七层的区别   https: ...

  9. Haproxy+Keepalived高可用环境部署梳理(主主和主从模式)

    Nginx.LVS.HAProxy 是目前使用最广泛的三种负载均衡软件,本人都在多个项目中实施过,通常会结合Keepalive做健康检查,实现故障转移的高可用功能. 1)在四层(tcp)实现负载均衡的 ...

随机推荐

  1. com.sun.org.apache.xerces.internal.impl.io.MalformedByteSequenceException: Invalid byte 2 of 2-byte UTF-8 sequence报错解决方法

    添加了XML实体和表映射文件后,莫名报错,百思不得其解,也找不到哪里错了,后来把mybatis-config.xml文件中去掉中文注释就好了 mybatis-config.xml文件中的内容如下,去掉 ...

  2. Doherty Threshold

    Prior to the publication of the IBM technical paper behind what commonly known today as the Doherty ...

  3. php组合

    为了提高代码的复用性,降低代码的耦合(组合实现的两种方式) 模式一: <?php //组合模式一 class Person{ public function eat(){ echo " ...

  4. Xcode6中如何使用自定义的类模板

    说到IOS类的模板,有些人感觉很陌生,但是只要有开发过IOS程序的人,其实都用过类的模板,只不过是用的系统自带的类的模板. 例如创建一个ClassTemplateVC继承于UIViewControll ...

  5. Linux学习之路—Linux文件与目录管理

    该内容来自鸟哥私房菜 1.目录的相关操作 1.1 特殊的目录 .  代表此层目录 .. 代表上一层目录 -  代表前一个工作目录 ~ 代表"目前用户身份"所在的主文件夹 ~acco ...

  6. 关于JavaScript 中的变量

    JS的变量声明语句永远是在其作用域中最先执行的,不论其定义的位置在哪里: 函数体内部,局部变量的优先级比同名的全局变量高. Javas作用域分类 未使用var定义的变量不论定义在什么位置都是全局变量, ...

  7. css中font-size的单位总结:px、em、pt

    px:基于像素的单位.像素是一种有用的单位,因为在任何媒体上都可以保证一个像素的差别确实是可见的.em :一般用来测量长度的通用单位(例如元素周转的页边空白和填充),当用于指定字体大小时,em单位是指 ...

  8. FMS 4中multicast脚本的小修正

    FMS 4中multicast脚本的小修正 http://help.adobe.com/en_US/flashmediaserver/devguide/WS7812b00092aae0dc-2829d ...

  9. thinkphp在模型中自动完成session赋值

    相信用过thinkphp的用户都知道thinkphp的模型可以完成很多辅助功能,比 如自动验证.自动完成等,今天在开发中遇到自动完成中需要获取session值 然后自动赋值的功能,具体看代码:clas ...

  10. CE 进程同步-事件

    事件(event)分为有名的和无名的,使用有名事件的时候,在不同进程中创建的同名事件,其实就是同一个,这样就可以在不同的进程中使用了.两个进程里面都要创建事件,事件名要一致. //进程1 HANDLE ...