yield-bytes

沉淀、分享与无限进步

基于Keepalived实现双机主备

  本文使用keepalived快速配置实现双机主备模式,该模式为keepalived入门使用,生产使用需要谨慎,当然可用于帮助理解keepalived

步骤:

1)主备server安装keepalived

2)主备server配置keepalived.conf

3)主备server安装httpd web服务(用于测试)

4)主备启动keepalived,并测试master、backup各自中断服务后,访问情况

1、yum -y install keepalived httpd
2、主server的配置文件:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
! Configuration File for keepalived

global_defs {
router_id s0 ! 集群作用域的全局路由id,每台serverID要求唯一
}

vrrp_instance VI_1 {
state MASTER ! 主server为master,备server为BACKUP
interface eth0 !该server的网卡
virtual_router_id 51 !集群作用域所有server 相同id
priority 100 !优先级,同一个vrrp_instance里,主server必须要高于备server
advert_int 1
authentication { !主与备之间的认证机制
auth_type PASS
auth_pass 1111
}
virtual_ipaddress { ! 虚拟IP
192.168.1.10
}
}

点击并拖拽以移动

备机的配置同上,只需将state和priority改下 。从该配置文件可知,kl提供的功能极为简单,因此可实现一主多备的模式,而且非常容易配置,例如通过ansible 批量配置备机。

3、安装apache httpd web server

修改web主页内容,以便显示访问的是来自哪台server:

cd /var/www/html

vi index.html

内容:from keepalived master server

同理备机:from keepalived slave server

(聪明的你,可用docker去启动一个web服务,甚至keepalived也被docker化)

4、主备分别启动keepalived

server keepalived start

在主server的linux日志可看到相关运行info

vi /var/log/messages

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
Jun 27 02:58:10 nn systemd: Started LVS and VRRP High Availability Monitor.
# 启动LVS和VRRP HA监测服务
Jun 27 02:58:10 nn Keepalived_healthcheckers[11285]: Opening file '/etc/keepalived/keepalived.conf'.
# 读取ka配置文件
Jun 27 02:58:10 nn Keepalived_vrrp[11286]: Registering Kernel netlink reflector
# ka使用Linux内核netlink创建与ka进程的通信
# netlink是用户进程与内核的IP网络配置之间的通信接口,同时它也可以作为内核内部与多个用户空间进程之
# 间的消息传输系统.基于netlink,用户进程和内核之间的通信支持全双工、组播、异步,像一台纯软件实现的“虚拟机三层交换机”,从这一点可感受到Linux内核有多强大!

Jun 27 02:58:10 nn Keepalived_vrrp[11286]: Registering Kernel netlink command channel
Jun 27 02:58:10 nn Keepalived_vrrp[11286]: Registering gratuitous ARP shared channel
Jun 27 02:58:10 nn Keepalived_vrrp[11286]: Opening file '/etc/keepalived/keepalived.conf'.
Jun 27 02:58:10 nn Keepalived_vrrp[11286]: VRRP_Instance(VI_1) removing protocol VIPs.
Jun 27 02:58:10 nn Keepalived_vrrp[11286]: Using LinkWatch kernel netlink reflector...
Jun 27 02:58:10 nn Keepalived_vrrp[11286]: VRRP sockpool: [ifindex(2), proto(112), unicast(0), fd(10,11)]
Jun 27 02:58:11 nn Keepalived_vrrp[11286]: VRRP_Instance(VI_1) Transition to MASTER STATE
Jun 27 02:58:12 nn Keepalived_vrrp[11286]: VRRP_Instance(VI_1) Entering MASTER STATE
# 通过VRRP协议和ka的配置文件,将这台server选为master角色

Jun 27 02:58:12 nn Keepalived_vrrp[11286]: VRRP_Instance(VI_1) setting protocol VIPs.
# eth0网口上设置VIP
Jun 27 02:58:12 nn Keepalived_vrrp[11286]: Sending gratuitous ARP on eth0 for 192.168.1.10
# 在eth0发送ARP广播,对外问下192.168.1.10有没有机器在使用
Jun 27 02:58:12 nn Keepalived_vrrp[11286]: VRRP_Instance(VI_1) Sending/queueing gratuitous ARPs on eth0 for 192.168.88.10
Jun 27 02:58:12 nn Keepalived_vrrp[11286]: Sending gratuitous ARP on eth0 for 192.168.1.10
Jun 27 02:58:12 nn Keepalived_vrrp[11286]: Sending gratuitous ARP on eth0 for 192.168.1.10
Jun 27 02:58:12 nn Keepalived_vrrp[11286]: Sending gratuitous ARP on eth0 for 192.168.1.10
Jun 27 02:58:12 nn Keepalived_vrrp[11286]: Sending gratuitous ARP on eth0 for 192.168.1.10

点击并拖拽以移动

备机的message:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Jun 27 03:25:23 dn2 systemd: Starting LVS and VRRP High Availability Monitor...
Jun 27 03:25:23 dn2 Keepalived[11248]: Starting Keepalived v1.3.5 (03/19,2017), git commit v1.3.5-6-g6fa32f2
Jun 27 03:25:23 dn2 Keepalived[11248]: Opening file '/etc/keepalived/keepalived.conf'.
Jun 27 03:25:23 dn2 systemd: PID file /var/run/keepalived.pid not readable (yet?) after start.
Jun 27 03:25:23 dn2 Keepalived[11249]: Starting Healthcheck child process, pid=11250
Jun 27 03:25:23 dn2 Keepalived[11249]: Starting VRRP child process, pid=11251
Jun 27 03:25:23 dn2 systemd: Started LVS and VRRP High Availability Monitor.
Jun 27 03:25:23 dn2 Keepalived_healthcheckers[11250]: Opening file '/etc/keepalived/keepalived.conf'.
Jun 27 03:25:23 dn2 Keepalived_vrrp[11251]: Registering Kernel netlink reflector
Jun 27 03:25:23 dn2 Keepalived_vrrp[11251]: Registering Kernel netlink command channel
Jun 27 03:25:23 dn2 Keepalived_vrrp[11251]: Registering gratuitous ARP shared channel
Jun 27 03:25:23 dn2 Keepalived_vrrp[11251]: Opening file '/etc/keepalived/keepalived.conf'.
Jun 27 03:25:23 dn2 Keepalived_vrrp[11251]: VRRP_Instance(VI_1) removing protocol VIPs.
Jun 27 03:25:23 dn2 Keepalived_vrrp[11251]: Using LinkWatch kernel netlink reflector...
Jun 27 03:25:23 dn2 Keepalived_vrrp[11251]: VRRP_Instance(VI_1) Entering BACKUP STATE
# 备机进入BACKUP状态
Jun 27 03:25:23 dn2 Keepalived_vrrp[11251]: VRRP sockpool: [ifindex(2), proto(112), unicast(0), fd(10,11)]

点击并拖拽以移动

对比主备ka的运行日志发现:

主server比被server多了在eth0网口设置VIP:192.168.1.10的过程,使用ip a命令查看网口配置可看到:

主server网口多了VIP,而备机网口还是单IP,这里涉及到keepalived的设计原理,以下为原理解析部分

5、keepalived工作原理
5.1 模块设计

keepalived采用是模块化设计,不同模块实现不同的功能,keepalived主要有三个模块,分别是core、check和vrrp。

core:是keepalived的核心,负责主进程的启动和维护,全局配置文件的加载解析等

check: 负责healthchecker(健康检查),包括了各种健康检查方式,以及对应的配置的解析包括LVS的配置解析;

可基于脚本检查对IPVS后端服务器健康状况进行检查。

vrrp:VRRPD子进程,VRRPD子进程就是来实现VRRP协议,虚拟冗余路由协议。

下面是其他库: libipfwc:iptables/ipchains库,配置LVS会用到 libipvs*:配置LVS会用到,注意,keepalived和LVS完全不同的技术方向,各司其职相互配合

架构图:

img

点击并拖拽以移动

  keepalived启动后会有三个进程:

父进程:内存管理,IO调度、子进程管理等等

子进程:vrrpd子进程

子进程:healthchecker子进程

  由上图可知,两个子进程都被系统WatchDog看管,两个子进程各自实现自己的事,healthchecker子进程实现检查各自服务器的健康程度,例如HTTP,LVS等等,如果healthchecker子进程检查到MASTER上服务不可用,就会通知本机上的兄弟VRRP子进程,让他删除通告,并且去掉虚拟IP,转换为BACKUP状态

5.2 工作原理

  kpa是一个类似于layer3,4 & 5交换机制的软件,类似第3层、第4层和第5层物理交换机,分别工作在IP/TCP协议栈的IP层、TCP层、应用层。原理分别如下:

  在layer3,kpa使用layer3的方式工作式时,kpa会定期向服务器群中的服务器发送一个ICMP的数据包(既Ping),如果发现某台服务的IP地址没有激活,kpa便报告这台服务器失效,并将它从服务器群中剔除(这种情况的典型例子是某台服务器被非法关机)。Layer3方式是以服务器的IP地址是否有效作为服务器工作正常与否的标准。

  在layer4: layer4主要以TCP端口的状态来决定服务器工作正常与否。如web server的服务端口一般是80,8080或者443,如果kpa检测到80端口没有启动,则kpa将把这台服务器从服务器群中剔除。

  Layer5: Layer5就是工作在具体的应用层了,比Layer3,Layer4要复杂,在网络上占用的带宽也要大一些。kpa将根据用户的设定规则检查服务器相应服务是否运行正常,如果没有正常运行,则Keepalived将把服务器从服务器群中剔除。

5.3 VRRP虚拟冗余路由协议

  在现实的网络环境中,两台需要通信的主机大多数情况下并没有直接的物理连接。对于这样的情况,它们之间路由怎样选择?主机如何选定到达目的主机的下一跳路由,这个问题通常的解决方法有二种:在主机上使用动态路由协议(RIP、OSPF等)或者在主机上配置静态路由。显然,在主机上配置动态路由是不切实际的,因为管理、维护成本以及是否支持等诸多问题。配置静态路由则变得十分流行,但路由器(或者说默认网关default gateway)却经常成为单点。

VRRP的目的就是为了解决静态路由单点故障问题。VRRP通过一竞选(election)协议来动态的将路由任务交给LAN中虚拟路由器中的某台VRRP路由器。

​ VRRP工作机制

​ 在一个VRRP虚拟路由器中,有多台物理的VRRP路由器,但是这多台的物理的机器并不能同时工作,而是由一台称为MASTER的负责路由工作,其它的都是BACKUP,MASTER并非一成不变,VRRP让每个VRRP路由器参与竞选,最终获胜的就是MASTER。MASTER拥有一些特权,比如 拥有虚拟路由器的IP地址,我们的主机就是用这个IP地址作为静态路由的。拥有特权的MASTER要负责转发发送给网关地址的包和响应ARP请求。VRRP通过竞选协议来实现虚拟路由器的功能,所有的协议报文都是通过IP多播(multicast)包形式发送的。虚拟路由器由VRID(范围0-255)和一组IP地址组成,对外表现为一个周知的MAC地址。所以,在一个虚拟路由 器中,不管谁是MASTER,对外都是相同的MAC和IP(称之为VIP)。客户端主机并不需要因为MASTER的改变而修改自己的路由配置,对他们来说,这种主从的切换是透明的。

  在一个虚拟路由器中,只有作为MASTER的VRRP路由器会一直发送VRRP广告包(VRRPAdvertisement message),BACKUP不会抢占MASTER,除非它的优先级(priority)更高。当MASTER不可用时(BACKUP收不到广告包), 多台BACKUP中优先级最高的这台会被抢占为MASTER。这种抢占是非常快速的(<1s),以保证服务的连续性

6、入门级kpa优缺点

  优点当然是配置简单,缺点:浪费服务器资源,因为配置模式为主备,正常对外服务时,仅有一台主机对外提供服务,而多台备机只能处于未使用状态。在之后的几篇文章中,将开始使用keepalived+nginx,keepalived+lvs实现负载均衡高可用的主从、双主模式。