赞
踩
在大型网站中一般服务端会做集群,同时利用负载均衡器做负载均衡。这样有利于将大量的请求分散到各个服务器上,提升网站的响应速度。当然为了解决单点故障的问题,还会做热备份方案。这里演示利用LVS做负载均衡器,同时利用Keepalived保证其高可用,基于LVS的DR模式构建Nginx集群。
Keepalvied的工作原理我们这里不在赘述,有需要的同学可查看小强之前的文章。
相关文章:
【Nginx-学习nginx这一篇就够了】
【搭建keepalived+nginx热备高可用(主备+双主模式)】
LVS(Linux Virtual Server)即Linux虚拟服务器,是由章文嵩博士主导的开源负载均衡项目,目前LVS已经被集成到Linux内核模块中。该项目在Linux内核中实现了基于IP的数据请求负载均衡调度方案,其体系结构如图1所示,终端互联网用户从外部访问公司的外部负载均衡服务器,终端用户的Web请求会发送给LVS调度器,调度器根据自己预设的算法决定将该请求发送给后端的某台Web服务器,比如,轮询算法可以将外部的请求平均分发给后端的所有服务器,终端用户访问LVS调度器虽然会被转发到后端真实的服务器,但如果真实服务器连接的是相同的存储,提供的服务也是相同的服务,最终用户不管是访问哪台真实服务器,得到的服务内容都是一样的,整个集群对用户而言都是透明的。最后根据LVS工作模式的不同,真实服务器会选择不同的方式将用户需要的数据发送到终端用户,LVS工作模式分为NAT模式、TUN模式、以及DR模式。
NAT(Network Address Translation)即网络地址转换,其作用是通过数据报头的修改,使得位于企业内部的私有IP地址可以访问外网,以及外部用用户可以访问位于公司内部的私有IP主机。
在LVS(NAT)模式的集群环境中,由于所有的数据请求及响应的数据包都需要经过LVS调度器转发,如果后端服务器的数量大于10台,则调度器就会成为整个集群环境的瓶颈。我们知道,数据请求包往往远小于响应数据包的大小。因为响应数据包中包含有客户需要的具体数据,所以LVS(TUN)的思路就是将请求与响应数据分离,让调度器仅处理数据请求,而让真实服务器响应数据包直接返回给客户端。
DR模式也叫直接路由模式,其体系结构如图4所示,该模式中LVS依然仅承担数据的入站请求以及根据算法选出合理的真实服务器,最终由后端真实服务器负责将响应数据包发送返回给客户端。
轮询调度(Round Robin 简称’RR’)算法就是按依次循环的方式将请求调度到不同的服务器上,该算法最大的特点就是实现简单。轮询算法假设所有的服务器处理请求的能力都一样的,调度器会将所有的请求平均分配给每个真实服务器。
加权轮询(Weight Round Robin 简称’WRR’)算法主要是对轮询算法的一种优化与补充,LVS会考虑每台服务器的性能,并给每台服务器添加一个权值,如果服务器A的权值为1,服务器B的权值为2,则调度器调度到服务器B的请求会是服务器A的两倍。权值越高的服务器,处理的请求越多。
最小连接调度(Least Connections 简称’LC’)算法是把新的连接请求分配到当前连接数最小的服务器。最小连接调度是一种动态的调度算法,它通过服务器当前活跃的连接数来估计服务器的情况。调度器需要记录各个服务器已建立连接的数目,当一个请求被调度到某台服务器,其连接数加1;当连接中断或者超时,其连接数减1。
(集群系统的真实服务器具有相近的系统性能,采用最小连接调度算法可以比较好地均衡负载。)
加权最少连接(Weight Least Connections 简称’WLC’)算法是最小连接调度的超集,各个服务器相应的权值表示其处理性能。服务器的缺省权值为1,系统管理员可以动态地设置服务器的权值。加权最小连接调度在调度新连接时尽可能使服务器的已建立连接数和其权值成比例。调度器可以自动问询真实服务器的负载情况,并动态地调整其权值。
HOSTNAME | IP | 说明 |
---|---|---|
nginx | 192.168.92.100 | nginx服务器 |
nginx | 192.168.92.101 | nginx服务器 |
Lvs+keepalived(主) | 192.168.92.102 | Lvs+keepalived(VIP:192.168.92.150) |
Lvs+keepalived(备) | 192.168.92.103 | Lvs+keepalived(VIP:192.168.92.150) |
所有计算机节点关闭网络配置管理器,因为有可能会和网络接口冲突:
systemctl stop NetworkManager
systemctl disable NetworkManager
1. 进入到网卡配置目录,找到咱们的ens33:
cd /etc/sysconfig/network-scripts/
2. 拷贝并创建子接口,修改接口配置:
#数字1为别名,可以取其他数字
cp ifcfg-ens33 ifcfg-ens33:1
vim ifcfg-ens33:1
3. 配置参考如下:
4. 重启网络服务,或者重启linux:
service network restart
5. 重启成功后,ip addr查看一下,你会发现多了一个ip,也就是虚拟ip(vip)
现如今的centos都是集成了LVS,所以ipvs是自带的,相当于苹果手机自带ios,我们只需要安装ipvsadm即可(ipvsadm是管理集群的工具,通过ipvs可以管理集群,查看集群等操作),命令如下:
yum install ipvsadm
安装成功后,可以检测一下:
ipvsadm -Ln
图中显示目前版本为1.2.1,此外是一个空列表,啥都没。
两台服务器配置一样,以下已一台服务器配置作为演示
配置虚拟网络子接口可以理解为构建一个虚拟ip,这个ip只能返回数据,不能被访问。
1.进入到网卡配置目录,找到 lo(本地环回接口,用户构建虚拟网络子接口),拷贝一份新的随后进行修改:
2.修改内容如下:
3.重启后通过ip addr 查看如下,表示ok:
通过命令刷新网卡
ifup lo
1.arp-ignore:ARP响应级别(处理请求)
0:只要本机配置了ip,就能响应请求
1:请求的目标地址到达对应的网络接口,才会响应请求
2.arp-announce:ARP通告行为(返回响应)
1.打开sysctl.conf
vim /etc/sysctl.conf
2.配置所有网卡、默认网卡以及虚拟网卡的arp响应级别和通告行为,分别对应:all,default,1o:
#configration for lvs
net.ipv4.conf.all.arp_ignore=1
net.ipv4.conf.default.arp_ignore=1
net.ipv4.conf.lo.arp_ignore=1
net.ipv4.conf.all.arp_announce=2
net.ipv4.conf.default.arp_announce=2
net.ipv4.conf.lo.arp_announce=2
3.刷新配置
sysctl -p
4.增加一个网关,用于接收数据报文,当有请求到本机后,会交给lo去处理
route add -host 192.168.92.150 dev lo:1
5.防止重启失效,做如下处理,用于开机自启动
1.创建LVS节点,用户访问的集群调度者
ipvsadm -A -t 192.168.92.150:80 -s rr
2.创建2台RS真实服务器
把nginx添加到集群
ipvsadm -a -t 192.168.92.150:80 -r 192.168.92.100:80 -g
ipvsadm -a -t 192.168.92.150:80 -r 192.168.92.101:80 -g
到这一步,Lvs搭建DR模式已经完成,VIP地址已经可以正常访问
3.为什么多次刷新后还是访问的同一个节点呢?(我们配置的轮询)
在配置中:
ipvsadm -E -t 192.168.92.150:80 -s rr -p 5
ipvsadm -Ln
到这一步,请求5秒一次后会进行轮训
还有一个 tcp, udp 超时时间的默认配置
#设置超时时间都为1秒 (为了测试轮询方便而设置, 一般保持默认即可)
ipvsadm --set 1 1 1
#查看当前ipvs模块中记录的连接(可用于观察转发情况)
ipvsadm -lnc
ps:查看ipvs模块的转发情况统计
ipvsadm -Ln --stats | --rate
--stats
选项是统计自该条转发规则生效以来的包
Conns (connections scheduled) 已经转发过的连接数
InPkts (incoming packets) 入包个数
OutPkts (outgoing packets) 出包个数
InBytes (incoming bytes) 入流量(字节)
OutBytes (outgoing bytes) 出流量(字节)
--rate
选项是显示速率信息
CPS (current connection rate) 每秒连接数
InPPS (current in packet rate) 每秒的入包个数
OutPPS (current out packet rate) 每秒的出包个数
InBPS (current in byte rate) 每秒入流量(字节)
OutBPS (current out byte rate) 每秒入流量(字节)
4.保存到规则库,否则重启失效
ipvsadm -S
5.检查集群
查看集群列表
ipvsadm -Ln
查看集群状态
ipvsadm -Ln --stats
6.其他命令:
#清除所有纪录
ipvsadm -C
#重启ipvsadm,重启后需要重新配置
service ipvsadm restart
#查看持久化连接
ipvsadm -Ln --persistent-conn
#查看连接请求过期时间以及请求源ip和目标1p
ipvsadm -Lnc
#设置tcp tcpfin udp的过期时间(一般保持默认)
ipvsadm --set 111
#查看过期时间
ipvsadm -Ln --timeout
6.更详细的帮助文档:
ipvsadm -h
man ipvsadm
keepalived这里不在赘述,有需要的同学可跳转链接
centos7.9搭建keepalived+nginx热备高可用(主备+双主模式)】
这种架构目前在很多公司都在采用的高可用高性能架构, 优点如下:
cd /etc/keepalived
vim keepalived.conf
配置文件如下:
! Configuration File for keepalived
global_defs {
router_id LVS_102
}
vrrp_instance VI_1 {
state MASTER
interface ens33
virtual_router_id 41
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.92.150
}
}
# LVS 配置: 配置集群访问的 IP+端口, 端口和nginx保持一致, 都是80, IP与端口是空格而不是冒号
virtual_server 192.168.92.150 80 {
# 健康检查的时间, 单位是秒
delay_loop 6
# 配置负载均衡的算法, 默认是 轮询
lb_algo rr
# 设置LVS的工作模式 NAT|TUN|DR lb是load_balance 负载均衡的缩写
lb_kind DR
# 会话持久化的时间, 默认是 50 秒
persistence_timeout 5
# 协议 -t
protocol TCP
# Real Server 配置 nginx服务ip+端口
real_server 192.168.92.100 80 {
# 轮询的权重, 默认有多少台, 就设置为多少个 1
weight 1
# 设置健康检查, 基于 tcp
TCP_CHECK {
# 检查的80端口
connect_port 80
# 检查的超时时间 2秒
connect_timeout 2
# 重试的次数 我们设置为2, 一般是5-7
nb_get_retry 2
# 设置间隔时间 3s
delay_before_retry 3
}
}
real_server 192.168.92.101 80 {
weight 1
# 设置健康检查, 基于 tcp
TCP_CHECK {
# 检查的80端口
connect_port 80
# 检查的超时时间 2秒
connect_timeout 2
# 重试的次数 我们设置为2, 一般是5-7
nb_get_retry 2
# 设置间隔时间 3s
delay_before_retry 3
}
}
}
清除负载均衡的规则
ipvsadm -C
重启keepalived, 使得配置生效
systemctl restart keepalived
步骤同 Master ,只有配置文件不一样
! Configuration File for keepalived
global_defs {
#主服务器配置不同,名称随便起
router_id LVS_103
}
vrrp_instance VI_1 {
#主服务器配置不同
state BACKUP
interface ens33
virtual_router_id 41
#主服务器配置不同,权重需要比主服务器低
priority 50
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.92.150
}
}
# LVS 配置: 配置集群访问的 IP+端口, 端口和nginx保持一致, 都是80, IP与端口是空格而不是冒号
virtual_server 192.168.92.150 80 {
# 健康检查的时间, 单位是秒
delay_loop 6
# 配置负载均衡的算法, 默认是 轮询
lb_algo rr
# 设置LVS的工作模式 NAT|TUN|DR lb是load_balance 负载均衡的缩写
lb_kind DR
# 会话持久化的时间, 默认是 50 秒
persistence_timeout 5
# 协议 -t
protocol TCP
# Real Server 配置 nginx服务ip+端口
real_server 192.168.92.100 80 {
# 轮询的权重, 默认有多少台, 就设置为多少个 1
weight 1
# 设置健康检查, 基于 tcp
TCP_CHECK {
# 检查的80端口
connect_port 80
# 检查的超时时间 2秒
connect_timeout 2
# 重试的次数 我们设置为2, 一般是5-7
nb_get_retry 2
# 设置间隔时间 3s
delay_before_retry 3
}
}
real_server 192.168.92.101 80 {
weight 1
# 设置健康检查, 基于 tcp
TCP_CHECK {
# 检查的80端口
connect_port 80
# 检查的超时时间 2秒
connect_timeout 2
# 重试的次数 我们设置为2, 一般是5-7
nb_get_retry 2
# 设置间隔时间 3s
delay_before_retry 3
}
}
}
改完配置文件,进行重启keeplivaed,命令同上!
重启完出现相同路由规则标识已配置成功
停掉 LVS 的 Master 节点 (102节点操作)
keepalived stop keepalived
ip addr
观察主节点130 LVS节点 IP
此时发现102节点的 ens33中150ip已经没有了
观察备用节点 131 LVS 节点 IP
在Backup上通过ipvsadm -Lnc
命令查看网站链接情况
网站还可以正常访问
重启Master 节点,我们发现ip有漂移回来了
我们关闭100节点的Nginx服务器(假如宕机状态)
cd /usr/local/nginx/sbin
./nginx -s stop
进入102 LVS 节点进行查看集群信息
ipvsadm -Ln
只剩下了101节点, 即可以做到自动剔除宕机节点
我们启动100节点nginx,进入102 LVS 节点进行查看集群信息,发现节点已自动恢复到集群
到此LVS+KeepAlived+Nginx高可用实现方案已经搭建完毕!!!!!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。