Haproxy
HAProxy 提供高可用性、负载均衡以及基于 TCP 和 HTTP 应用的代理,支持虚拟主机,它是免费、快速并且可靠的一种解决方案。HAProxy 特别适用于那些负载特大的 web 站点, 这些站点通常又需要会话保持或七层处理。HAProxy 运行在当前的硬件上,完全可以支持数以万计的并发连接。并且它的运行模式使得它可以很简单安全的整 合进您当前的架构中, 同时可以保护你的 web 服务器不被暴露到网络上。
一、haproxy 实现对web服务器的负载均衡
实验环境:rhel6.5 selinux and iptables disabled
实验主机: 172.25.27.1 (server1) haproxy
172.25.27.2 (server2) web1
172.25.27.3 (server3) web2
172.25.27.4(server4) haproxy
软件下载:http://haproxy.1wt.eu/
rpm 包方式:
rpmbuild -tb haproxy-1.6.11.tar.gz #build rpm 包
rpm -ivh /root/rpmbuild/RPMS/x86_64/haproxy-1.6.11-1.x86_64.rpm
源码方式:
tar zxf haproxy-1.6.11.tar.gz
cd haproxy-1.6.11
make TARGET=linux26 PREFIX=/usr/local/haproxy
make install PREFIX=/usr/local/haproxy
配置:
[root@server1 ~]# cd /root/rpmbuild/BUILD/haproxy-1.6.11/examples
[root@server1 examples]# mv acl-content-sw.cfg /etc/haproxy/
[root@server1 examples]# cd /etc/haproxy/
[root@server1 haproxy]# mv acl-content-sw.cfg haproxy.cfg
[root@server1 haproxy]# id haproxy
uid=188(haproxy) gid=188(haproxy) 组=188(haproxy)
[root@server1 haproxy]# vim haproxy.cfg #编辑配置文件
global
maxconn 65535 #并发最大连接数量
stats socket /var/run/haproxy.stat mode 600 level admin
log 127.0.0.1 local0
uid 188 #用户 必须是本机查看显示的id
gid 188 #组
chroot /var/empty
Daemon #后台运行
defaults
mode http #默认使用 http 的 7 层模式 tcp: 4 层
log global
option httplog #http 日志格式
option dontlognull #禁用空链接日志
monitor-uri /monitoruri
maxconn 8000
timeout client 30s
retries 2
option redispatch
timeout connect 5s
timeout server 5s
stats uri /admin/stats #haproxy 监控页面
# The public 'www' address in the DMZ
frontend public
bind 172.25.27.1:80 name clear
#bind 192.168.1.10:443 ssl crt /etc/haproxy/haproxy.pem
#use_backend static if { hdr_beg(host) -i img }
#use_backend static if { path_beg /img /css }
default_backend dynamic
# The static backend backend for 'Host: img', /img and /css.
backend dynamic
balance roundrobin #负载均衡算法
server web1 172.25.27.2:80 check inter 1000
server web2 172.25.27.3:80 check inter 1000 检测心跳频率
/etc/init.d/haproxy start
修改别的限制:
1. 和nginx相同,从三个层面设置:
2. 内核层面:
3. [root@server1 haproxy]# sysctl -a | grep file
4. fs.file-nr = 544 0 188465
5. fs.file-max = 188465 #此处内核所支持的最大连接数已满足
6. 如果不满足需要修改配置文件:
7. vim /etc/sysctl.conf
8. 7 net.ipv4.ip_forward = 1 #开启内核路由功能
9. 系统层面:
10. vim /etc/security/limits.conf #最后一行添加
11. haproxy - nofile 65535
12. 应用层面:
13. vim /etc/haproxy/haproxy.cfg
14. 最大连接设置为65535
[root@server1 haproxy]# /etc /init.d/haproxy start #开启haproxy服务
开启server2 和server3 上的apache
测试:
balance roundrobin #轮询模式下
balance source #主备模式测试
宕掉server3上的apache 后测试
二、 pacemaker+ corosync 实现对haproxy集群的高可用
在server4主机上安装haproxy,为了保持数据的一致性,直接从server1主机上把haproxy配置文件等远程复制过去
scp haproxy-1.6.11-1.x86_64.rpm serevr4:
scp /etc/haproxy/haproxy.cfg server4:/etc/haproxy
scp /etc/security/limits.conf server4:/etc/security
vim /etc/haproxy/haproxy.cfg
37 bind 172.25.27.100:80 name clear #设置只有访问172.25.27.100才能访问集群资源
yum install -y pacemaker corosync #sevrer1、server4两个节点都安装
[root@server1 ~]# cd /etc/corosync/
[root@server1 corosync]# cp corosync.conf.example corosync.conf #配置corosync配置文件,server1、server4上必须保持一致
[root@server1 corosync]# vim corosync.conf
8 interface {
9 ringnumber: 0
10 bindnetaddr: 172.25.27.0
11 mcastaddr: 226.94.1.1
34 service{
35 name:pacemaker
36 ver:0
37 }
[root@server1 ~]# /etc/init.d/corosync start #启动服务
[root@server1 ~]# yum install crmsh-1.2.6-0.rc2.2.1.x86_64.rpm pssh-2.3.1-2.1.x86_64.rpm -y #同样两个节点都安装
[root@server1 ~]# crm #查看管理集群
crm(live)# configure
crm(live)configure# show
node server1
node server4
property $id="cib-bootstrap-options" \
dc-version="1.1.10-14.el6-368c726" \
cluster-infrastructure="classic openais (with plugin)" \
expected-quorum-votes="2"
crm(live)configure# primitive vip ocf:heartbeat:IPaddr2 params ip= 172.25.27.100 cidr_netmask=24 op monitor interval=30s #添加ip
crm(live)configure# property stonith-enabled=false #禁掉fence功能
crm(live)configure# property no-quorum-policy=ignore #关闭集群对节点数量的检查,集群默认最少量台主机, 如果只是一台主机不能接管资源 shcrm(live)configure# show node server1 node server4 primitive vip ocf:heartbeat:IPaddr2 \ params ip="172.25.27.100" cidr_netmask="24" \ op monitor interval="30s" property $id="cib-bootstrap-options" \ dc-version="1.1.10-14.el6-368c726" \ cluster-infrastructure="classic openais (with plugin)" \ expected-quorum-votes="2" \ stonith-enabled="false" \ no-quorum-policy="ignore查看ip
主机端测试:
[root@server1 ~]# /etc/init.d/corosync stop #将server1上的corosync关掉,造成人为宕机
此时ip已经漂移到了server4上,即此时集群服务已经由server4接管
crm(live)configure# primitive haproxy lsb:haproxy op monitor interval=30s #向集群添加haproxy 服务
crm(live)configure# commit
crm(live)configure# show
node server1 \
attributes standby="off"
node server4
primitive haproxy lsb:haproxy \
op monitor interval="30s"
primitive vip ocf:heartbeat:IPaddr2 \
params ip="172.25.27.100" cidr_netmask="24" \
op monitor interval="30s"
property $id="cib-bootstrap-options" \
dc-version="1.1.10-14.el6-368c726" \
cluster-infrastructure="classic openais (with plugin)" \
expected-quorum-votes="2" \
stonith-enabled="false" \
no-quorum-policy="ignore"
发现此时vip和haproxy 不在一台主机上,造成资源飘移,所以让他们绑定在一个组上
crm(live)configure# group westos vip haproxy #创建组
crm(live)configure# commit
此时开启server1、server4上的haproxy ,关闭此时ip在的主机上的corosync,发现服务仍能正常访问,实现了集群高可用
crm(live)configure# property stonith-enabled=true #开启fence功能
crm(live)configure# commit
[root@foundation27 corosync]# systemctl start fence_virtd #开启主机上的fence功能
[root@server1 ~]# yum install -y fence-virt.x86_64 fence-agents.x86_64 #server1、server4上都安装,同时设置corosync的开机自启动
crm(live)configure# primitive vmfence stonith:fence_xvm params pcmk_host_map="server1:server1;server4:server4" onitor
interval=1min #添加fence资源,并做好集群节点名和真实server的名字映射
crm(live)configure# commit
crm(live)configure# show
node server1 \
attributes standby="off"
node server4
primitive haproxy lsb:haproxy \
op monitor interval="30s"
primitive vip ocf:heartbeat:IPaddr2 \
params ip="172.25.27.100" cidr_netmask="24" \
op monitor interval="30s"
primitive vmfence stonith:fence_xvm \
params pcmk_host_map="server1:server1;server4:server4" \
op monitor interval="1min"
group westos vip haproxy
property $id="cib-bootstrap-options" \
dc-version="1.1.10-14.el6-368c726" \
cluster-infrastructure="classic openais (with plugin)" \
expected-quorum-votes="2" \
stonith-enabled="true" \
no-quorum-policy="ignore"
crm(live)configure#
此时重启server4后,server4会自动加入集群,不断的重启sever1,server4在机子启来后自动加入集群,haproxy服务也自动的被接管
[root@foundation27 corosync]# curl 172.25.27.100
<hi> www.westos.org.server3</hi>
[root@foundation27 corosync]# curl 172.25.27.100
<hi> www.server2.com </hi>
[root@foundation27 corosync]# curl 172.25.27.100
<hi> www.westos.org.server3</hi>
[root@foundation27 corosync]# curl 172.25.27.100
<hi> www.server2.com </hi>
[root@foundation27 corosync]# curl 172.25.27.100
<hi> www.westos.org.server3</hi>
[root@foundation27 corosync]# curl 172.25.27.100
<hi> www.server2.com </hi>
[root@foundation27 corosync]# curl 172.25.27.100
<hi> www.westos.org.server3</hi>
[root@foundation27 corosync]# curl 172.25.27.100
<hi> www.server2.com </hi>
[root@foundation27 corosync]# curl 172.25.27.100
<hi> www.westos.org.server3</hi>
[root@foundation27 corosync]# curl 172.25.27.100
<hi> www.server2.com </hi>
[root@foundation27 corosync]# curl 172.25.27.100
<hi> www.westos.org.server3</hi>
至此
haproxy
的基于
pacemaker
结合
corosync
的高可用负载均衡集群部署完毕
#对集群资源的管理:
crm(live)resource# show
Resource Group: westos
vip (ocf::heartbeat:IPaddr2): Started
haproxy (lsb:haproxy): Started
vmfence (stonith:fence_xvm): Stopped
crm(live)resource# stop vip #停掉vip
crm(live)resource# show
Resource Group: westos
vip (ocf::heartbeat:IPaddr2): Stopped
haproxy (lsb:haproxy): Stopped #由于ip没有了,此时的haproxy停止了
vmfence (stonith:fence_xvm): Stopped
#对集群节点的管理:
crm(live)# node
crm(live)node# standby #停掉server1节点
crm(live)node# show
server1: normal
standby: on
server4: normal
crm(live)node# online #开启server1节点
crm(live)node# show
server1: normal
standby: off
server4: normal
crm(live)node#