目录
1.2 双机热备方案-keepalived的含义以及工作原理
2.3 修改主机(192.168.81.130)keepalived配置文件
2.4 修改备机(192.168.81.131)keepalived.conf配置文件
2.7 在主节点和从节点上查看虚拟IP是否绑定到ens33网卡上
3.1 修改两个服务器默认访问的nginx的html页面作为区别
3.3.1杀死主节点的keepalived的三个进程、停止nginx服务
1、基本原理介绍
1.1 高可用概念以及它能解决的问题
高可用HA(High Availability)是分布式系统架构设计中必须考虑的因素之一,它通常是指通过设计减少系统不能提供服务的时间。如果一个系统能够一直提供服务,那么这个可用性则是百分之百,但是天有不测风云。所以我们只能尽可能的去减少服务的故障。
在生产环境上很多时候是以Nginx
做反向代理对外提供服务,但是一天Nginx难免遇见故障,如:服务器宕机。当Nginx
宕机那么所有对外提供的接口都将导致无法访问。
虽然我们无法保证服务器百分之百可用,但是也得想办法避免这种悲剧,今天我们使用keepalived
来实现Nginx
的高可用。
1.2 双机热备方案-keepalived的含义以及工作原理
这种方案是国内企业中最为普遍的一种高可用方案,双机热备其实就是指一台服务器在提供服务,另一台为某服务的备用状态,当一台服务器不可用另外一台就会顶替上去。
keepalived的含义
Keepalived
软件起初是专为LVS
负载均衡软件设计的,用来管理并监控LVS集群系统中各个服务节点的状态,后来又加入了可以实现高可用的VRRP (Virtual Router Redundancy Protocol ,虚拟路由器冗余协议)
功能。因此,Keepalived
除了能够管理LVS软件外,还可以作为其他服务(例如:Nginx、Haproxy、MySQL等)
的高可用解决方案软件。
keepalived的工作原理
Keepalived
高可用服务之间的故障切换转移,是通过VRRP
来实现的。
在 Keepalived
服务正常工作时,主 Master
节点会不断地向备节点发送(多播的方式)心跳消息,用以告诉备Backup
节点自己还活着,当主 Master
节点发生故障时,就无法发送心跳消息,备节点也就因此无法继续检测到来自主 Master
节点的心跳了,于是调用自身的接管程序,接管主Master节点的 IP资源及服务。而当主 Master节点恢复时,备Backup节点又会释放主节点故障时自身接管的IP资源及服务,恢复到原来的备用角色。
2、部署nginx-高可用主备模式
2.1 环境准备
主机名 | IP地址 |
centos01(已安装好nginx) | 192.168.81.130/24 |
centos02(已安装好nginx) | 192.168.81.131/24 |
2.2 安装keepalived
yum 方式直接安装,该方式会直接安装依赖
yum install -y keepalived
安装好后,将keepalived程序开启,并且加入到开机启动项中。
systemctl start keepalived
systemctl enable keepalived
2.3 修改主机(192.168.81.130)keepalived配置文件
yum 方式安装的会在配置文件在/etc/keepalived下
vi /etc/keepalived/keepalived.conf
keepalived.conf
! Configuration File for keepalived
global_defs {
notification_email { #设置报警邮件地址,需要开启本机postfix或者sendmail服务;
xxx@alibaba-inc@qq.com
}
notification_email_from root@localhost.com #用于设置邮件的发送地址,即报警邮件发送者;
smtp_server 127.0.0.1 #用于设置邮件的SMTP Server地址;
smtp_connect_timeout 30 #设置连接SMTP Server的超时时间;
router_id LVS_DEVEL #LVS_DEVEL这字段在/etc/hosts文件中看;通过它访问到主机
}
vrrp_script chk_ngnix {
script /etc/keepalived/scripts/chk_nginx.sh #监控nginx脚本路径
interval 2 #检测时间间隔
weight -10 #如果条件成立的话,则权重 -10
}
vrrp_instance VI_1 {
state MASTER #主从状态(MASTER/BACKUP)
interface ens33 #绑定虚拟 IP 的网络接口,注:ip addr查询
virtual_router_id 52 #虚拟路由的 ID 号, 两个节点设置必须一样
mcast_src_ip 192.168.81.130 #填写本机ip
priority 100 #主节点优先级,主要比从节点优先级高
#garp_master_delay 30
advert_int 1 #每隔1s发送一次心跳
authentication {
auth_type PASS
auth_pass 1111 #校验类型:密码=1111
}
# 将track_script块加入 instance 配置块
track_script {
chk_ngnix #执行Nginx监控服务
}
virtual_ipaddress {
192.168.81.136 #虚拟ip(设置虚拟ip网段需要同一个,需要根据项目去调整 )
}
}
virtual_ipaddress
里面可以配置vip,在线上通过vip来访问服务。
interface
需要根据服务器网卡进行设置通常查看方式ip addr
authentication
配置授权访问后备机也需要相同配置1.3
2.4 修改备机(192.168.81.131)keepalived.conf配置文件
! Configuration File for keepalived
global_defs {
notification_email { #设置报警邮件地址,需要开启本机postfix或者sendmail服务;
xxx@alibaba-inc@qq.com
}
notification_email_from root@localhost.com #用于设置邮件的发送地址,即报警邮件发送者;
smtp_server 127.0.0.1 #用于设置邮件的SMTP Server地址;
smtp_connect_timeout 30 #设置连接SMTP Server的超时时间;
router_id LVS_DEVEL #LVS_DEVEL这字段在/etc/hosts文件中看;通过它访问到主机
}
vrrp_script chk_ngnix {
script /etc/keepalived/scripts/chk_nginx.sh #监控nginx脚本路径
interval 2 #检测时间间隔
weight -10 #如果条件成立的话,则权重 -10
}
vrrp_instance VI_1 {
state BACKUP #主从状态(MASTER/BACKUP)
interface ens33 #绑定虚拟 IP 的网络接口,注:ip addr查询
virtual_router_id 52 #虚拟路由的 ID 号, 两个节点设置必须一样
mcast_src_ip 192.168.81.131 #填写本机ip
priority 90 #主节点优先级,主要比从节点优先级高
#garp_master_delay 30
advert_int 1 #每隔1s发送一次心跳
authentication {
auth_type PASS
auth_pass 1111 #校验类型:密码=1111
}
# 将track_script块加入 instance 配置块
track_script {
chk_ngnix #执行Nginx监控服务
}
virtual_ipaddress {
192.168.81.136 #虚拟ip(设置虚拟ip网段需要同一个,需要根据项目去调整 )
}
}
2.5 编写nginx监控脚本
#创建
mkdir -p /etc/keepalived/scripts/
#编辑
vim /etc/keepalived/scripts/chk_nginx.sh
#添加可执行权限
chmod 755 /etc/keepalived/scripts/chk_nginx.sh
#!/bin/bash
# ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
# + 1、此脚本为nginx监控脚本,与keepalived组件配合使用
# + 2、keepalived配置文件:/etc/keepalived/keepalived.conf
# + 3、脚本输出日志/etc/keepalived/check_service.log
# + 4、默认脚本路径在/etc/keepalived/scripts下,需要改变路径,请修改keepalived配置
# + 5、创建此脚本后请赋予可执行权限chmod +x /etc/keepalived/scripts/chk_nginx.sh
# ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
####################基础参数####################
#获取当前时间
DATE=`date +%Y%m%d`
#日志输出路径
logPath=/etc/keepalived
A=`ps -C nginx --no-header |wc -l`
# 判断nginx是否宕机,如果宕机了,尝试重启
echo "$(date +%Y'-'%m'-'%d' '%H':'%M':'%S) 进程数:$A" | tee -a ${logPath}/check_service.log
if [ $A -eq 0 ];then
/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
# 等待一小会再次检查nginx,如果没有启动成功,则停止keepalived,使其启动备用机
sleep 3
if [ `ps -C nginx --no-header |wc -l` -eq 0 ];then
echo "$(date +%Y'-'%m'-'%d' '%H':'%M':'%S)nginx is over! stop keepalived!" | tee -a ${logPath}/check_service.log
systemctl stop keepalived
exit 1
fi
else
echo "$(date +%Y'-'%m'-'%d' '%H':'%M':'%S) nginx is run!" | tee -a ${logPath}/check_service.log
exit 0
fi
2.6 重启keepalived,使得修改的配置文件生效
systemctl restart keepalived
2.7 在主节点和从节点上查看虚拟IP是否绑定到ens33网卡上
主节点
从节点
3、高可用验证
3.1 修改两个服务器默认访问的nginx的html页面作为区别
3.2 在浏览器使用虚拟IP地址来访问服务
3.3 接下来模拟宕机
3.3.1杀死主节点的keepalived的三个进程、停止nginx服务
将服务和keepaived部署在同一个节点上可能会遇到的问题:
当主节点的 Nginx 停止工作时,keepalived 会检测到主服务器的状态发生了变化,并尝试将虚拟 IP 转移到备用服务器上。但是,如果主节点的 keepalived 还在运行,它可能会认为主节点仍然可用,并尝试保持虚拟 IP 在主服务器上,这将导致无法通过虚拟 IP 访问服务。所以通常是将nginx和keepalived部署在不同的节点上。但是这次实验,是部署在同一个节点上,所以就要按照下面操作来模拟宕机。
因此,在停止主节点的 nginx 时,应该同时停止主节点的 keepalived,以便从节点可以接管虚拟 IP,并成为新的主节点。这样,即使主节点的 nginx 停止工作,从节点也可以接管服务并继续提供服务。
3.3.2观察虚拟IP,此时绑定到从节点的网卡上
3.3.3 在浏览器在此使用虚拟IP访问服务
至此,keepalived对nginx高可用已经实现!!!
#为美好的开源世界贡献一份力量