一、简介
HAProxy简介:
HAProxy提供高可用性、负载均衡以及基于TCP和HTTP应用的代理,支持虚拟主机,它是免费、快速并且可靠的一种解决方案。HAProxy特别适用于那些负载特大的web站点,这些站点通常又需要会话保持或七层处理。HAProxy运行在时下的硬件上,完全可以支持数以万计的并发连接。并且它的运行模式使得它可以很简单安全的整合进您当前的架构中, 同时可以保护你的web服务器不被暴露到网络上
HAProxy实现了一种事件驱动、单一进程模型,此模型支持非常大的并发连接数。多进程或多线程模型受内存限制 、系统调度器限制以及无处不在的锁限制,很少能处理数千并发连接。事件驱动模型因为在有更好的资源和时间管理的用户端(User-Space) 实现所有这些任务,所以没有这些问题。此模型的弊端是,在多核系统上,这些程序通常扩展性较差。这就是为什么他们必须进行优化以 使每个CPU时间片(Cycle)做更多的工作
Keepalived简介:
KeepAlived 是一个类似于layer3, 4 & 5交换机制的软件, 是一个高可用解决方案,通过虚拟IP地址和心跳检测对方状态来实现高可用功能。Keepalived是由两台服务器分别指定Master与Backup两个角色,而指定Master的优先级比Backup的高;所以默认情况下虚拟IP会绑定到Master服务器上,对外提供服务。而Master、Backup服务器会在一定的时间间隔向对方发送心跳信息来检测对方的存活状态,时间间隔一般为2秒钟可以修改,如果Backup发现Master宕机,那么Backup会发送ARP包到网关,然后把虚拟IP绑定到自己的网卡上,此时Backup对外提供服务,实现了自动化的故障转移,当Master恢复的时会重新接管所有资源
vip:192.168.10.16
主Haproxy:192.168.10.141
主Haproxy:192.168.10.142
real server1:192.168.10.157
realserver2:192.168.10.42
二、haproxy环境搭建
1、关闭SElinux、配置防火墙
vi /etc/selinux/config
#SELINUX=enforcing #注释掉
#SELINUXTYPE=targeted #注释掉
SELINUX=disabled #增加
:wq! #保存退出
setenforce 0 #使配置立即生效
2、创建HAProxy运行账户和组
groupadd haproxy #添加haproxy组
useradd -g haproxy haproxy -s /bin/false #创建nginx运行账户haproxy并加入到haproxy组,不允许haproxy用户直接登录系统
3、下载安装依赖包
yum install gcc gcc-c++ openssl-devel popt-devel
下载安装haproxy
wget http://pkgs.fedoraproject.org/repo/pkgs/haproxy/haproxy1.4.24.tar.gz/86422620faa9759907563d5e0524b98c/
haproxy-1.4.24.tar.gz
上传haproxy-1.4.24.tar.gz到/usr/local/src
tar -xvzf haproxy-1.4.24.tar.gz
cd haproxy-1.4.24
make install
4、设置HAProxy
mkdir -p /usr/local/haproxy/conf #创建配置文件目录
mkdir -p /etc/haproxy #创建配置文件目录
cp /usr/local/src/haproxy-1.4.24/examples/haproxy.cfg /usr/local/haproxy/conf/haproxy.cfg #拷贝配置模板文件
ln -s /usr/local/haproxy/conf/haproxy.cfg /etc/haproxy/haproxy.cfg #添加配置文件软连接
cp -r /usr/local/src/haproxy-1.4.24/examples/errorfiles /usr/local/haproxy/errorfiles #拷贝错误页面
ln -s /usr/local/haproxy/errorfiles /etc/haproxy/errorfiles #添加软连接
mkdir -p /usr/local/haproxy/log #创建日志文件目录
touch /usr/local/haproxy/log/haproxy.log #创建日志文件
ln -s /usr/local/haproxy/log/haproxy.log /var/log/haproxy.log #添加软连接
cp /usr/local/src/haproxy-1.4.24/examples/haproxy.init /etc/rc.d/init.d/haproxy #拷贝开机启动文件
chmod +x /etc/rc.d/init.d/haproxy #添加脚本执行权限
chkconfig haproxy on #设置开机启动
ln -s /usr/local/haproxy/sbin/haproxy /usr/sbin #添加软连接
5、配置haproxy.cfg参数
vi /usr/local/haproxy/conf/haproxy.cfg #编辑,修改
##################################################################### # this config needs haproxy-1.1.28 or haproxy-1.2.1 global log 127.0.0.1 local0 #在本机记录日志 log 127.0.0.1 local1 notice #log loghost local0 info maxconn 65535 #每个进程可用的最大连接数 nbproc 8 #进程数量,可以设置多个,提高处理效率 chroot /usr/local/haproxy #haproxy安装目录 uid 503 #运行haproxy的用户uid(cat /etc/passwd查看) gid 503 #运行haproxy的组uid(cat /etc/group查看) daemon #以后台守护进程运行 pidfile /usr/local/haproxy/haproxy.pid #将所有进程写入pid文件 #debug #调试模式 #quiet #安装模式 defaults #log global log 127.0.0.1 local3 #日志文件设置 mode http #运行模式tcp、http、health option httplog option http-pretend-keepalive #服务器端保持长连接 option http-server-close #每次请求完毕后主动关闭http通道 option forceclose #服务端响应后主动关闭请求连接,及早释放服务连接,不必等到客户端应答确认 option httpclose #每次请求完毕后主动关闭http通道 option accept-invalid-http-request #接受无效的http请求,一般建议不设置,但是可解决部分杂牌浏览器访问打不开页面问题 option dontlognull #不记录健康检查的日志信息 option redispatch #如果后端有服务器宕机,强制切换到正常服务器 option abortonclose #丢弃由于客户端等待时间过长而关闭连接但仍在haproxy等待队列中的请求 option forwardfor except 127.0.0.0/8 #不记录本机转发的日志 option originalto #记录客户端访问的目的IP
maxconn 65535 #每个进程可用的最大连接数
balance source #同一IP地址的所有请求都发送到同一服务器,本机测试时此项建议注释掉
retries 3 #三次连接失败,则判断服务不可用
contimeout 5000 #连接超时
clitimeout 50000 #客户端超时
srvtimeout 50000 #服务器超时
timeout check 5s #检测超时
timeout http-request 5s #http请求超时时间
timeout queue 30s #一个请求在队列里的超时时间
timeout http-keep-alive 5s #设置http-keep-alive的超时时间
stats refresh 30s #统计页面自动刷新时间
stats uri /haproxy-status #统计页面URL路径
stats realm haproxy-status #统计页面输入密码框提示信息
stats auth admin:123456 #统计页面用户名和密码
stats hide-version #隐藏统计页面上HAProxy版本信息
listen web_proxy 192.168.10.16:80
mode http
balance source #本机测试时此项建议注释掉
#option httpchk /index.php #检测服务器此文件是否存在,如果没有,则认为服务器连接异常,此参数可以不设置
server 192.168.10.157 192.168.10.157:8105 check inter 2000 rise 3 fall 3 weight 100 #inter 2000 心跳检测时间;rise 3 三次连接成功,表示服务器正常;fall 3 三次连接失败,表示服务器异常; weight 100 权重设置
server 192.168.10.42 192.168.10.42:8105 check inter 2000 rise 3 fall 3 weight 100
#errorloc 503 http://www.osyunwei.com/404.html
errorfile 403 /etc/haproxy/errorfiles/403.http
errorfile 500 /etc/haproxy/errorfiles/500.http
errorfile 502 /etc/haproxy/errorfiles/502.http
errorfile 503 /etc/haproxy/errorfiles/503.http
errorfile 504 /etc/haproxy/errorfiles/504.http
#####################################################################
:wq! #保存退出
service haproxy start #启动
service haproxy stop #关闭
service haproxy restart #重启
注意:备服务器此配置一样
6、设置HAProxy日志
vi /etc/syslog.conf #编辑,在最下边增加
# haproxy.log
local0.* /var/log/haproxy.log
local3.* /var/log/haproxy.log
:wq! #保存退出
vi /etc/sysconfig/syslog #编辑修改
SYSLOGD_OPTIONS="-r -m 0" #接收远程服务器日志
:wq! #保存退出
service syslog restart #重启syslog
三、Keepalived 环境搭建<span class="comment" style="padding: 0px; margin: 0px; color: rgb(153, 153, 136); font-style: italic; background-color: inherit;">yum -y install keepalived</span>
<span class="comment" style="padding: 0px; margin: 0px; color: rgb(153, 153, 136); font-style: italic; background-color: inherit;">vi /etc/keepalived/</span><span style="color: rgb(51, 51, 51); font-size: 13px; letter-spacing: 0.5px; line-height: 23px; font-family: 'Courier New'; background-color: rgb(240, 240, 240);"><em>keepalived.conf</em></span>
配置keepalived.conf:
主:
! Configuration File for keepalived
global_defs {
notification_email {
acassen@firewall.loc
failover@firewall.loc
sysadmin@firewall.loc
}
notification_email_from Alexandre.Cassen@firewall.loc
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id Haprxoy_Master
}
vrrp_script check_haproxy {
script "/etc/keepalived/check_haproxy.sh"
interval 4
weight 2
}
vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 51
priority 101 #主机的优先级,主机优先级一定要大于备机
advert_int 1
unicast_src_ip 192.168.10.141 #使用单播发送vrrp心跳,本地ip地址
unicast_peer {
192.168.10.142 #(对端IP地址)
}
authentication {
auth_type PASS
auth_pass 1111
}
track_script {
check_haproxy
}
virtual_ipaddress {
192.168.10.16/24 broadcast 192.168.10.255 dev eth0 label eth0:vip
}
notify_master "/etc/keepalived/clean_arp.sh 192.168.10.16" #更新虚拟服务器(VIP)地址的arp记录到网关
}
备:
! Configuration File for keepalived
global_defs {
notification_email {
acassen@firewall.loc
failover@firewall.loc
sysadmin@firewall.loc
}
notification_email_from Alexandre.Cassen@firewall.loc
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id Haprxoy_Master
}
vrrp_script check_haproxy {
script "/etc/keepalived/check_haproxy.sh"
interval 4
weight 2
}
vrrp_instance VI_1 {
state BACKUP
interface eth0
virtual_router_id 51
priority 100
advert_int 1
advert_int 1
unicast_src_ip 192.168.10.142 #使用单播发送vrrp心跳,本地ip地址 unicast_peer { 192.168.10.141 #(对端IP地址) }
authentication { auth_type PASS auth_pass 1111 } track_script { check_haproxy } virtual_ipaddress { 192.168.10.16/24 broadcast 192.168.10.255 dev eth0 label eth0:vip } notify_master "/etc/keepalived/clean_arp.sh 192.168.10.16" #更新虚拟服务器(VIP)地址的arp记录到网关}设置HAproxy服务监控脚本
vi /etc/keepalived/check_haproxy.sh #编辑,添加以下代码
#########################################################
#!/bin/bash
A=`ps -C haproxy --no-header | wc -l`
if [ $A -eq 0 ]
then service haproxy start
sleep 3
if [ `ps -C haproxy --no-header | wc -l ` -eq 0 ]
then service keepalived stop
fi
fi
#########################################################
:wq! #保存退出
chmod +x /etc/keepalived/check_haproxy.sh #添加执行权限
设置更新虚拟服务器(VIP)地址的arp记录到网关脚本
vi /etc/keepalived/clean_arp.sh #编辑,添加以下代码
#!/bin/sh
VIP=$1
GATEWAY=192.168.21.2 #网关地址
/sbin/arping -I eth0 -c 5 -s $VIP $GATEWAY &>/dev/null
:wq! #保存退出
chmod +x /etc/keepalived/clean_arp.sh #添加脚本执行权限
service keepalived start #启动
service keepalived stop #关闭
service keepalived restart #重启
测试HAProxy+Keepalived是否正常运行
进入 http://192.168.10.16/haproxy-status
输入用户名,密码
admin
123456
在192.168.10.141上:
发现VIP:192.168.10.16指向192.168.10.141
service keepalived stop 后
在192.168.10.142上:
发现VIP:192.168.10.16指向192.168.10.142
说明keepalived主备生效了!!!
转载自:http://blog.youkuaiyun.com/dandan2zhuzhu/article/details/51141760