文章目录
- 集群类型
- VRRP
- 为什么需要VRRP
- KeepAlived
- KeepAlived介绍
- KeepAlived架构
- 编译安装
- 1.下载源码包并解压
- 2.查看install文件的安装说明
- 3.执行“./configure”
- 4.make && make install
- 5.指定keepalived.conf配置文件
- 6.修改keepalived的server文件
- 报错 WARNING - interface eth0 for vrrp_instance VI_1 doesn't exist
- 7.重启成功
- 再创建一个KeepAlived节点
- ka1和ka2的ip地址漂移
- 是否能ping通ka发布的IP地址
- 初体验KA的ip漂移的高可有
- KeepAlived配置说明
- 配置文件组成
- 全局配置
- 虚拟路由器配置
- 启用keepalived日志功能
- 独立记录ka的日志
- 实现ka独立子配置文件
- 抢占模式和非抢占模式
- 抢占延迟模式 preempt_delay
- VIP单播配置
- KA通知脚本配置
- 通知脚本类型
- 脚本调用方法
- 实现KA的双主架构
- ka1主机配置
- ka2主机配置
- 实现多主架构
- 三个节点的三主三从
- 三个节点的三主六从架构
- 实现IPVS的高可用
- IPVS相关配置
- 环境准备
- 修改RS的内核参数
- 虚拟服务器配置
- 重启ka服务,查看ipvsadm规则
- 模拟客户端访问VIP
- 后端服务的健康性检查
- HTTP_GET
- TCP监测
- 基于VRRP Script实现其他应用的高可用性
- VRRP Script 配置
- 1.定义VRRP script
- 2.调用VRRP script
- 实现HAproxy高可用
- 1.在两个ka1和ka2上实现haproxy的配置
- 2.在两个ka1和ka2两个节点启用内核参数
- 3.创建check_haproxy.sh
- 4.配置keepalived调用脚本
KeepAlived:通用的高可用集群解决方案。
集群类型
1.LB: Load Balance负载均衡
LVS/HAProxy/nginx (http/upstream, stream/upstream).
2.HA: High Availability高可用集群
数据库、Zookeeper、Redis
KeepAlived通用的高可用集群
SPoF: Single Point of Failure,解决单点故障
3.HPC: High Performance Computing 高性能集群
https://www.top500.org
VRRP
虚拟路由冗余协议(Virtual Router Redundancy Protocol)是一种用于提高网络可靠性,解决局域网中配置静态网关出现单点失效现象的路由容错协议。
VRRP 允许两台或多台交换机使用同一个虚拟的MAC地址和IP地址,看起来多台交换机就像一个台大交换机,其实这台大交换机并不存在,只是多台互为备份的交换机。
虚拟路由冗余协议,解决静态网关单点风险
物理层:路由器、三层交换机
软件层:keepalived
为什么需要VRRP
基础网络的可靠性日益成为用户关注的焦点,能够保证网络传输不中断对于终端用户非常重要。
如图1-2,现网中的主机使用缺省网关与外部网络联系时,如果Gateway出现故障,与其相连的主机将与外界失去联系,导致业务中断。
如图1-3,VRRP的出现很好地解决了这个问题。VRRP将多台设备组成一个虚拟设备,通过配置虚拟设备的IP地址为缺省网关,实现缺省网关的备份。当网关设备发生故障时,VRRP机制能够选举新的网关设备承担数据流量,从而保障网络的可靠通信。如下图所示,当Master设备故障时,发往缺省网关的流量将由Backup设备进行转发。
参考链接:https://support.huawei.com/enterprise/zh/doc/EDOC1100209553/,
KeepAlived
KeepAlived介绍
vrrp协议的软件实现,原生设计目的为了高可用ipvs服务。
官方网站:https://keepalived.org/
Keepalived 是一个用 C 编写的路由软件。该项目的主要目标是为 Linux 系统和基于 Linux 的基础设施提供简单而强大的负载平衡和高可用性设施。负载平衡框架依赖于著名且广泛使用的Linux 虚拟服务器(IPVS) 内核模块,提供第 4 层负载均衡。Keepalived 实现了一组检查器,根据服务器池的健康状况动态、自适应地维护和管理负载平衡服务器池。另一方面,高可用性是通过 VRRP协议实现的。VRRP 是路由器故障转移的基本要素。此外,Keepalived 实现了一组挂钩到 VRRP 有限状态机,提供低级和高速协议交互。为了提供最快的网络故障检测,Keepalived 实现了BFD协议。VRRP 状态转换可以考虑 BFD 提示来驱动快速状态转换。Keepalived 框架可以单独使用,也可以一起使用,以提供有弹性的基础设施。Keepalived
KeepAlived功能:
1.基于vrrp协议完成地址流动;
2.为vip地址所在的节点生成ipvs规则(在配置文件中预先定义);
3.为ipvs集群的各RS做健康状态检测;
4.基于脚本调用接口完成脚本中定义的功能,进而影响集群事务,以此支持nginx、haproxy等服务。
KeepAlived架构
官方文档:
https://keepalived.org/doc/
https://keepalived.org/documentation.html
Keepalived 完全由纯 ANSI/ISO C 编写。该软件围绕提供实时网络设计的中央 I/O 多路复用器进行连接。主要设计重点是在所有元素之间提供同质模块化,这就是为什么创建核心库来消除代码重复的原因。另一方面,目标是生成安全可靠的代码以确保生产稳健性和稳定性。
为了确保稳健性和稳定性,守护进程被分成 3 个不同的进程。全局设计基于一个极简的父进程,负责分叉的子进程监控。然后是 2 个子进程,一个负责 VRRP 框架,另一个负责健康检查。
每个子进程都有自己的调度 I/O 多路复用器,这样 VRRP 调度抖动就得到了优化,因为 VRRP 调度比健康检查器更合理/更关键。另一方面,这种拆分设计最小化了健康检查对外部库的使用,并将其自身操作最小化到空闲主循环,以避免自身导致故障。
父进程监控框架称为看门狗(WatchDog),设计如下:每个子进程打开一个接受 unix 域套接字,然后在守护进程引导时,父进程连接到这些 unix 域套接字并向子进程发送定期(5 秒)的 hello 数据包。如果父进程无法将 hello 数据包发送到远程连接的 unix 域套接字,它只需重新启动子进程。
这种看门狗设计有两个好处,首先,从父进程发送到远程连接的子进程的 hello 数据包是通过 I/O 多路复用器调度程序完成的,这样它就可以检测子进程调度框架中的死循环。第二个好处是使用 sysV 信号来检测死子进程。运行时,您将在进程列表中看到:
1.用户空间核心组件:
vrrp stack: VIP消息通告
checkers: 监测Real Server
system call: 实现vrrp协议状态转换时调用脚本的功能
SMTP:邮件组件
IPVS wrapper:生成IPVS规则
Netlink Reflector:网络接口
WatchDog:监控进程
2.控制组件:提供keepalived.conf 的解析器,完成Keepalived配置
3.IO复用器:针对网络目的而优化的自己的线程抽象
4.内存管理组件:为某些通用的内存管理功能(例如分配,重新分配,发布等)提供访问权限
编译安装
编译安装以ubuntu2004为例,事前需要安装一些依赖。
apt update
apt -y install make gcc ipvsadm build-essential pkg-config automake autoconf libipset-dev libnl-3-dev libnl-genl-3-dev libssl-dev libxtables-dev libip4tc-dev libip6tc-dev libipset-dev libmagic-dev libsnmp-dev libpcre2-dev libnftnl-dev libmnl-dev libsystemd-dev
1.下载源码包并解压
wget https://keepalived.org/software/keepalived-2.2.7.tar.gz
2.查看install文件的安装说明
3.执行“./configure”
./configure --prefix=/usr/local/keepalived
4.make && make install
make -j 2 && make install # -j 2是加上自己的cpu核数可以加速编译
查看版本信息
/usr/local/keepalived/sbin/keepalived -v
5.指定keepalived.conf配置文件
完成第4步后还启动不了keepalived服务,启动会报错,journalctl日志提示“Config files missing ‘/usr/local/etc/keepalived/keepalived.conf’”缺失这个配置文件,然而我们自定义的编译安装的目录在/usr/local/keepalived目录下,所以我们需要再server文件中指定我们自定义的配置文件的目录。
我们先将keepalived.conf.sample的模板文件拷贝致我们的安装目录“/usr/local/keepalived/etc”下作为keepalived.conf配置文件,
6.修改keepalived的server文件
在keepalived.service文件中指定keepalived.conf的位置。
vim /lib/systemd/system/keepalived.service
ExecStart=/usr/local/keepalived/sbin/keepalived -f /usr/local/keepalived/etc/keepalived.conf --dont-fork $KEEPALIVED_OPTIONS
报错 WARNING - interface eth0 for vrrp_instance VI_1 doesn’t exist
报错提示“WARNING - interface eth0 for vrrp_instance VI_1 doesn’t exist”
看下,我的网卡名好像不是eth0是ens33,需要修改keepalived.conf中的
vim /usr/local/keepalived/etc/keepalived.conf
7.重启成功
修改上面的配置之后启动就成功了
keepalived服务成功起来后,使用ip命令可以看到生成了许多ip地址。
再创建一个KeepAlived节点
复制以上编译安装的文件,再重新创建一个ka2的服务节点。
拷贝keepalived文件
scp -r /usr/local/keepalived/ 192.168.10.150:/usr/local
拷贝service文件
scp -r /lib/systemd/system/keepalived.service 192.168.10.150:/lib/systemd/system/keepalived.service
这次我们尝试将keepalived.conf文件放在/etc/keepalived下,然后在/usr/lib/systemd/system/keepalived.service文件中不指定keepalived.conf的位置,看系统能否自己找到。
vim /usr/lib/systemd/system/keepalived.service
启动service服务
root@ka2:~# systemctl daemon-reload
root@ka2:~# systemctl enable --now keepalived.service
启动成功了,说明系统会默认去/etc/keepalived下找keepalived.conf
此时ka2的ip地址好像没有增多
ka1和ka2的ip地址漂移
我停掉ka1的service服务
是否能ping通ka发布的IP地址
我修改了ka新增的ip子网掩码为24
vim /etc/keepalived/keepalived.conf
现在我找一台192.168.10.149的机器,看能否ping通192.168.200.16等ip地址
刚开始ping不通,可能会有很多原因,
原因一:keepalived.conf中的配置需要注释掉vrrp_strict
原因二:192.168.10.X和192.168.200.X不在同一网段(这个解释可能有错误,后面知道正确的原因后再回来改正)
在192.168.10.149的机器上新增一个192.168.200.X的ip地址
新增一个ip地址
ip a a 192.168.200.123/24 dev ens33
删除一个ip地址
ip a del 192.168.200.123/24 dev ens33
可以ping通了
初体验KA的ip漂移的高可有
分别在ka1和ka2上安装nginx,两个nginx对外提供同一个web服务,默认页面都是 “This is + ip地址”
在192.168.10.149中配置hosts文件
vim /etc/hosts
192.168.200.16 www.leiweb.com
此时192.168.200.16的地址是在150的机器上的,则由150的机器提供nginx的web服务
当我宕掉150的keepalived服务后,192.168.200.16的地址漂移到了137的机器上去了,此时则由137来提供nginx的web服务。
KeepAlived配置说明
vim /etc/keepalived/keepalived.conf
配置文件组成
1.GLOBAL CONFIGURATION
Global definitions:定义邮件配置,route_id,vrrp配置,多播地址等
2.VRRP CONFIGURATION
VRRP instance(s):定义每个vrrp虚拟路由器
3.LVS CONFIGURATION
Virtual server group(s)
Virtual server(s):LVS集群的VS和RS
vim /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_mcast_group4 230.1.1.1
}
vrrp_instance VI_1 {
state MASTER
interface ens33
virtual_router_id 51
priority 100 # 是master还是backup最终由优先级决定
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.200.16/24
192.168.200.17/24
192.168.200.18/24
}
}
全局配置
/etc/keepalived/keepalived.conf
global_defs {
notification_email {
root@localhost #keepalived发生故障切换时邮件发送的目标邮箱,可以按行区分写多个,据说配了没用
root@wangxiaochun.com
xxxxxx@qq.com
}
notification_email_from keepalived@localhost #发邮件的地址
smtp_server 127.0.0.1 #邮件服务器地址
smtp_connect_timeout 30 #邮件服务器连接timeout
router_id ka1.example.com #每个keepalived主机唯一标识,建议使用当前主机名,如果多节点重名可能会影响切换脚本执行
vrrp_skip_check_adv_addr #对所有通告报文都检查,会比较消耗性能,启用此配置后,如果收到的通告报文和上一个报文是同一个路由器,则跳过检查,默认值为全检查
vrrp_strict #严格遵守VRRP协议,启用此项后以下状况将无法启动服务:
#1.无VIP地址
#2.配置了单播邻居
#3.在VRRP版本2中有IPv6地址,开启动此项并且没有配置vrrp_iptables时会自动开启iptables防火墙规则,默认导致VIP无法访问,
#建议不加此项配置
vrrp_garp_interval 0 #gratuitous ARP messages报文发送延迟,0表示不延迟
vrrp_gna_interval 0 #unsolicited NA messages(不请自来)消息发送延迟
vrrp_mcast_group4 224.0.0.18 #指定组播IP地址范围:224.0.0.0到239.255.255.255,默认值:224.0.0.18
vrrp_iptables #此项和vrrp_strict同时开启时,则不会添加防火墙规则,如果无配置vrrp_strict项,则无需启用此项配置
}
抓包
tcpdump -i ens33 -nn host 224.0.0.18
137在不断地向组播地址224.0.0.18发送消息,当宕掉137的ka服务之后,150或继续向224.0.0.18发送
宕掉137的ka服务
虚拟路由器配置
vrrp_instance <STRING> { #<String>为vrrp的实例名,一般为业务名称
配置参数
....
}
#配置参数:
state MASTER|BACKUP #当前节点在此虚拟路由器上的初始状态,状态为MASTER或者BACKUP
interface IFACE_NAME #绑定为当前虚拟路由器使用的物理接口,如:eth0, ens33, bond0 ,br0,可以和VIP不在一个网卡
virtual_router_id vRID #每个虚拟路由器唯一标识,范围:0-255,每个虚拟路由器此值必须唯一,否则服务无法启动,同属一个虚拟路由器的多个keepa1ived节点必须相同,务必要确认在同一网络中此值必须唯一
priority 100 #当前物理节点在此虚拟路由器的优先级,范围:1-254,每个keepa7ived主机节点此值不同
advert_int 1 #vrrp通告的时间间隔,默认1s
authentication { #认证机制
auth_type AH|PASS #AH为IPSEC认证(不推荐), PASS为简单密码(建议使用)
auth_pass <PASSWORD> #预共享密钥,仅前8位有效,同一个虚拟路由器的多个keepa7ived节点必须一样
}
virtual_ipaddress { #虚拟IP,生产环境可能指定上百个IP地址
<IPADDR>/<MASK> brd <IPADDR> dev <STRING> scope <SCOPE>labe1 <LABEL>
192.168.200.100 #指定VIP,不指定网卡,默认为eth0,注意:不指定/prefix ,默认为/32
192.168.200.101/24 dev eth1 #指定VIP的网卡,建议和interface指令指定的网卡不在一个网卡
192.168.200.102/24 dev eth2 1abe1 eth2:1 #指定VIP的网卡1abel
}
track_interface { #配置监控网络接口,一旦出现故障,则转为FAULT状态实现地址转移
eth0
eth1
...
}
启用keepalived日志功能
在service文件中查看下面这个文件
vim /usr/local/keepalived/etc/sysconfig/keepalived
默认ka的系统日志记录在log_daemon中,log_daemon的配置在/etc/rsyslog.d/50-default.conf
vim /etc/rsyslog.d/50-default.conf
但daemon日志开启后,/var/log/daemon.log会记录很多daemon日志,会ka的daemon日志杂糅在一起不利于观察,于是我们就自定义一个文件在记录ka的daemon信息。
独立记录ka的日志
1.设置log-facility
vim /usr/local/keepalived/etc/sysconfig/keepalived
KEEPALIVED_OPTIONS="-D -S 6"
/usr/local/keepalived/etc/sysconfig/keepalived文件的查看方法,先找到ka的service路径,打开keepalived.service文件后,EnvironmentFile等号后面的值便是。
2.定义规则文件
vim /etc/rsyslog.d/6-keepalived.conf
local6.* /var/log/keepalived.log
3.重启ka服务
重启keepalived.service和rsyslog.service
由日志了
实现ka独立子配置文件
当生产环境复杂时,/etc/keepalived/keepalived.conf文件中内容过多,不易管理,可以将不同集群的配置,比如:不同集群的VIP配置放在独立的子配置文件中。
利用include指令可以实现包含子配置文件,格式如下:
include /etc/keepalived/conf.d/*.conf
vim /etc/keepalived/keepalived.conf
mkdir /etc/keepalived/conf.d/
vim leimall.org.conf
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.200.16/24
192.168.200.17/24
192.168.200.18/24
}
}
抢占模式和非抢占模式
默认为抢占模式 preempt,即当高优先级的主机恢复在线后,会抢占低先级的主机的master角色,造成网络抖动,建议设置为非抢占模式 nopreempt,即高优先级主机恢复后,并不会抢占低优先级主机的master角色。
注意:非抢占模式下,如果原主机down机, VIP迁移至的新主机,后续新主机也发生down时,仍会将VIP迁移回原主机。
注意:要关闭VIP抢占,必须将各Keepalived服务器state配置为BACKUP
#ha1主机配置
vrrp_instance VI_1 {
state BACKUP #都为BACKUP
interface ens33
virtual_router_id 66
priority 100 #优先级高
advert_int 1
nopreempt #添加此行,设为nopreempt
}
#ha2主机配置
vrrp_instance VI_1 {
state BACKUP #都为BACKUP
interface ens33
virtual_router_id 66
priority 80 #优先级低
advert_int 1
#nopreempt #生产中ka2主机是抢占式,不添加此行,否则会导致ka1即使优先级降低,也不会切换至ka2
}
抢占延迟模式 preempt_delay
抢占延迟模式,即优先级高的主机恢复后,不会立即抢回VIP,而是延迟一段时间(默认300s)再抢回VIP
preempt_delay #指定抢占延迟时间为#s,默认延迟300s
注意:需要各keepalived服务器state为BACKUP,并且不要启用vrrp_strict
#ka1主机配置
vrrp_instance VI_1 {
state BACKUP #都为BACKUP
interface eth0
virtual_router_id 66
priority 100 #优先级高
advert_int 1
preempt_de1ay 60 #抢占延迟模式,默认延迟300s
}
#ka2主机配置
vrrp_instance VI_1 {
state BACKUP #都为BACKUP
interface eth0
virtual_router_id 66
priority 80 #优先级低
advert_int 1
}
VIP单播配置
默认keepalived主机之间利用多播相互通告消息,会造成网络拥塞,可以替换成单播,减少网络流量。机器不多就用单播。
注意:启用vrrp_strict时,不能启用单播
在所有节点vrrp_instance语句块中设置对方主机的IP,建议设置为专用于对应心跳线网络的地址,而非使用业务网络
unicast_src_ip <IPADDR> 指定发送单播的源IP
unicast_peer {
<IPADDR> 指定接收单播的对方目标主机IP
......
}
192.168.10.137的MASTER配置
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.200.16/24
192.168.200.17/24
192.168.200.18/24
}
unicast_src_ip 192.168.10.137
unicast_peer{
192.168.10.150 指向对方主机IP
192.168.10.151 如果有多个keepalived,再加其他节点的ip
}
}
192.168.10.150的BACKUP配置
vrrp_instance VI_1 {
state BACKUP
interface ens33
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.200.16/24
192.168.200.17/24
192.168.200.18/24
}
unicast_src_ip 192.168.10.150
unicast_peer {
192.168.10.137
}
}
抓包观察
tcpdump -i ens33 -nn src host 192.168.10.137 and dst host 192.168.10.150
可以看出已经是192.168.10.137向192.168.10.150单播发送消息了,不再是使用多播地址224.0.0.18广播消息了。
KA通知脚本配置
当keepalived的状态变化时,可以自动触发脚本的执行,比如:发邮件通知用户
默认以用户keepalived_script身份执行脚本,如果此用户不存在,以root执行脚本
可以用下面指令指定脚本执行用户的身份
global_defs {
....
script_user <USER>
....
}
通知脚本类型
1.当前节点成为主节点时触发的脚本
notify_master <STRING>|<QUOTED-STRING>
2.当前节点转为备节点时触发的脚本
notify_backup <STRING>|<QUOTED-STRING>
3.当前节点转为“失败”状态时触发的脚本
notify_fault <STRING>|<QUOTED-STRING>
4.通用格式的通知触发机制,一个脚本可完成以上三种状态的转换时的通知
notify <STRING>|<QUOTED-STRING>
5.停止VRRP时触发的脚本
notify_stop <STRING>|<QUOTED-STRING>
notify.sh
#!/bin/bash
wall The host is to being $1 state
脚本调用方法
脚本的使用可以参看编译安装后的路径下的示范案例
在vrrp_instance Vl_1语句块的末尾加下面行
notify_master "/etc/keepalived/conf.d/notify.sh master"
notify_backup "/etc/keepalived/conf.d/notify.sh backup"
notify_fault "/etc/keepalived/conf.d/notify.sh fault"
当我关掉150的ka服务之后
实现KA的双主架构
ka1主机配置
root@ka1:~# 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
}
include /etc/keepalived/conf.d/*.conf
ka1的cluster1.conf
root@ka1:~# cat /etc/keepalived/conf.d/cluster1.conf
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.200.16/24
}
unicast_src_ip 192.168.10.137
unicast_peer{
192.168.10.150
}
notify_master "/etc/keepalived/conf.d/notify.sh master"
notify_backup "/etc/keepalived/conf.d/notify.sh backup"
notify_fault "/etc/keepalived/conf.d/notify.sh fault"
}
ka1的cluster2.conf
root@ka1:~# cat /etc/keepalived/conf.d/cluster2.conf
vrrp_instance VI_2 {
state BACKUP
interface ens33
virtual_router_id 61
priority 80
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.200.17/24
}
unicast_src_ip 192.168.10.137
unicast_peer{
192.168.10.150
}
notify_master "/etc/keepalived/conf.d/notify.sh master"
notify_backup "/etc/keepalived/conf.d/notify.sh backup"
notify_fault "/etc/keepalived/conf.d/notify.sh fault"
}
ka2主机配置
ka2的keepalived.conf
root@ka2:~# 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
}
include /etc/keepalived/conf.d/*.conf
ka2的cluster1.conf
vrrp_instance VI_1 {
state BACKUP
interface ens33
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.200.16/24
}
unicast_src_ip 192.168.10.150
unicast_peer {
192.168.10.137
}
notify_master "/etc/keepalived/conf.d/notify.sh master"
notify_backup "/etc/keepalived/conf.d/notify.sh backup"
notify_fault "/etc/keepalived/conf.d/notify.sh fault"
}
ka2的cluster2.conf
vrrp_instance VI_2 {
state MASTER
interface ens33
virtual_router_id 61
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.200.17/24
}
unicast_src_ip 192.168.10.150
unicast_peer {
192.168.10.137
}
notify_master "/etc/keepalived/conf.d/notify.sh master"
notify_backup "/etc/keepalived/conf.d/notify.sh backup"
notify_fault "/etc/keepalived/conf.d/notify.sh fault"
}
查看IP
实现多主架构
三个节点的三主三从
第一个节点ka1配置:
virtual_router_id 1, vrrp instance 1, MASTER, 优先级100
virtual_router_id 3, vrrp instance 2, BACKUP, 优先级80
第二个节点ka2配置:
virtual_router_id 2, vrrp instance 1, MASTER, 优先级100
virtual_router_id 1, vrrp instance 2, BACKUP, 优先级80
第三个节点ka3配置:
virtual_router_id 3, vrrp instance 1, MASTER,优先级100
virtua1_router_id 2, vrrp instance 2, BACKUP,优先级80
三个节点的三主六从架构
第一个节点ka1配置:
virtual_router_id 1, vrrp instance 1, MASTER,优先级100
virtual_router_id 2, vrrp instance 2, BACKUP,优先级80
virtual_router_id 3, vrrp instance 3, BACKUP,优先级60
第二个节点ka2配置:
virtua1_router_id 1, vrrp instance 1, BACKUP,优先级60
virtua1_router_id 2, vrrp instance 2, MASTER,优先级100
virtual_router_id 3, vrrp instance 3, BACKUP,优先级80
第三个节点ka3配置:
virtua1_router_id 1, vrrp instance 1, BACKUP,优先级80
virtual_router_id 2, vrrp instance 2, BACKUP,优先级60
virtual_router_id 3, vrrp instance 3, MASTER,优先级100
实现IPVS的高可用
IPVS相关配置
每一个虚拟服务器即一个IPVS集群,可以通过下面语法实现
virtual_server IP port {
......
real_server IP port {
......
}
real_server IP port {
......
}
}
环境准备
1.两台ka服务137和150,VIP为192.168.200.16/24
2.两台web服务151和153,因为是基于DR模式的ipvs,所以VIP都配192.168.200.16/24
修改RS的内核参数
两台web服务需要修改自己的VIP为不应答和广播,这里我们使用脚本配置
lvs_dr_rs.sh
#!/bin/bash
#Author:wangxiaochun
#Date:2017-08-13
vip=192.168.200.16
mask='255.255.255.0'
dev=lo:1
rpm -q httpd &> /dev/null || yum -y install httpd &>/dev/null
service httpd start &> /dev/null && echo "The httpd Server is Ready!"
echo "`hostname -I`" > /var/www/html/index.html
case $1 in
start)
echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
ifconfig $dev $vip netmask $mask
echo "The RS Server is Ready!"
;;
stop)
ifconfig $dev down
echo 0 > /proc/sys/net/ipv4/conf/all/arp_ignore
echo 0 > /proc/sys/net/ipv4/conf/lo/arp_ignore
echo 0 > /proc/sys/net/ipv4/conf/all/arp_announce
echo 0 > /proc/sys/net/ipv4/conf/lo/arp_announce
echo "The RS Server is Canceled!"
;;
*)
echo "Usage: $(basename $0) start|stop"
exit 1
;;
esac
两台web服务同时执行脚本
虚拟服务器配置
virtual_server IP port{ VIP和PORT
delay_loop <INT> 检查后端服务器的时间间隔
lb_algo rr|wrr|lc|wlc|lblc|sh|dh 定义调度方法
lb_kind NAT|DR│TUN 集群的类型,注意要大写
persistence_timeout <INT> 持久连接时长
protocol TCP|UDP|SCTP 指定服务协议,一般为TCP
sorry_server <IPADDR><PORT> 所有RS故障时,备用服务器地址
real_server <IPADDR><PORT> { RS的IP和PORT
weight <INT> RS权重
notify_up <STRING> |<QUOTED-STRING> RS上线通知脚本
notify_down <STRING> |<QUOTED-STRING> RS下线通知脚本
HTTP_GET| SSL_GET|TCP_CHECK|SMTP_CHECK|MISC_CHECK { ... } 定义当前主机健康状态检测方法
}
}
注意:括号必须分行写,两个括号写在同一行,如:}}会出错
137的cluster1.conf
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.200.16/24
}
unicast_src_ip 192.168.10.137
unicast_peer{
192.168.10.150
}
notify_master "/etc/keepalived/conf.d/notify.sh master"
notify_backup "/etc/keepalived/conf.d/notify.sh backup"
notify_master "/etc/keepalived/conf.d/notify.sh master"
}
virtual_server 192.168.200.16 80 {
delay_loop 6
lb_algo rr
lb_kind DR
persistence_timeout 50
protocol TCP
real_server 192.168.10.151 80 {
weight 1
TCP_CHECK {
connect_timeout 3
retry 3
delay_before_retry 3
connect_port 80
}
}
real_server 192.168.10.153 80 {
weight 1
TCP_CHECK {
connect_timeout 3
retry 3
delay_before_retry 3
connect_port 80
}
}
}
150的配置
vrrp_instance VI_1 {
state BACKUP
interface ens33
virtual_router_id 51
priority 80
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.200.16/24
}
unicast_src_ip 192.168.10.150
unicast_peer {
192.168.10.137
}
notify_master "/etc/keepalived/conf.d/notify.sh master"
notify_backup "/etc/keepalived/conf.d/notify.sh backup"
notify_fault "/etc/keepalived/conf.d/notify.sh fault"
}
virtual_server 192.168.200.16 80 {
delay_loop 6
lb_algo rr
lb_kind DR
persistence_timeout 50
protocol TCP
real_server 192.168.10.151 80 {
weight 1
TCP_CHECK {
connect_timeout 3
retry 3
delay_before_retry 3
connect_port 80
}
}
real_server 192.168.10.153 80 {
weight 1
TCP_CHECK {
connect_timeout 3
retry 3
delay_before_retry 3
connect_port 80
}
}
}
重启ka服务,查看ipvsadm规则
systemctl restart keepalived.service
这是keepalived自动生成的ipvsadm规则
模拟客户端访问VIP
这里还有问题,先跳过,后续补上
后端服务的健康性检查
KA是怎么探测后端服务的健康性的呢?
默认通过KeepAliveClient浏览器来发送HTTP/1.0协议
HTTP_GET
应用层检测:HTTP_GET |SSL_GET
HTTP_GET|SSL_GET {
url {
path <URL_PATH> 定义要监控的URL
status_code <INT> 判断上述检测机制为健康状态的响应码,一般为 200
}
connect_timeout <INTEGER> 客户端请求的超时时长,相当于haproxy的timeout server
nb_get_retry <INT> 重试次数
delay_before_retry <INT> 重试之前的延迟时长
connect_ip <IP ADDRESS> 向当前RS哪个IP地址发起健康状态检测请求
connect_port <PORT> 向当前RS的哪个PORT发起健康状态检测请求
bindto <IP ADDRESS> 向当前RS发出健康状态检测请求时使用的源地址
bind_port <PORT> 向当前RS发出健康状态检测请求时使用的源端口
}
示例
virtual_server 192.168.200.16 80 {
delay_loop 3
lb_algo rr
lb_kind DR
protocol TCP
sorry_server 127.0.0.1 80
real_server 192.168.10.151 80 {
weight 1
HTTP_GET {
url {
path /monitor.html
status_code 200
}
connect_timeout 1
nb_get_retry 3
delay_before_retry 1
}
}
real_server 192.168.10.153 80 {
weight 1
HTTP_GET {
url {
path /
status_code 200
}
connect_timeout 1
nb_get_retry 3
delay_before_retry 1
}
}
}
TCP监测
传输层检测:TCP_CHECK
TCP_CHECK {
connect_ip <IP ADDRESS> 向当前RS的哪个IP地址发起健康状态检测请求
connect_port <PORT> 向当前RS的哪个PORT发起健康状态检测请求
bindto <IP ADDRESS> 发出健康状态检测请求时使用的源地址
bind_port <PORT> 发出健康状态检测请求时使用的源端口
connect_timeout <INTEGER> 客户端请求的超时时长,等于haproxy的timeout server
}
示例
virtual_server 192.168.200.16 80 {
delay_loop 6
lb_algo wrr
lb_kind DR
persistence_timeout 120 会话保持时间
protocol TCP
sorry_server 127.0.0.1 80
real_server 192.168.10.151 80 {
weight 1
TCP_CHECK {
connect_timeout 5
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
real_server 192.168.10.153 80 {
weight 1
TCP_CHECK {
connect_timeout 5
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
}
基于VRRP Script实现其他应用的高可用性
keepalived利用VRRP Script技术,可以调用外部的辅助脚本进行资源监控,并根据监控的结果实现优先动态调整,从而实现其它应用的高可用性功能。
VRRP Script 配置
VRRP Script的配置分两步实现定义脚本和调用脚本。
1.定义VRRP script
vrrp_script:自定义资源监控脚本,vrrp实例根据脚本返回值监控指定应用的状态,一旦发现应用的状态异常,则触发对MASTER节点的权重的减小,减至低于SLAVE节点,从而实现VIP切换到SLAVE节点。
公共定义,可被多个实例调用,定义在vrrp实例之外的独立配置块,一般放在global_defs设置块之后;是和global_defs平级的语句块。
当keepalived_script用户存在时,会以此用户身份运行脚本,否则默认以root运行脚本
注意:此定义脚本的语句块一定要放在下面调用此语句vrrp_instance语句块的前面
vrrp_script <SCRIPT_NAME> {
script <STRING>|<QUOTED-STRING> 此脚本返回值为非O时,会触发下面OPTIONS执行
OPTIONS
}
vrrp_script <SCRIPT_NAME> { 定义一个检测脚本,在global_defs之外配置
script <STRING> |<QUOTED-STRING> shell命令或脚本路径
interval <INTEGER> 间隔时间,单位为秒,默认1秒
timeout <INTEGER> 超时时间
weight <INTEGER:-254..254> 默认为0,如果设置此值为负数,当上面脚本返回值为非0时,会将此值与 本节点权重相加可以降低本节点权重,即表示fa11,
如果是正数,当脚本返回值为0,会将此值与本节点权重相加可以提高本节点权重,即表示 rise.通常使用负值
fall <INTEGER> 执行脚本连续几次都失败,则转换为失败,建议设为2以上
rise <INTEGER> 执行脚本连续几次都成功,把服务器从失败标记为成功
user USERNAME [GROUPNAME] 执行监测脚本的用户或组
init_fail 设置默认标记为失败状态,监测成功之后再转换为成功状态
}
2.调用VRRP script
track_script:调用vrrp_script定义的脚本去监控资源,定义在VRRP实例之内,调用事先定义的vrrp_script
track_script {
SCRIPT_NAME_1
SCRIPT_NAME_2
}
vrrp_instance VI_1 {
....
track_script {
<SCRIPT_NAME>
}
}
示范案例
vrrp_script check_down {
script "[ ! -f /etc/keepalived/down ]" /etc/keepalived/down 存在时返回非0,触发权重-30
interval 1
weight -30
fall 3
rise 2
timeout 2
}
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.200.16/24
}
unicast_src_ip 192.168.10.137
unicast_peer{
192.168.10.150
}
track_script{
check_down
}
notify_master "/etc/keepalived/conf.d/notify.sh master"
notify_backup "/etc/keepalived/conf.d/notify.sh backup"
notify_master "/etc/keepalived/conf.d/notify.sh master"
}
“-f /etc/keepalived/down” 表示文件知否存储,
"[! -f /etc/keepalived/down ]" /etc/keepalived/down 存在时返回非0,触发权重-30
实现HAproxy高可用
1.在两个ka1和ka2上实现haproxy的配置
vim /etc/haproxy/haproxy.cfg
[root@ka1 ~]#cat /etc/haproxy/haproxy.cfg
listen leiedu_http
bind 192.168.200.16:80
server 192.168.10.151 192.168.10.151:80 check
server 192.168.10.153 192.168.10.153:80 check
listen stats
mode http
bind 0.0.0.0:9999
stats enable
log global
stats uri /haproxy-status
stats auth haadmin: 123456
2.在两个ka1和ka2两个节点启用内核参数
vim /etc/sysctl.conf
net.ipv4.ip_nonlocal_bind = 1
sysctl -p
3.创建check_haproxy.sh
vim /etc/keepalived/ check_haproxy.sh
#!/bin/bash
/usr/bin/killall -0 haproxy || systemctl restart haproxy
赋予脚本执行权限
chmod a+x /etc/keepalived/check_haproxy.sh
4.配置keepalived调用脚本
vim /etc/keepalived/keepalived.conf
! configuration File for keepalived
g1obal_defs {
notification_email {
root@localhost
}
notification_emai1_from kaadmin@localhost
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id ka1.lei.org 在另一个节点为ka2.lei.org
vrrp_mcast_group4 224.0.100. 100
}
vrrp_script check_haproxy { 定义脚本
script "/etc/keepalived/check_haproxy.sh"
interval 1
weight -30
fall 3
rise 2
timeout 2
}
vrrp_instance VI_1 {
state MASTER 在另一个节点为BACKUP
interface eth0
virtual_router_id 66
priority 100 在另一个节点为80
advert_int 1
authentication {
auth_type PASS
auth_pass 123456
}
virtua1_ipaddress {
192.168.200.16/24 dev ens33 labe1 ens33:1
}
track_interface {
ens33
}
notify_master "/etc/keepalived/notify.sh master"
notify_backup " /etc / keepalived/notify.sh backup"
notify_fault "/etc/keepalived/notify.sh fau1t"
track_script {
check_haproxy 调用上面定义的脚本
}
}