vlambda博客
学习文章列表

LVS+Keepalived+Nginx基于DR模式构建高可用方案


IT那活儿
不管IT什么活儿,干就完了。
293篇原创内容
Official Account



◆  一、简  介 





 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 





◆   、部  署 




   1、部署环境准备


各个软件及其版本信息如下:

软件

版本

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


 
   2、部署架构


基于上述的环境,部署的架构如下:

LVS+Keepalived+Nginx基于DR模式构建高可用方案

特别注意:


     
   3、部署程序


(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时,效果为

LVS+Keepalived+Nginx基于DR模式构建高可用方案LVS+Keepalived+Nginx基于DR模式构建高可用方案

(3)在lvsmaster节点和lvsslave节点配置keepalived信息:

首先配置lvsmaster节点:

编辑如下文件:

[root@c6-yz-htsb-sc01~]# cat /etc/keepalived/keepalived.conf

!Configuration File for keepalived

#全局配置

global_defs{

#邮件通知信息

#  notification_email {

#定义收件人

#    [email protected]

#    [email protected]

#    [email protected]

#  }

#定义发件人

#  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

LVS+Keepalived+Nginx基于DR模式构建高可用方案


在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的信息,即:

LVS+Keepalived+Nginx基于DR模式构建高可用方案


END