NGINX+KEEPALIVED | 一文搞懂NG+KL负载均衡高可用架构的实操教程(详细)

NGINX+KEEPALIVED | 一文搞懂NG+KL负载均衡高可用架构的实操教程(详细) 文章目录 NGINXKEEPALIVED负载均衡高可用架构为什么需要多节点应用为什么需要Nginx服务为什么需要Keepalived服务NGKL简

文章目录

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

Like (0)
CSDN的头像CSDN
Previous 2024年7月4日
Next 2024年7月4日

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注