Haproxy+Keepalived实现负载均衡高可用

Nginx+keepalived可以参考我的博文
Lvs+keepalived可以参考我的博文


背景:
   Haproxy+Keepalived的优势何在,如果你的网站并发量挺大的但是还不至于大到使用lvs的地步,并且又想对七层协议进行过滤。可能需要实现动静分离,又或者是基于内容的过滤等。但是并发量还是挺大的,Nginx可能没法满足要求的话,那么Haproxy是您绝佳的选择Haproxy和Nginx一样都是单进程事件驱动模型,linux2.6内核下都是使用了epoll机制。那么Haproxy相比Nginx有哪些优良之处呢。我认为Haproxy的优化做的比Nginx好可以承载的并发大于Nginx,还有良好的数据接口,基于流量的健康状态检查机制,服务器管理命令行接口,基于URI的负载均衡算法(在缓存服务器场景下工作良好),对session保持和cookie引导有很好的支持。并且适用于多种七层协议(Nginx只支持mail和http),还可以支持四层的负载均衡(用的少,多用于七层)。

HAproxy的一些特性如下:
   客户端侧的长连接(client-side keep-alive)
   TCP加速(TCP speedups)
   响应池(response buffering)
   RDP协议
   基于源的粘性(source-based stickiness)
   更好的统计数据接口(a much better stats interfaces)
   更详细的健康状态检测机制(more verbose health checks)
   基于流量的健康评估机制(traffic-based health)
   支持HTTP认证
   服务器管理命令行接口(server management from the CLI)
   基于ACL的持久性(ACL-based persistence)
   日志分析器


实验环境:
   Haproxy主:172.16.35.81
   Haproxy备:172.16.35.206
   PHP:172.16.35.75
   Nginx:172.16.35.249
   VIP:172.16.35.211


实验拓扑如下:
Haproxy+Keepalived实现负载均衡高可用_Haproxy
Haproxy+keeaplived安装配置:
在Haproxy主和Haproxy备分别安装keepalived

#!/bin/bash
yum install kernel-devel gcc gcc-c++ openssl-devel -y
wget http://www.keepalived.org/software/keepalived-1.2.12.tar.gz
tar zxvf keepalived-1.2.12.tar.gz
cd keepalived-1.2.12
./configure --prefix=/usr/local/keepalived --with-kernel-dir=/usr/src/kernels/*/
make && make install
mkdir /etc/keepalived
\cp  -f keepalived/etc/keepalived/keepalived.conf /etc/keepalived/
\cp -f keepalived/etc/init.d/keepalived.init /etc/init.d/keepalived
\cp -f keepalived/etc/init.d/keepalived.sysconfig /etc/sysconfig/keepalived
\cp -f /usr/local/keepalived/sbin/keepalived /sbin/


HAproxy主的keepalived配置文件如下:

! Configuration File for keepalived
global_defs {
   notification_email {
        yfzhang@Iflytek.com
   }
   notification_email_from root@localhost
   smtp_server 127.0.0.1
   smtp_connect_timeout 30
   router_id LVS_DEVEL
}
vrrp_script check_run {
        script "killall -0 haproxy"
        interval 2
        weight -2
        fail 2
}
vrrp_instance VI_1 {
    state MASTER
    interface eth0
    virtual_router_id 51
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
track_script {
        check_run
}
    virtual_ipaddress {
        172.16.35.211
    }
}

Haproxy备的keepalive配置文件和HAproxy是一样的,只是HAproxy备的priority值为99。

安装Haproxy:

#!/bin/bash
wget http://haproxy.1wt.eu/download/1.4/src/haproxy-1.4.25.tar.gz
tar zxvf haproxy-1.4.25.tar.gz
cd haproxy-1.4.25
yum install gcc gcc-c++ autoconf automake -y
make TARGET=linux2628 arch=x86_64
make install
mkdir /etc/haproxy
cp examples/haproxy.cfg /etc/haproxy
cp examples/haproxy.init /etc/init.d/haproxy
chmod +x /etc/init.d/haproxy

注意:通常我们在网上找到的haproxy的安装方法都是TARGET=linux26,这种边缘方式是可以的,不可以默认是禁用了splice系统调用splice系统调用类似与sendfile机制,在linux内核2.6.28以前有bug存在不建议使用,linux内核2.6.28以后是可以启用的,我使用的是Centos6.4内核版本是2.6.32所以使用TARGET=linux2628的编译方式。

配置HAproxy:
配置文件如下:HAproxy主和背配置文件是相同的

# this config needs haproxy-1.1.28 or haproxy-1.2.1
global
        log 127.0.0.1   local1 notice  #设置日志存放的位置和日志记录的级别,还需要进入/etc/rsyslog.conf中配置local1日志存放的位置
        maxconn 40960                   #每个haproxy进程最大可接受的并发连接数
        uid 99                            #指定运行haproxy进程的用户和组
        gid 99
        daemon                            #以服务的形式运行
        pidfile /var/log/haproxy.pid    #指定pid文件的位置
defaults
        log     global                     #使用全局配置的日志
        mode    http                    #使用七层负载均衡
        option  httplog                 #记录http访问日志
        option  dontlognull             #不记录空日志
        option forwardfor except 127.0.0.1 #允许在发往服务器的请求首部中插入“X-Forwarded-For”首部但除了127.0.0.1
        retries 3                       #连接失败后重新连接的次数
        option  redispatch              #在连接失败的情况下将sesion重新分发
        timeout http-request 10s        #等待完成http的请求的最大时间
        timeout queue 1m    #当请求达到maxconn的时候后续的连接请求就会放置连接队列中,这个时间用于设置队列中的最大等待时间
        timeout connect 1m  #尝试连接到服务器的最大等待时间
        timeout client  1m  #设置客户端这边的最大非活动时间(意思就是一个空闲连接的保持时间)
        timeout server 1m   #设置服务器端的最大非活动时间
        timeout http-keep-alive 10s #设置等待一个新的http请求的最大等待时间(从一个http请求开始到发送回复报文这段时间)
        timeout check 10s #额外的检查时间不同于server中的inter 如果设置了haproxy将会使用timeout check和inter中最小的那个
        maxconn 20000 #每个haproxy可承受的最大并发连接数目
#定义后端统计数据接口
#一个listen就等于一个frontend结合一个backend
listen ststus
        bind *:1080         #定义监听的接口
        stats enable        #开启统计数据接口
        stats hide-version   #隐藏haproxy版本
        stats uri /haproxy?stats #定义统计数据网址
        stats realm Haproxy\ Statistics #定义认证提示信息
        stats auth statsadmin:password #定义认证的用户名和密码
        stats auth statsmaster:password
        stats admin if TRUE #定义在认证通过的情况下开启管理功能
#定义一个fronted
frontend www
        bind *:80
        mode http
        log global
#开启http被动关闭
        option httpclose
#设置一个acl 用来匹配静态文件
        acl url_static path_end -i .css .js .html .htm
#设置一个acl 用来匹配动态文件
        acl url_dynamic path_end -i .php
#如果匹配了静态文件就使用nginx提供服务
        use_backend static if url_static
#默认使用php服务器
        default_backend dynamic
#定义一个后端 静态服务器
backend static
        server nginx 172.16.35.75:80 check maxconn 3000
#定义一个后端 动态服务器
backend dynamic
        server php 172.16.35.249:80 check maxconn 3000
HAproxy主和备的配置文件相同

安装Nginx提供静态web服务:

#!/bin/bash
groupadd -r nginx
useradd -r -g nginx nginx
yum install gcc gcc-c++ openssl-devel pcre-devel wget vim automake autoconf -y
wget http://nginx.org/download/nginx-1.4.7.tar.gz
#这个地址可能有的时候无法解析到域名下载不到这个包,需要自己去下载包然后安装安装步骤一步一步安装
#wget http://mirror.yongbok.net/nongnu/libunwind/libunwind-1.1.tar.gz
wget http://gperftools.googlecode.com/files/gperftools-2.1.tar.gz
#                       libunwind install             
tar -xvf libunwind-1.1.tar.gz
cd libunwind-1.1
CFLAGS=-fPIC ./configure
make CFLAGS=-fPIC
make CFLAGS=-fPIC install
cd ..
#                       gperftools install
tar -xvf gperftools-2.1.tar.gz
cd gperftools-2.1
./configure
make && make install
echo "/usr/local/lib" > /etc/ld.so.conf.d/usr_local_lib.conf
ldconfig
cd ..
#                       nginx install
tar zxvf nginx-1.4.7.tar.gz
cd nginx-1.4.7
./configure --prefix=/usr/local/nginx \
--with-http_stub_status_module \
--with-http_gzip_static_module \
--with-google_perftools_module \
--user=nginx \
--group=nginx \
--with-http_ssl_module \
--with-pcre
make && make install
#                       Setup
mkdir /tmp/tcmalloc
chmod 0777 /tmp/tcmalloc
#简单的一个nginx优化
cat >> /etc/sysctl.conf <<EOF
net.ipv4.tcp_max_tw_buckets = 6000
net.ipv4.ip_local_port_range = 1024 65000
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_syncookies = 1
net.core.somaxconn = 262144
net.core.netdev_max_backlog = 262144
net.ipv4.tcp_max_orphans = 262144
net.ipv4.tcp_max_syn_backlog = 262144
net.ipv4.tcp_synack_retries = 1
net.ipv4.tcp_syn_retries = 1
net.ipv4.tcp_fin_timeout = 1
net.ipv4.tcp_keepalive_time = 30
EOF

安装lamp提供动态应用服务这里为了方便使用yum安装:

yum install php-mysql php-gd libjpeg* php-imap php-ldap php-odbc php-pear php-xml php-xmlrpc php-mbstring php-mcrypt php-bcmath php-mhash libmcrypt php -y
yum install mysql mysql-server -y


给nginx和php两台机器分别提供一个动态页面一个静态页面
echo "I am a static page 172.16.35.75" >> /usr/local/nginx/html/index.html
echo "<?php echo "I am s dynamic page 172.16.35.249"; ?>" >> /var/www/html/index.php

验证其结果是否实现动静分离:

Haproxy+Keepalived实现负载均衡高可用_keepalived_02

Haproxy+Keepalived实现负载均衡高可用_keepalived_03


验证其结果是否实现了HAproxy的高可用

关闭keepalived实现高可用地址漂移

Haproxy+Keepalived实现负载均衡高可用_Haproxy_04


关闭haproxy实现高可用地址漂移

Haproxy+Keepalived实现负载均衡高可用_keepalived_05


至此Haproxy+Keepalived实现高可用和动静分离就实现了。