您的位置:首页 > 运维架构 > 网站架构

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

2014-05-08 17:16 896 查看
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+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实现高可用地址漂移





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





至此Haproxy+Keepalived实现高可用和动静分离就实现了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  keepalived Haproxy