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.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 (双主)高可用集群
上面的 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 访问状态是否正确。