文章目录
- 前言
- 一、nginx+keepalive搭建高可用服务方案?
- 二、方案解析
- 1.keepalive是什么
- 2.nginx是什么
- 三、keepalive与nginx环境安装
- 四、高可用配置实例
- 总结
前言
一、nginx+keepalive搭建高可用服务方案?
使用nginx-keepalived双机热备机制,vip主机可以进行漂移,这样当一台主机挂掉了,还有备用机可以使用,保证了服务的可靠性。
具体的vip漂移架构图,如下:
二、方案解析
1.keepalive是什么
Keepalived起初是为LVS设计的,专门用来监控集群系统中各个服务节点的状态,它根据TCP/IP参考模型的第三、第四层、第五层交换机制检测每个服务节点的状态,如果某个服务器节点出现异常,或者工作出现故障,Keepalived将检测到,并将出现的故障的服务器节点从集群系统中剔除,这些工作全部是自动完成的,不需要人工干涉,需要人工完成的只是修复出现故障的服务节点。
健康检查和失败切换是keepalived的两大核心功能。
所谓的健康检查,就是采用tcp三次握手,icmp请求,http请求,udp echo请求等方式对负载均衡器后面的实际的服务器(通常是承载真实业务的服务器)进行保活;而失败切换主要是应用于配置了主备模式的负载均衡器,利用VRRP维持主备负载均衡器的心跳,当主负载均衡器出现问题时,由备负载均衡器承载对应的业务,从而在最大限度上减少流量损失,并提供服务的稳定性。
VRRP的功能,VRRP(VritrualRouterRedundancyProtocol,虚拟路由冗余协议)出现的目的是解决静态路由出现的单点故障问题,通过VRRP可以实现网络不间断稳定运行,因此Keepalvied一方面具有服务器状态检测和故障隔离功能,另外一方面也有HAcluster功能。
keepalived运行时,会启动3个进程,分别为:core(核心进程),check和vrrp
- core:负责主进程的启动,维护和全局配置文件的加载;
- check:负责健康检查
- vrrp:用来实现vrrp协议
2.nginx是什么
Nginx是十分轻量级的HTTP服务器。Nginx,它的发音为“engine X”,是一个高性能的HTTP和反向代理服务器,同时也是一个IMAP/POP3/SMTP 代理服务器。Nginx是由俄罗斯人 Igor Sysoev为俄罗斯访问量第二的 Rambler.ru站点开发的,它已经在该站点运行超过两年半了。Igor Sysoev在建立的项目时,使用基于BSD许可。
Nginx凭借其稳定性、低资源消耗、简单配置和丰富的功能,从十多年前名不见经传的Web服务器软件,发展到如今能够跟Apache匹敌的地位。
1、作为Web服务器,Nginx处理静态文件、索引文件,自动索引的效率非常高
2、作为代理服务器,Nginx可以实现无缓存的反向代理加速,提高网站运行速度
3、作为负载均衡服务器,Nginx既可以在内部直接支持Rails和PHP,也可以支持HTTP代理服务器对外进行服务,同时还支持简单的容错和利用算法进行负载均衡
4、在性能方面,Nginx是专门为性能优化而开发的,实现上非常注重效率。它采用内核Poll模型,可以支持更多的并发连接,最大可以支持对5万个并发连接数的响应,而且只占用很低的内存资源
5、在稳定性方面,Nginx采取了分阶段资源分配技术,使得CPU与内存的占用率非常低。Nginx官方表示,Nginx保持1万个没有活动的连接,而这些连接只占用2.5MB内存,因此,类似DOS这样的攻击对Nginx来说基本上是没有任何作用的
6、在高可用性方面,Nginx支持热部署,启动速度特别迅速,因此可以在不间断服务的情况下,对软件版本或者配置进行升级,即使运行数月也无需重新启动,几乎可以做到7x24小时不间断地运行
nginx采用多进程的模式,nginx在启动后,会有一个master进程和多个worker进程。master进程主要用来管理worker进程,包含:接收来自外界的信号,向各worker进程发送信号,监控worker进程的运行状态,当worker进程退出后(异常情况下),会自动重新启动新的worker进程。而基本的网络事件,则是放在worker进程中来处理了。多个worker进程之间是对等的,他们同等竞争来自客户端的请求,各进程互相之间是独立的。一个请求,只可能在一个worker进程中处理,一个worker进程,不可能处理其它进程的请求。
三、keepalive与nginx环境安装
安装keepalived
在线安装
yum install keepalived
修改/etc/keepalived/keepalived.conf配置
systemctl enable keepalived;
systemctl start keepalived;
准备安rpm装包:
mkdir workspace & cd workspace
sudo yum install --downloadonly keepalived --downloaddir=.
rpm -ivh net-snmp-libs-5.7.2-49.el7_9.2.x86_64.rpm
rpm -ivh net-snmp-agent-libs-5.7.2-49.el7_9.2.x86_64.rpm
rpm -ivh keepalived-1.3.5-19.el7.x86_64.rpm
修改/etc/keepalived/keepalived.conf配置
systemctl enable keepalived;
systemctl start keepalived;
下载keepalive(下载官网:https://www.keepalived.org/download.html)
cd /home/*****/workspace/
wget --no-check-certificate https://www.keepalived.org/software/keepalived-2.2.7.tar.gz
tar xf keepalived-2.2.7.tar.gz
cd keepalived-2.2.7
./configure
make -j3&& make install
sudo cp -rf keepalived/etc/keepalived/keepalived.conf.sample /usr/local/sbin/keepalived.conf
/usr/local/sbin/keepalived keepalived.conf
卸载keepalived
yum卸载
yum remove keepalived
或者rpm卸载
rpm -e net-snmp-libs-5.7.2-49.el7_9.2.x86_64
rpm -e net-snmp-agent-libs-5.7.2-49.el7_9.2.x86_64
rpm -e keepalived-1.3.5-19.el7.x86_64
rm -rf /etc/keepalived/*
安装nginx
1.安装nginx:
sudo rpm -Uvh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm
sudo yum -y install nginx
sudo nginx -v
sudo journalctl -u nginx -f
2.查看安装nginx结果:
rpm -qa | grep nginx
3.升级
rpm -Uvh 新版本软件nginx包
4.卸载
命令:rpm -e nginx
安装报错解决:
解决:
原因是Nginx 启动时 PID 文件并未生成,导致文件无法读取
/usr/lib/systemd/system/nginx.service新增 ExecStartPost=/bin/sleep 0.1
systemctl daemon-reload
systemctl restart nginx
四、高可用配置实例
/etc/keepalived/keepalived.conf如下
Keepalived的配置文件可以分为三块:
全局定义块:对整个 Keepalive 配置生效的,不管是否使用 LVS;
VRRP 实例定义块:是 Keepalived 的核心;
虚拟服务器(LVS)定义块:LVS 配置只在使用 Keepalived 来配置和管理 LVS 时才需要使用,如果仅仅使用 Keepalived做 HA,LVS 的配置完全是不需要的。
配置文件都是以块(block)形式组织的,每个块都在{和}包围的范围内。#和!开头的行都是注释。
简单实例:
主节点
! Configuration File for keepalived
global_defs { #全局配置
router_id vplatform1 #此处注意router_id为负载均衡标识,在局域网内应该是唯一的。
script_user root
enable_script_security
}
vrrp_script chk_service_state {
script "/etc/keepalived/check_port.sh"
#script "killall -0 nginx"
interval 2 #脚本检测的时间间隔,表示每n秒就检查一次,默认1秒就检测一次
weight -20
# rise 2 #表示需要连续成功2次才能认为是成功的
# fall 2 #表示需要连续失败2次才能认为是失败的
# timeout 2 #脚本检测超时时间,超过这个时间则认为检测失败
}
vrrp_script avoid_brain_split {
script "/usr/bin/ping -c 1 -w 1 10.20.50.254"
interval 2 #脚本检测的时间间隔,表示每n秒就检查一次,默认1秒就检测一次
weight -20
rise 2 #表示需要连续成功2次才能认为是成功的
fall 2 #表示需要连续失败2次才能认为是失败的
timeout 2 #脚本检测超时时间,超过这个时间则认为检测失败
}
vrrp_instance VI_1 { #vrrp 实例部分定义,VI_1自定义名称
state MASTER #指定 keepalived 的角色,必须大写 可选值:MASTER|BACKUP
interface eth0 #网卡设置,lvs需要绑定在网卡上,realserver绑定在回环口。区别:lvs对访问为外,realserver为内不易暴露本机信息
virtual_router_id 51 #虚拟路由标识,是一个数字,同一个vrrp 实例使用唯一的标识,MASTER和BACKUP 的 同一个 vrrp_instance 下 这个标识必须保持一致
priority 100 #定义优先级,数字越大,优先级越高。
advert_int 1 #设定 MASTER 与 BACKUP 负载均衡之间同步检查的时间间隔,单位为秒,两个节点设置必须一样
authentication { #设置验证类型和密码,两个节点必须一致
auth_type PASS
auth_pass 1111
}
virtual_ipaddress { #设置虚拟IP地址,可以设置多个虚拟IP地址,每行一个
10.20.40.100/24
}
track_script { #脚本监控状态
chk_service_state #可加权重,但会覆盖声明的脚本权重值。chk_nginx_service weight -20
}
notify_master /etc/keepalived/slave2master.sh
notify_backup /etc/keepalived/master2slave.sh
}
从节点
! Configuration File for keepalived
global_defs { #全局配置
router_id vplatform2 #此处注意router_id为负载均衡标识,在局域网内应该是唯一的。
script_user root
enable_script_security
}
vrrp_script chk_service_state {
script "/etc/keepalived/check_port.sh"
#script "killall -0 nginx"
interval 2 #脚本检测的时间间隔,表示每n秒就检查一次,默认1秒就检测一次
weight -20
# rise 2 #表示需要连续成功2次才能认为是成功的
# fall 2 #表示需要连续失败2次才能认为是失败的
# timeout 2 #脚本检测超时时间,超过这个时间则认为检测失败
}
vrrp_script avoid_brain_split {
script "/usr/bin/ping -c 1 -w 1 10.20.50.254"
interval 2 #脚本检测的时间间隔,表示每n秒就检查一次,默认1秒就检测一次
weight -20
rise 2 #表示需要连续成功2次才能认为是成功的
fall 2 #表示需要连续失败2次才能认为是失败的
timeout 2 #脚本检测超时时间,超过这个时间则认为检测失败
}
vrrp_instance VI_1 { #vrrp 实例部分定义,VI_1自定义名称
state BACKUP #指定 keepalived 的角色,必须大写 可选值:MASTER|BACKUP
interface eth0 #网卡设置,lvs需要绑定在网卡上,realserver绑定在回环口。区别:lvs对访问为外,realserver为内不易暴露本机信息
virtual_router_id 51 #虚拟路由标识,是一个数字,同一个vrrp 实例使用唯一的标识,MASTER和BACKUP 的 同一个 vrrp_instance 下 这个标识必须保持一致
priority 90 #定义优先级,数字越大,优先级越高。
advert_int 1 #设定 MASTER 与 BACKUP 负载均衡之间同步检查的时间间隔,单位为秒,两个节点设置必须一样
authentication { #设置验证类型和密码,两个节点必须一致
auth_type PASS
auth_pass 1111
}
virtual_ipaddress { #设置虚拟IP地址,可以设置多个虚拟IP地址,每行一个
10.20.40.100/24
}
track_script { #脚本监控状态
chk_service_state #可加权重,但会覆盖声明的脚本权重值。chk_nginx_service weight -20
}
notify_master /etc/keepalived/slave2master.sh
notify_backup /etc/keepalived/master2slave.sh
}
checkport实例
#!/bin/bash
#检测nginx是否启动了
A=`ps -C nginx --no-header |wc -l`
if [ $A -eq 0 ];then
systemctl start nginx
sleep 1
if [ `ps -C nginx --no-header |wc -l` -eq 0 ];then
systemctl stop keepalived
elif [ `ps -C keepalived --no-header |wc -l` -eq 0 ];then
systemctl restart keepalived
fi
fi
其中slave2master.sh、master2slave.sh以及checkport.sh一定要存在/etc/keepalived/下且权限要正确如下:
chmod 0744 /etc/keepalived/master2slave.sh
chmod 0744 /etc/keepalived/slave2master.sh
chmod 0644 /etc/keepalived/keepalived.conf
chmod 0644 /etc/keepalived/check_port.sh
在主机A上执行ip addr
发现虚拟IP在主机A网卡eth0上,重启主机A,发现虚拟IP消失,在主机B上出现虚拟IP
如果主机A/B都配置了nginx,可以通过VIP:80访问nginx主页,即便关闭主机A,VIP会切换到主机B上,此时仍然可以访问nginx主页。从而实现了高可用方案。
总结
通过本文的讲解应该对高可用方案有了较深刻的理解,希望能够对你有所帮助。