keepalived+lvs+nginx 高可用
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了keepalived+lvs+nginx 高可用相关的知识,希望对你有一定的参考价值。
keepalived是一款用C编写的,旨在给linux系统和基于linux的设施提供简单、稳固的高可用和负载均衡功能的软件。它基于linux内核的ipvs模块实现4层负载均衡,能应用一系列的健康状态检测机制基于VRRP协议实现服务的高可用。
一、VRRP协议
VRRP(Virtual Router Redundancy Protocol,虚拟路由冗余协议)是一种容错协议。通常,一个网络内的所有主机都设置一条默认路由,这样,主机发出的目的地址不在本网段的报文将被通过默认路由发往路由器RouterA,从而实现了主机与外部网络的通信。当路由器RouterA 坏掉时,本网段内所有以RouterA 为默认路由下一跳的主机将无法与外部通信,这就是单点故障。VRRP就是为解决上述问题而提出的。
VRRP 将局域网的一组路由器组织成一个虚拟路由器。这个虚拟路由器通过虚拟IP对外提供服务,而在虚拟路由器内部是多个物理路由器协同工作,同一时间内只有一台物理路由器占有这个虚拟IP,作为master实际负责ARP响应和数据包转发等工作;其它物理路由器作为backup,不提供对外服务,仅接收master的vrrp状态通告信息。
master由优先级选举产生,每个物理路由器都有一个 1-255 之间的优先级,级别最高的(highest priority)将成为master,若优先级相同,则IP地址较大者胜出。
在vrrp协议中,所有的报文都是通过IP多播形式发送的,而在一个虚拟路由器中,只有处于master角色的路由器会一直发送VRRP数据包,处于backup角色的路由器只接收master发过来的报文信息,用来监控master的运行状态,因此不会发生backup抢占的现象,除非它的优先级更高。当master不可用时,backup也就无法收到master发过来的报文信息,于是就认定master出现故障,接着多台backup就会进行优先级最高的backup就将成为新的master,这样就保证了服务的持续可用性。
二、keepalived的组件
keepalived的主要组件:
WatchDog:负责监控checkers和VRRP进程
Checkers:实现对服务器运行状态检测和故障隔离
VRRP Stack:实现vrrp协议,即实现HA集群中失败切换功能
IPVS wrapper:将设置好的ipvs规则送给内核ipvs模块
Netlink Reflector:负责虚拟IP的设置和切换
三、keepalive的适用场景
keepalived理论上可以为mysqld,httpd等服务提供高可用,给这些服务做高可用通常需要配置共享存储资源,对此keepalived需要借助额外的命令或脚本实现,这种情况下keepalived的性能是显然不如heartbeat或corosync的。keepalived适合提供轻量级的高可用方案,如对作为反向代理的nginx、haproxy以及ipvs做高可用,给这些服务做高可用都无需配置共享存储资源。keepalived即能给ipvs做高可用,又能基于ipvs做负载均衡,并且能应用一系列的健康状态检测机制,获知后端服务器的状态,实现服务器池的动态维护和管理。
四、使用keepalived做反向代理nginx的高可用
前提条件:
①各节点要能互相解析主机名。建议通过hosts解析
②各节点时间同步
③iptables和selinux不对keepalived产生影响
安装:
yum install keepalived
查看配置文件帮助信息:man keepalived.conf
keepalived配置文件主要包括四大段:
global_defs:全局配置段,主要配置邮件通知和机器标识
vrrp_instance:vrrp实例配置段,配置高可用集群
virtual_server:lvs配置段,配置负载均衡集群
vrrp_script:vrrp脚本配置段,用来实现对集群资源的监控,要在vrrp_instance配置段中调用才能生效
注:以上各配置段并非都必不可少,可按需配置。如果只是单纯地做负载均衡集群,可不用配置vrrp_instance段,反过来也是;甚至如果不想使用邮件通知,都不需要配置global_defs段。
我们通过YUM安装的默认是没有日志的 需要手动开启
vi /etc/sysconfig/keepalived
修改成KEEPALIVED_OPTIONS="-D -S 0"
vi /etc/rsyslog.conf
添加一项 local0.* /var/log/keepalived.log
[[email protected] keepalived]# vi /etc/keepalived/keepalived.conf
! Configuration File for keepalived #以!开头为注释
global_defs { #全局配置段
notification_email {#指定keepalived在发生事件(如切换、故障)时发送email给谁,有多个收件人个写多行
[email protected] #收件人
}
notification_email_from [email protected] #发件人
smtp_server 127.0.0.1 #smtp服务器地址
smtp_connect_timeout 30 #连接SMTP服务器超时时间
router_id lishuai #机器标识;通常为hostname,但不是必须为hostname,可自己定义,会显示在邮件主题中
}
vrrp_script chk_mantaince_down {# #vrrp脚本配置段,要在vrrp实例中调用才生效
script "/etc/keepalived/down.sh" #信号0用来判断进程的状态;返回状态码为0表示正常,返回状态码非0表示异常
interval 1 #检查频率 默认一秒一次
}
vrrp_instance VI_1 { #定义对外提供服务的VIP vrrp_instance配置
state MASTER #指定vrrp_instance的初始状态,是MASTER还是BackUP主要还是看优先级,因为vrrp默认工作在抢占模式
interface enp3s0 #指定vrrp_instance绑定的网卡,最终会通过指定的网卡宣告VIP
virtual_router_id 51 #虚拟路由id,用来区分多个instance的VRRP组播
priority 100 #优点级,可为1-255
advert_int 1 #发送心跳信息的间隔时间,MASTER会每隔1秒发送一个报文告诉组内其他机器,自己还活着。
authentication {#节点间通信认证,认证类型有PASS和AH
auth_type PASS
auth_pass lishuai #在一个vrrp实例中,master和backup要使用相同密码才能正常通信
}
virtual_ipaddress {
192.168.2.90/24 dev enp3s0 lable enp3s0:0 #虚拟IP地址,会添加在master上
}
track_script { #调用vrrp脚本,可调用多个
chk_mantaince_down
}
}
vrrp_instance VI_2 {
state BACKUP
interface enp3s0
virtual_router_id 52
priority 99
advert_int 1
authentication {
auth_type PASS
auth_pass 9129
}
virtual_ipaddress {
192.168.2.100/24 dev enp3s0 lable enp3s0:1
}
track_script {
chk_mantaince
}
}
# vrrp实例配置段中其它常用参数:
nopreempt 表示不抢占。允许一个priority较低的节点保持master状态,即使priority更高的节点恢复正常。
因为节点的切换会毕竟会造成服务短暂的中断,而且存在一定的风险和不稳定性。因此应尽量减少切换操作。
要配置非抢占模式,在优先级较高节点的配置文件中:
state BACKUP
nopreempt
preempt_delay 抢占延迟时间;有时候系统重启之后需要经过一段时间后才能工作,在这种情况下进行主备切换是没必要的
notify_master/backup/fault 分别表示节点状态为主/备/出错时所执行的脚本
notify_master "/etc/keepalived/notify.sh master"
notify_backup "/etc/keepalived/notify.sh backup"
notify_fault "/etc/keepalived/notify.sh fault"
use_vmac 是否使用VRRP的虚拟MAC地址
[[email protected] keepalived]# cat down.sh
#!/bin/bash #这个脚本的功能是当检测到/etc/keepalived/down这个文件存在就给优先级减去2
if [ -f /etc/keepalived/down ];then
weight -2
fi
实验一
这里我们用192.168.2.18和192.168.2.29两台机器模拟最简单的keepalived,当任意一台负载均衡机器挂了之后vip能自动迁移到另一台主机,我们先以192.168.2.18为master
这里我们可以注意一下 两台主机的keepalived.conf文件有略微差异
两台机器开启keepalived服务
systemctl start keepalived;ssh [email protected] "systemctl start keepalived"
此时我们发现vip已经被绑定在192.168.2.18这台主机上了,我们再/etc/keepalived/下创建一个down文件验证脚本检测功能
touch //etc/keepalived/down
systemctl restart keepalived.service ;ssh [email protected] 'systemctl restart keepalived'
这是我们就会发现vip192.168.2.90就自动迁移到192.168.2.29这台主机上了,而192.168.2.18这台主机上已经没了
实验二 简单双主模型
在上述拓扑图中我们始终有一台负载均衡主机处于休息状态,这样会牺牲一部分机器性能,在下面拓扑图中,我们让两台负载均衡主机同时做master,两台主机有不同的vip地址,我们用DNS做轮询,是两个vip指向同一网址如www.lishuai.com,这样用户访问www.lishuai.com 就会被调度到这两台负载均衡主机上,这两台负载均衡主机会把请求根据调度算法发给后端的RS主机,当其中一台负载均衡主机挂了之后我们就把他的vip迁移到另一台机器上。这样用户始终能够正常访问
我们在上次配置下添加如上配置 ,并创建名为chk_mantaince的脚本
systemctl restart keepalived.service ;ssh [email protected] 'systemctl restart keepalived'
这次我们在192.168.2.18主机创建down,在192.168.2.29主机创建down-vi_2文件
结果如下:
实验三 keepalived+lvs模型
虚拟机实验 网络选择vmware2 ,在我们之前的配置下添加如下
virtual_server 192.168.2.90 80 {
delay_loop 6
lb_algo wrr
lb_kind DR
protocol TCP
netmask 255.255.255.0
real_server 192.168.2.30 80 {
weight 1
HTTP_GET {
url {
path /
status_code 200
}
}
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
real_server 192.168.2.57 80 {
weight 2
HTTP_GET {
url {
path /
status_code 200
}
}
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
delay_loop 延迟轮询时间(单位秒)。
lb_algo 后端调试算法(load balancing algorithm)(rr|wrr|ls|wlc|sh|wsh等)
lb_kind LVS调度类型NAT/DR/TUN。
virtualhost 用来给HTTP_GET和SSL_GET配置请求header的。
sorry_server 当所有real server都掉线时,sorry server顶替。
real_server 真正提供服务的服务器。
weight 权重。
notify_up/down 当real server下线或启动时执行的脚本。
健康检查的方式,N多种方式。
path 请求real serserver上的路径。
digest或者status_code 分别表示用genhash算出的结果和http状态码。
connect_port 健康检查,如果端口通则认为服务器正常。
connect_timeout,nb_get_retry,delay_before_retry分别表示超时时长、重试次数,下次重试的时间延迟。
systemctl start keepalived.service ;ssh [email protected] 'systemctl start keepalived' 启动keepalived
我们可以查看一下此时已经在192.168.2.29上自动生成lvs规则
我们在192.168.2.29里 touch down ,此时192.168.2.90这个IP就自动转移到192.168.2.28这台主机上了,这台主机也自动生产了lvs规则
我们访问一下可以发现这和我们在keepalived配置文件里设置的规则是一样的。
实验四 keepalive+nginx双主模型
这里我们用keepalived把两个nginx负载均衡主机同时做master,当任何一台nginx主机down了就把负载迁移到另一台主机上,例如当负载均衡主机2 down了就会把192.168.2.100这个IP给转移到nginx负载均衡主机1上
[[email protected] keepalived]# vi keepalived.conf #192.168.2.18的配置文件
router_id lishuai
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id lishuai
}
vrrp_script chk_mantaince_down {
script "/etc/keepalived/down.sh"
interval 1
}
vrrp_script chk_mantaince {
script "/etc/keepalived/killall.sh"
interval 1
weight -20
}
vrrp_instance VI_1 {
state MASTER
interface enp3s0
virtual_router_id 66
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass lishuai
}
virtual_ipaddress {
192.168.2.90/24 dev enp3s0
}
track_script {
chk_mantaince
}
}
vrrp_instance VI_2 {
state BASKUP
interface enp3s0
virtual_router_id 77
priority 99
advert_int 1
authentication {
auth_type PASS
auth_pass 123456
}
virtual_ipaddress {
192.168.2.100/24 dev enp3s0
}
track_script {
chk_mantaince
}
下面是192.168.2.29的配置文件
! Configuration File for keepalived
global_defs {
notification_email {
}
notification_email_from [email protected]
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id lishuai
}
vrrp_script chk_mantaince_down {
script "/etc/keepalived/down.sh"
interval 1
}
vrrp_script chk_mantaince {
script "/etc/keepalived/killall.sh"
interval 1
weight -20
}
vrrp_instance VI_1 {
state BACKUP
interface ens33
virtual_router_id 66
priority 99
advert_int 1
authentication {
auth_type PASS
auth_pass lishuai
}
virtual_ipaddress {
192.168.2.90/24 dev ens33
}
track_script {
chk_mantaince
}
}
vrrp_instance VI_2 {
state MASTER
interface ens33
virtual_router_id 77
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 123456
}
virtual_ipaddress {
192.168.2.100/24 dev ens33
}
track_script {
chk_mantaince
}
}
下面是killall.sh
这里再次注意 新版本的keepalived不支持采用类似script "killall -0 nginx &> /dev/null"这种形式,必须写成shell文件,如果shell文件执行失败则执行配置文件后面的weight -20
这是我们nginx.conf里的负载均衡设置
验证:
当我们执行完重载keepalived后如下
负载功能这是也正常
我们把192.168.2.18的nginx给下线
此时192.168.2.90这个IP地址转移到192.168.2.29这台负载均衡主机了,此时192.168.2.90和192.168.2.100都依然能正常访问,我们启动192.168.2.18上的nginx,然后把192.168.2.29上的nginx下线,此时192.168.2.90和192.168.2.100都被移动回192.168.2.18这台负载均衡主机上了
此时访问192.168.2.90和192.168.2.100依旧正常负载均衡
以上是关于keepalived+lvs+nginx 高可用的主要内容,如果未能解决你的问题,请参考以下文章
lvs + keepalived + nginx 实现高可用