三、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

bash 复制代码
#!/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 配置命令:

bash 复制代码
#组建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

bash 复制代码
#!/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

bash 复制代码
#keepalived的健康检测脚本模块 模块名

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

(4) 调用 check_nginx 模块:

bash 复制代码
#调用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。

bash 复制代码
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) MASTER 与BACKUP之间如何通信:

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

生产环境:

bash 复制代码
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:

bash 复制代码
vrrp_instance VI_1 {
    ......
    unicast_src_ip 10.1.1.11 #本机IP地址

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

web02:

bash 复制代码
vrrp_instance VI_1 {

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

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

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

相关推荐
子非衣11 分钟前
MySQL修改JSON格式数据示例
android·mysql·json
openinstall全渠道统计3 小时前
免填邀请码工具:赋能六大核心场景,重构App增长新模型
android·ios·harmonyos
双鱼大猫4 小时前
一句话说透Android里面的ServiceManager的注册服务
android
双鱼大猫4 小时前
一句话说透Android里面的查找服务
android
双鱼大猫4 小时前
一句话说透Android里面的SystemServer进程的作用
android
双鱼大猫4 小时前
一句话说透Android里面的View的绘制流程和实现原理
android
双鱼大猫5 小时前
一句话说透Android里面的Window的内部机制
android
双鱼大猫5 小时前
一句话说透Android里面的为什么要设计Window?
android
双鱼大猫5 小时前
一句话说透Android里面的主线程创建时机,frameworks层面分析
android
苏金标6 小时前
android 快速定位当前页面
android