keepalived初体验

前言

keeplived用来做集群的高可用,如果一台机子挂了,另一台接管

安装

这边选择编译安装,先去官网下载然后上传到服务器上。

然后使用./configure --prefix=/usr/local/keepalived --sysconf=/etc配置安装目录和配置文件目录

如果报错了,下面列出几个我安装的时候出现的报错

  • OpenSSL is not properly installed on your system 【解决: yum -y install openssl-devel
  • WARNING - this build will not support IPVS with IPv6. 【解决: yum -y install libnl libnl-devel

当然你也可以直接用yum装- -

将keepalived注册为系统服务

源码包里有keepalived/etc这个目录,里面有个 init.dsysconfig里面都有 keepalived,将他们分别拷贝至/etc/init.d/etc/sysconfig

使用systemctl daemon-reload重置下,就可以使用systemctl start keepalived.service来启动了

使用keepalived实现双机主备

首先我们先准备两台虚拟机,都装上keepalived和nginx,nginx的配置要一致

然后修改下keepalived的配置

master配置

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
global_defs {
# 路由id:当前安装keepalived的节点主机标识符,保证全局唯一
router_id keep_171
}

vrrp_instance VI_1 {
# 表示状态是MASTER主机还是备用机BACKUP
state MASTER
# 该实例绑定的网卡
interface eth1
# 保证主备节点一致即可
virtual_router_id 51
# 权重,master权重一般高于backup,如果有多个,那就是选举,谁的权重高,谁就当选
priority 100
# 主备之间同步检查时间间隔,单位秒
advert_int 1
# 认证权限密码,防止非法节点进入
authentication {
auth_type PASS
auth_pass 1111
}
# 虚拟出来的ip,可以有多个
virtual_ipaddress {
192.168.56.151
}
}

backup配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
global_defs {
router_id keep_172
}

vrrp_instance VI_1 {
# 备用机设置为BACKUP
state BACKUP
interface eth1
virtual_router_id 51
# 权重低于MASTER
priority 80
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
# 注意:主备两台的虚拟ip都是一样的,绑定到同一个虚拟ip
192.168.56.151
}
}

启动之后访问虚拟ip,可以发现访问到的是master的nginx
123

然后我们手动把master节点关掉systemctl stop keepalived.service

然后刷新页面,就会发现访问的是备用节点
123

这样就搭建好了一个简单双机主备了。在主节点关闭后,你可以去备用节点使用ip addr查看ip,就会发现虚拟ip绑定在了备用机的网卡上,将主节点恢复,再次查看就会发现虚拟ip是跟主节点网卡绑定而备用节点的网卡已经没用绑定了。

使用keepalived检测nginx

上面我们实现了一个简单双机主备,细心的小伙伴可能会发现,只有当keepalived挂掉的时候才会切换到备用节点,而当nginx挂掉的时候是不会的,下面就让我们解决这个问题

  1. 在/ect/keepalived目录下新建一个脚本,用来检测nginx是否挂掉

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    #!/bin/bash

    A=`ps -C nginx --no-header |wc -l`
    # 判断nginx是否宕机,如果宕机了,尝试重启
    if [ $A -eq 0 ];then
    /usr/local/nginx/sbin/nginx
    # 等待一小会再次检查nginx,如果没有启动成功,则停止keepalived,使其启动备用机
    sleep 3
    if [ `ps -C nginx --no-header |wc -l` -eq 0 ];then
    killall keepalived
    fi
    fi
  2. 修改keepalived配置

    1
    2
    3
    4
    5
    6
    vrrp_script check_nginx {
    script "/etc/keepalived/check_nginx.sh"
    interval 2 # 每隔两秒运行
    weight 10 # 如果脚本运行成功,则升级权重+10
    # weight -10 # 如果脚本运行失败,则升级权重-10
    }
  3. 在vrrp_instance添加

    1
    2
    3
    track_script {
    check_nginx # 上面配置的脚本
    }

脚本写完记得chmod +x,修改完成后,重启下keepalived,然后手动把nginx关掉,刷新页面会发现页面并没有挂也没有切到备用节点,因为脚本起作用了,重启了nginx

keepalived实现双主热备

双机主备有个缺点,就是当主节点不挂的时候,备用节点是不会工作的,造成了资源浪费,所以我们下面修改下配置,把双机主备升级成双主热备

所谓双机主备,就是两个节点互为备用节点,将域名解析到两个虚拟ip上,使用dns轮询来做

下面给出配置

node1配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
vrrp_instance VI_2 {
state BACKUP
interface eth1
virtual_router_id 52
priority 80
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.56.152
}
}

node2配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
vrrp_instance VI_2 {
state MASTER
interface eth1
virtual_router_id 52
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.56.152
}
}

两台机子的配置文件都多添加一个实例而已,只不过是又多了一个虚拟ip,之前备用节点的实例2位主节点,之前主节点的实例2为备用节点,这样就可以了

重启后测试下,访问http://192.168.56.151/可以访问到主节点,访问http://192.168.56.152/可以访问到备用节点,然后手动把主节点的keepalived关掉,再访问151,就会发现切换到了备用节点了,去备用节点查看网卡信息,会发现网卡上绑定了两个虚拟ip

这样就做好了双主热备了!

end