LVS+Keepalived+Nginx基于DR模式构建高可用方案
1.负载均衡的类型
负载均衡可以采用硬件设备(例如常常听见的F5),也可以采用软件负载
商用硬件负载设备成本通常较高(一台几十万甚至上百万),所以一般情况下会采用软件负载.
软件负载解决的两个核心问题是:选谁、转发,其中最著名的是lvs .
2.lvs 是什么?
英文全称是Linux Virtual Server,即Linux 虚拟服务器
Linux2.4内核以后,LVS已经是 Linux标准内核的一部分
可以将请求分发给后端真实服务器处理
提供了多种调度算法
轮询调度(Round-RobinScheduling)
加权轮询调度(WeightedRound-Robin Scheduling)
最小连接调度(Least-ConnectionScheduling)
加权最小连接调度(WeightedLeast-Connection Scheduling)
基于局部性的最少链接(Locality-BasedLeast Connections Scheduling)
最短预期延时调度(ShortestExpected Delay Scheduling)
不排 队 调 度 ( Never Queue Scheduling )对应:rr|wrr|lc|wlc|lblc|lblcr|dh|sh|sed|nq
有三种转发规则
NAT:简单理解,就是数据进出都通过LVS,性能不是很好。
TUNL:简单理解:隧道
DR:最高效的负载均衡规则
3.lvs 的体系结构
最前端的负载均衡层,用Load Balancer 表示
中间的服务器集群层,用Server Array 表示
最底端的数据共享存储层,用Shared Storage 表示
在用户看来,所有的内部应用都是透明的,用户只是在使用一个虚拟服务器提供的高性能服务
4.keepAlived 是什么?
因为所有的请求都要经过负载均衡,所以负载均衡必然是非常重要,不能挂掉,说白了就是要 keep the lvs alived。
提供的功能就是可以配置2 台LVS,一台主机,一台备机。并且检测任何一个节点是否还活着。
(1)定义
keepalived是集群管理中保证集群高可用的一个服务软件,其功能类似于heartbeat,用来防止单点故障。
(2)工作原理
将N台提供相同功能的路由器组成一个路由器组,这个组里面有一个master和多个backup,master上面有一个对外提供服务的
vip(该路由器所在局域网内其他机器的默认路由为该vip),master会发组播,当backup收不到vrrp包时就认为master宕掉了,
这时就需要根据VRRP的优先级来选举一个backup当master。这样的话就可以保证路由器的高可用了。
(3)VPPR协议
keepalived是以VRRP协议为实现基础的,VRRP全称VirtualRouter Redundancy Protocol,即虚拟路由冗余协议。
虚拟路由冗余协议,可以认为是实现路由器高可用的协议,即将N台提供相同功能的路由器组成一个路由器组,这个组里面有一个
master和多个backup,master上面有一个对外提供服务的vip(该路由器所在局域网内其他机器的默认路由为该vip),master
会发组播,当backup收不到vrrp包时就认为master宕掉了,这时就需要根据VRRP的优先级来选举一个backup当master
5.lvs 的优点?
抗负载能力强,因为lvs 工作方式的逻辑是非常之简单,而且工作在网络4 层仅做请求分发之用,没有流量,所以在效率上基本不需要太过考虑。
有完整的双机热备方案,当节点出现故障时,lvs会自动判别,所以系统整体是非常稳定的。
基本上能支持所有应用,因为lvs 工作在 4层,所以它可以对几乎所有应用做负载均衡,包括http、数据库等等。
6.lvs 负载均衡机制
lvs是四层负载均衡,也就是说建立在OSI 模型的第四层——传输层之上
传输层上有TCP/UDP,lvs支持 TCP/UDP的负载均衡
因为LVS 是四层负载均衡,因此它相对于其它高层负载均衡的解决办法,比如 DNS 域名轮流解析、应用层负载的调度、客户端的调度等,它的效率是非常高的
lvs的转发还可以通过修改直接路由实现(DR模式)
7.lvs 与 nginx对比?
负载度 lvs 优于nginx
稳定度 lvs 优于nginx
服务器性能要求lvs 优于 nginx
网络层数的效率lvs 优于 nginx
功能多少 nginx 优于lvs
各个软件及其版本信息如下:
软件
版本
Centos系统
Nginx1.16.0
LVSipvsadm-1.27-7.el7.x86_64
Keepalivedkeepalived.x86_64 0:1.3.5-8.el7_6
节点分配及角色如下:
节点
192.192.192..154 lvs master
192.192.192..155 lvs slave
192.192.192..150 nginx1
192.192.192..151 nginx2
基于上述的环境,部署的架构如下:
特别注意:
(1)首先在lvsmaster节点和slave节点关闭防火墙以及安装lvs和keepalived
关闭lvsmaster和slave节点上的访火墙:
systemctlstop firewalld
systemctldisable firewalld
yuminstall ipvsadm
yuminstall keepalived
(2)在nginx1和nginx2节点上安装nginx:
#添加nginx的yum源
rpm-ivhhttp://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm
# 安装
yuminstall nginx
安装完成nginx后,编辑其默认页面,加上特定的信息,这样才能判断请求到底是哪个nginx处理的,即:
vi/usr/share/nginx/html/index.html
对于nginx1加上150字样,nginx2加上151字样,即:
当直接访问nginx1时,效果为:当直接访问nginx2时,效果为
(3)在lvsmaster节点和lvsslave节点配置keepalived信息:
首先配置lvsmaster节点:
编辑如下文件:
[root@c6-yz-htsb-sc01~]# cat /etc/keepalived/keepalived.conf
!Configuration File for keepalived
#全局配置
global_defs{
#邮件通知信息
# notification_email {
#定义收件人
# }
#定义发件人
# notification_email_from [email protected]
# smtp_server 192.168.200.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_scriptchk_nginx {
script "/etc/keepalived/nginx_check.sh"
interval 2
weight -20
}
#一个vrrp_instance就是定义一个虚拟路由器的,实例名称
vrrp_instanceVI_1 {
#定义初始状态,可以是MASTER或者BACKUP
state MASTER
#工作接口,通告选举使用哪个接口进行
interface eth0
#虚拟路由ID,如果是一组虚拟路由就定义一个ID,如果是多组就要定义多个,而且这个虚拟
virtual_router_id 51
#如果你上面定义了MASTER,这里的优先级就需要定义的比其他的高
priority 100
#通告频率,单位为秒
advert_int 1
mcast_src_ip=134.134.134.154
#通信认证机制,这里是明文认证还有一种是加密认证
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
#IP/掩码 dev配置在哪个网卡
134.134.134.163
}
#追踪脚本,通常用于去执行上面的vrrp_script定义的脚本内容
track_script {
chk_nginx
}
}
#定义LVS集群服务,可以是IP+PORT;也可以是fwmark数字,也就是防火墙规则
#所以通过这里就可以看出来keepalive天生就是为ipvs而设计的
virtual_server134.134.134.163 80 {
delay_loop 6
# 算法
lb_algo rr
# LVS的模式
lb_kind DR
#子网掩码,这个掩码是VIP的掩码
nat_mask 255.255.255.0
#持久连接超时时间
persistence_timeout 50
#定义协议
protocol TCP
#后端应用服务器 IPPORT
real_server 134.134.134.154 80 {
# 权重
weight 1
# 针对应用服务器做健康检查的方法
TCP_CHECK {
# 连接超时时间
connect_timeout 3
# 尝试次数
nb_get_retry 3
# 每次尝试之间间隔几秒
delay_before_retry 3
}
}
nginx进程检测脚本:
#!/bin/bash
A=`ps-C nginx --no-header | wc -l`
if [$A -eq 0 ];then
/usr/sbin/nginx #尝试重新启动nginx
sleep 2 #睡眠2秒
if [ `ps -C nginx --no-header | wc -l` -eq 0 ];then
killall keepalived #启动失败,将keepalived服务杀死。将vip漂移到其它备份节点
fi
分别启动lvsmaster和slave的keepalived,并且设置为开机自启动:
systemctlstart keepalived
systemctlenable keepalived
ip a
在nginx服务器上设置回环IP:
由于服务器重启后设置的回环IP会失效,所以将设置的内容放在脚本lvs-rs.sh中,内容如下:
#!/bin/bash
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
sysctl-w net.ipv4.ip_forward=1
ifconfiglo:0 134.134.134.163 broadcast 134.134.134.163 netmask255.255.255.255 up
routeadd -host 134.134.134.163 dev lo:0
执行后,查看IP信息,可以在lo网卡中看到VIP的信息,即:
END