史上最全LVS+keepalived+nginx基于DR模式高可用安装部署
lvs+keepAlived→效率最高的负载均衡
在大型网站中一般服务端会做集群,同时利用负载均衡器做负载均衡。这样有利于将大量的请求分散到各个服务器上,提升网站的响应速度。当然为了解决单点故障的问题,还会做热备份方案。这里演示利用LVS做负载均衡器,同时利用Keepalived保证其高可用,基于LVS的DR模式构建Nginx集群。
(1)定义
keepalived是集群管理中保证集群高可用的一个服务软件,其功能类似于heartbeat,用来防止单点故障。
(2)工作原理
将N台提供相同功能的路由器组成一个路由器组,这个组里面有一个master和多个backup,master上面有一个对外提供服务的
vip(该路由器所在局域网内其他机器的默认路由为该vip),master会发组播,当backup收不到vrrp包时就认为master宕掉了,
这时就需要根据VRRP的优先级来选举一个backup当master。这样的话就可以保证路由器的高可用了。
(3)VPPR协议
keepalived是以VRRP协议为实现基础的,VRRP全称Virtual Router Redundancy Protocol,即虚拟路由冗余协议。
虚拟路由冗余协议,可以认为是实现路由器高可用的协议,即将N台提供相同功能的路由器组成一个路由器组,这个组里面有一个
master和多个backup,master上面有一个对外提供服务的vip(该路由器所在局域网内其他机器的默认路由为该vip),master
会发组播,当backup收不到vrrp包时就认为master宕掉了,这时就需要根据VRRP的优先级来选举一个backup当master
一、 简介
-
负载均衡的类型
负载均衡可以采用硬件设备(例如常常听见的 F5),也可以采用软件负载
商用硬件负载设备成本通常较高(一台几十万甚至上百万),所以一般 情况下会采用软件负载
软件负载解决的两个核心问题是:选谁、转发,其中最著名的是 lvs -
lvs 是什么?
英文全称是 Linux Virtual Server,即 Linux 虚拟服务器
Linux2.4 内核以后,LVS 已经是 Linux 标准内核的一部分
可以将请求分发给后端真实服务器处理
提供了多种调度算法
轮询调度(Round-Robin Scheduling)
加权轮询调度(Weighted Round-Robin Scheduling)
最小连接调度(Least-Connection Scheduling)
加权最小连接调度(Weighted Least-Connection Scheduling)
基于局部性的最少链接(Locality-Based Least Connections Scheduling)
带 复 制 的 基 于 局 部 性 最 少 链 接 ( Locality-Based Least Connections with Replication Scheduling)
目标地址散列调度(Destination Hashing Scheduling)
源地址散列调度(Source Hashing Scheduling)
最短预期延时调度(Shortest Expected Delay Scheduling)
不 排 队 调 度 ( Never Queue Scheduling )对应: rr|wrr|lc|wlc|lblc|lblcr|dh|sh|sed|nq
有三种转发规则
NAT:简单理解,就是数据进出都通过 LVS,性能不是很好。
TUNL:简单理解:隧道
DR:最高效的负载均衡规则 -
lvs 的体系结构
最前端的负载均衡层,用 Load Balancer 表示
中间的服务器集群层,用 Server Array 表示
最底端的数据共享存储层,用 Shared Storage 表示
在用户看来,所有的内部应用都是透明的,用户只是在使用一个虚拟服 务器提供的高性能服务 -
keepAlived 是什么?
因为所有的请求都要经过负载均衡,所以负载均衡必然是非常重要,不 能挂掉,说白了就是要 keep the lvs alived。
提供的功能就是可以配置 2 台 LVS,一台主机,一台备机。并且检测任 何一个节点是否还活着。 -
lvs 的优点?
抗负载能力强,因为 lvs 工作方式的逻辑是非常之简单,而且工作在网络 4 层仅做请求分发之用,没有流量,所以在效率上基本不需要太过考虑。
有完整的双机热备方案,当节点出现故障时,lvs 会自动判别,所以系统整体是非常稳定的。
基本上能支持所有应用,因为 lvs 工作在 4 层,所以它可以对几乎所有应用做负载均衡,包括 http、数据库、聊天室等等。 -
lvs 负载均衡机制
lvs 是四层负载均衡,也就是说建立在 OSI 模型的第四层——传输层之 上
传输层上有 TCP/UDP,lvs 支持 TCP/UDP 的负载均衡
因为 LVS 是四层负载均衡,因此它相对于其它高层负载均衡的解决办法, 比如 DNS 域名轮流解析、应用层负载的调度、客户端的调度等,它的效 率是非常高的
lvs 的转发可以通过修改 IP 地址实现(NAT 模式)
lvs 的转发还可以通过修改直接路由实现(DR 模式) -
lvs 与 nginx 对比?
负载度 lvs 优于 nginx
稳定度 lvs 优于 nginx
服务器性能要求 lvs 优于 nginx
网络层数的效率 lvs 优于 nginx 网络七层:应用层、会话层、表示层、传输层、网络层、链路层、 物理层
功能多少 nginx 优于 lvs
1、环境准备
各个软件及其版本信息如下:
软件
版本
Centos系统
Linux release 7.3.1611 (Core)
Nginx
1.16.0
LVS
ipvsadm-1.27-7.el7.x86_64
Keepalived
keepalived.x86_64 0:1.3.5-8.el7_6
节点分配及角色如下:
节点
角色
192.168.208.154
lvs master
192.168.208.155
lvs slave
192.168.208.150
nginx1
192.168.208.151
nginx2
同时特别注意这里设置的VIP地址为:192.168.208.100,VIP也即虚拟的IP地址,即当外部请求所访问的IP地址。
2、部署架构
基于上述的环境,部署的架构如下:
特别注意:
由于是采用DR模式,也即当用户请求发送到VIP时,LVS会根据所设置的负载均衡算法将请求转发到具体的Nginx服务器(Real Server)上,而当具体的Nginx服务器处理完后是直接将结果返回给用户。所以在具体的Nginx服务器是要设置回环的IP,即在lo网卡上设置VIP的地址。
3、部署程序
关闭lvs master和slave节点上的访火墙:
systemctl stop firewalld
systemctl disable firewalld
sed -i “s/^SELINUX=enforcing/SELINUX=disabled/g” /etc/sysconfig/selinux
setenforce 0
添加hosts
10.17.249.81 c4dns01
10.17.249.82 c4dns02
(1)、首先在lvs master节点和slave节点安装lvs和keepalived:
yum install ipvsadm
yum install keepalived
(2)、在nginx1和nginx2节点上安装nginx:
添加nginx的yum源
rpm -ivh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm
安装
yum install nginx
安装完成nginx后,编辑其默认页面,加上特定的信息,这样才能判断请求到底是哪个nginx处理的,即:
vi /usr/share/nginx/html/index.html
对于nginx1加上150字样,nginx2加上151字样,即:
当直接访问nginx1时,效果为:
当直接访问nginx2时,效果为:
(3)、在lvs master节点和lvs slave节点配置keepalived信息:
首先配置lvs master节点:
编辑如下文件:
[root@c6-yz-htsb-sc01 ~]# cat /etc/keepalived/keepalived.conf
! Configuration File for keepalived
全局配置
global_defs {
邮件通知信息
notification_email {
定义收件人
acassen@firewall.loc
failover@firewall.loc
sysadmin@firewall.loc
}
定义发件人
notification_email_from Alexandre.Cassen@firewall.loc
SMTP服务器地址
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_script chk_nginx
{
script “/etc/keepalived/nginx_check.sh”
interval 2
weight -20
}
一个vrrp_instance就是定义一个虚拟路由器的,实例名称
vrrp_instance VI_1 {
定义初始状态,可以是MASTER或者BACKUP
state MASTER
工作接口,通告选举使用哪个接口进行
interface eth0
虚拟路由ID,如果是一组虚拟路由就定义一个ID,如果是多组就要定义多个,而且这个虚拟
ID还是虚拟MAC最后一段地址的信息,取值范围0-255
virtual_router_id 51
如果你上面定义了MASTER,这里的优先级就需要定义的比其他的高
priority 100
通告频率,单位为秒
advert_int 1
mcast_src_ip=134.80.189.154
通信认证机制,这里是明文认证还有一种是加密认证
authentication {
auth_type PASS
auth_pass 1111
}
设置虚拟VIP地址,一般就设置一个,在LVS中这个就是为LVS主机设置VIP的,这样你就不用自己手动设置了
virtual_ipaddress {
IP/掩码 dev 配置在哪个网卡
134.80.189.163
}
追踪脚本,通常用于去执行上面的vrrp_script定义的脚本内容
track_script {
chk_nginx
}
}
定义LVS集群服务,可以是IP+PORT;也可以是fwmark 数字,也就是防火墙规则
所以通过这里就可以看出来keepalive天生就是为ipvs而设计的
virtual_server 134.80.189.163 80 {
delay_loop 6
# 算法
lb_algo rr
# LVS的模式
lb_kind DR
子网掩码,这个掩码是VIP的掩码
nat_mask 255.255.255.0
持久连接超时时间
persistence_timeout 50
定义协议
protocol TCP
后端应用服务器 IP PORT
real_server 134.80.189.154 80 {
# 权重
weight 1
# 针对应用服务器做健康检查的方法
TCP_CHECK {
# 连接超时时间
connect_timeout 3
# 尝试次数
nb_get_retry 3
# 每次尝试之间间隔几秒
delay_before_retry 3
}
}
real_server 134.80.189.155 80 {
weight 1
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
real_server 134.80.189.161 80 {
weight 1
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
real_server 134.80.189.162 80 {
weight 1
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
}
基于上述的配置,那么lvs slave的配置如下:
[root@c6-yz-htsb-sc02 ~]# cat /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
notification_email {
acassen@firewall.loc
failover@firewall.loc
sysadmin@firewall.loc
}
notification_email_from Alexandre.Cassen@firewall.loc
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_script chk_nginx
{
script “/etc/keepalived/nginx_check.sh”
interval 2
weight -20
}
vrrp_instance VI_1 {
state BACKUP
interface eth0
virtual_router_id 51
priority 90
advert_int 1
mcast_src_ip=134.80.189.155
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
134.80.189.163
}
track_script {
chk_nginx
}
}
virtual_server 134.80.189.163 80 {
delay_loop 6
lb_algo rr
lb_kind DR
nat_mask 255.255.255.0
persistence_timeout 50
protocol TCP
real_server 134.80.189.154 80 {
weight 1
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
real_server 134.80.189.155 80 {
weight 1
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
real_server 134.80.189.161 80 {
weight 1
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
real_server 134.80.189.162 80 {
weight 1
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
}
nginx进程检测脚本:
[root@c6-yz-4a-uwf2 keepalived]# cat nginx_check.sh
#!/bin/bash
A=ps -C nginx --no-header | wc -l
if [ $A -eq 0 ];then
/home/nginx/sbin/nginx #尝试重新启动nginx
sleep 2 #睡眠2秒
if [ `ps -C nginx --no-header | wc -l` -eq 0 ];then
killall keepalived #启动失败,将keepalived服务杀死。vip漂移到其它备份节点
fi
fi
修改nginx脚本nginx_check.sh 755权限
分别启动lvs master和slave的keepalived,并且设置为开机自启动:
systemctl start keepalived
systemctl enable keepalived
systemctl restart keepalived
systemctl stop keepalived
此时在lvs master节点查看IP地址情况:
ip a
结果为:
说明此时VIP在master节点上的eth0网卡上生成好了。
在lvs master节点查看路由转发情况:
ipvsadm -Ln
ipvsadm -L -n
在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
ifconfig lo:0 134.80.189.163 broadcast 134.80.189.163 netmask 255.255.255.255 up
route add -host 134.80.189.163 dev lo:0
执行后,查看IP信息,可以在lo网卡中看到VIP的信息,即: