文章目录
NGINX+KEEPALIVED 负载均衡高可用架构为什么需要多节点应用为什么需要Nginx 服务为什么需要Keepalived NG+KL 简介准备工作配置Linux 服务器公共环境Server1 配置NG+KL 服务器Server2 NG+KL 服务器配置Server3 HTTP 服务器配置Server4 用于运行测试用例的HTTP 服务器配置
NGINX+KEEPALIVED负载均衡高可用架构
为什么需要多节点应用
如果您仅在一台服务器上部署应用程序服务,那么随着您的使用量随着时间的推移而增长,您肯定会达到单个服务器的复杂性极限。如果将同一个服务部署到多台服务器上,用户可以通过以下方式访问:各服务器的分配更加合理,提高了系统的负载能力和稳定性。
为什么需要Nginx服务
前面提到,当使用多个节点时,如何合理、均匀地将N个用户的访问请求分配到不同的应用服务器上?此时Nginx是一个中间协调器,负责整合入口和转发服务。
为什么需要Keepalived服务
最初,我们使用多个应用程序和多个节点,因为我们担心单个应用程序崩溃,但此时Nginx 能够充当负载均衡器。
Nginx 是一个负载均衡的服务器服务,所以我们不知道这个服务器是否稳定或者服务是否会崩溃。例如,流量过多可能会导致主机宕机,或者蓝翔挖掘机可能会切断电缆。哈哈)。
由于单个Nginx 节点可能会导致意外问题,因此我们模拟多节点应用服务器并展示多个Nginx 服务器的行为。
但不可能给用户大量的域名和端口,说不能访问第一个域名和端口就可以访问第二个域名,所以可以使用虚拟IP技术VIP需求。去做吧。
VIP允许用户统一访问虚拟IP地址,Keepalived发现Nginx主次服务,确保请求流量可靠地分发到对应的Nginx服务器。
当Keepalived检测到某个Nginx主服务宕机时,它会通过多种机制尝试检测并恢复,如果确定无法恢复,则立即将请求的服务转移到Nginx备份机上,实现高可用和可用。持续离线。
当然,两台Nginx服务器最好采用两点中心策略。否则,挖掘机可能会挖掉两台Nginx 服务器的电缆。 (哈哈)
废话不多说,我们来看看实用方法
NG+KL简述
Nginx + Keepalived 是一种流行的服务器高可用和负载均衡解决方案。
Nginx 是一个轻量级、高性能的Web 服务器、反向代理服务器和电子邮件(IMAP/POP3) 代理服务器。它具有高性能、高并发、低资源消耗等优点,常用于实现网站的负载均衡、动静分离等功能。
Keepalived 是用于为服务器提供高可用性的软件。通过虚拟IP地址(VIP)监控服务器状态,当主服务器无法保证服务连续性和稳定性时,自动将服务切换到备份服务器。
例如,网站架构有多个运行Nginx 的服务器来处理用户请求。当你通过Keepalived配置一个虚拟IP地址时,当用户访问这个虚拟IP时,它实际上是动态分配给一个正在工作的Nginx服务器的。如果Nginx 服务器发生故障,Keepalived 会立即将虚拟IP 切换到另一台常规服务器,因此您的用户访问不受影响。
也就是说,Nginx + Keepalived 的结合可以有效提高服务器可靠性和服务可用性,保证业务稳定运行。
(附:这个NG+KL架构可以替换为任意X+KL架构实现高可用。X可以是Mysql、Redis、Web Services等)
前期准备
[4]Linux服务器,[2]部署Nginx+Keepalived服务器,[2]部署http服务。
Server1: Nginx+Keepalived主服务IP:172.16.249.101
Server2: Nginx+Keepalived从服务IP:172.16.249.102
Server3: HTTP 主动/主动A 服务IP:172.16.249.201
Server4: HTTP Active/Active B 服务IP:172.16.249.202
Linux服务器公共环境配置
我们建议使用VMware Fusion虚拟机并使用CentOS7 Mini映像构建它们(服务器1、2、3和4都应该相应预设)只需配置完整的副本)。
安装CentOS7操作系统
CentOS-7-x86_64-Minimal-2009.iso
安装所需的软件包
yum install -y psmisc 网络工具vim wget 跟踪路由
cd /etc/yum.repos.d/mv CentOS-Base.repo CentOS-Base.repo.bak
wget http://mirrors.aliyun.com/repo/Centos-7.repo
mv Centos-7.repo CentOS-Base.repo
嗯,把所有东西都清理干净。
百胜赚钱
百胜更新-y
嗯,请升级
请注意,您可能会在这里遇到403 网络问题。对于这种情况,一个简单的解决方案是主机直接下载http://mirrors.aliyun.com/repo/Centos-7.repo文件,通过sftp上传到服务器进行操作。
同步时间服务器
# 安装NTP
百胜安装ntp -y
# 同步时间。这里我们以阿里云服务器3为例。如果需要,您可以选择其他服务器
ntpdate ntp3.aliyun.com
#需要切换默认EDT时间
mv /etc/localtime /etc/localtime.bak
# CST 切换至中国上海时间
ln -s /usr/share/zoneinfo/Asia/上海/etc/localtime
# 测试时间是否同步
日期
关闭防火墙
设置力0
sed -i \’s/SELINUX=enforcing/SELINUX=disabled/g\’ /etc/selinux/config
猫/etc/selinux/config
systemctl状态firewalld.service
systemctl 停止firewalld.service
使用systemctl 禁用firewalld.service
systemctl 停止网络管理器
systemctl 禁用网络管理器
Server1 NG+KL服务器配置
检查DNS 和网关(参考)
1. cat /etc/resolv.conf # DNS查看
2.traceroute www.baidu.com # 第一行是你自己的网关
3. 根-n
4.ip路由显示
5.cat /etc/sysconfig/network-scripts/ifcfg-ens33
6.cat /etc/sysconfig/网络
7、netstat -r
设置固定IP
vim /etc/sysconfig/network-scripts/ifcfg-ens33
#将BOOTPROTO从dhcp调整为静态
DHCP=静态
#在文件末尾添加以下内容
IPADDR=172.16.249.101 #固定IP
网关=172.16.249.2 # 网关
NETMASK=255.255.255.0 # 子网掩码
DNS1=172.16.249.2 #默认DNS
DNS2=223.5.5.5 # 公共DNS
# 更新网络服务
服务网络重启
安装nginx
# 将Nginx 添加到Yum 源
rpm -Uvh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm
# 安装Nginx
yum安装-y nginx
# 启动Nginx服务
启动systemctl nginx.service
Nginx配置
vim /etc/nginx/nginx.conf
用户nginx。
工人流程自动化;
错误日志/var/log/nginx/error.log;
pid /run/nginx.pid;
包含/usr/share/nginx/modules/*.conf。
事件{
工人连接1024;
}
http{
log_format main \’$remote_addr – $remote_user [$time_local] \’$request\’ \’
\’$status $body_bytes_sent \’$http_referer\’ \’
\’\’$http_user_agent\’ \’$http_x_forwarded_for\’;
access_log /var/log/nginx/access.log main;
发送文件。
tcp_no 继续推送;
tcp_nolay 已打开。
保活超时65;
type_hash_max_size 2048;
包括/etc/nginx/mime.types。
默认类型应用程序/八位字节流;
#include /etc/nginx/conf.d/*.conf;
上游代理服务器{
服务器172.16.249.201:80权重=1;
服务器172.16.249.202:80权重=1;
}
服务器{
80 监听默认服务器。
监听[:]:80默认服务器;
服务器名称_;
#根/usr/share/nginx/html;
# 包含/etc/nginx/default.d/*.conf。
位置/{
proxy_pass http://代理服务器;
索引index.htmlindex.htm;
}
错误页面404/404.html;
位置=/40x.html {
}
错误页面500 502 503 504 /50x.html;
位置=/50x.html {
}
}
}
# 重启Nginx服务
启动systemctl nginx.service
安装保活
yum 安装-y keepalived
配置保活
vim /etc/keepalived/keepalived.conf
保活配置文件
全局定义{
通知电子邮件{
acassen@firewall.loc
故障转移@firewall.loc
sysadmin@firewall.loc
}
notification_email_from Alexandre.Cassen@firewall.loc
smtp_服务器192.168.200.1
smtp_connect_timeout 30
router_id NginxNode001 # 唯一标识不能重复
vrrp_skip_check_adv_addr
#vrrp_strict # 没有注释无法访问VIP
vrrp_garp_interval 0
vrrp_gna_间隔0
}
# 检测设置
vrrp_script check_nginx {
script \’/etc/keepalived/check_nginx.sh\’ # 用于发现Nginx 服务的心跳检测脚本。如果多次重启后发现Nginx服务停止且无法启动,请立即重启。直接keepalive并关闭当前服务器。
Interval 5 #心跳检测周期(秒)
Weight -20 # 如果脚本检测失败,则每次脚本检测失败时改变权重的单元的优先级会降低。
Fall 2 # 如果发现脚本两次失败,则认为脚本发现失败,并更改服务优先级权重值。
raise 1 # 一次脚本检测成功后,认为脚本检测成功,优先级权重值保持不变。
}
vrrp_实例VI_1 {
state MASTER # 节点名称MASTER/BACKUP主要用于标识,但受优先级控制。
Interface ens33 #网卡名称
virtual_router_id 51 # Keepalived服务集群号,相同数量,同一个集群
priority 150 # 主要和次要权重优先级。优先级越高,优先级越高。最高优先级是主要的。
advert_int 1 # 主从通信间隔(秒)
# 身份验证类型和密码。 主备服务必须使用相同的认证方式和密码才能成功通信。
认证{
auth_type PASS
认证通过1111
}
#添加检测脚本
轨道脚本{
检查_nginx
}
# 可以配置一个或多个虚拟IP地址,只要不使用同一个域IP
虚拟IP地址{
172.16.249.80
172.16.249.90
172.16.249.100
}
}
配置心跳检测脚本
触摸/etc/keepalived/check_nginx.sh
触摸/etc/keepalived/check_nginx.log
chmod 777 /etc/keepalived/check_nginx.sh
vim /etc/keepalived/check_nginx.sh
#!/bin/bash
nginxpid=`ps -C nginx –no-header | nginxpid=`ps -C nginx –no-header |
如果[ $nginxpid -eq 0 ];那么
systemctl 重新启动nginx
睡觉2
echo \’$(date): systemctl restart nginx\’ /etc/keepalived/check_nginx.log
nginxpid=`ps -C nginx –no-header | nginxpid=`ps -C nginx –no-header |
如果[ $nginxpid -eq 0 ];那么
杀死所有保持活着
echo \’$(date): Killall keepalived\’ /etc/keepalived/check_nginx.log
菲
菲
解释一下,这个脚本的目的是检测是否有nginx相关的进程。如果没有,启动nginx服务后等待2秒,如果还没有启动则说明有问题。这时必须杀掉keepalived服务进程,并将服务转移到另一个Keepalived服务节点上。
# 重启keepalive服务
systemctl 重新启动keepalived.service
Server2 NG+KL服务器配置
Server1 NG+KL服务器的配置基本相同,只有第2和第6部分标记为需要调整。
检查DNS 和网关(参考)
1. cat /etc/resolv.conf # DNS查看
2.traceroute www.baidu.com # 第一行是你自己的网关
3. 根-n
4.ip路由显示
5.cat /etc/sysconfig/network-scripts/ifcfg-ens33
6.cat /etc/sysconfig/网络
7、netstat -r
设置固定IP
vim /etc/sysconfig/network-scripts/ifcfg-ens33
#将BOOTPROTO从dhcp调整为静态
DHCP=静态
#在文件末尾添加以下内容
IPADDR=172.16.249.102 # 固定IP(与此处的Server1不同)
网关=172.16.249.2 # 网关
NETMASK=255.255.255.0 # 子网掩码
DNS1=172.16.249.2 #默认DNS
DNS2=223.5.5.5 # 公共DNS
# 更新网络服务
服务网络重启
安装nginx
# 将Nginx 添加到Yum 源
转速-Uvh
http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm
# 安装Nginx
yum安装-y nginx
# 启动Nginx服务
启动systemctl nginx.service
Nginx配置
vim /etc/nginx/nginx.conf
用户nginx。
工人流程自动化;
错误日志/var/log/nginx/error.log;
pid /run/nginx.pid;
包含/usr/share/nginx/modules/*.conf。
事件{
工人连接1024;
}
http{
log_format main \’$remote_addr – $remote_user [$time_local] \’$request\’ \’
\’$status $body_bytes_sent \’$http_referer\’ \’
\’\’$http_user_agent\’ \’$http_x_forwarded_for\’;
access_log /var/log/nginx/access.log main;
发送文件。
tcp_no 继续推送;
tcp_nolay 已打开。
保活超时65;
type_hash_max_size 2048;
包括/etc/nginx/mime.types。
默认类型应用程序/八位字节流;
#include /etc/nginx/conf.d/*.conf;
上游代理服务器{
服务器172.16.249.201:80权重=1;
服务器172.16.249.202:80权重=1;
}
服务器{
80 监听默认服务器。
监听[:]:80默认服务器;
服务器名称_;
#根/usr/share/nginx/html;
# 包含/etc/nginx/default.d/*.conf。
位置/{
proxy_pass http://代理服务器;
索引index.htmlindex.htm;
}
错误页面404/404.html;
位置=/40x.html {
}
错误页面500 502 503 504 /50x.html;
位置=/50x.html {
}
}
}
# 重启Nginx服务
重启systemctl nginx.service
安装保活
yum 安装-y keepalived
配置保活
保活配置文件
全局定义{
通知电子邮件{
acassen@firewall.loc
故障转移@firewall.loc
sysadmin@firewall.loc
}
notification_email_from Alexandre.Cassen@firewall.loc
smtp_服务器192.168.200.1
smtp_connect_timeout 30
router_id NginxNode002 # 唯一标识符不能重复(与Server1不同)
vrrp_skip_check_adv_addr
#vrrp_strict # 没有注释无法访问VIP
vrrp_garp_interval 0
vrrp_gna_间隔0
}
# 检测设置
vrrp_脚本check_ngi
nx {
script \”/etc/keepalived/check_nginx.sh\” # 心跳检测脚本,用于检测Nginx服务,如果发现Nginx服务挂了,就立刻重启,如果重启多次后依旧发现起不来,则直接将当期服务器Keepalived节点服务关闭;
interval 5 # 心跳检测周期(秒)
weight -20 # 脚本检测失败的话 将减少priority优先级 每脚本检测失败后进行权重变更的单位
fall 2 # 检测脚本2次均失败的话,则认为脚本检测失败,进行服务优先级权重值变更
rise 1 # 检测脚本1次成功的话,就认为脚本检测成功,不会变更优先级权重值
}
vrrp_instance VI_1 {
state MASTER # 节点名称 MASTER/BACKUP 一般不关注,主要做个标识,主备依旧通过priority来控制
interface ens33 # 网卡名称
virtual_router_id 51 # Keepalived服务集群编号 同号同集群
priority 100 # 主备权重优先级 越大优先级越高 默认100 这里是备(这里与Server1不同)
advert_int 1 # 主备通讯时间间隔(秒)
# 验证类型与密码 主备服务必须使用相同的验证方式与密码才可以正常通讯
authentication {
auth_type PASS
auth_pass 1111
}
# 添加检测脚本
track_script {
check_nginx
}
# 虚拟IP地址,可以设置1个或多个,只要没被使用过的同域IP均可
virtual_ipaddress {
172.16.249.80
172.16.249.90
172.16.249.100
}
}
配置心跳检测脚本
touch /etc/keepalived/check_nginx.sh
touch /etc/keepalived/check_nginx.log
chmod 777 /etc/keepalived/check_nginx.sh
vim /etc/keepalived/check_nginx.sh
#!/bin/bash
nginxpid=`ps -C nginx –no-header | wc -l`
if [ $nginxpid -eq 0 ];then
systemctl restart nginx
sleep 2
echo \”$(date): systemctl restart nginx\” >> /etc/keepalived/check_nginx.log
nginxpid=`ps -C nginx –no-header | wc -l`
if [ $nginxpid -eq 0 ];then
killall keepalived
echo \”$(date): killall keepalived\” >> /etc/keepalived/check_nginx.log
fi
fi
说明一下,脚本的意思是检测有没有nginx相关的进程,如果没有那么启动nginx服务,启动后等待2秒后再次检测,如果发现依旧没启动起来,那就说明nginx的配置或者服务有问题了,这个时候就需要杀掉keepalived服务进程,将服务转交给其它Keepalived服务节点;
# 重启keepalived服务
systemctl restart keepalived.service
Server3 HTTP服务器配置
检查DNS和网关Gateway(参考)
1. cat /etc/resolv.conf # DNS 查看
2. traceroute www.baidu.com # 第一行就是自己的网关
3. route -n
4. ip route show
5. cat /etc/sysconfig/network-scripts/ifcfg-ens33
6. cat /etc/sysconfig/network
7. netstat –r
设置固定IP
vim /etc/sysconfig/network-scripts/ifcfg-ens33
# 将BOOTPROTO从dhcp调整为static(静态)
dhcp => static
# 文件末尾添加如下
IPADDR=172.16.249.201 # 固定IP
GATEWAY=172.16.249.2 # 网关
NETMASK=255.255.255.0 # 子网掩码
DNS1=172.16.249.2 # 默认DNS
DNS2=223.5.5.5 # 公共DNS
# 刷新网络服务
service network restart
安装http web服务
yum -y install httpd
调整显示页面信息
echo \’HTTP WEB NODE 01\’ > /usr/share/httpd/noindex/index.html
启动服务
systemctl start httpd.service
Server4 HTTP服务器配置
检查DNS和网关Gateway(参考)
1. cat /etc/resolv.conf # DNS 查看
2. traceroute www.baidu.com # 第一行就是自己的网关
3. route -n
4. ip route show
5. cat /etc/sysconfig/network-scripts/ifcfg-ens33
6. cat /etc/sysconfig/network
7. netstat –r
设置固定IP
vim /etc/sysconfig/network-scripts/ifcfg-ens33
# 将BOOTPROTO从dhcp调整为static(静态)
dhcp => static
# 文件末尾添加如下
IPADDR=172.16.249.202 # 固定IP(这里与Server3不同)
GATEWAY=172.16.249.2 # 网关
NETMASK=255.255.255.0 # 子网掩码
DNS1=172.16.249.2 # 默认DNS
DNS2=223.5.5.5 # 公共DNS
# 刷新网络服务
service network restart
安装http web服务
yum -y install httpd
调整显示页面信息
echo \’HTTP WEB NODE 02\’ > /usr/share/httpd/noindex/index.html # (这里与Server3不同)
启动服务
systemctl start httpd.service
运行测试用例
在同网段其它机器/宿主机,检查server1、server2、server3、server4服务是否均OK
# NG 检测
curl 172.16.249.101:80
curl 172.16.249.102:80
# Web 服务器检测
curl 172.16.249.201:80
curl 172.16.249.201:80
高可用测试
开5个终端进行测试
# VIP
watch -d -n 1 \”curl 172.16.249.80:80\”
# NG+KL
watch -d -n 1 \”curl 172.16.249.101:80\”
watch -d -n 1 \”curl 172.16.249.102:80\”
# HTTPWEB
watch -d -n 1 \”curl 172.16.249.201:80\”
watch -d -n 1 \”curl 172.16.249.202:80\”
Server1(NG+KL)、Server2(NG+KL)、Server3(HTTPWEB)、Server4(HTTPWEB)服务均正常运行时,我们可以看到:
# VIP(176.16.249.80/90/100)正常通过Server1的Nginx在进行分发请求;
# S1(176.16.249.101):正常(主)
# S2(176.16.249.102):正常(备)
# S3(176.16.249.201):正常
# S4(176.16.249.202):正常
HTTP WEB NODE01
HTTP WEB NODE02
HTTP WEB NODE01
HTTP WEB NODE02
…
Server1(NG+KL) 关闭Nginx与Keepalived服务
Server2(NG+KL)、Server3(HTTPWEB)、Server4(HTTPWEB)正常,我们可以看到:
# VIP(176.16.249.80/90/100)正常通过Server2的Nginx在进行分发请求;
# S1(176.16.249.101):NG\\KL服务关闭(主)
# S2(176.16.249.102):正常(备)
# S3(176.16.249.201):正常
# S4(176.16.249.202):正常
HTTP WEB NODE01
HTTP WEB NODE02
HTTP WEB NODE01
HTTP WEB NODE02
…
Server1(NG+KL) 、Server2(NG+KL)关闭Nginx与Keepalived服务
Server3(HTTPWEB)、Server4(HTTPWEB)正常,我们可以看到:
# VIP(176.16.249.80/90/100)请求阻塞(不刷新了)
# S1(176.16.249.101):NG\\KL服务关闭(主)
# S2(176.16.249.102):NG\\KL服务关闭(备)
# S3(176.16.249.201):正常
# S4(176.16.249.202):正常
# 卡住
Server1(NG+KL) 关闭Nginx与Keepalived服务
Server3(HTTPWEB)、Server4(HTTPWEB)正常,
重启Server2(NG+KL)的Keepalived服务,我们可以看到:
# VIP(176.16.249.80/90/100)正常通过Server2的Nginx在进行分发请求;
# S1(176.16.249.101):NG\\KL服务关闭(主)
# S2(176.16.249.102):重启NG\\KL服务(备)
# S3(176.16.249.201):正常
# S4(176.16.249.202):正常
HTTP WEB NODE01
HTTP WEB NODE02
HTTP WEB NODE01
HTTP WEB NODE02
…
Server1(NG+KL) 、Server3(HTTPWEB)、Server4(HTTPWEB)正常,
重启Server1(NG+KL)的Keepalived服务,我们可以看到:
# VIP(176.16.249.80/90/100)立刻自动切换到Server1上进行转发(会有一个跳动点)
# S1(176.16.249.101):重启NG\\KL服务(备)
# S2(176.16.249.102):正常(备)
# S3(176.16.249.201):正常
# S4(176.16.249.202):正常
HTTP WEB NODE01
HTTP WEB NODE02
HTTP WEB NODE01
HTTP WEB NODE02
…
The End!
🎉如果对你有所帮助,可以点赞、关注、收藏起来,不然下次就找不到了🎉
【点赞】⭐️⭐️⭐️⭐️⭐️
【关注】⭐️⭐️⭐️⭐️⭐️
【收藏】⭐️⭐️⭐️⭐️⭐️
Thanks for watching.
–Kenny
#以上关于NGINX+KEEPALIVED | 一文搞懂NG+KL负载均衡高可用架构的实操教程(详细)的相关内容来源网络仅供参考,相关信息请以官方公告为准!
原创文章,作者:CSDN,如若转载,请注明出处:https://www.sudun.com/ask/92836.html