实现基于Haproxy+Keepalived负载均衡高可用架构

来源:互联网 发布:plc和单片机有什么区别 编辑:程序博客网 时间:2024/05/05 16:15

今天小编讲的依然是负载均衡高可用,全是干货:

先看一下我们要实现的架构图:


一、环境准备:

centos系统服务器4台、两台用于做haproxy主从架构,两台作为后端server,服务器配置好

yum源、防火墙关闭、各节点时钟服务同步、各节点之间可以通过主机名互相通信

机器名称

IP配置

服务角色

备注

haproxy-server-master

VIP:172.17.252.102

DIP:172.17.252.233

负载均衡器

主服务器

开启路由功能

配置keepalived

haproxy-server-backup

RIP:172.17.252.115

VIP:172.17.252.102

后端服务器

从服务器

开启路由功能

配置keepalived

Rs01

RIP:172.17.252.116

VIP:172.17.252.102

后端服务器

网关指向DIP(桥接)

Rs02

RIP:172.17.252.117

VIP:172.17.252.102

后端服务器

网关指向DIP(桥接)


二、安装步骤:

  • iptables -F && setenforing 清空防火墙策略,关闭selinux
  • 拿两台服务器都使用yum方式安装haproxy、keepalived服务
  • 后端服务器配置好基于LNMP架构的web服务(这部分不会就看前俩个博客)

三、修改配置文件:

修改配置文件:vim/etc/keepalived/keepalived.conf(前俩个实验改过,这次改动的不多)


然后就可以把这个文件拷进backup里面,需要修改的地方是(也可以直接在backup里面修改该文件)


  • masterbackup都要启动keepalivedsystemctl restart keepalived
  • 安装haproxyyum install haproxy
  • 修改配置文件:vim  /etc/haproxy/haproxy.cfg(基本上都已经默认配置好了)

我们添加了一个listen页面

  listen stats
  mode 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  root@172.17.252.115:/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
  • 开启webphp-fpmmysql服务

 实现了负载均衡: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.要把backupkeepalived服务停掉,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,小编介绍完了














阅读全文
0 0
原创粉丝点击