一、双机热备概述
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地址,支持多台机器
}
......
}
③ 抓包查看数据包传输情况: