Linux 笔记 - 第十八章 Linux 集群之(一)Keepalived 高可用集群

2023-02-15,,,,

一、前言

Linux 集群从功能上可以分为两大类:高可用集群和负载均衡集群。此处只讲高可用集群,负载均衡放在下一篇博客讲解。

高可用集群(High Availability Cluster,简称 HA)包括两台及以上的服务器,通常为两台服务器,其中一台工作,另一条冗余,当提供服务的服务器宕机时,冗余的那台服务器将接替宕机的服务器继续提供服务。只有两个节点的高可用集群又称为双机热备,即使用两台服务器互相备份。从而在不需要人工干预的 情况下,自动保证系统能持续对外提供服务。双机热备只是高可用集群的一种,高可用集群系统更可以支持两个以上的节点,提供比双机热备更多、更高级的功能, 更能满足用户不断出现的需求变化。

实现高可用集群的开源软件有 Heartbeat 和 Keepalived 等。

二、Keepalived 简介

Keepalived 是通过 VRRP(Virtual Router Redundancy Protocal)协议来实现高可用的。VRRP 协议会将多台功能相同的路由器组成一个小组,这个小组里有一个 master 主节点和 N(N >=1)个 backup 备用节点。工作时, master 会通过组播的形式向各个 backup 发送 VRRP 协议的数据包,当 backup 收到 master 发来的 VRRP 数据包时,就会认为 master 宕机了。此时就需要根据各个 backup 的优先级来决定谁称为新的 master,来提供服务。

Keepalived 有三个模块,分别是 core、check 和 vrrp。其中,core 模块是 Keepalived 的核心功能,负责主进程的启动、维护以及全局配置文件的加载和解析;check 模块负责健康检查;vrrp 模块用来实现 VRRP 协议。

Keepalived 官方网站:https://www.keepalived.org/

三、创建 Keepalived (单主)高可用集群

以下使用 Keepalived+Nginx 实现(单主)高可用的 Web 集群,所谓单主,即只有一个 master 主节点在工作,另一台节点作为 backup,处于空闲。

3.1 准备集群节点

准备两台 server,一台作为 master 节点,一台作为 backup 节点。

master 节点:hostname:masternode,IP Address:192.168.56.110

backup节点:hostname:datanode1,IP Address:192.168.56.111

Virtual IP(VIP):192.168.56.100

两台 server 都需要安装 Keepalived 和 Nginx,而且在安装服务后关闭防火墙和 selinux,此处以在 master 节点上安装为例,在 backup 节点上安装是相同的,如下均使用 yum 安装的方式:

安装 Keepalived,如下:

[root@masternode ~]# rpm -qa |grep keepalived
[root@masternode ~]# yum install -y keepalived
[root@masternode ~]# rpm -qa |grep keepalived
keepalived-1.3.-.el7_6.x86_64

安装 Nginx,如下:

[root@masternode ~]# rpm -qa |grep nginx
[root@masternode ~]# yum install -y nginx
Loaded plugins: fastestmirror, langpacks
Loading mirror speeds from cached hostfile
* base: mirrors.huaweicloud.com
* extras: mirrors.huaweicloud.com
* updates: mirrors.huaweicloud.com
No package nginx available.
Error: Nothing to do

提示在 yum 源中没有 nginx 的软件包,表示默认情况 Centos7 中并没有 nginx 的源,但是 Nginx 官网提供了 Centos 的源地址:

64位系统的 Nginx 源地址:rpm -Uvh http://nginx.org/packages/centos/7/x86_64/RPMS/nginx-1.16.0-1.el7.ngx.x86_64.rpm

不区分32还是64的 Nginx 源地址:rpm -Uvh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm

或者添加 CentOS 的扩展源:

[root@masternode ~]# yum install -y epel-release
[root@masternode ~]# yum search nginx
......
[root@masternode media]# yum install -y nginx
......

yum 安装 Nginx 后,默认路径为:

/etc/nginx 为 Nginx 的程序安装目录,/etc/share/nginx/html 为网站根目录。

关闭防火墙和 selinux,如下:

[root@masternode ~]# systemctl stop firewalld.service
[root@masternode ~]# systemctl disable firewalld.service
Removed symlink /etc/systemd/system/multi-user.target.wants/firewalld.service.
Removed symlink /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service.
[root@masternode ~]# getenforce
Disabled

backup 节点也按照上面的步骤准备即可。

3.2 设置 master 主服务器的 keepalived

编辑 master 服务器上的 Keepalived 配置文件,清空原始配置,将 VIP 设置为 100,此处的 VIP 指 Virtual IP,即 "虚拟 IP",或者叫浮动 IP,因为这个 IP 是由 Keepalived 给服务器配置上的,服务器靠这个 VIP 对外提供服务,当 master 机器宕机,VIP 被分配到 backup 上,而对用户来说是无感知的。

首先查看网卡 ifcfg-enp0s8,准备将 VIP 绑定到此网卡。

[root@masternode network-scripts]# ls -l ifcfg-enp0s8
-rw------- root root May ifcfg-enp0s8
[root@masternode network-scripts]# pwd
/etc/sysconfig/network-scripts
[root@masternode network-scripts]# ls -l ifcfg-enp0s8
-rw------- root root May ifcfg-enp0s8

编辑配置文件 /etc/keepalived/keepalived.conf,设置为如下内容:

[root@masternode ~]# cd /etc/keepalived
[root@masternode keepalived]# ls -ltr
total
-rw-r--r-- root root Jul : keepalived.conf
[root@masternode keepalived]# vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived global_defs { #定义全局参数
notification_email { #出现问题时给此邮箱通知
admin@moonxy.com
}
notification_email_from root@moonxy.com #定义发邮件地址
smtp_server 127.0.0.1 #表示使用本机自带的邮件服务器发送
smtp_connect_timeout
router_id LVS_DEVEL
} vrrp_script chk_nginx { # chk_nginx 为自定义名字,后面还会使用到
script "/usr/local/sbin/check_nginx.sh" #自定义脚本,用于监控Nginx服务
interval #每隔3秒执行一次该脚本
} vrrp_instance VI_1 {
state MASTER #定义角色为master
interface enp0s8 #针对哪个网卡监听VIP
virtual_router_id
priority #权重为100,master权重要比backup大
advert_int
authentication {
auth_type PASS
auth_pass moonxy>com #自定义密码
}
virtual_ipaddress {
192.168.56.100 #定义VIP
}
track_script {
chk_nginx #定义监控脚本,与vrrp_script后的名字一致
}
}

Keepalived 要实现高可用,必须要监控 Nginx 服务,而它本身没有这个功能,需要自定义脚本来实现,并设置为 755 权限,如下:

[root@masternode ~]# cd /usr/local/sbin
[root@masternode sbin]# vim /usr/local/sbin/check_nginx.sh
#!/bin/bash
#author:moonxy
#时间变量,用于记录日志
d=`date --date today +%Y%m%d_%H:%M:%S`
#计算Nginx进程数量
n=`ps -C nginx --no-heading|wc -l`
#如果进程数为0,则启动Nginx,并且再次检测nginx进程数量
#如果数量还为0,说明Nginx无法启动,此时需要关闭Keepalived
if [ $n -eq ""]; then
systemctl start nginx
n2=`ps -C nginx --no-heading|wc -l`
if [ $n2 -eq "" ]; then
echo "$d nginx down,keepalived will stop" >> /var/log/check_nginx.log
systemctl stop keepalived
fi
fi
[root@masternode sbin]# chmod /usr/local/sbin/check_nginx.sh

启动 keepalived 之前,使用 ip addr 或者 ip add 查看网卡 enp0s8 绑定的 IP 地址,如下:

启动 keepalived 服务后,发现网卡 enp0s8 已经绑定了 VIP 的地址:192.168.56.100,而且在启动 keepalived 时,会自动通过检测脚本 /usr/local/sbin/check_nginx.sh,来启动 nginx,如下:

即使 nginx 在使用中突然停止服务,只要 keepalived 服务正常,便会每三秒钟检测一次脚本,来启动 nginx。

3.3 设置 backup 从服务器的 keepalived

按照同样方法设置 backup 从服务器,编辑 /etc/keepalived/keepalived.conf 和创建 /usr/local/sbin/check_nginx.sh,只不过在 /etc/keepalived/keepalived.conf 中,将 state 设置为 BACKUP,将 priority 设置为 90,如下:

[root@datanode1 keepalived]# vim keepalived.conf
! Configuration File for backup keepalived global_defs {
notification_email {
admin@moonxy.com
}
notification_email_from root@moonxy.com
smtp_server 127.0.0.1
smtp_connect_timeout
router_id LVS_DEVEL
} vrrp_script chk_nginx {
script "/usr/local/sbin/check_nginx.sh"
interval
} vrrp_instance VI_1 {
state BACKUP
interface enp0s8
virtual_router_id
priority
advert_int
authentication {
auth_type PASS
auth_pass moonxy>com
}
virtual_ipaddress {
192.168.56.100
}
track_script {
chk_nginx
}
}

启动 Keepalived 服务,并查看进程,如下:

可以看到 keepalived 和 nginx 进程已经启动。

/usr/local/sbin/check_nginx.sh 与 master 的内容一样,不需要修改。

3.4 区分主从 Nginx 服务器

master 主服务器的 Nginx 版本为 1.16.0

访问 master 的地址:192.168.56.110,index.html

backup 从服务器的 Nginx 版本为 1.12.2

访问 backup 的地址:192.168.56.111,index.html

访问 VIP 的地址:192.168.56.100,index.html 如下:

由于两台 server 的 nginx 版本不同,主页也刚好不同,所以很容易区分主从服务器。如果使用的相同版本的 nginx,为了区分主从服务器,可以修改网站根目录下的 index.html 来区分。

通过 yum 安装的 nginx,可以先找到 nginx 的虚拟主机默认的配置文件 /etc/nginx/nginx.conf 或 /etc/nginx/conf.d/default.conf,找到网站根目录为 /usr/share/nginx/html,修改其中的 index.html 首页内容,如下:

3.5 测试 Keepalived 高可用

模拟生产环境中的宕机,将 master 服务器上的 Keepalived 服务停掉,此时 VIP 地址将从 master 上被释放,而绑定到 backup 上,如下:

先停掉 master 的 keepalived,如下:

[root@masternode nginx]# systemctl stop keepalived

发现 VIP 已经被释放,如下:

发现此时 VIP 绑定到了 backup 服务器上,如下:

访问 VIP 地址,发现已经切换到了 backup 服务器的 nginx 上,如下:

如果此时又启动 master 的 keepalived,再次访问 VIP 时,又会切换到 master 的 nginx,因为 master 的优先级高。

四、创建 Keepalived (双主)高可用集群

上面的 Keepalived + Nginx 主备模式,始终存在一台服务器处于空闲状态,如何更好地把两台服务器利用起来,可以借助 keepalived + Nginx 双主架构来实现,在该架构中,同时两台对外提供服务,拥有两个 VIP 地址,同时接收用户的请求。

4.1 准备集群节点

准备两台 server,第一台作为 master 节点,也作为第二台的 backup 节点,第二台作为第一台 backup 节点,也作为第二台的 master 节点。

第一台节点:hostname:masternode,IP Address:192.168.56.110

第二台节点:hostname:datanode1,IP Address:192.168.56.111

Virtual IP1(VIP1):192.168.56.105

Virtual IP2(VIP2):192.168.56.106

4.2 准备第一台节点

编辑配置文件 /etc/keepalived/keepalived.conf,设置为如下内容:

[root@masternode keepalived]# vim /etc/keepalived/keepalived.conf
! Configuration File for two master mode keepalived global_defs {
notification_email {
admin@moonxy.com
}
notification_email_from root@moonxy.com
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id LVS_DEVEL
} vrrp_script chk_nginx {
script "/usr/local/sbin/check_nginx.sh"
interval 3
} #VIP1 for MASTER
vrrp_instance VI_1 {
state MASTER
interface enp0s8
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass moonxy>com
}
virtual_ipaddress {
192.168.56.105
}
track_script {
chk_nginx
}
} #VIP2 for BACKUP
vrrp_instance VI_2 {
state BACKUP
interface enp0s8
virtual_router_id 52
priority 90
advert_int 1
authentication {
auth_type PASS
auth_pass moonxy>com
}
virtual_ipaddress {
192.168.56.106
}
track_script {
chk_nginx
}
}

可以看到配置了两个 VIP 地址。

4.3 准备第二台节点

编辑配置文件 /etc/keepalived/keepalived.conf,设置为如下内容:

[root@datanode1 keepalived]# cat keepalived.conf
! Configuration File for backup keepalived global_defs {
notification_email {
admin@monnxy.com
}
notification_email_from root@moonxy.com
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id LVS_DEVEL
} vrrp_script chk_nginx {
script "/usr/local/sbin/check_nginx.sh"
interval 3
} #VIP1 for BACKUP
vrrp_instance VI_1 {
state BACKUP
interface enp0s8
virtual_router_id 51
priority 90
advert_int 1
authentication {
auth_type PASS
auth_pass moonxy>com
}
virtual_ipaddress {
192.168.56.105
}
track_script {
chk_nginx
}
} #VIP2 for MASTER
vrrp_instance VI_2 {
state MASTER
interface enp0s8
virtual_router_id 52
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass moonxy>com
}
virtual_ipaddress {
192.168.56.106
}
track_script {
chk_nginx
}
}

同样可以看到配置了两个 VIP 地址,主从的 virtual_router_id 需要分别保持一致。

4.4 启动服务

启动两台 server 的 keepalived 服务后,查看 VIP 绑定情况,如下:

可以看到 masternode 绑定了 VIP1。

可以看到 datanode1 节点绑定了 VIP2。

4.5 测试

访问:http://192.168.56.105/

访问:http://192.168.56.106/

比如现在某一台 server 宕机,则两个 VIP 全都会绑定到另一台 server 上。如下停掉了 datanode1,两个 VIP 全都绑定到了 masternode:

此时浏览器访问 http://192.168.56.105/

访问 http://192.168.56.106/

注意:停掉 keepalived 之后,各自服务器上的 nginx 依然能够正常访问,只不过是通过各自的 IP 地址直接访问。

在使用双主架构的 keepalived 时需要注意:

keepalived 主配置文件必须设置不同的 VRRP 名称,同时优先级和 VIP 设置各不相同。

Nginx 网站总访问量为两台 Nginx 服务器访问之和,可以写脚本自动统计访问量。

两台 Nginx 为 master,存在两个 VIP 地址,用户从外网访问 VIP,需要配置域名映射到两个 VIP 上方即可。

通过外网 DNS 映射不同 VIP 的方法也称为 DNS 负载均衡模式。

可以通过 Zabbix 实时监控 VIP 访问状态是否正确。

Linux 笔记 - 第十八章 Linux 集群之(一)Keepalived 高可用集群的相关教程结束。

《Linux 笔记 - 第十八章 Linux 集群之(一)Keepalived 高可用集群.doc》

下载本文的Word格式文档,以方便收藏与打印。