Linux集群

 

1 搭建高可用集群

  1.1 keepalived 工作原理

  1.2 安装 keepalived

  1.3 keepalived+Nginx 实现 Web高可用

    1.3.1设置master

    1.3.2 设置backup

    1.3.3 验证

2 搭建负载均衡集群

  2.1 LVS介绍

  2.2 🥇LVS的调度算法

  2.3 NAT模式LVS搭建

  2.4 DR模式LVS搭建

  2.5 keepalived+LVS

Linux集群

集群从功能实现分为两种:高可用集群和负载均衡集群。高可用,顾名思义,当一台服务器宕机不能提供服务了,还有另外的服务器顶替。负载均衡集群,简单讲就是把用户的请求分摊到多台服务器上,。

1 搭建高可用集群

高可用集群,即“HA集群”,也常称作”双机热备“,用于关键业务。常见实现高可用的开源软件有heartbeat和keepalived,其中keepalived还有负载均衡的功能。这两个软件类似,核心原理都是通过心跳线连接两台服务器,正常情况下有一台服务器提供服务,当这台服务器宕机,备用服务器顶替。

发现heartbeat在Centos 6上不太好用,heartbeat软件在2010年就停止了更新。本节实验中采用keepalived实现HA集群。

1.1 keepalived 工作原理

讲述keepalived工作原理之前,先介绍一个协议VRRP(Virtual Router Redundancy Protocol,虚拟路由冗余协议)。它是实现路由高可用的一种通信协议,在这个协议里会将多台功能相同的路由器组成一个小组,这个小组里会有1个master(主)角色和N(N>=1)个backup(备用)角色。工作时,master会通过组播的形式向各个backup发送VRRP协议的数据包,当backup收不到master发来的VRRP数据包时,就会认为master宕机了,此时就需要根据各个backup的优先级来决定谁成为新的master。

而keepalived就是采用这种VRRP协议实现的高可用。keepalived要有三个模块,分别是corecheckvrrp

其中core模块为keepalived的核心,负责主程序的启动、维护以及全局配置文件的加载和解析;

check模块负责健康检查;

vrrp模块用来实现vrrp协议。

1.2 安装 keepalived

准备两台Linux虚拟机(128和129),其中128作为master,129作为backup)。

两台机器上

# yum install -y keepalived

CentOS默认的yum源里有keepalived,本次实验版本为1.2,重点在于配置,拿一个实际案例来阐述keepalived的高可用功能。

1.3 keepalived+Nginx 实现 Web高可用

生产环境中,诸多企业把Nginx作为负载均衡器来用,它的重要性很高,一旦宕机会导致整个站点不能访问,所以有必要准备一台备用Nginx,keepalived用在这种场景下非常合适。管理的业务也是这样用的两台Nginx做负载均衡,每一台上面都安装了keepalived,也就是说keepalived和Nginx安装在一起。在配置之前,先把两台机器的IP、角色罗列一下。

master:192.168.188.128 安装keepalived+Nginx

backup:192.168.188.129 安装keepalived+Nginx

VIP:192.168.188.100

VIP(Virtual IP),即“虚拟IP”,也有人叫它“浮动IP”。因为这个IP是由keepalived给服务器配置上的,服务器靠这个VIP对外提供服务,当master机器宕机,VIP被分配到backup上,这样用户看来是无感知的。

 

1.3.1设置master

编辑master(128)的keepalived的配置文件 //改

# vim /tec/keepalived/keepalived.conf
global_defs{
notificaton_email{
aming@aminglinux.com //定义接收告警的人
}
notification_email_from root@aminglinux.com //定义发邮件的地址(实际没用)
smtp_ser 127.0.0.1 //定义发邮件地址,若为127.0.0.1则使用本机自带邮件服务器发送
smtp_connect_timeout 30
router_id LVS_DEVEL
}

vrrp_script chk_nginx {
script "/usr/local/sbin/check_ng.sh" //自定义脚本,该脚本为监控Nginx服务的脚本
interval 3 //每隔3秒执行一次该脚本
}

vrrp_instance VI_1 {
state MASTER //角色为master
interface ens33 //针对哪个网卡监听VIP
virtual_router_id 51
priority 100 //权重为100,master要比backup大
advert_int 1
authentication {
auth_type PASS
auth_pass aminglinux>com //定义密码,这个密码自定义
}
virtual_ipaddress {
192.168.188.100 //定义VIP
}
track_script {
chk_nginx //定义监控脚本,这里和上面vrr_script后面的字符床保持一致
}
}

keeplived要实现高可用,监控Nginx服务是必不可少的,它本身没有这个功能,不要借助自定义脚本实现,所以定义一个监控Nginx服务的脚本,如下:

# vim /sur/local/sbin/check_ng.sh
# 时间变量,用于记录日志
d=`date --date today +%Y%m%d_%H:%M:%S`
# 计算Nginx进程数量
n=`ps -C nginx --no-heading |wc -l`
# 如果进程为0,则启动Nginx,并且再次检测nginx进程数量,
# 如果还为0,说明Nginx无法启动,此时需要关闭keepalived
if [ $n -eq "0" ];then
/etc/init.d/nginx start
n2=`ps -C nginx --no-heading |wc -l`
if [ $2 -eq "0" ];then
echo "$d nginx down,keepalived will stop" >> /var/log/check_ng.log
systemctl stop keepalived
fi
fi

#####以上为脚本内容#####
# chmod a+x /usr/local/sbin/check_ng.sh

-C<指令名称>:指定执行指令的名称,并列出该指令的程序的状况。 h:不显示标题列。 --no-headers:此选项的效果和指定"h"选项相同,只在列表格式方面稍有差异。

 

做完以上操作,就可以启动master上的keepalived了,如果没有启动Nginx服务,它会帮我们自动拉起来,并监听VIP:

# systemctl start keepalived
# ip add
...
2: ens33:
inet 192.168.188.128/24 brd 192.168.188.255 scope global ens33
valid_lft forever preferred_lft forever
inet 192.168.188.100/32 scope global ens33
...
可以看到master上已经自动配置了192.168.188.100这个IP。再看看Nginx服务
# ps aux |grep nginx
xxx
xxx

master上已经大功告成。

 

1.3.2 设置backup

下面继续配置backup,首先编辑配置文件:

# vim /etc/keepalived/keepalived.conf       //内容和master大部分一致,state和priority有变化
global_defs{
notificaton_email{
aming@aminglinux.com //定义接收告警的人
}
notification_email_from root@aminglinux.com //定义发邮件的地址(实际没用)
smtp_ser 127.0.0.1 //定义发邮件地址,若为127.0.0.1则使用本机自带邮件服务器发送
smtp_connect_timeout 30
router_id LVS_DEVEL
}

vrrp_script chk_nginx {
script "/usr/local/sbin/check_ng.sh" //自定义脚本,该脚本为监控Nginx服务的脚本
interval 3 //每隔3秒执行一次该脚本
}

vrrp_instance VI_1 {
state BACKUP //角色为backup
interface ens33 //针对哪个网卡监听VIP
virtual_router_id 51
priority 90 //权重为90,master要比backup大
advert_int 1
authentication {
auth_type PASS
auth_pass aminglinux>com //定义密码,这个密码自定义
}
virtual_ipaddress {
192.168.188.100 //定义VIP
}
track_script {
chk_nginx //定义监控脚本,这里和上面vrr_script后面的字符床保持一致
}
}

编辑监控脚本,如下:

# vim /sur/local/sbin/check_ng.sh
# 时间变量,用于记录日志
d=`date --date today +%Y%m%d_%H:%M:%S`
# 计算Nginx进程数量
n=`ps -C nginx --no-heading |wc -l`
# 如果进程为0,则启动Nginx,并且再次检测nginx进程数量,
# 如果还为0,说明Nginx无法启动,此时需要关闭keepalived
if [ $n -eq "0" ];then
systemctl start nginx
n2=`ps -C nginx --no-heading |wc -l`
if [ $2 -eq "0" ];then
echo "$d nginx down,keepalived will stop" >> /var/log/check_ng.log
systemctl stop keepalived
fi
fi

#####以上为脚本内容#####
# chmod a+x /usr/local/sbin/check_ng.sh

由于backup(129)上还未安装Nginx,暂时不能启动keepalived,还需如下操作:

# yum install -y epel-release
# yum install -y nginx
CentOS 7上yum安装的Nginx启动命令为systemctl start nginx,脚本的nginx启动命令有所改变。
现在把keepalived服务启动:
# systemctl start keepalived

虽然在129上安装了Nginx,但并不需要启动Nginx服务,正常情况下只要master提供Nginx服务即可。

 

1.3.3 验证

下面验证keepalived的高可用。

1️⃣ 先看两个Nginx服务的版本和VIP所在。

# curl -I 192.168.188.128       //128上的版本为1.10.3
200 ok
server: nginx/1.10.3
Last-Modified: sun,26 Mar 2017 09:56:56 GMT

# systemctl start nginx //129
# curl -I 192.168.188.129
200 ok
server: nginx/1.10.2
Last-Modified: Mon, 31 0ct 2016 12:37:02 GMT

# curl -I 192.168.188.100 //VIP也是在master
200 ok
server: nginx/1.10.3

 

2️⃣ 先把master上的Nginx故意关掉:

# netstat -lntp |grep nginx
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 927/nginx: master p
tcp 0 0 0.0.0.0:443 0.0.0.0:* LISTEN 927/nginx: master p
# /etc/init.d/nginx stop
Stopping nginx (via systemctl):
# netstat -lntp |grep nginx //关掉之后,暂时没有Nginx服务
过了几秒,再来检测端口,发现端口自己启动了:
# netstat -lntp |grep nginx
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 927/nginx: master p
tcp 0 0 0.0.0.0:443 0.0.0.0:* LISTEN 927/nginx: master p

也可以通过/var/log/messages日志看到Nginx被启动的信息:

Apr 4   16:22:11    aminglinux-123  systemd: Stopping   SYSV: http  service....
Apr 4 16:22:11 aminglinux-123 nginx: Stopping Nginx: [确定]
Apr 4 16:22:11 aminglinux-123 systemd: Stopping SYSV:http service..
Apr 4 16:22:11 aminglinux-123 systemd: Starting SYSV: http service....
Apr 4 16:22:11 aminglinux-123 nginx: Starting Nginx: [确定]
Apr 4 16:22:11 aminglinux-123 systemd: Starting SYSV:http service..

关闭Nginx服务后,没超过3秒钟,它又被启动了。

 

3️⃣ ​下面再模拟master宕机,加一条iptables规则(这时Nginx还是启动状态,backup上有VIP,master上也还有,会产生脑裂):

# iptables -I OUTPUT -p vrrp -j DROP

查看backup上是否被设置了VIP

# ip add
...
2: ens33: ...
inet 192.168.188.129/24 brd 192.168.188.255 scope global ens33
valid_lft forever preferred_lft forever
inet 192.168.188.100/32 scope global ens33
...

VIP已设置

再看/var/log/messages

其中也有VIP相关信息,但并不完美,因为在master上依旧有VIP,master上虽然被禁掉了VRRP协议,但它并不认为自己宕机。

如果master和backup都绑定了VIP那么对外提供服务就会紊乱,这叫作“脑裂”,这种情况是不允许发生的。其实还有一种测试方案,直接把master上的keepalived服务关掉,运行下面命令:

# systemctl stop keepalived
# curl -I 192.168.188.100
# curl -I 192.168.188.100 //VIP也是在master
200 ok
server: nginx/1.10.2

VIP已在slave上,再把master上的keepalived服务开启:
# systemctl start keepalived
# curl -I 192.168.188.100
200 ok
Server: nginx/1.10.3

 

2 搭建负载均衡集群

负载均衡集群,简单说就是让多台服务器均衡地承载压力。实现负载均衡集群的开源软件有LVSkeepalivedhaproxyNginx等,当然也有优秀的商业负载均衡设备,比如F5、NetScaler等。商业的负载均衡解决方案稳定没的说,但是成本非常昂贵,本节以开源的LVS为主。

2.1 LVS介绍

LVS(Linux Virtual Server)是由国内大牛张文嵩开发的,这款软件的流行度不亚于Apache的httpd,它是一款四层的负载均衡软件,是针对TCP/IP做的转发和路由,所以稳定性和效率相当高。不过LVS最新的版本是基于Linux2.6内核的,这意味着他已经有多年没有更新了。虽然目前越来越多的企业选择使用Nginx实现负载均衡,但LVS依然被诸多企业应用在核心的架构中。LVS的架构图如下:

在该架构中有一个核心的角色叫做调度器(Load Balancer),用来分发用户的请求,还有诸多的真是服务器(Real Server),也就是处理服务器请求的服务器。

image-20210102222448411

LVS根据实现方式的不同,主要分为三种类型:NAT模式、IP Tunnel(IP隧道)模式、DR模式。

1️⃣NAT模式

IPtables有nat表,和这里的NAT是一个意思。这种模式的实现原理很简单,调度器会把用户的请求通过预设的iptables规则转发给后端的真实服务器。其中调度器有两个IP,分别是公网IP和内网IP,而真实服务器只有内网IP。用户访问的时候请求的是调度器公网IP,它会把用户的请求转发到真实服务器的内网IP上。这种模式的好处是节省公网IP,但是调度器会成为一个瓶颈。

NAT模式架构图如下:

image-20210102223339746

image-20210102223400523

2️⃣IP Tunnel模式

IP隧道是将一个IP报文封装在另一个IP报文的技术,这可以使目标为一个IP地址的数据报文能被封装和转发到另一个IP地址。想大家熟知的VPN技术其实就是IP隧道。在LVS的IP Tunnel架构中,后端服务器有一组而非一个,所以不可能静态的建立一一对应的隧道。而是动态地选择一台服务器,将请求报文封装和转发给选出的服务器。这样,我们可以利用IP隧道的原理,将一组服务器上的网络服务组成在一个IP地址上虚拟网络服务。

IP Tunnel模式架构图如下:

image-20210102224528442

调度器(Load Balancer)将请求报文封装在另一个IP报文中,再将封装后的IP报文转发给真实服务器。真实服务器收到报文后,先将报文解封获得原来目标地址为VIP的报文,服务器发现VIP地址被配置在本地的IP隧道设备上,所以就处理这个请求,然后根据路由表将响应报文直接返回给客户。这种模式下,需要给调度器和所有的真实服务器全部分配公网IP,所以比较浪费公网IP。

3️⃣DR模式

和IP Tunnel模式方法相同,用户的请求被调度器动态地分配到真实服务器上,真实服务器响应请求把结果直接返回给用户。不过,在这种模式下不会封装IP,而是将数据帧的MAC地址改为真实服务器的MAC地址。

DR模式架构图:

image-20210102230031604

 

LVS的官方网站给出了三种模式的比较。

 VS/NATVS/TUNVS/DR
server any Tunneling Non-arp device
server network private LAN/WAN LAN
server number low(10~20) High(100) High(100)
server gateway load balancer own router own router

以上三种方法所能支持最大服务器的估值是假设调度器使用100MB网卡,调度器的硬件配置与后端服务器的硬件配置相同,而且是针对一般Web服务的。使更高的硬件配置(如千兆网卡和更快的处理器)作为调度器,调度器所能调度的服务器数量会相应增加。当应用不同时,服务器的数目也会相应也会相应地改变。所以,以上数据估计主要是为三种方法的伸缩性进行量化比较。

根据图21-1的比较可以看出,NAT模式适合小型的集群,机器数量不多,它的优势是节省公网IP。TUN和DR相差不大,都能支撑比较大规模的集群,但缺点是浪费公网IP。

2.2 🥇LVS的调度算法

调度器把客户端发来的请求均衡地分发给后端的真实服务器,这是依靠预先设定好的调度算法实现的,在LVS中支持的调度算法主要有以下8种。

1️⃣轮询调度(Round-Robin)

非常简单的一种调度算法,就是按顺序把请求依次发送给后端的服务器,它不管后端服务器的处理速度和响应时间怎样。当后端服务器性能不一致时,用这种调度算法就不合适了

2️⃣带权重的轮询调度(Weighted Round-Robin)

比第一种算法多了一个权重的设置,权重越高的服务器被分配到的请求就越多,这样后端服务器性能不一致时,就可以给配置低的服务器比较小的权重。

3️⃣最小链接调度(Least-Connection)

这种算法会根据各真实服务器上的连接数来决定把新的请求分配给谁,连接数少说明服务器是空闲的,这样把新的请求分配到空闲服务器上才更加合理。

4️⃣带权重最小连接调度(Weight Least-Connection)

在最小连接调度的基础上再增加一个权重设置,这样就可以人为地去控制哪些服务器上多分配请求,哪些少分配请求。

5️⃣基于局部性的最少链接调度(Locality-Based Least Connection)

这种算法简称LBLC,是针对请求报文的目标IP地址的负载均衡调度,目前主要用于Cache集群系统,因为在Cache集群中客户请求报文的目标IP地址是变化的。算法的设计目标是在服务器的负载基于平衡的情况下,将相同目标IP地址的请求调度到同一台服务器,来提高各台服务器的访问局部性和主存Cache命中率。

6️⃣带复制的基于局部性最少链接调度(Locality-Based Least Connections with Replication)

该算法简称LBLCR,也是针对目标IP地址的负载均衡,它与LBLC算法的不同之处是:它要维护从一个目标IP地址到一组服务器的映射,而LBLC算法是维护从一个目标IP地址到一台服务器的映射。LBLCR算法先根据请求的目标IP地址找出该目标IP地址对应的服务器组,按“最小连接”原则从该服务器组中选出一台服务器,若服务器没有超载,则将请求发送到该服务器;若服务器超载,则按“最小连接”原则从整个集群中选出一台服务器,将该服务器加入到服务器组中,将请求发送到该服务器。同时,当该服务器组有一段时间没有被修改,将最忙的服务器从服务器组中删除,以降低复制的程度。

7️⃣目标地址散列调度(Destination Hashing)

该算法也是针对目标IP地址的负载均衡的,但它是一种静态映射算法,通过一个散列(hash)函数将一个目标IP地址映射到一台服务器。目标地址散列调度算法先根据请求的目标IP地址,作为散列键(hash key)从静态分配的散列表找出对应的服务器,若该服务器是可用的且未超载,将请求发送到该服务器,否则返回空。

8️⃣源地址散列调度(Source Hashing)

该算法正好与目标地址散列调度算法相反,它根据请求的源IP地址,作为散列键从静态分配的散列表找出对应的服务器,若该服务器是可用的且未超载,将请求发送到该服务器,否则返回空。

它的算法流程与目标地址散列算法的基本相似,只不过将请求的目标IP地址换成请求的源IP地址。

 

对于以上8种调度算法,前4种用得比较多,也最容易理解,它们基本上能满足绝大多数的应用场景。关于LVS的介绍内容较多,也在面试的时候经常会被问到

2.3 NAT模式LVS搭建

NAT模式下,调度器需要有两个IP,一个公网IP一个内网IP,真实服务器只需要内网IP。此架构需要准备三台机器。三台机器的IP分配如下:

  • 调度器dir:192.168.188.128(内网IP),192.168.147.144(公网IP,vmware仅主机网络模式)。

  • 真实服务器rs1:192.168.188.129(内网IP)。

  • 真实服务器rs2:192.168.188.127(内网IP)。

其中调度器上有两块网卡,作为内网的这块网卡使用的是NAT的网络,而作为“公网”的网卡使用的是仅主机网络。这里模拟的公网IP不是真实的公网IP。再配置LVS之前,需要做一些准备工作。首先,真实服务器rs1和rs2上需要把内网的网关设置为dir的内网IP(128),否则实验无法成功,然后清空三台服务器上的iptables规则清空并保存。

# iptables -F;iptables -t nat -F;service iptables save      //三台服务器都要执行

dir上安装ipvsadm,这是实现LVS的核心工具:

# yum install -y ipvsadm

# vim /usr/local/sbin/lvs_nat.sh
#!/bin/bash
# director服务器上开启路由转发功能
echo 1 > /proc/sys/net/ipv4/ip_forward
# 关闭ICMP的重定向
echo 0 > /proc/sys/net/ipv4/conf/all/send_redirects
echo 0 > /proc/sys/net/ipv4/conf/default/send_redirects
# 主要区分网卡名字,注意自己的网卡名,这里分别为ens33和ens37
echo 0 > /proc/sys/net/ipv4/conf/ens33/send_redirects
echo 0 > /proc/sys/net/ipv4/conf/ens37/send_redirects
# director 设置NAt防火墙
iptables -t nat -F
iptables -t nat -X
iptables -t nat -A POSTROUTING -s 192.168.188.0/24 -j MASQUERADE
# director 设置ipvsadm
IPVSADM='/usr/sbin/ipvsadm'
$IPVSADM -C
$IPVSADM -A -t 192.168.147.144:80 -s wlc -p 300
$IPVSADM -a -t 192.168.147.144:80 -r 192.168.188.129:80 -m -w 1
$IPVSADM -a -t 192.168.147.144:80 -r 192.168.188.127:80 -m -w 1

其中ipvsadm的参数

-C选项可以清空规则,防止之前的规则有影响。

-A增加Virtual Server,-t为TCP,-s选项指定调度算法,wcl为带权重的最小连接算法,

-p指定超时时间(这里的300为300秒,它表示300秒内相同用户的请求会一直被调度到同一台rs上,这里不建议设置该参数,否则后续检查结果会比较麻烦),

-a增加rs,-r指定rs的IP,-m表示LVS的模式为NAT(masquerad),

-g表示LVS模式为DR,

-i表示LVS模式的IP Tunnel

-w指定权重。

 

# bash /usr/local/sbin/lvs_nat.sh
# killall nginx //关闭Nginx服务,否则影响实验结果

给129和127设置一个默认页面,127位128(dir)的克隆(Nginx为编译的),129位yum安装的
# echo "rs1" > /usr/share/nginx/html/index.html //在129上执行,yum安装
# echo "rs2" > /data/nginx/default/index.html //在127上执行

在dir访问两个rs
# curl 192.168.188.129
rs1
# curl 192.168.188.127
rs2

这样区分开了rs1和rs2,然后直接在dir上访问dir的外网IP(192.168.147.144)
# curl 192.168.147.144
rs2
# curl 192.168.147.144
rs2
# curl 192.168.147.144
rs2
# curl 192.168.147.144
rs2
# curl 192.168.147.144
rs2
连续访问多次,一直请求到rs2上,这是因为在前面的脚本有设置-p,理论上在300秒内会一直请求到rs2上。先重新编辑/usr/local/sbin/lvs_nat.sh脚本把-p删除,然后再次测试:
# curl 192.168.147.144
rs2
# curl 192.168.147.144
rs1
# curl 192.168.147.144
rs2
# curl 192.168.147.144
rs1
# curl 192.168.147.144
rs2
# curl 192.168.147.144
rs1
这次做到了均衡访问。

2.4 DR模式LVS搭建

DR模式同样需要三台虚拟机,三台机器只需要有“公网IP”,这种模式下多了一个VIP。

  • 调度器dir:192.168.188.128(内网IP)。

  • 真实服务器rs1:192.168.188.129(内网IP)。

  • 真实服务器rs2:192.168.188.127(内网IP)。

  • VIP:192.168.188.110

先把两台rs的网关改回原来网关,在dir上编写一个shell脚本:

# vim /usr/local/sbin/lvs_dr.sh
#!/bin/bash
echo 1 > /proc/sys/net/ipv4/ip_forward
ipv=/usr/sbin/ipvsadm
vip=192.168.188.110
rs1=192.168.188.129
rs2=192.168.188.127
# 注意这里的网卡名字
ifconfig ens33:2 $vip broadcast $vip netmask 255.255.255.255 up
route add -host $vip dev ens33:2
$ipv -C
$ipv -A -t $vip:80 -s wrr
$ipv -a -t $vip:80 -r $rs1:80 -g -w 1
$ipv -a -t $vip:80 -r $rs2:80 -g -w 1

两台rs上也需要编写脚本(内容一样)
# vim /usr/local/sbin/lvs_dr_rs.sh
#!/bin/bash
vip=192.168.188.110
# 把vip绑定在lo上,是为了rs能直接把结果返回给客户端
ifconfig lo:0 $vip broadcast $vip netmask 255.255.255.255 up
route add -host $vip lo:0
# 以下操作作为更改ARP内核参数,目的是让rs顺利发送mac地址给客户端
# 参考www.cnblogs.com/lgfeng/archive/2012/10/16/2726308.html
echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore
echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce
echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore
echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce
# echo "rs2" > /data/nginx/default/index.html

分别在三台机器上执行各自的脚本
# bash /usr/local/sbin/lvs_dr.sh //128
# bash /usr/local/sbin/lvs_dr_rs.sh //127、129

执行完三个脚本后测试。这次不能再dir上用curl命令测试,因为VIP在三台机器上都有设置,直接curl去访问VIP的话不可能成功。只能用浏览器来测试结果。

2.5 keepalived+LVS

LVS架构中,不管是NAT模式还是DR模式,当后端的RS宕掉时,调度器依然会把请求转发到宕掉的RS上,这样的结果并不是我们想要。其实,keepalived就可以解决该问题,它不仅仅有高可用的功能,还有负载均衡的功能。在调度器上只要安装了keepalived,就不用再安装ipvsadm了,也不用去编写LVS相关的脚本了,也就是说keepalived已经嵌入了LVS功能。完整的keepalived+LVS架构需要有两台调度器实现高可用,提供调度服务的只需要一台,另外一台作为备用。

为了节省资源,只设置一台keepalived,备用的暂时就省略掉。

  • 主keepalived(调度器):192.168.188.128

  • 真实服务器rs1:192.168.188.129

  • 真实服务器rs2:192.168.188.127

  • VIP:192.168.188.110

安装keepalived,编辑keepalived的配置文件:

# yum install -y keepalived
# vim /etc/keepalived/keepalived.conf //更改
vrrp_instance VI_1 {
#备用服务器上为BACKUP
state MASTER
interface ens33 //针对哪个网卡监听VIP
virtual_router_id 51
#备用服务器上为90
priority 100 //权重为100,master要比backup大
advert_int 1
authentication {
auth_type PASS
auth_pass aminglinux //定义密码,这个密码自定义
}
virtual_ipaddress {
192.168.188.110 //定义VIP
}
}
virtual_server 192.168.188.110 80 {
#每隔10秒查询realserver状态
delay_loop 10
#(lvs 算法)
lb_algo wlc
#(DR模式)
lb_kind DR
#(同一IP的连接60秒内被分配到同一台realserver)
persistence_timeout 60
#(用TCP协议检查realserver状态)
protocol TCP

real_server 192.168.188.129 80 {
#(权重)
weight 100
TCP_CHECK {
#(10秒无响应超时)
connect_timeout 10
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
real_server 192.168.188.127 80 {
weight 100
TCP_CHECK {
connect_timeout 10
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
}

由于在上节执行过LVS脚本,所以需要做一些操作:

# ipvsadm -C        //把之前的ipvsadm规则清空
# systemctl restart network //可以把之前设置的VIP删掉

在keepalived配置的文件中定义的LVS模式为DR模式,需要在两台rs上执行lvs_dr_rs.sh。上节有脚本代码
# sh /usr/local/sbin/lvs_dr_rs.sh //129和127上都执行

 

在128上启动keepalived服务:

# systemctl start keepalived
# ps aux |grep keepalived //检查有无keepalived进程

检验是否成功的方法很简单,需要在浏览器直接访问vip192.168.188.110,然后故意把其中一台rs的Nginx服务关掉,不如说关闭129的;然后再刷新浏览器看结果,刷新的时候需要使用组合键(Ctrl+F5)强制刷新浏览器,这样就不会有缓存数据了。同时,也可以在调度器(128)上执行ipvsadm -ln查看连接数:

# ipvsadm -ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:port Forward Weight ActiveConn InActConn
TCP 192.168.188.110:80 wlc
-> 192.168.188.127:80 Route 100 1 14
 
对应的rs只有一台127,然后再把129的Nginx服务启动,再看:
# ipvsadm -ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:port Forward Weight ActiveConn InActConn
TCP 192.168.188.110:80 wlc
-> 192.168.188.127:80 Route 100 0 0
-> 192.168.188.129:80 Route 100 0 0

 

出处:《跟阿铭学Linux》

posted @ 2021-02-21 20:27  破碎的屋檐  阅读(96)  评论(0编辑  收藏  举报