一、前言
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 集群。
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.5-8.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------- 1 root root 328 May 27 2018 ifcfg-enp0s8
[root@masternode network-scripts]# pwd
/etc/sysconfig/network-scripts
[root@masternode network-scripts]# ls -l ifcfg-enp0s8
-rw------- 1 root root 328 May 27 2018 ifcfg-enp0s8
编辑配置文件 /etc/keepalived/keepalived.conf,设置为如下内容:
[root@masternode ~]# cd /etc/keepalived
[root@masternode keepalived]# ls -ltr
total 4
-rw-r--r-- 1 root root 560 Jul 14 21:23 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 30
router_id LVS_DEVEL
}
vrrp_script chk_nginx { # chk_nginx 为自定义名字,后面还会使用到
script "/usr/local/sbin/check_nginx.sh" #自定义脚本,用于监控Nginx服务
interval 3 #每隔3秒执行一次该脚本
}
vrrp_instance VI_1 {
state MASTER #定义角色为master
interface enp0s8 #针对哪个网卡监听VIP
virtual_router_id 51
priority 100 #权重为100,master权重要比backup大
advert_int 1
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 "0"]; then
systemctl start nginx
n2=`ps -C nginx --no-heading|wc -l`
if [ $n2 -eq "0" ]; then
echo "$d nginx down,keepalived will stop" >> /var/log/check_nginx.log
systemctl stop keepalived
fi
fi
[root@masternode sbin]# chmod 755 /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 30
router_id LVS_DEVEL
}
vrrp_script chk_nginx {
script "/usr/local/sbin/check_nginx.sh"
interval 3
}
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.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 + Nginx 主备模式,始终存在一台服务器处于空闲状态,如何更好地把两台服务器利用起来,可以借助 keepalived + Nginx 双主架构来实现,在该架构中,同时两台对外提供服务,拥有两个 VIP 地址,同时接收用户的请求。这样就会涉及到 DNS 负载均衡模式,即在 DNS 服务器中为同一个主机名配置多个 IP 地址,在此处即为多个 VIP 地址。双主模式具体实现方式可以查询相关文章,此处不做过多介绍。
注意:
停掉 keepalived 之后,各自服务器上的 nginx 依然能够正常访问,只不过是通过各自的 IP 地址直接访问。