LVS+Keepalived的高可用及负载均衡集群


1.实验环境:7.6版本虚拟机封装

  • 选择7.6版本镜像,设置内存大小,设置虚拟机名
  • 安装前设置:改时区,最小化安装,自动分区,不勾选kdump enable选项(kdump能够保存系统崩溃时内存的数据)进行安装
  • 安装时:设置超级用户root和密码。
  • 安装完成,虚拟机设置:主机名;ip(uid一定要删掉)、网关;解析dns(速度快);yum源;安装vim、bash-*、 httpd等必要包;禁用防火墙,selinux是disable;最后poweroff关闭虚拟机
hostnamectl set-hostname server1
systemctl disable --now NetworkManager
vi /etc/sysconfig/network-scripts/ ifcfg-eth0
BOOTPROTO=static
DEVICE=eth0
ONBOOT=yes
IPADDR=172.25.3.11
PREFIX=24
GATEWAY=172.25.3.250
DNS1=114.114.114.114

systemctl restart network
[root@server1 ~]# vi /etc/yum.repos.d/dvd.repo
[dvd]
name=rhel7.6
baseurl=http://172.25.3.250/rhel7.6
gpgcheck=0

yum install vim bash-* httpd 
vim /etc/hosts
172.25.3.250 zhenji  #真机name
172.25.3.1 server1##可写多个虚拟机解析以供使用
  • 压缩和清理封装好的虚拟机镜像
[root@zhenji images]# virt-sysprep -d rhel7.6-linux#清理
[root@zhenji images]# virt-sparsify --compress rhel7.6-linux.qcow2 linux7.6.qcow2#压缩
[root@zhenji images]# rm -fr rhel7.6-linux.qcow2##此时可以删除原镜像,留存压缩过得镜像

2.服务器架构

服务器常用架构包括:C/S与B/S架构、高可用架构、负载均衡架构

2.1.C/S与B/S架构

在这里插入图片描述

  • BS:(Browser/Server,浏览器/服务器模式),web应用,可以实现跨平台,客户端零维护,但是个性化能力低,响应速度较慢。如微信、qq等
  • CS:(Client/Server,客户端/服务器模式),桌面级应用,响应速度快,安全性强,个性化能力强,响应数据较快。如大多数电商平台

2.2.负载均衡架构

2.3.负载均衡架构

3.lvs原理、三种模式及流量转发过程

官网http://zh.linuxvirtualserver.org/handbooks

  • 原理
    LVS(Linux Virtual Server)即Linux虚拟服务器,目前LVS已经被集成到Linux内核模块中。该项目在Linux内核中实现了基于IP的数据请求负载均衡调度方案,其体系结构如图1所示,终端互联网用户从外部访问公司的外部负载均衡服务器,终端用户的Web请求会发送给LVS调度器,调度器根据自己预设的算法决定将该请求发送给后端的某台Web服务器。

在这里插入图片描述

  • 三种模式:NAT、TUN、DR。具体原理和优缺点参考https://blog.csdn.net/qiao_qing/article/details/117285233

  • 流量转发过程:请求数据包–>DR转发–>RS。数据流通过路由器需要先经过负载均衡层(集群)处理来分担单个服务器的压力。

  • 负载均衡层包括四层负载均衡与七层负载均衡,

  • 四层负载均衡工作在OSI模型的传输层,主要工作是转发,它在接收到客户端的流量以后通过修改数据包的地址信息将流量转发到应用服务器。LVS就是四层负载均衡,但是四层无法定制分流策略,比如重定向等,且客户发起的往往是七层应用请求(http),最终是要到达七层(应用层)来进行处理。

  • 七层负载均衡工作在OSI模型的应用层,因为它需要解析应用层流量,所以七层负载均衡在接到客户端的流量以后,还需要一个完整的TCP/IP协议栈。七层负载均衡会与客户端建立一条完整的连接并将应用层的请求流量解析出来,再按照调度算法选择一个应用服务器,并与应用服务器建立另外一条连接将请求发送过去,因此七层负载均衡的主要工作就是代理。

  • OSI参考模型各层详解参考https://baike.baidu.com/item/OSI%E5%8F%82%E8%80%83%E6%A8%A1%E5%9E%8B/708028?fr=aladdin

4.LVS DR模式部署

4.1 LVS DR工作原理

在这里插入图片描述数据流:
数据流

1)客户端访问目标地址 vip;
2)数据包到达DR的时候将目标地址的mac转换成了RS(real server)的mac地址;
3)因为DR的工作机制是在第二层,数据链路层,数据包通过mac地址进行转发,因此要求DR调度器和real server必须要在同一个vlan(网段)中,否则数据链路层是不通的(在数据链路层的时候是不能过路由的,无法进行ip转换);
4)数据包到达RS后,此时通过解包能看到要访问的vip,rs上也必须要有要访问的与DR同一个vlan的vip
5)但为了能让客户端能够从调度器访问rs,因此要禁用掉rs的arp协议,不让RS对访问自己的vip地址,只能通过调度器访问自己。

总结:客户端访问目标地址vip,DR会把目标地址mack转换为RS的mac地址(流量转发),RS通过解包救护看到客户端访问的vip,而且此时RS要禁用arp协议,使自己只能通过调度器来访问自己

iptables优先于lvs策略
安全策略的优先顺序:iptables>tcpwarp>xinted(超级守护进程) >service(服务)>filesystem(底层文件系统包括:rwx,SELINUX)

4.2 添加内核策略ipvsadm

新建虚拟机快照server11、12、13,设ip、内存、主机名等

[root@server11 ~]# yum instal ipvsadm
[root@server11 ~]# ip addr add 172.25.3.100/24 dev eth0##添加虚拟ip
[root@server11 ~]# ipvsadm ­-A -­t 172.25.3.100:80 ­-s rr       ##-A:添加策略,-t:TCP服务,-s:指定调度算法,rr为轮询调度算法
[root@server11 ~]# ipvsadm ­-a -­t 172.25.3.100:80 ­-r 172.25.3.12:80 -­g     ##-a:添加;-r:真实的服务器ip;-g:表示直连模式;直连模式不支持端口转发,是什么端口就对应的是什么端口
[root@server11 ~]# ipvsadm ­-a -­t 172.25.3.100:80 ­-r 172.25.3.13:80 ­-g

在这里插入图片描述
注意:此时虽然能够看到负载均衡的假象,因为此时客户端随机访问到了server11上的vip实现正常调度,而正常情况下,server11、12、13上都有vip,因此他们都会被客户端访问到vip,真正意义上的浮在均衡是只能访问到调度节点server11,再通过均衡调度到其他节点,这就需要禁用server12和server13节点的arp协议,让它们对外广播vip地址

4.3 后端服务arp策略

禁用后端的arp(地址解析协议),让主机不要对外广播自己的vip地址,就相当于不要告诉别人我有这个ip,链路层的传输只需要mac地址(是一个用来确认网络设备位置的位址)而不需要通过ip

[root@server12 ~]# echo server12 > /var/www/html/index.html
[root@server12 ~]# systemctl enable --now httpd
[root@server12 ~]# curl localhost
server12
[root@server12 ~]# ip addr add 172.25.3.100/24 dev eth0
[root@server12 ~]# yum install -y arptables_jf
[root@server12 ~]# arptables -A INPUT -d 172.25.3.100 -j DROP##丢弃访问172.25.0.100地址的数据包,拒绝访问
[root@server12 ~]# arptables -A OUTPUT -s 172.25.3.100 -j mangle --mangle-ip-s 172.25.3.12##将输出的地址172.25.0.100转换为实际的ip
[root@server13 ~]# echo server13 > /var/www/html/index.html
[root@server13 ~]# systemctl enable --now httpd
[root@server13 ~]# curl localhost
server13
[root@server13 ~]# ip addr add 172.25.3.100/24 dev eth0
[root@server13 ~]# yum install -y arptables_jf
[root@server13 ~]# arptables -A INPUT -d 172.25.3.100 -j DROP
[root@server13 ~]# arptables -A OUTPUT -s 172.25.3.100 -j mangle --mangle-ip-s 172.25.3.13

4.4 真机模仿客户端检测负载均衡

[root@zhenji images]# arp -an | grep 100
? (172.25.3.100) at 52:54:00:37:64:a9 [ether] on br0
[root@zhenji images]# arp -d 172.25.3.100
[root@zhenji images]# curl 172.25.3.100
server13
[root@zhenji images]# curl 172.25.3.100
server12
[root@zhenji images]# curl 172.25.3.100
server13
[root@zhenji images]# curl 172.25.3.100
server12

在这里插入图片描述

DR模式下的数据流走向: client -> DR -> RS ->client,即客户端访问DR,DR第二层直接通过mac地址转发数据,工作效率最高,DR访问RS,RS直接把数据包返回给客户端,DR只是一个转发过程。

4.5 自动化检测脚本

功能:自动检测,每5秒检测一次,自动删除有故障的节点,添加正常的节点

[root@server11 mnt]# vim lvscheck.sh
[root@server11 mnt]# cat lvscheck.sh 
#!/bin/bash
VIP=172.25.3.100
PORT=80
RS=(172.25.3.12 172.25.3.13)
LOG=checklvs.log
addrs() {
	ipvsadm -a -t $VIP:$PORT -r $1:$PORT -g
	echo "add $1 to ipvs" >> $LOG
}
delrs() {
	ipvsadm -d -t $VIP:$PORT -r $1
        echo "del $1 to ipvs" >> $LOG
}
checkrs() {
	for i in ${RS[*]}
	do
		num=`curl  -I -s -o /dev/null -w %{http_code} http://$i` #返回直是200说明该命令执行正确。
		if [ $num -eq 200 -a $(ipvsadm -ln|grep $i|wc -l) -eq 0 ];then  #返回值是200且ipvsadm -ln里没有该ip;$i相当于上面的$1
			addrs $i
		elif [ $num -ne 200 -a $(ipvsadm -ln|grep $i|wc -l) -ne 0 ];then#返回值不是200且ipvsadm -ln里有该ip
			delrs $i
		fi
	done
}
while true
do
	checkrs
	sleep 5#每5秒检测一次
done

http状态码解释

测试

[root@server11 mnt]# chmod + lvscheck.sh 
[root@server11 mnt]# sh lvscheck.sh &
[1] 23006
[root@server11 mnt]# watch -n 3 ipvsadm -ln
#在server12中分别stop httpd,查看server11中的ipvsadm会删除server12
[root@server12 ~]# systemctl stop httpd

在这里插入图片描述

[root@server12 ~]# systemctl start httpd ##start后查看server11中的ipvsadm会添加server12

在这里插入图片描述

5.keepalived:LVS管理软件(解决lvs健康检查和冗余)

  • 新建虚拟机快照server14,与server11数据同步,一台发生故障,另外一台自动接管。

  • Keepalived是Linux下一个轻量级别的高可用解决方案。高可用(High Avalilability,HA),其实两种不同的含义:广义来讲,是指整个系统的高可用行,狭义的来讲就是之主机的冗余和接管。

5.1 安装及配置文件

[root@server11 mnt]# yum install keepalived ipvsadm -y
[root@server11 ~]# ipvsadm -C  #清除ipvsadm

server11配置文件

[root@server11 ~]#  vim /etc/keepalived/keepalived.conf
[root@server11 keepalived]# cat keepalived.conf 
! Configuration File for keepalived

global_defs {
  notification_email {
   root@localhost              %邮件通知,如果主机联网的话可以写外部邮箱,用于通知集群状态,写localhost本机的话需要安装mailx
  }
  notification_email_from keepalived@localhost      %邮件来源
  smtp_server 127.0.0.1         %本机
  smtp_connect_timeout 30
  router_id LVS_DEVEL
  vrrp_skip_check_adv_addr
  #vrrp_strict                #禁掉这个选项
  vrrp_garp_interval 0
  vrrp_gna_interval 0
}

vrrp_instance VI_1 {                   %高可用部分,vrrp协议巧妙利用了路由器硬件的冗余。vrrp虚拟路由器冗余协议
   state MASTER                 %主调度节点
   interface eth0
   virtual_router_id 51
   priority 100                %优先级,只要设置backup优先级比master优先级低就可以
   advert_int 1                %与backup之间每秒发一次心跳
   authentication {            %认证
       auth_type PASS
       auth_pass 1111
   }
   virtual_ipaddress {
       172.25.0.100
   }
}

virtual_server 172.25.0.100 80 {       %这部分相当于将lvs的策略以文本的方式写出来了,集群将会根据这部分内容来制定lvs策略
   delay_loop 6                  %每隔6秒钟对后端做一次健康检查
   lb_algo rr                   %定义调度算法rr轮询
   lb_kind DR                  %lvs模式(大写)
   #persistence_timeout 50     %此服务用于数据库和http。指50秒内同一个客户端发过来的请求将会交给同一个后端处理,为了看到效果,建议注释掉
   protocol TCP

##两个后端server12,13,两组real server
   real_server 172.25.0.12 80 {
       weight 1             %权重,当前类型属于tcp,所以使用tcp_check
       TCP_CHECK { 
              connect_timeout 3
              nb_get_retry 3
              delay_before_retry 3
       }
   }
   real_server 172.25.0.13 80 {
       weight 1
       TCP_CHECK {
             connect_timeout 3
           	 nb_get_retry 3
          	 delay_before_retry 3
       }
   }
}

vrrp协议虚拟路由器冗余协议,内网访问外网时候只有一个网关,如果网关换了(单点故障)就不能进行通信了。vrrp是将多个路由虚拟成一个虚拟路由,解决单点故障。
server14配置文件,在server11的基础上更改状态、id和权限

[root@server11 keepalived]# scp keepalived.conf server14:/etc/keepalived/
[root@server14 ~]# yum install ipvsadm -y
[root@server14 ~]# yum install keepalived -y
[root@server14 ~]# vim /etc/keepalived/keepalived.conf 
vrrp_instance VI_1 {
    state BACKUP  #改为BACKUP,双机热备,master挂掉后,backup成为新的master
    interface eth0 
    virtual_router_id 54  #改成自己的
    priority 50  #权限改为50,比master小

5.2 测试高可用

[root@server11 keepalived]# ip addr del 172.25.3.100/24 dev eth0
[root@server11 keepalived]# systemctl start keepalived.service 
[root@server14 keepalived]# systemctl start keepalived.service 
[root@server11 keepalived]# ipvsadm -ln #开启keepalived后会自动添加

在这里插入图片描述

模拟故障,后端服务器master down掉

[root@server11 keepalived]# systemctl stop keepalived.service
%停掉server11后,看日志会发现server14会变成Transition to MASTER STATE。因为server11断开后,server14收不到心跳连接,等待一定时间后会切换成master状态,并且向网内更新arp协议、mac地址
[root@zhenji images]# arp -an | grep 100  #真机的100对应的mac地址也会转换成server14的
? (172.25.3.100) at 52:54:00:fd:3f:ac [ether] on br0

在这里插入图片描述

[root@server11 keepalived]# systemctl start keepalived.service 
%开server11后,由于server11的master优先级高于server14,此时server变成master端,会发现server14会变成Entering BACKUP STATE,此时的mac地址和arp会响应变化。

keepalive此时就很好的解决了lvs的健康检查和冗余(因为lvs自身不带健康检查和冗余),但是切得再快也会有数据损失。

6 lvs7层负载均衡

[root@server11 keepalived]# yum install haproxy
[root@server11 keepalived]# vim /etc/haproxy/haproxy.cfg 
添加更改

在这里插入图片描述

[root@server11 keepalived]# systemctl stop keepalived.service
[root@server11 keepalived]# systemctl stop httpd
[root@server11 keepalived]# systemctl start haproxy
[root@server12 ~]# arptables -F
[root@server12 ~]# ip addr del 172.25.3.100/24 dev eth0
[root@server11 keepalived]# yum install net-tools
[root@server11 keepalived]# netstat -antlp
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      26071/haproxy 

客户端中测试负载均衡

[root@zhenji images]# for i in {1..10};do curl 172.25.3.11;done

在这里插入图片描述

8.相关协议和原理

1优点:

1)抗负载能力强,
2)效率快,工作在网络 4 层仅做请求分发之用,没有流量,所以效率快。
3)有完整的双机热备方案,当节点出现故障时,lvs 会自动判别,所以系统整体是非常稳定的。
4)基本上能支持所有应用,因为 lvs 工作在 4 层,所以它可以对几乎所有应用做负载均衡,包括 http、数据库、聊天室等等。

lvs 与 nginx 对比?
1)负载度 lvs 优于 nginx
2)稳定度 lvs 优于 nginx
3)服务器性能要求 lvs 优于 nginx
4)网络层数的效率 lvs 优于 nginx  网络七层:应用层、会话层、表示层、传输层、网络层、链路层、 物理层
5)功能多少 nginx 优于 lvs

对比项lvsnginx
负载度lvs优于nginx
稳定度
网络层数的效率
服务器性能要求
功能多少nginx优于lvs

2.Lvs原理:

1)用户访问lvs负载均衡服务器,用户的Web请求会发送给LVS调度器
2)调度器根据自己预设的算法(轮询、加权轮询、最小连接)决定将该请求发送给后端的某台Web服务器。
3)后端服务器直接响应给用户

3.keepalive原理

1)健康检查

对lvs的real server检测方式用tcp_check工作在第4层,keepalived向后端服务 器发起一个tcp连接请求, 如果后端服务器没有响应或超时,那么这个后端将从服务器池中移除。

real_server 172.25.0.12 80 {
weight 1 %权重,当前类型属于tcp,所以使用tcp_check
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
HTTP_ GET:工作在第5层,向指定的URL执行http请求,将得到的结果用md5加密并与
指定的md5值比较看是否匹配,不匹配则从服务器池中移除;此外还可以指定http返回
码来判断检测是否成功。HTTP _GET可以指定多个URL用于检测,这个台服务器有多个
虚拟主机的情况下比较好用。
keepalived可根据第3~5层的交换机制用来监控集群后端服务器状态,如果某个服务节点出现异常或故障,就把他将集群中移除,恢复正常后,再加入到集群中。

主备冗余

keepalived主要是通过虚拟路由冗余vrrp来实现高可用。
准备一个backup,与主lvs端(master)数据同步,一台发生故障,另外一台自动接管。
具体下面vrrp协议原理:

4.vrrp(虚拟路由器冗余协议)原理

1)目的是解决静态路由器出现的单点故障。vrrp(虚拟路由器冗余协议)可以实现网络不间断地,稳定地运行
2)VRRP可以将两台或多台物理服务器设备虚拟成一个虚拟路由器。
3)虚拟拟路由器通过虚拟IP(可以多个)对外提供服务,多个物理路由器协同工作,同一时间一般只有一台物理服务器对外提供服务,这台物理服务器就叫做MASTER。
4)MASTER一般由选举算法产生,当MASTER故障后,就会将自身的虚拟IP绑定到BACKUP上,由BACKUP进行对外提供服务。
5)什么时候BACKUP就知道MASTER故障了呢?
这就要靠主备之间的心跳检测,MASTER每隔段时间就告诉BACKUP,它的信息表示它alive。如果BACKUP超时未收到MASTER的alive信息,就知道MASTER已经挂了,需要切换它进行服务了。
6)VRRP优先级的取值范围为0到255(数值越大表明优先级越高)。但优先级一样时,接口IP地址大者当选为Master。
4.arp地址解析协议
禁用后端arp协议:让主机不要对外广播自己的vip地址
[root@server12 ~]# ip addr add 172.25.3.100/24 dev eth0
[root@server12 ~]# yum install -y arptables_jf
[root@server12 ~]# arptables -A INPUT -d 172.25.3.100 -j DROP##丢弃访问172.25.0.100地址的数据包,拒绝访问
[root@server12 ~]# arptables -A OUTPUT -s 172.25.3.100 -j mangle --mangle-ip-s 172.25.3.12##将输出的地址172.25.0.100转换为实际的ip

ARP地址解析协议来完成IP地址与物理地址的转化
原因:网络层以上的协议用IP地址来标识网络接口,但以太数据帧传输时,以物理地址来标识网络接口。因此我们需要进行IP地址与物理地址之间的转化。
Mac地址由设备制造商定义/分配,每一个硬件设备都有一个链路层主地址(MAC地址),保存在设备的永久内存中。设备的mac地址不会改变(现在可以进行mac地址伪装)
IP地址就是被用来给Internet上的电脑一个唯一的编号。由用户配置给网络接口, 网络接口的IP地址是可以发生变化的(通过DHCP获取IP,变化速度比较快)

5.ARP协议工作原理

1)每个主机都会在自己的 ARP 缓冲区中建立一个 ARP 列表,以表示 IP 地址和 MAC 地址之间的对应关系。
2)主机(网络接口)新加入网络时(也可能只是mac地址发生变化,接口重启等), 会发送免费ARP报文把自己IP地址与Mac地址的映射关系广播给其他主机。
3)网络上的主机接收到免费ARP报文时,会更新自己的ARP缓冲区。将新的映射关系更新到自己的ARP表中。
4)某个主机需要发送报文时,首先检查 ARP 列表中是否有对应 IP 地址的目的主机的 MAC 地址,如果有,则直接发送数据,如果没有,就向本网段的所有主机发送 ARP 数据包,该数据包包括的内容有:源主机 IP 地址,源主机 MAC 地址,目的主机的 IP 地址等。
5)当本网络的所有主机收到该 ARP 数据包时:
(A)首先检查数据包中的 IP 地址是否是自己的 IP 地址,如果不是,则忽略该数据包。
(B)如果是,则首先从数据包中取出源主机的 IP 和 MAC 地址写入到 ARP 列表中,如果已经存在,则覆盖。
(C) 然后将自己的 MAC 地址写入 ARP 响应包中,告诉源主机自己是它想要找的 MAC 地址。
6)源主机收到 ARP 响应包后。将目的主机的 IP 和 MAC 地址写入 ARP 列表,并利用此信息发送数据。如果源主机一直没有收到 ARP 响应数据包,表示 ARP 查询失败。
5.DR原理:
客户端访问目标地址vip,DR会把目标地址mac转换为RS的mac地址(流量转发),RS通过解包就能看到客户端访问的vip,而且此时RS要禁用arp协议,使自己只能通过调度器来访问自己
1)客户端访问目标地址 vip;
2)数据包到达DR的时候将目标地址的mac转换成了RS(real server)的mac地址;
3)因为DR的工作机制是在第二层,数据链路层,数据包通过mac地址进行转发,因此要求DR调度器和real server必须要在同一个vlan(网段)中,否则数据链路层是不通的(在数据链路层的时候是不能过路由的,无法进行ip转换);
4)数据包到达RS后,此时通过解包能看到要访问的vip,rs上也必须要有要访问的与DR同一个vlan的vip
5)但为了能让客户端能够从调度器访问rs,因此要禁用掉rs的arp协议,不让RS对访问自己的vip地址,只能通过调度器访问自己。
iptables优先于lvs策略
安全策略的优先顺序:iptables>tcpwarp>xinted(超级守护进程) >service(服务)>filesystem(底层文件系统包括:rwx,SELINUX)

6.keepalived脑裂问题

Keepalived的BACKUP主机在收到不MASTER主机报文后就会切换成为master,如果是它们之间的通信线路出现问题,无法接收到彼此的组播通知,但是两个节点实际都处于正常工作状态,这时两个节点均为master强行绑定虚拟IP,导致不可预料的后果,这就是脑裂。
脑裂问题首先是检测,网上有以下几个方案:
1、添加更多的检测手段,比如冗余的心跳线(两块网卡做健康监测),ping对方等等。尽量减少"裂脑"发生机会。(指标不治本,只是提高了检测到的概率);
2、设置仲裁机制。两方都不可靠,那就依赖第三方。比如启用共享磁盘锁,ping网关等。(针对不同的手段还需具体分析);
3、算法保证,比如采用投票机制(keepalived没有实现);

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值