实现基于Haproxy+Keepalived负载均衡高可用架构
今天小编讲的依然是负载均衡高可用,全是干货:
先看一下我们要实现的架构图:
一、环境准备:
centos系统服务器4台、两台用于做haproxy主从架构,两台作为后端server,服务器配置好
yum源、防火墙关闭、各节点时钟服务同步、各节点之间可以通过主机名互相通信
机器名称 |
IP配置 |
服务角色 |
备注 |
||
haproxy-server-master |
|
负载均衡器 主服务器 |
开启路由功能 配置keepalived |
||
haproxy-server-backup |
|
后端服务器 从服务器 |
开启路由功能 配置keepalived |
||
Rs01 |
|
后端服务器 |
网关指向DIP(桥接) |
||
Rs02 |
|
后端服务器 |
网关指向DIP(桥接) |
二、安装步骤:
- iptables -F && setenforing 清空防火墙策略,关闭selinux
- 拿两台服务器都使用yum方式安装haproxy、keepalived服务
- 后端服务器配置好基于LNMP架构的web服务(这部分不会就看前俩个博客)
三、修改配置文件:
修改配置文件:vim/etc/keepalived/keepalived.conf(前俩个实验改过,这次改动的不多)
然后就可以把这个文件拷进backup里面,需要修改的地方是(也可以直接在backup里面修改该文件):
- master和backup都要启动keepalived:systemctl restart keepalived
- 安装haproxy:yum install haproxy
- 修改配置文件:vim /etc/haproxy/haproxy.cfg(基本上都已经默认配置好了)
我们添加了一个listen页面
listen statsmode http
bind 0.0.0.0:1080
stats enable
stats uri /haproxyadmin
stats auth admin:admin
stats admin if TRUE
由于我们配置了一个页面,现在可以启动服务systemctl restart haproxy查看一下:
- 查看监听端口:netstat -tunlp |grep 1080
- 页面访问:
现在开始定义服务:
- master位置:vim /etc/haproxy/haproxy.cfg
- 重启服务:systemctl restart haproxy
- 出错的话就查看日志:tail -200 /var/log/haproxy.log
现在修改backup的配置文件:
- 先在master里把配置文件拷过去:scp /etc/haproxy/haproxy.cfg [email protected]:/etc/haproxy/
- 启动服务:systemctl start haproxy
- 启动keepalived: systemctl start keepalived
realserver配置:
- 配置VIP到本地回环网卡lo上,并只广播自己:ifconfig lo:0 172.17.252.102 broadcast172.17.252.102 netmask 255.255.255.255 up
- 配置本地回环网卡路由:route add -host172.17.251.102 lo:0
- 设置1只回答目标IP地址是来访网络接口本地地址的ARP查询请求:echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore
- 设置2对查询目标使用最适当的本地地址.在此模式下将忽略这个IP数据包的源地址并尝试选择与能与该地址通信的本地地址(忽略IPMAC地址正确也可以响应):
echo "2">/proc/sys/net/ipv4/conf/lo/arp_announce
- 关闭arp应答,设置:
1:仅在请求的目标IP配置在本地主机的接收到请求报文的接口上时,才给予响应
2:必须避免将接口信息向非本网络进行通告
echo "1">/proc/sys/net/ipv4/conf/all/arp_ignore
echo "2">/proc/sys/net/ipv4/conf/all/arp_announce
- 创建文件健康检查页面会用到:echo 2 >/data/web/index.html
- 开启web、php-fpm、mysql服务
实现了负载均衡:fori in $(seq 10);do curlhttp://172.17.252.102/index.html;done
下面是它的几个扩展应用:
1. Haproxy访问控制ACL应用
在master里修改配置文件:vim/etc/haproxy/haproxy.cfg
重启:systemctl restart haproxy
.master主机的/data/web/index.html文件存在
通过日志查看:tail -f /var/log/haproxy.log
已经有一个挂掉了
2.通过ACL指定可访问的用户
在master里修改配置文件:vim/etc/haproxy/haproxy.cfg
重启:systemctl restart haproxy
通过日志查看:tail -f /var/log/haproxy.log (403错误)
好了其他机器不能访问了(注意了,1.要把backup的keepalived服务停掉,2.master主机的/data/web/index.html文件存在)
然后就可以把配置恢复了,会发现又可以访问了
3.根据用户访问内容实现动静分离
在master里修改配置文件:vim/etc/haproxy/haproxy.cfg
启动服务:systemctl restart haproxy
网页访问:
4.根据用户浏览器进行访问控制
阻拦IE浏览器的访问
在IE上访问发现并访问不了
5.设置日志服务:
1. 在配置文件里定义了日志级别,vim/etc/rsyslog.conf,然后
2级别的日志都会存在/var/log/haproxy.log
重启服务:systemctlrestart rsyslog
2.在haproxy的配置文件进行配置:vim /etc/haproxy/haproxy.log
6.会话保持俩种方法:
一、源地址hash(用户IP识别)
Haroxy 将用户IP经过hash计算后指定到固定的真实服务器上(类似于nginx 的IP hash 指令)。
缺点:当后端一台服务器挂了以后会造成部分session丢失
backend SOURCE_srv
mode http
balance source
server app-node1 10.31.1.179:80 check port 80 inter 3000 rise 3 fall 3
server app-node2 10.31.1.191:80 check port 80 inter 3000 rise 3 fall 3
server app-node3 10.31.0.35:80 check port 80 inter 3000 rise 3 fall 3
二、cookie 识别
haproxy将WEB服务端返回给客户端的cookie中插入haproxy中特定的字符串(或添加前缀)在后端的服
务器COOKIE ID。
backendCOOKIE_srv
mode http
cookieSERVERID insert indirect nocache
serverapp-node1 10.31.1.179:80 check port 80cookie a inter 3000 rise 3 fall 3
serverapp-node2 10.31.1.191:80 check port 80cookie b inter 3000 rise 3 fall 3
serverapp-node3 10.31.0.251:80 check port 80 cookie c inter 3000 rise 3 fall 3
在LB1上配置好HAProxy后,LB1将接受用户的所有请求。如果一个用户请求不包含任何cookie,那这
个请求将被HAProxy转发到一台可用的WEB服务器。可能是webA,webB,webC。然后HAProxy将把
处理这个请求的WEB服务器的cookie值插入到请求响应中。如SERVERID=A。当这个客户端再次访问
并在HTTP请求头中带有SERVERID=A,HAProxy将会把它的请求直接转发给webA处理。在请求到达
webA之前,cookie将被移除,webA将不会看到这个cookie。如果webA不可用,对应的请求将被转
发到其他可用的WEB服务器,相应的cookie值也将被重新设置。
现在我们介绍cookie识别的方法:当我们把一台realserver挂了,
cookie值就会变:
OK,小编介绍完了