一、前言

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 高可用集群的更多相关文章

  1. Linux 笔记 - 第十八章 Linux 集群之(三)Keepalived+LVS 高可用负载均衡集群

    一.前言 前两节分别介绍了 Linux 的高可用集群和负载均衡集群,也可以将这两者相结合,即 Keepalived+LVS 组成的高可用负载均衡集群,Keepalived 加入到 LVS 中的原因有以 ...

  2. Linux 笔记 - 第十八章 Linux 集群之(二)LVS 负载均衡集群

    一.前言 Linux 集群从功能上可以分为两大类:高可用集群和负载均衡集群.上一篇已经讲解了 HA 高可用集群,此节讲解负载均衡集群. 负载均衡集群(Load Balance Cluseter,简称 ...

  3. Keepalived高可用集群应用

    Keepalived高可用集群应用 1.keepalived服务说明 1.1.keepalived介绍 Keepalived是一个用C语言编写的路由软件.该项目的主要目标是为Linux系统和基于Lin ...

  4. Haproxy+keepalived高可用集群实战

    1.1  Haproxy+keepalived高可用集群实战 随着互联网火热的发展,开源负载均衡器的大量的应用,企业主流软件负载均衡如LVS.Haproxy.Nginx等,各方面性能不亚于硬件负载均衡 ...

  5. Nginx+Keepalived高可用集群应用实践

    Nginx+Keepalived高可用集群应用实践 1.Keepalived高可用软件 1.1 Keepalived服务的三个重要功能 1.1.1管理LVS负载均衡软件 早期的LVS软件,需要通过命令 ...

  6. Linux实战教学笔记31:Keepalived高可用集群应用实践

    1.1 Keepalived高可用软件 1.1.1 Keepalived介绍 Keepalived软件起初是专门为LVS负载均衡软件设计的,用来管理并监控LVS集群系统中各个服务节点的状态,后来又加入 ...

  7. Linux系统——Keepalived高可用集群

    #### keepalived服务的三个重要功能1. 管理LVS负载均衡软件Keepalived可以通过读取自身的配置文件,实现通过更底层的接口直接管理LVS的配置以及控制服务的启动,停止功能,这使得 ...

  8. Keepalived高可用集群搭建(转载linuxIDC)

    1.Keepalived简介 Keepalived是一个基于VRRP协议来实现的WEB服务高可用方案,可以利用其来避免单点故障.使用多台节点安装keepalived.其 他的节点用来提供真实的服务,同 ...

  9. rabbitmq+haproxy+keepalived高可用集群环境搭建

    1.先安装centos扩展源: # yum -y install epel-release 2.安装erlang运行环境以及rabbitmq # yum install erlang ... # yu ...

随机推荐

  1. ASP.NET Core[源码分析篇] - WebHost

    _configureServicesDelegates的承接 在[ASP.NET Core[源码分析篇] - Startup]这篇文章中,我们得知了目前为止(UseStartup),所有的动作都是在_ ...

  2. ASP.NET 一个页上需要显示多个验证码

    1.后台获取验证字节流,以字符串的形式返回到前端. public ActionResult GetValidateGraphic() { var validate = new ValidateCode ...

  3. Code signing is required for product type 'Unit Test Bundle' in SDK 'iOS 11.0.1'

    Code signing is required for product type 'Unit Test Bundle' in SDK 'iOS 11.0.1' 进入 projects and lis ...

  4. 使用MTA HTML5统计API来分析数据

    使用MTA HTML5统计API来分析数据 在开发个人博客的时候,用到了腾讯移动分析(MTA),相比其他数据统计平台来说我喜欢她的简洁高效,易上手,同时文档也比较全面,提供了数据接口供用户调用. 在看 ...

  5. Linux系统@根目录下各目录作用归纳图

  6. mac下面有epoll?

    没有的,但是mac下面有kqueue,跟epoll原理是差不多的. 这个是没办法的,如果实在需要,就用Ubuntu吧,这个也可以无缝迁移. 更多资源,更多文章由小白技术社提供(是我啦)

  7. PythonI/O进阶学习笔记_2.魔法函数

    前言: 本文一切观点和测试代码是在python3的基础上. Content: 1.什么是魔法函数,魔法函数__getitem__在python中应用. 2.python的数据模型和数据模型这种设计对p ...

  8. Linux系统下LNMP架构搭建

    一.防火墙状态: 1.查看防火墙状态: systemctl status firewalld service iptables status firewall-cmd --state 2.永久有效开启 ...

  9. Java 前后端分离项目:微人事

    本文适合刚学习完 Java 语言基础的人群,跟着本文可了解和运行项目,本示例是在 Windows 操作系统下演示. 本文作者:HelloGitHub-秦人 大家好!这里是 HelloGitHub 推出 ...

  10. Netty源码分析 (三)----- 服务端启动源码分析

    本文接着前两篇文章来讲,主要讲服务端类剩下的部分,我们还是来先看看服务端的代码 /** * Created by chenhao on 2019/9/4. */ public final class ...