三、keepalived双机热备

一、双机热备概述

1、为什么需要双机热备:

双机热备主要为了解决服务器的单点故障问题。 在主机 MASTER 宕机之后可以马上切换到备选服务器 BACKUP。

服务器规划:

2、克隆产生web01服务器:

(1) 基于LNMP克隆生成Web01服务器:

(2) 更改服务器IP和UID后三位:

vim /etc/sysconfig/network-scripts/ifcfg-ens33

IPADDR=10.1.1.11

(3) 更改主机名:

hostnamectl set-hostname web01.itcast.cn

(4) 修改物理机host文件的映射关系:

3克隆产生MySQL01服务器:

基于CentOS7母机克隆产生MySQL服务器:

(1) 更改IP地址、UID和主机名:

IPADDR=10.1.1.12

hostnamectl set-hostname mysql01.itcast.cn

(2) 更改Web01与MySQL01中/etc/hosts文件:

10.1.1.11 web01 web01.itcast.cn

10.1.1.12 mysql01 mysql02.itcast.cn

关闭防火墙、selinux和NetworkManager。

二、MySQL数据库分离

1、在MySQL01中安装MySQL:

使用Shell脚本安装MySQL:

vim mysql.sh

#!/bin/bash

echo "==================================="
echo "Install MySQL5.6.35 GLIBC"
echo "==================================="

tar -zxf mysql-5.6.35-linux-glibc2.5-x86_64.tar.gz
mv mysql-5.6.35-linux-glibc2.5-x86_64 /usr/local/mysql
useradd -r -s /sbin/nologin mysql
chown -R mysql.mysql /usr/local/mysql

cd /usr/local/mysql
yum remove mariadb-libs -y

#mysql 用户的身份创建初始化数据库
scripts/mysql_install_db --user=mysql

#/etc/init.d/ 是 Linux 系统中存放服务启动脚本的目录
cp support-files/mysql.server /etc/init.d/mysql
service mysql start

#修改环境变量
echo 'export PATH=$PATH:/usr/local/mysql/bin' >> /etc/profile
source /etc/profile

mysql 初始化:mysql_secure_installation

2、把Web01中的数据库迁移MySQL01:

原先ds_shop的数据存在Web01中,现在需要将这些数据迁移到mysql01上,实现web服务器与mysql服务器的分离。

(1) 对Web01中的数据库的ds_shop商城系统进行备份:

mysqldump -uroot --databases ds_shop > ds_shop.sql -p

(2) 使用文件传输命令rsync把ds_shop.sql推送到MySQL01:

rsync -av ds_shop.sql root@10.1.1.12:/root/

mysql01上可以查看到已传输过来的数据:

(3) 在MySQL01数据库中创建一个ds_shop数据库,导入 ds_shop.sql:

(4) 停止web01中的数据库:

systemctl stop mysql

(5) 在MySQL01的MySQL数据中创建一个远程连接账号:

grant all privileges on ds_shop.* to 'dsshop'@'10.1.1.%' identified by '123';

flush privileges;

(6) 更改web01服务器中的数据库配置文件:

vim /home/www/application/database.php

刷新页面:

三、HA高可用服务搭建

1、HA Cluster高可用集群:

HA是High Available缩写。

HA Cluster是指高可用性集群,是保证业务连续性的有效解决方案,一般有两个或两个以上的节点,且分为活动节点及备用节点。

FailOver:故障自动切换,MASTER/BACKUP,MASTER宕机了,BACKUP 可以充当主机使用。

引入HA高可用主要是为了解决Web服务的单点故障。

2、keepalived 概述与原理:

(1) keepalived 软件概述:

Keepalived最初是专门为LVS(Linux Virtual Server)负载均衡软件设计的,它的主要作用是管理并监控LVS集群系统中各个服务节点的状态,并在节点出现故障时自动进行故障转移。

(2) keepalived 原理:

Keepalived软件主要是通过VRRP协议实现高可用功能的(故障切换方式)。

VRRP是Virtual Router RedundancyProtocol (虚拟路由器冗余协议) 的缩写,VRRP出现的目的就是为了解决静态路由单点故障问题,它能够保证当个别节点宕机时,整个网络可以不间断地运行。

master上面有一个对外提供服务的vip,该路由器所在局域网内其他机器的默认路由为该vip。master会发组播,当backup收不到vrrp包时就认为master宕掉了,这时就需要根据VRRP的优先级来选举一个backup作为master,保证路由器的高可用性。

(3) keepalived 组成:

Keepalived的功能体系结构大致分为两层:用户空间 (user space) 和内核空间 (kernel space)。

内核空间:

主要包括IPVS (IP虚拟服务器,用于实现网络服务的负载均衡) 和NETLINK (提供高级路由及其他相关的网络功能) 两个部分。

用户空间:

● WatchDog:负责监控checkers和VRRP进程的状况。

● VRRP Stack:负载均衡器之间的失败切换FailOver,如果只用一个负载均衡器,则VRRP不是必须的。

● Checkers:负责真实服务器的健康检查healthchecking,是 keepalived 最主要的功能。healthchecking是一定要有的。

● Netlink Reflector:用来设定vrrp的vip地址等。

● IPVS wrapper:用户发送设定的规则到内核ipvs代码。

3、安装 keepalived 软件:

(1) Web01关机,克隆生成Web02:
更改IP地址、UUID、主机名称、绑定IP地址与主机名称到/etc/hosts文件、关闭防火墙与SELinux、关闭NetworkManager。

(2) 在Web01与Web02安装Keepalived软件:

yum install keepalived -y

配置文件:/etc/keepalived/keepalived.conf

日志文件:/var/log/messages

4、设置Keepalived配置文件:

web01和web02同时操作:

vim /etc/keepalived/keepalived.conf

(1) 删除不必要的配置行:

切换光标到35行,在命令行模式下按dG,删除35行以后的所有内容。

35行后的内容是用于LVS配置负载均衡器,在此项目配置中暂时不需要。

(2) 了解并修改 vrrp_instace 配置命令:

#组建vrrp实例 实例组名 (web01与web02要保持一致)
vrrp instance VI_1 {
    state MASTER #角色 (Master/Backup)
    interface eth0 #网卡名
    virtual router id 51 #组编号 (web01与web02要保持一致)
    priority 100 #权重 权重越高的备用服务器在主服务器宕机后可先被选举成为新的Matser
    advert int 1 #VRRP节点每隔1秒就会发送一次通告消息,告知其他节点自己的状态

    authentication {
        auth type PASS #实例组中的节点加入组的授权类型 (密码)
        auth pass 1111 #组密码 (组集群节点中的密码要保持一致)
    }

#组集群提供服务的虚拟IP地址 (VIP),需要和集群节点的真实IP地址保持在同一网段

    virtual_ipaddress {
        192.168.200.16
        192.168.200.17
        192.168.200.18
    }
}

修改后的 vrrp_instace 配置,左为web01,右为web02。

(3) 启动 keepalived 软件:

systemctl start keepalived

systemctl status keepalived

使用 ip a 命令,查看网卡上是否挂载VIP地址:

(4) 解析www.shop.com到VIP虚拟IP地址:

在配置文件中注释掉 vrrp_strict,保存后重启keepalived软件:

5、模拟故障,VIP漂移:

master故障原因:网络无法连接 ;keepalived 软件关闭 ;主机宕机

6、Keepalived监测Nginx服务:

当MASTER服务器的Nginx服务停止时,VIP不会发生漂移。

因为keepalived软件主要检测keepalived服务状态以及网络情况,只要这两者正常,VIP就不会发生漂移。

无法访问商城:

解决方法:编写脚本让keepalived监控nginx状态。

(1) 在web01和web02编写脚本检测nginx运行状态:

mkdir /scripts

vim /scripts/nginx.sh

#!/bin/bash

nginx_status=`ps -C nginx --no-header | wc -l`
if [ $nginx_status -eq 0 ]; then
    systemctl stop keepalived
fi

ps -C nginx 可以返回 nginx 的进程 id;

--no-header | wc -l 意思是在统计 nginx 进程 id 数时不计入 header;

如果统计结果为0,说明当前不存在nginx进程,服务器会关闭keepalived软件,触发vip漂移。

(2) 给nginx.sh文件添加可执行权限:

chmod +x /scripts/nginx.sh

测试nginx.sh脚本是否可用:

先关闭nginx服务,再执行脚本,查看keepalived状态。执行脚本后keepalived关闭,说明脚本可用。

(3) 在Web01/Web02两台机器的keepalived.conf文件中定义nginx.sh脚本:

vim /etc/keepalived/keepalived.conf

#keepalived的健康检测脚本模块 模块名

vrrp_script check_nginx {
    script /scripts/nginx.sh  #脚本路径
    interval 3  #每隔3秒运行一次脚本
}

(4) 调用 check_nginx 模块:

#调用vrrp_script中定义的脚本

track_script {
    check_nginx
}

设置完成后,keepalived软件。

(5) 测试配置是否生效:

关闭web01的nginx服务:

商城能够正常访问:

7、抢占与非抢占模式:

(1) 抢占模式:

当MASTER发生故障时(宕机),VIP会自动从MASTER漂移到BACKUP服务器。但是当MASTER维修完毕后,启动keepalived的瞬间,其就会把VIP从BACKUP服务器中抢占过来,这种情况称之为“抢占模式”。

② keepalived中,如何决定谁是MASTER:

主要通过权重配置以及IP地址的大小来决定:

如果Web01与Web02其权重不同,当启动keepalived的时候, 默认会选择权重比较大的服务器充当MASTER。

如果Web01与Web02其权重相同,则IP地址大的优先成为MASTER:

Web02(10.1.1.13) > Web01(10.1.1.11)

③ 抢占模式的弊端:

抢占模式在VIP漂移时可能导致网络抖动,造成暂时的业务中断。

(2) 非抢占模式:

非抢占模式(Non-Preemption Mode)是keepalived配置中的一种模式。在非抢占模式下,当主节点故障后,备份节点接管服务,主节点恢复后,它不会再次抢占VIP,而是保持备份状态。

② 非抢占模式配置:

配置后重启keepalived。

vrrp_instance VI_1 {
    state BACKUP #所有服务器都设置为BACKUP,没有MASTER
    ……
    nopreempt #添加nopreempt(非抢占模式)
    priority 100 #web01与web02权重相同
    ……
}

③ 停止web01,重新启动后查看VIP所在位置:

VIP未漂移回web01。

8、VIP脑裂:

脑裂 (split-brain):指在一个高可用(HA)系统中,当联系着的两个节点断开联系时,本来为一个整体的系统,分裂为两个独立节点,这时两个节点开始争抢共享资源,结果会导致系统混乱,数据损坏。(简言之:MASTER-BACKUP,两台机器上同时拥有VIP)

(1) MASTERBACKUP之间如何通信:

MASTER服务器通过组播地址 224.0.0.18,发送数据包,BACKUP服务器接收MASTER服务器的数据包。

安装tcpdump抓包软件:yum install tcpdump -y

抓取组播数据包:tcpdump -i ens33 vrrp -n (指定网卡和协议,-n显示IP地址)

可以看到在两台服务器上都是由MASTER发送组播信息:

(2) 模拟脑裂:

当BACKUP接收不到组播地址传输过来的数据包,系统就会认为MASTER已经宕机,开始选举生成新的MASTER。

VIP脑裂最大的产生原因:防火墙未关闭或没有把vrrp协议添加到防火墙中。

① 开启web02的防火墙:

systemctl start firewalld

使用ip a与tcpdump,查看VIP与抓取vrrp协议的数据包:

MASTER和BACKUP中都有VIP:

主从服务器都在发送组播数据包,数据传输混乱。

③ 解决方案:

当出现脑裂现象时,先关闭所有的BACKUP中的keepalived,只保留MASTER的服务。

检查所有BACKUP机器防火墙是否未关闭或者没有把vrrp协议添加到防火墙规则中,再重新启动BACKUP机器上的keepalived:

测试环境:systemctl stop firewalld

生产环境

firewall-cmd --direct --permanent --add-rule ipv4 filter INPUT 0 --in-interface ens33 --destination 224.0.0.18 -- protocol vrrp -j ACCEPT

firewall-cmd --reload

9、单播模式:

(1) 为什么要从组播改成单播:

keepalived在组播模式下所有的信息都会向224.0.0.18的组播地址发送,可能会产生干扰和冲突 ;某些特定环境(云服务器)禁止了组播方式,BACKUP没办法获取到MASTER的数据包信息。

组播:MASTER => 224.0.0.18 <= BACKUP

单播:MASTER => BACKUP1,BACKUP2,BACKUP3

(2) 单播配置:

① 配置文件中注释掉 vrrp_strict;

② 修改配置文件并重启keepalived软件:

web01:

vrrp_instance VI_1 {
    ......
    unicast_src_ip 10.1.1.11 #本机IP地址

    unicast_peer {
    10.1.1.13 #对端IP地址,支持多台机器
    }
    ......
}

web02:

vrrp_instance VI_1 {

    ......
    unicast_src_ip 10.1.1.13 #本机IP地址

    unicast_peer {
        10.1.1.11 #对端IP地址,支持多台机器
    }
    ......
}

③ 抓包查看数据包传输情况:

相关推荐

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-04-05 11:28:05       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-04-05 11:28:05       100 阅读
  3. 在Django里面运行非项目文件

    2024-04-05 11:28:05       82 阅读
  4. Python语言-面向对象

    2024-04-05 11:28:05       91 阅读

热门阅读

  1. Apache Spark 的基本概念和在大数据分析中的应用

    2024-04-05 11:28:05       42 阅读
  2. WPF如何使用 System.Windows.Forms.FolderBrowserDialog

    2024-04-05 11:28:05       33 阅读
  3. 找出字符串中所有偶数的个数

    2024-04-05 11:28:05       36 阅读
  4. 单例模式的多种写法

    2024-04-05 11:28:05       39 阅读
  5. 设计模式:单例模式六种实现

    2024-04-05 11:28:05       36 阅读
  6. 单例模式详解

    2024-04-05 11:28:05       32 阅读
  7. Visual Studio Code(VS Code)安装教程

    2024-04-05 11:28:05       29 阅读
  8. Vue 组件的 mixin 函数,用于屏幕适配

    2024-04-05 11:28:05       38 阅读
  9. 0基础如何进入IT行业

    2024-04-05 11:28:05       33 阅读
  10. C/C++中的static关键字用法总结

    2024-04-05 11:28:05       39 阅读
  11. 梯度反向传播过程是如何处理repeat函数的

    2024-04-05 11:28:05       39 阅读
  12. linux小工具杂记

    2024-04-05 11:28:05       35 阅读
  13. 算法思想 - 贪心算法

    2024-04-05 11:28:05       38 阅读
  14. vue3从精通到入门12:vue3的生命周期和组件

    2024-04-05 11:28:05       40 阅读