一、前言

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. C# 复制Excel单元格格式

    本文将介绍通过C# 复制Excel单元格格式的方法,包括复制单元格中的字体.字号.字体加粗.倾斜.单元格背景色.字体颜色.单元格数字格式.单元格文字方向.文字旋转.下划线.单元格对齐方式.单元格边框等 ...

  2. ansible批量自动配置Juniper

    一.需求 有几台新上线的Juniper,需要批量配置下syslog,ntp,snmp基础配置 二.拓扑 三.实施步骤 1.读取配置并输出作为初步核查 2.把配置载入网络其中一台网络设备中,并做一个sh ...

  3. MySQL隔离性及Spring事务

    一.数据库事务ACID特性 必须要掌握事务的4个特性,其中事务的隔离性之于MySQL,对应4级隔离级别. 原子性(Atomicity): 事务中的所有原子操作,要么都能成功完成,要么都不完成,不能停滞 ...

  4. abp(net core)+easyui+efcore实现仓储管理系统——使用 WEBAPI实现CURD (十五)

    core)+easyui+efcore实现仓储管理系统目录 abp(net core)+easyui+efcore实现仓储管理系统——ABP总体介绍(一) abp(net core)+easyui+e ...

  5. python 07 数据类型

    目录 1. 基础数据类型填充 1.str:(不可变) 2. list: 3. tuple: 4. dict: 5. set: 6. bool: 7. 数据类型之间转换 2.删除列表/字典的代码坑: 3 ...

  6. python 05 字典

    [TOC] 字典——dict { } 字典是无序,可变的数据类型. 字典:用于存储数据,存储大量数据,字典要比列表快:将数据和数据之间进行关联. 1. 定义:  dic = {键:值,键:值}  #每 ...

  7. CocosCreator上的游戏(调试)发布到微信小程序

    1.下载CocosCreator,微信开发者工具 官网地址:http://www.cocos.com/download 官网下载:https://developers.weixin.qq.com/mi ...

  8. Java基础之Collection与Collections浅析

    Java基础之Collection与Collections浅析 一.前言: 位于Java.util包下的Collection与Collections都是Java中重要的工具类,它们都是Java集合框架 ...

  9. 微信小程序捕获async/await函数异常实践

    背景 我们的小程序项目的构建是与web项目保持一致的,完全使用webpack的生态来构建,没有使用小程序自带的构建功能,那么就需要我们配置代码转换的babel插件如Promise.Proxy等:另外, ...

  10. CentOS7下使用SonatypeNexus3搭建Docker私有仓库

    前置条件:安装docker(如果机器上没有安装的话) //安装一些必要的系统工具: sudo yum install -y yum-utils device-mapper-persistent-dat ...