Linux 笔记 - 第十八章 Linux 集群之(一)Keepalived 高可用集群
一、前言
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+LVS 高可用负载均衡集群
一.前言 前两节分别介绍了 Linux 的高可用集群和负载均衡集群,也可以将这两者相结合,即 Keepalived+LVS 组成的高可用负载均衡集群,Keepalived 加入到 LVS 中的原因有以 ...
- Linux 笔记 - 第十八章 Linux 集群之(二)LVS 负载均衡集群
一.前言 Linux 集群从功能上可以分为两大类:高可用集群和负载均衡集群.上一篇已经讲解了 HA 高可用集群,此节讲解负载均衡集群. 负载均衡集群(Load Balance Cluseter,简称 ...
- Keepalived高可用集群应用
Keepalived高可用集群应用 1.keepalived服务说明 1.1.keepalived介绍 Keepalived是一个用C语言编写的路由软件.该项目的主要目标是为Linux系统和基于Lin ...
- Haproxy+keepalived高可用集群实战
1.1 Haproxy+keepalived高可用集群实战 随着互联网火热的发展,开源负载均衡器的大量的应用,企业主流软件负载均衡如LVS.Haproxy.Nginx等,各方面性能不亚于硬件负载均衡 ...
- Nginx+Keepalived高可用集群应用实践
Nginx+Keepalived高可用集群应用实践 1.Keepalived高可用软件 1.1 Keepalived服务的三个重要功能 1.1.1管理LVS负载均衡软件 早期的LVS软件,需要通过命令 ...
- Linux实战教学笔记31:Keepalived高可用集群应用实践
1.1 Keepalived高可用软件 1.1.1 Keepalived介绍 Keepalived软件起初是专门为LVS负载均衡软件设计的,用来管理并监控LVS集群系统中各个服务节点的状态,后来又加入 ...
- Linux系统——Keepalived高可用集群
#### keepalived服务的三个重要功能1. 管理LVS负载均衡软件Keepalived可以通过读取自身的配置文件,实现通过更底层的接口直接管理LVS的配置以及控制服务的启动,停止功能,这使得 ...
- Keepalived高可用集群搭建(转载linuxIDC)
1.Keepalived简介 Keepalived是一个基于VRRP协议来实现的WEB服务高可用方案,可以利用其来避免单点故障.使用多台节点安装keepalived.其 他的节点用来提供真实的服务,同 ...
- rabbitmq+haproxy+keepalived高可用集群环境搭建
1.先安装centos扩展源: # yum -y install epel-release 2.安装erlang运行环境以及rabbitmq # yum install erlang ... # yu ...
随机推荐
- 在使用Lists.transform时,不会直接生成PurchaseOrderVo的集合对象,而是生成一个Function的集合
但是在使用Lists.transform时,不会直接生成PurchaseOrderVo的集合对象,而是生成一个Function的集合,在循环的时候,会去调用apply 生成一个PurchaseOrde ...
- 从零开始一起学习SLAM | 用四元数插值来对齐IMU和图像帧
视觉 Vs. IMU 小白:师兄,好久没见到你了啊,我最近在看IMU(Inertial Measurement Unit,惯性导航单元)相关的东西,正好有问题求助啊 师兄:又遇到啥问题啦? 小白:是这 ...
- npm install 安装很慢
npm install 安装很慢 设置国内镜像 npm config set registry https://registry.npm.taobao.org npm install
- (转)2019年给Java编程初学者的建议(附学习大纲)
本文链接:https://blog.csdn.net/javajlb/article/details/85920904 1. 引言这是一篇初学者干货,请耐心看完,希望对你有帮助 作为初学者的你,命中了 ...
- json模块和pickle模块
json模块和pickle模块 一.json模块 作用:用python写了一个程序,用java写了一门程序,这两个程序需要数据之间交流,就产生了一种多种语言通用的数据类型,json串. 序列化:把对象 ...
- 区间K大数
区间K大数 问题描述 给定一个序列,每次询问序列中第l个数到第r个数中第K大的数是哪个. 输入格式 第一行包含一个数n,表示序列长度. 第二行包含n个正整数,表示给定的序列. 第三个包含一个正整数m, ...
- js的兼容问题以及解决方式(持续更新)
我们在使用js操作页面的时候兼容问题是很常见的,下面将常见的兼容问题及其对应的解决方法分享给大家,并持续更新: 1.获取事件对象的兼容写法: IE中:window.event 正常浏览器中:对 ...
- [Python] socket发送UDP广播实现聊天室功能
一.说明 本文主要使用socket.socket发送UDP广播来实现聊天室功能. 重点难点:理解UDP通讯流程.多线程.UDP广播收发等. 测试环境:Win10\Python3.5. 程序基本流程:创 ...
- Delphi - Indy TIdHTTP方式创建程序外壳 - 实现可执行程序的自动升级
Delphi 实现可执行程序的自动升级 准备工作: 1:Delphi调用TIdHTTP方式开发程序,生成程序打包外壳 说明:程序工程命名为ERP_Update 界面布局如下: 代码实现如下: unit ...
- Count on a tree 树上区间第K小
Count on a tree 题意:求路径 u到v上的 第k小的权重. 题解:先DFS建数, 然后对于每个节点往上跑出一颗主席树, 然后每次更新. 查询的时候, u, v, k, 找到 z = l ...