Linux-Keepalived

Keepalived介绍

大白话:就是虚拟一个ip,然后虚拟机绑定该ip,如果该虚拟机挂掉,该另一个虚拟机就绑定虚拟ip。

keepalived是基于VRRP协议为LVS服务提供高可用方案。主要提供了负载均衡和高可用功能,用来避免单点故障。负载均衡是通过linux的IPVS(ip虚拟服务器)实现,高可用通过VRRP实现多机故障转移。
  keepalived一般是2个节点运行keepalived,一台是主节点(MASTER),一台是备节点(BACKUP)对外表现都是一个虚拟IP,主节点会通过组播方式发送特定的消息给备节点,如果备节点收不到这个特定消息时,说明主节点就宕机了,此时备节点就会接管VIP进行服务提供,这就实现了高可用。

  • VRRP虚拟路由器冗余协议(英语:Virtual Router Redundancy Protocol,缩写为 VRRP)是一种网络协议,可以为参与的路由器自动分配可用的IP地址。这个协议通过在子网中,自动选取默认网关,来增加路由的可用性和可靠性。

    VRRP原理:是一种容错协议,保证当主机的下一条路由器出现故障时,由另一台路由器来代替出现故障的路由器进行工作,从而保持网络通信的连续性和可靠性。

    VRRP相关术语:

    1. 虚拟路由器:由一个Master路由器和一个或多个Backup路由器组成。
    2. VRID:虚拟路由器的标识。同一虚拟路由器内的路由器有着相同的VRID。
    3. VIP(虚拟IP地址):路由器组(虚拟路由器)的IP地址。
    4. 抢占模式与非抢占模式:Master会以组播方式不断的向虚拟路由器组内发送自己的心跳报文,一旦Backup在设定时间内没有收到心跳信息的次数超过了设定次数,则会将Master的所有权转移到优先级最高的Backup,则就是抢占模式。非抢占模式是指只有在主节点完全故障时才能将backup变为master。
  • 组播:网卡支持并开启组播功能,组播通信方式是一种很节省资源的通信方式。其余还有单播、广播。

  • LVSLinux虚拟服务器(Linux Virtual Server)是一个虚拟的服务器集群系统,用于实现负载平衡

  • VIP虚拟IP地址(Virtual IP Address),主要是用来进行不同主机之间的切换,主要用在服务器的主从切换。

L2ohL9.png

实战

常用命令

1
2
3
4
#安装
yum install -y keepalived
# 启动keepalived
systemctl start keepalived

10.0.0.10双主热备配置文件 /etc/keepalived/keepalived.conf10.0.0.11修改相反即可

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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
! Configuration File for keepalived

global_defs {
router_id NGINX_DEVEL1 # 标识节点的字符串,一般设置为hostname
}

vrrp_script chk_nginx { #检测业务进程(nginx)来调整keepalived权重
script "/etc/keepalived/check_nginx.sh"
interval 2 #每2s检测一次
#weight -5 #检测失败(脚本返回非0)则优先级 -5
weight 2 #检测失败(脚本返回非0)则优先级 +2?
fall 3 #检测连续3次失败才算确定是真失败。
rise 2 #检测 2 次成功就算成功。但不修改优先级
}

vrrp_instance VI_1 {
state MASTER # 标识主节点服务(只有MASTER和BACKUP两种,大写)
interface eth0 # 当前ip的网卡接口
mcast_src_ip 10.0.0.10 # 本机IP地址
virtual_router_id 51 # 虚拟路由 ID(0-255),在一个 VRRP 实例中主备服务器 ID 必须一样
priority 200 # 优先级值设定:MASTER 要比 BACKUP 的值大
advert_int 1 # MASTER和BACKUP节点之间的同步检查时间间隔,单位为秒,主被设置一致

track_interface { # 设置额外的监控,eth0网卡出现问题也会切换
eth0
}

authentication { # 认证机制,主从节点保持一致即可
auth_type PASS
auth_pass password123 # MASTER和BACKUP使用相同明文才可以互通
}

virtual_ipaddress { # 虚拟IP地址池,可以多个IP
10.0.0.20/24 # 虚拟IP N个(VIP)
}

track_script {
chk_nginx
}
}

vrrp_instance VI_2 {
state BACKUP
interface eth0
mcast_src_ip 10.0.0.11
virtual_router_id 52
priority 180
advert_int 1

track_interface {
eth0
}

authentication {
auth_type PASS
auth_pass password123
}

virtual_ipaddress {
10.0.0.21/24
}

track_script {
chk_nginx
}
}

后面就可以通过vip进行访问了。

ip a s查看vip

1
2
3
4
5
6
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
link/ether 52:54:99:e5:7e:13 brd ff:ff:ff:ff:ff:ff
inet 10.0.0.10/24 brd 10.255.243.255 scope global noprefixroute dynamic eth0
valid_lft 58597sec preferred_lft 58597sec
inet 10.0.0.20/24 scope global secondary eth0
valid_lft forever preferred_lft forever

/etc/keepalived/check_nginx.sh脚本内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#!/bin/bash

function check_nginx() {
for ((i=0;i<5;i++));do
nginx_job_id=$(pgrep nginx)
if [[ ! -z $nginx_job_id ]];then
return
else
sleep 2
fi
nginx_job_id=0
done
}

# 1: running 0: stopped
check_nginx
if [[ $nginx_job_id -eq 0 ]]; then
/usr/bin/systemctl stop keepalived
exit 1
else
exit 0
fi