keepalived
介绍
https://www.cnblogs.com/clsn/p/8052649.html
keepalived时一款保障服务高可用的软件,其功能类似与heartbeat,用来防止单点故障,具有自动侦测服务器的状态,故障切换,添加恢复等功能;
三个重要功能:
- 管理LVS负载均衡软件;
- 实现LVS集群节点的健康检查;
- 系统网络服务的高可用;
VRRP协议
即虚拟路由冗余协议,是一种容错协议,也是keepalived的实现基础,它保证了在具有多播或广播能力的局域网中,当某台路由器出现故障时,由另一台路由器来代替出现故障的路由器工作,而无需修改动态路由协议、路由发现协议等配置,解决了路由的单点故障问题。VRRP协议中的主要概念有:
- 虚拟路由器:由一个master和多个backup组成,主机将虚拟路由器当作默认网关;
- VRID:虚拟路由器的标识,由有相同VRID的一组路由器构成一个虚拟路由器;
- master:虚拟路由器中承担报文转发任务的路由器;
- backup:master故障时,代替master工作;
- vip:即虚拟IP,一个虚拟路由器可以拥有一个或多个vip;
- 虚拟mac:一个虚拟路由器拥有一个虚拟mac;
- ip拥有者:接口ip与虚拟ip相同的路由器;
- 优先级:选举master的依据;
VRRP协议工作原理:
- 路由器开启VRRP功能后,会组成一个路由器组(功能上相当于一台路由器,一般组内的路由器功能都相同),会根据优先级确定出1个Master,其他的为backup;
- master有一个对外提供服务的虚拟IP(vip),同时Master还会对内组播vrrp包;
- backup会接受vrrp包,且如果是抢占式,会比较优先级,若自己优先级更高,则Backup会抢占成为Master;若是非抢占式,则只要Master没有故障就不会出现新Master;
- 如果backup连续3次收不到VRRP包或者收到优先级为0的vrrp包,则会竞选新的Master;
VRRP负载分担:即多台路由器同时承担业务,避免设备闲置,具体实现方法就是将同一台路由器加入多个备份组,在不同组中拥有不同的优先级,使得该路由器在一个组中作为Master,在其他组中作为Backup;
体系结构
分为用户空间和内核空间:
- IPVS:IP虚拟服务器,是一种提供负载平衡功能的技术;
- NetLink:提供高级路由及其他网关相关的网络功能;
- WatchDog:监控checkers和VRRP进程的状况;
- Checkers:真实服务器的健康检查,是keepalived的主要功能;
- VRRP Stack:负载均衡器的故障切换;
- IPVS wrapper:发送设定的规则到内核的IPVS部分;
- Netlink Reflector:用来设定VRRP的vip地址;
- 控制面板:配置文件的编译和解析,是用到的时候解析;
安装
yum方式安装:yum install keepalived -y
下载安装:
下载地址:https://www.keepalived.org/download.html
- 我这里安装的
keepalived-2.0.20
版本; - 安装依赖:
yum install curl gcc openssl-devel libnl libnl-devel libnl3-devel net-snmp-devel -y
; - 解压安装包,依次执行:
./configure --prefix=/data/keepalived
、make && make install
;(configure执行完成时,要看看有没有报错) - 验证keepalived:执行keepalived然后通过ps查找对应进程(应该有3个);
- core:负责主进程的启动,维护和全局配置文件的加载;
- check:负责健康检查;
- vrrp:实现vrrp协议;
- 查看keepalived日志:
tail -f /var/log/message
;
配置
https://www.keepalived.org/manpage.html
https://www.keepalived.org/doc/configuration_synopsis.html
keepalived只有一个配置文件keepalived.conf,里面主要配置区域包括:global_defs、static_ipaddress、static_routes、vrrp_script、vrrp_instance和virtual_server。
global_defs
全局配置区域,主要设置通知机制和标志,具体如下:
global_defs {
# 故障时收件邮件
notification_email {
a@abc.com
b@abc.com
...
}
# 发件邮件
notification_email_from alert@abc.com
# 邮件的smtp地址和超时时间
smtp_server smtp.abc.com
smtp_connect_timeout 30
# 开启smtp陷阱
enable_traps
# 本节点的标识字符串
router_id test01
}
VRRP实例和组
vrrp_instance
配置对外提供服务的vip及相关的属性;vrrp_sync_group
用来定义vrrp_instance
组,使得组内成员的动作一致,比如一个vrrp_instance
发生故障切换,那么另一个也跟着故障切换;详细配置如下:
# 这个可以不要
vrrp_sync_group VG_1 {
group {
# vrrp_instance名称
inside_network VI_1
# 对外的ip
outside_network 192.168.48.101
...
}
# 表示切换为主/备/出错/任意动作时锁执行的脚本,若脚本有参数,需要用双引号
notify_master /path/to_master.sh
notify_backup /path/to_backup.sh
notify_fault "/path/fault.sh VG_1"
# 这个脚本执行时会自动添加三个参数:$1:GROUP或者INSTANCE;$2:组或实例名称;$3:切换成的状态,MASTER或BACKUP或FAULT
notify /path/notify.sh
# 开启邮件通知
smtp_alert
}
vrrp_instance VI_1 {
# master或者backup,只是说明
state MASTER
# 虚拟ip放置的网卡
interface ens33
# 监控以下网卡,任何一个不通都会切换到falt状态
track_interface {
ens33
...
}
# 0-255,用来区分多个instance,同一个集群的要一致
virtual_router_id 51
# 优先级(决定主备),越大越优先
priority 100
# 发vrrp包间隔时间(秒)
advert_int 1
# 认证
authentication {
# 推荐pass,即只识别密码前8位,还有HA;
auth_type PASS
# 同一集群应该相同
auth_pass 1111
}
# 虚拟ip(vip)
virtual_ipaddress {
192.168.48.10
}
# 追踪实例脚本,访问实例时会执行脚本
track_script {
# vrrp_script部分定义的名称
chk_http_port
}
# 非抢占式
nopreempt
# 抢占延时
preempt_delay 300
# 表示切换为主/备/出错/任意动作时锁执行的脚本
notify_master /path/to_master.sh
notify_backup /path/to_backup.sh
notify_fault "/path/fault.sh VG_1"
notify /path/notify.sh
# 开启邮件通知
smtp_alert
}
LVS配置
如果不使用lvs做负载均衡,只是做HA的话,可以不配置。lvs配置分为两个部分:
- 虚拟服务器组(
virtual_server_group
):实现一台真实服务器的某个服务可以属于多个虚拟服务器,一般用不到; - 虚拟服务器(
virtual_server
):
# 可以配置多个
virtual_server 192.168.48.101 80 {
# 轮询时间(秒)
delay_loop 30
# 调度算法
lb_algo rr|wrr|lc|wlc|sh|dh|lblc
# LVS调度类型,一般用DR
lb_kind NAT|DR|TUN
# 会话保持超时时间
persistence_timeout 50
# 一般都是TCP
protocol TCP|UDP
sorry_server 192.168.48.101 80
# 可以配置多个
real_server 192.168.48.101 80 {
# 权重
weight 1
# 启动/宕机时执行的脚本
notify_up /path/up.sh
notify_down /path/down.sh
# tcp方式健康检查
TCP_CHECK {
connect_port 80
# 超时时间(秒)
connect_timeout 3
# 重试次数
retry 3
# 重连时间间隔(秒)
delay_before_retry 2
}
# http get方式健康检查
#HTTP_GET {
# url {
# path /
# status_code 200
# }
# connect_timeout 3
# retry 3
# delay_before_retry 3
#}
}
}
静态ip和路由
static_ipaddress
和static_routes
配置本节点的ip和路由信息(一般情况下都会有IP地址和路由信息的,因此没必要配置这个):
static_ipaddress {
# 格式符合linux下的ip命令参数的格式
192.168.48.101
...
}
vrrp_script
用来做健康检查的:
vrrp_script chk_http_port {
# 要执行的脚本(需要有执行权限)
script "/data/xxx.sh"
# 脚本执行时间间隔(秒)
interval 3
# 执行失败权重-10
weight -10
}
主从切换与LVS
主从切换:需要master的keepalived停止或者将backup配置文件的priority(优先级)调整为比master高;
LVS
负载均衡可以采用硬件设备(如F5),也可以采用软件实现,一般用软件,LVS,即Linux虚拟服务器,是linux下的简单负载均衡实现;具有负载能力强、高可用、可以对基本所有应用做负载均衡等特点,如:tomcat、数据库等;且在用户看来,所有内部应用都是透明的,用户只是在使用一个虚拟服务器提供的高性能、高可用服务,与nginx相比只是功能上逊于nginx;lvs+keepalived适用于大型网站的负载均衡;
三种转发规则:
- NAT(网络地址翻译技术):调度器收到请求时,改写请求地址为真实地址,转发给服务器,请求处理后,又将源地址改成虚拟地址,返回给用户;
- TUNL(IP隧道):调度器收到请求后直接转发给服务器,服务器处理完毕后直接返回给用户;
- DR(直接路由技术):DR直接改写请求的mac地址,转发给服务器,服务器处理后直接返回给用户;(最高效,但是要求调度器与服务器在同一网段,只支持ip转发,即端口要一致)
linux2.4以后就已经是Linux标准内核的一部分,其提供的主要调度算法有:
- 轮询、加权轮询:rr、wrr;
- 最小连接、加权最小连接:lc、wlc;
- 局部性的最少连接:lblc(找最近使用的服务器,若不存在或超载则采用最小连接);
- 带复制的局部性最少连接:lblcr(找最近的一组服务器按最小连接,若都超载或不存在,则采用最小连接);
- 目标地址散列:dh;
- 源地址散列:sh;
- 最短预期延时:sed;
- 不排队:nq;
附:lvs负载均衡使用没有nginx灵活。
nginx双主HA
附:本来想用两台搭建一个对外VIP的keepalived+nginx的高可用、负载均衡架构,但是始终没有成功,作为代替,这里就使用了双主结构,即两个对外VIP,功能一样,即使宕机一台,两个VIP仍然都能正常访问。
keepalived+nginx实现HA的原理是:编写一个shell脚本去定时检测nginx的端口或者nginx进程,若发现nginx出问题则关闭keepalived的相关进程,从而实现keepalived的主从切换来达到nginx的高可用。当然,还可以在关闭keepalived之前尝试重启nginx,重启失败在关闭keepalived;
具体实现步骤如下:
- 在两台服务器上启动nginx;
- 编写nginx检查脚本
chk_nginx.sh
:
#!/bin/bash
nginxstart=/data/nginx-1.16.1/sbin/nginx
function nginxps(){
echo `ps -ef | grep nginx | grep -v grep | grep -v chk_nginx | wc -l`
}
n=`nginxps`
if [[ $n -lt 2 ]];then
# 这里就不尝试重启nginx了
# echo `date`'--->restart nginx...'
# $nginxstart
# 这里sleep的时间要小于interval设定的值
# sleep 2
# n=`nginxps`
# if [[ $n -lt 2 ]];then
echo 'kill keepalived...'
killall keepalived
# fi
fi
- keepalived配置(另一台改下router_id,把MASTER改成BACKUP,BACKUP改成MASTER,priority也是):
! Configuration File for keepalived
global_defs {
router_id test01
}
vrrp_script chk_nginx {
script "/data/keepalived/chk_nginx.sh"
interval 3
weight -10
}
vrrp_instance VI_1 {
state MASTER
interface ens33
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.48.10
}
track_script {
chk_nginx
}
}
vrrp_instance VI_2 {
state BACKUP
interface ens33
virtual_router_id 52
priority 99
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.48.11
}
track_script {
chk_nginx
}
}
- 启动keepalived,搭建成功;