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#