keepalived介绍
keepalived是什么?
Keepalived 起初是专为LVS负载均衡软件设计的,用来管理并监控LVS集群系统中各个服务节点的状态,后来又加入了可以实现高可用的VRRP功能。
keepalived 是一个类似于layer3,layer4,layer5交换机制的软件。
keepalived 是集群管理中保证集群高可用的一个服务软件,用来防止单点故障,它可以自动检测集群中服务器的健康状况。
Keepalived 是用 C 语言编写的路由软件。这个项目的主要目标是为 Linux 系统和基于 Linux 的基础设施提供简单而强大的负载均衡和高可用性功能。
Keepalived 是开源并且免费的软件。
什么是VRRP?
VRRP(Virtual Router Redundancy Protocol,虚拟路由器冗余协议)是由IETF提出的解决局域网中配置静态网关出现单点失效现象的路由协议。
keepalived的工作原理
Layer3:Keepalived 会定期向服务器群中的服务器发送一个ICMP的数据包,如果发现某台主机的IP地址没有激活,Keepalived会报告这台服务器失效,并将它从服务器群中剔除,这种情况的典型例子是某台服务器被非法关机。Layer3的方式是以服务器的IP地址是否有效作为服务器工作正常与否的标准。
Layer4:例如 nginx 服务(端口80),如果Keepalived检测到80端口没有启动,则Keepalived将把这台服务器从服务器群中剔除。Layer4主要以TCP端口的状态来决定服务器工作正常与否。
Layer5:对指定的URL执行HTTP GET,使用MD5算法对HTTP GET结果进行求和。如果这个总数与预期值不符,Keepalived就会把这台服务器从服务器池中移除。
keepalived的组件
Keepalived 大致分两层结构:
用户空间
内核空间 (IPVS和NETLINK模块)
内核模块Keepalived主要实现负载均衡和路由高可用的核心模块,其中的NETLINK主要用于提供高级路由及其相关的网络功能。
用户空间是Keepalived的多数核心功能模块,其中几个核心功能模块的介绍如下:
core模块:keepalived的核心组件,负责主进程的启动、维护以及全局配置文件的加载和解析。
Checkers :主要负责真实服务器的健康检查( HealthChecking )。
VRRP Stack :主要负责负载均衡器之间的故障切换,集群架构中2个及2个以上LVS负载均衡器,才具备故障切换的条件。
System call 用来在进程之间的系统接口调用,来完成checkers和VRRP Stack健康检查和故障切换操作。
SMTP 在健康状态和故障切换发送故障时,通过邮件通知客户及时处理故障。
watch dog:监控check和vrrp进程的看管者,check负责检测器子进程的健康状态,当其检测到master上的服务不可用时则通告vrrp将其转移至backup服务器上。
IPVS Wrapper :主要用来发送设定的规则到内核IPVS代码。
Netlink Reflector :主要用来设定VRRP的VIP地址并提供相关的网络功能,该模块通过与内核中的NETLINK模块交互,从而为Keepalived提供路由高可用功能。
keepalived的作用
作为系统网络服务的高可用(High availability)
检测服务器的状态,如果有一台服务器宕机,或工作出现故障,Keepalived将检测到并且将有故障的服务器从集群中剔除,同时使用其他服务器代替该服务器的工作,当服务器恢复正常,Keepalived自动将服务器加入到服务器群中,这些工作全部自动完成。
Keepalived 的2大核心功能
1.loadbalance 负载均衡 LB:ipvs--》lvs软件在linux内核里已经安装,不需要单独安装。
2. high-availability 高可用 HA : vrrp协议
安装keepalived(yum 安装)
yum install keepalived -y
keepalived正常启动的时候,共启动3个进程:
一个是父进程,负责监控其子进程;一个是VRRP子进程,另外一个是checkers子进程;
两个子进程都被系统watchdog看管,两个子进程各自负责自己的事。Healthcheck子进程检查各自服务器的健康状况,例如http,lvs。如果healthchecks进程检查到master上服务不可用了,就会通知本机上的VRRP子进程,让他删除通告,并且去掉虚拟IP,转换为BACKUP状态。
[root@mysql-router-1 mail]# ps aux|grep keepa
root 4298 0.0 0.0 123012 1400 ? Ss 11:04 0:00 /usr/sbin/keepalived -D
root 4299 0.0 0.1 127212 2428 ? S 11:04 0:00 /usr/sbin/keepalived -D
root 4300 0.0 0.1 127212 2480 ? S 11:04 0:00 /usr/sbin/keepalived -D
root 4302 0.0 0.0 112824 980 pts/1 S+ 11:04 0:00 grep --color=auto keepa
主配置文件/etc/keepalived/keepalived.conf
[root@mysqlrouter-1 ~]# cd /etc/keepalived/
[root@mysqlrouter-1 keepalived]# ls
keepalived.conf
[root@mysqlrouter-1 keepalived]# cat 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协议(建议注释)
#vrrp_strict
#可设置ARP接口之间发送免费报文的延迟时间,可以精确到毫秒,默认是0
vrrp_garp_interval 0
#设置非请求消息的发送延迟时间,默认为0
vrrp_gna_interval 0
}
#定义一个vrrp协议的实例 名字叫VI_1 第一个vrrp实例
vrrp_instance VI_1 {
#做master角色
state MASTER
#指定监听网络的接口,其实就是vip绑定到那个网络接口上
interface ens33
#虚拟路由器id
virtual_router_id 51
#优先级 0~255
priority 200
#宣告消息的时间间隔 1秒
advert_int 1
authentication {
#密码认证
auth_type PASS
#具体密码
auth_pass 1111
}
#虚拟ip地址,可以有多个(vip)
virtual_ipaddress {
192.168.2.188
}
}
示例
配置单个主备vip
[root@mysql-router-1 ~]# cd /etc/keepalived/
[root@mysql-router-1 keepalived]# ls
keepalived.conf
[root@mysqlrouter-2 keepalived]# cat 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_instance VI_1 {
state backup
interface ens33
virtual_router_id 80
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.2.188
}
}
[root@mysqlrouter-2 keepalived]# service keepalived start
Redirecting to /bin/systemctl start keepalived.service
[root@mysql-router-1 keepalived]# cat 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_instance VI_1 {
state MASTER
interface ens33
virtual_router_id 80
priority 200
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.2.188
}
}
[root@mysql-router-1 keepalived]# service keepalived start
Redirecting to /bin/systemctl start keepalived.service
[root@mysql-router-1 keepalived]# ip add
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:0c:29:0b:ab:19 brd ff:ff:ff:ff:ff:ff
inet 192.168.2.106/24 brd 192.168.2.255 scope global noprefixroute dynamic ens33
valid_lft 6575sec preferred_lft 6575sec
inet 192.168.2.188/32 scope global ens33
valid_lft forever preferred_lft forever
inet6 fe80::756f:5c73:773b:8942/64 scope link noprefixroute
valid_lft forever preferred_lft forever
inet6 fe80::c677:9e7:aa77:c70c/64 scope link tentative noprefixroute dadfailed
valid_lft forever preferred_lft forever
inet6 fe80::e6:ae86:1811:699b/64 scope link tentative noprefixroute dadfailed
valid_lft forever preferred_lft forever
[root@mysql-router-1 keepalived]#
验证vip漂移
# 有vip的服务器停掉keepalived
[root@mysqlrouter-1 keepalived]# service keepalived stop
Redirecting to /bin/systemctl stop keepalived.service
# 查看另一台服务器上是否有vip
[root@mysql-router-2 keepalived]# ip add
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:0c:29:0b:ab:19 brd ff:ff:ff:ff:ff:ff
inet 192.168.2.106/24 brd 192.168.2.255 scope global noprefixroute dynamic ens33
valid_lft 6575sec preferred_lft 6575sec
inet 192.168.2.188/32 scope global ens33
valid_lft forever preferred_lft forever
inet6 fe80::756f:5c73:773b:8942/64 scope link noprefixroute
valid_lft forever preferred_lft forever
inet6 fe80::c677:9e7:aa77:c70c/64 scope link tentative noprefixroute dadfailed
valid_lft forever preferred_lft forever
inet6 fe80::e6:ae86:1811:699b/64 scope link tentative noprefixroute dadfailed
valid_lft forever preferred_lft forever
配置2个vrrp实例,互为主备
# 第1台服务器的配置
[root@mysql-router-1 keepalived]# cat 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_instance VI_1 {
state MASTER
interface ens33
virtual_router_id 80
priority 200
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.2.187
}
}
vrrp_instance VI_2 {
state backup
interface ens33
virtual_router_id 81
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.2.186
}
}
# 第2台服务器的配置
[root@mysqlrouter-2 keepalived]# cat 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_instance VI_1 {
state backup
interface ens33
virtual_router_id 80
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.2.187
}
}
vrrp_instance VI_2 {
state master
interface ens33
virtual_router_id 81
priority 200
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.2.186
}
}
什么是脑裂?
当两台高可用服务器在指定的时间内,无法互相检测到对方而各自启动故障转移功能,取得了资源以及服务的所有权,而此时的两台高可用服务器对都还活着并作正常运行,这样就会导致同一个服务在两端同时启动而发生冲突的严重问题,最严重的就是两台主机同时占用一个VIP的地址。
脑裂(split-brain):指在一个高可用(HA)系统中,当联系着的两个节点断开联系时,本来为一个整体的系统,分裂为两个独立节点,这时两个节点开始争抢共享资源,结果会导致系统混乱,数据损坏。
为什么会出现脑裂?
1.vrid(虚拟路由id)不一样
2.网络通信有问题:中间有防火墙阻止了网络之间的选举的过程,vrrp报文的通信
3.认证密码不一样也会出现脑裂
脑裂有没有危害?如果有危害对业务有什么影响?
没有危害,能正常访问,反而还有负载均衡的作用;
脑裂恢复的时候会有影响,会导致短暂的中断,影响业务。