Nginx 高可用负载均衡(三种模式)

一、nginx普通集群负载均衡

1、安装keepalived

(1)下载

复制代码
https://www.keepalived.org/download.html

(2)解压

复制代码
tar -zxvf keepalived-2.0.18.tar.gz

(3)使用configure命令配置安装目录与核心配置文件所在位置:

复制代码
./configure --prefix=/usr/local/keepalived --sysconf=/etc
  • prefix :keepalived安装的位置sysconf:keepalived核心配置文件所在位置,固定位置,改成其他位置则keepalived启动不了,/var/log/messages中会报错

  • sysconf :keepalived核心配置文件所在位置,固定位置,改成其他位置则keepalived启动不了,/var/log/messages中会报错

配置过程中可能会出现警告信息,如下所示:

复制代码
*** WARNING - this build will not support IPVS with IPv6. Please install libnl/libnl-3 dev libraries to support IPv6 with IPVS.

# 安装libnl/libnl-3依赖
yum -y install libnl libnl-devel  

(4)安装keepalived

复制代码
make && make install

(5)配置文件 在/etc/keepalived/keepalived.conf

(6)忘记安装配置的目录,则通过如下命令找到:

复制代码
whereis keepalived

(7)启动keepalived

进入sbin目录

复制代码
./keepalived

2、配置keepalived 主机

(1)通过命令 vim keepalived.conf 打开配置文件

复制代码
global_defs { 
    # 路由id:当前安装keepalived的节点主机标识符,保证全局唯一 
    router_id keep_171 
} 

vrrp_instance VI_1 { 
    # 表示状态是MASTER主机还是备用机BACKUP 
    state MASTER 
    # 该实例绑定的网卡 
    interface ens33 
    # 保证主备节点一致即可 
    virtual_router_id 51 
    # 权重,master权重一般高于backup,如果有多个,那就是选举,谁的权重高,谁就当选 
    priority 100 
    # 主备之间同步检查时间间隔,单位秒 
    advert_int 2 
    # 认证权限密码,防止非法节点进入 
    authentication { 
        auth_type PASS 
        auth_pass 1111 
    } 
    # 虚拟出来的ip,可以有多个(vip) 
    virtual_ipaddress { 
        192.168.1.161 
    }
}

附:查看网卡信息命令

复制代码
ip addr

(2)启动keepalived

(3)查看进程

复制代码
ps -ef|grep keepalived

(4)查看vip(虚拟ip)

在网卡ens33下,多了一个192.168.1.161,这个就是虚拟ip

3、把keepalived注册为系统服务

(1)拷贝配置文件

  • 将keepalived目录下etc/init.d/keepalived拷贝到/etc/init.d/

  • 将keepalived目录下etc/sysconfig/keepalived拷贝到/etc/sysconfig/

(2)刷新systemctl

复制代码
systemctl daemon-reload

(3)启动、停止、重启keepalived

复制代码
#启动
systemctl start keepalived.service
#停止
systemctl stop keepalived.service
#重启
systemctl restart keepalived.service

4、实现双机主备高可用

(1)修改备机配置

复制代码
global_defs { 
    router_id keep_172 
} 
vrrp_instance VI_1 { 
    # 备用机设置为BACKUP 
    state BACKUP 
    interface ens33 
    virtual_router_id 51 
    # 权重低于MASTER 
    priority 80 
    advert_int 2 
    authentication { 
        auth_type PASS auth_pass 1111 
    }
    virtual_ipaddress {
        # 注意:主备两台的vip都是一样的,绑定到同一个vip 
        192.168.1.161 
    } 
}

(2) 启动 Keepalived

(3) 访问vip即可访问主机,当主机失效时访问vip就会访问到备机

5、keepalived配置nginx自动重启

(1)编写脚本

/etc/keepalived/下创建脚本check_nginx_alive_or_not

复制代码
#!/bin/bash 

A=`ps -C nginx --no-header |wc -l` 
# 判断nginx是否宕机,如果宕机了,尝试重启 
if [ $A -eq 0 ];then 
    /usr/local/nginx/sbin/nginx 
    # 等待一小会再次检查nginx,如果没有启动成功,则停止keepalived,使其启动备用机 
    sleep 3 
        if [ `ps -C nginx --no-header |wc -l` -eq 0 ];then 
            killall keepalived 
        fi 
fi

(2)添加运行权限

复制代码
chmod +x /etc/keepalived/check_nginx_alive_or_not.sh

(3)配置keepalived监听nginx脚本

复制代码
vrrp_script check_nginx_alive { 
    script "/etc/keepalived/check_nginx_alive_or_not.sh" 
    interval 2 # 每隔两秒运行上一行脚本 
    weight 10 # 如果脚本运行失败,则升级权重+10 
}

(4)在vrrp_instance中新增监控的脚本

复制代码
track_script { 
    check_nginx_alive # 追踪 nginx 脚本
}

(5)重启Keepalived使得配置文件生效

复制代码
systemctl restart keepalived

6、keepalived双主热备

(1)配置DNS轮询

在同一个域名下配置两个ip,自行百度

(2)配置第一台主机

复制代码
global_defs {
    router_id keep_171 
} 
vrrp_instance VI_1 { 
    state MASTER i
    nterface ens33 
    virtual_router_id 51 
    priority 100 
    advert_int 1 
    authentication { 
        auth_type PASS 
        auth_pass 1111 
    } 
    virtual_ipaddress { 
        192.168.1.161 
    } 
} 

vrrp_instance VI_2  {
    state BACKUP 
    interface ens33 
    virtual_router_id 52 
    priority 80 
    advert_int 1 
    authentication { 
        auth_type PASS 
        auth_pass 1111 
    } 
    virtual_ipaddress { 
        192.168.1.162 
    }
}

(3)配置第二台主机

复制代码
global_defs {
    router_id keep_172 
} 
vrrp_instance VI_1 { 
    state BACKUP 
    interface ens33 
    virtual_router_id 51 
    priority 80 
    advert_int 1 
    authentication { 
        auth_type PASS 
        auth_pass 1111 
    } 
    virtual_ipaddress { 
        192.168.1.161
    }
} 

vrrp_instance VI_2 {
    state MASTER 
    interface ens33 
    virtual_router_id 52 
    priority 100 
    advert_int 1 
    authentication { 
        auth_type PASS 
        auth_pass 1111 
    } 
    virtual_ipaddress { 
        192.168.1.162 
    }
}

(4)重启两台Keepalived

复制代码
systemctl restart keepalived

二、LVS(Linux Virtual Server)实现高可用负载均衡

1、为什么要使用LVS+Nginx

  • lvs基于四层负载均衡,工作效率较Nginx的七层负载更高,使用LVS搭建Nginx集群,可以提高性能

  • 四层负载均衡无法对信息处理,只能通过ip+端口的形式转发,所以需要七成负载进行数据的处理

  • Nginx接收请求来回,LVS可以只接受不响应

2、LVS的三种模式

(1)NAT模式

  • 客户端将请求发往LVS,LVS会选择一台服务器响应请求,服务器将结果返回给LVS,LVS再返回给客户端。

  • 在NAT模式中,服务器的网关必须指向LVS,否则报文无法送达客户端

  • NAT 技术将请求的报文和响应的报文都需要通过LVS进行地址改写,因此网站访问量比较大的时候负载均衡调度器有比较大的瓶颈,一般要求最多之能 10-20 台节点

  • NAT 模式支持对 IP 地址和端口进行转换。即用户请求的端口和真实服务器的端口可以不一致

(2)TUN模式

  • 客户端将请求发往LVS,LVS会选择一台服务器响应请求,在客户端与服务器之间建立隧道,返回结果的时候直接由服务器返回响应,不在经过LVS。

  • TUN模式必须所有的服务器上都绑定VIP的IP地址,所有的服务器都必须有网卡。

  • TUN模式走隧道运维难度大,并且会直接暴露服务器地址

  • 服务器将应答包直接发给用户。所以,减少了负载均衡器的大量数据流动,负载均衡器不再是系统的瓶颈,就能处理很巨大的请求量,这种方式,一台负载均衡器能够为很多服务器进行分发。而且跑在公网上就能进行不同地域的分发

(3)DR模式

  • 客户端将请求发往LVS,LVS会选择一台服务器响应请求,返回结果的时候通过统一的路由进行返回,不在经过LVS。

  • 和TUN模式一样,LVS只是分发请求,应答包通过单独的路由返回给客户端,与TUN相比这种方式不需要隧道结构,可以兼容大多数的操作系统,同时统一路由可以隐藏真实的物理服务器。DR模式效率更高,但配置更复杂.

  • 所有服务器节点和LVS只能在一个局域网里面。

3、搭建LVS-DR模式

先关闭掉服务器上网络配置管理器,避免网络接口冲突

复制代码
systemctl stop NetworkManagersystemctl disable NetworkManager

(1)创建子接口(创建LVS的虚拟ip)

进入网卡配置目录/etc/sysconfig/network-scripts/,找到网卡配置文件,这里以ifcfg-ens33为例,拷贝并创建子接口

复制代码
cp ifcfg-ens33 ifcfg-ens33:1

修改子接口配置如下

  • 配置中的 192.168.1.150 就是vip,是提供给外网用户访问的ip地址

    DEVICE="ens33:1"ONBOOT="yes"IPADDR=192.168.1.150NETMASK=255.255.255.0BOOTPROTO=static

  • 重启网络服务

    service network restart

重启成功后,ip addr 查看一下,你会发现多了一个ip,也就是虚拟ip(vip)

注意:阿里云不支持配置网卡,需要购买相应的负载均衡服务,腾讯云支持配置网卡,但需要购买网卡支持,一个网卡支持10个虚拟ip配置

(2)安装ipvsadm

如今的centos都集成了LVS,所以ipvs是自带的,我们只需要安装ipvsadm即可(ipvsadm是管理集群的工具,通过ipvs可以管理集群,查看集群等操作)

复制代码
yum install ipvsadm

(3)配置服务器(RS)的虚拟ip

进入网卡配置目录/etc/sysconfig/network-scripts/,找到ifcfg-lo,拷贝并创建子接口

复制代码
cp ifcfg-lo ifcfg-lo:1

修改子接口配置如下

复制代码
DEVICE="lo:1"
IPADDR=192.168.1.150
NETMASK=255.255.255.255
NETWORK=127.0.0.0
BROADCAST=127.255.255.255
ONBOOT="yes"
NAME=loopback

重启网络服务成功后,ip addr 查看一下,你会发现多了一个ip,也就是虚拟ip(vip)

(4)为服务器(RS)配置arp

ARP响应级别与通告行为参数说明

复制代码
arp-ignore:ARP响应级别(处理请求)
    0:只要本机配置了ip,就能响应请求
    1:请求的目标地址到达对应的网络接口,才会响应请求
arp-announce:ARP通告行为(返回响应)
    0:本机上任何网络接口都向外通告,所有的网卡都能接受到通告
    1:尽可能避免本网卡与不匹配的目标进行通告2:只在本网卡通告

打开sysctl.conf:

复制代码
vim /etc/sysctl.conf

配置所有网卡、默认网卡以及虚拟网卡的arp响应级别和通告行为,分别对应:all,default,lo

复制代码
# configration for lvs 
net.ipv4.conf.all.arp_ignore = 1 
net.ipv4.conf.default.arp_ignore = 1 
net.ipv4.conf.lo.arp_ignore = 1 

net.ipv4.conf.all.arp_announce = 2 
net.ipv4.conf.default.arp_announce = 2 
net.ipv4.conf.lo.arp_announce = 2

刷新配置文件

复制代码
sysctl -p

增加一个网关,用于接收数据报文,当有请求到本机后,会交给lo去处理

复制代码
route add -host 192.168.1.150 dev lo:1

将网关添加至开机启动

复制代码
echo "route add -host 192.168.1.150 dev lo:1" >> /etc/rc.local

(4)使用ipvsadm配置集群规则

创建LVS节点,用户访问的集群调度者

复制代码
ipvsadm -A -t 192.168.1.150:80 -s rr -p 5
  • -A:添加集群

  • -t:tcp协议ip地址:设定集群的访问

  • ip:也就是LVS的虚拟ip

  • -s:设置负载均衡的算法,

  • rr:表示轮询

  • -p:设置连接持久化的时间,在指定时间内同一个用户的请求会访问到同一个服务器中

创建多台RS真实服务器

复制代码
ipvsadm -a -t 192.168.1.150:80 -r 192.168.1.171:80 -g 
ipvsadm -a -t 192.168.1.150:80 -r 192.168.1.172:80 -g
  • -a:添加真实服务器

  • -t:tcp协议

  • -r:真实服务器的ip地址

  • -g:设定DR模式

保存到规则库,否则重启失效

复制代码
ipvsadm -S

检查集群

复制代码
#查看集群列表
ipvsadm -Ln
#查看集群状态
ipvsadm -Ln --stats

一些其他命令

复制代码
 # 重启ipvsadm,重启后需要重新配置 
 service ipvsadm restart 
 # 查看持久化连接 
 ipvsadm -Ln --persistent-conn 
 # 查看连接请求过期时间以及请求源ip和目标ip 
 ipvsadm -Lnc 
 # 设置tcp tcpfin udp 的过期时间(一般保持默认) 
 ipvsadm --set 1 1 1 
 # 查看过期时间 
 ipvsadm -Ln --timeout

(5)访问虚拟ip,完成LVS搭建

附:LVS的负载均衡算法

(1)静态算法

静态:根据LVS本身自由的固定的算法分发用户请求。

  • 轮询(Round Robin 简写'rr'):轮询算法假设所有的服务器处理请求的能力都一样的,调度器会把所有的请求平均分配给每个真实服务器。(同Nginx的轮询)

  • 加权轮询(Weight Round Robin 简写'wrr'):安装权重比例分配用户请求。权重越高,被分配到处理的请求越多。(同Nginx的权重)

  • 源地址散列(Source Hash 简写'sh'):同一个用户ip的请求,会由同一个RS来处理。(同Nginx的ip_hash)

  • 目标地址散列(Destination Hash 简写'dh'):根据url的不同,请求到不同的RS。(同Nginx的url_hash)

(2)动态算法

动态:会根据流量的不同,或者服务器的压力不同来分配用户请求,这是动态计算的。

  • 最小连接数(Least Connections 简写'lc'):把新的连接请求分配到当前连接数最小的服务器。

  • 加权最少连接数(Weight Least Connections 简写'wlc'):服务器的处理性能用数值来代表,权重越大处理的请求越多。Real Server 有可能会存在性能上的差异,wlc动态获取不同服务器的负载状况,把请求分发到性能好并且比较空闲的服务器。

  • 最短期望延迟(Shortest Expected Delay 简写'sed'):特殊的wlc算法。举例阐述,假设有ABC三台服务器,权重分别为1、2、3 。如果使用wlc算法的话,当一个新请求进来,它可能会分给ABC中的任意一个。使用sed算法后会进行如下运算:

  • A:(1+1)/1=2

  • B:(1+2)/2=3/2

  • C:(1+3)/3=4/3

最终结果,会把这个请求交给得出运算结果最小的服务器。最少队列调度(Never Queue 简写'nq'):永不使用队列。如果有Real Server的连接数等于0,则直接把这个请求分配过去,不需要在排队等待运算了(sed运算)。

三、搭建Keepalived+Lvs+Nginx高可用集群负载均衡

如果原先服务器上配置了LVS+nginx需要清空ipvsadm中的配置

复制代码
ipvsadm -C

如果配置了Keepalived+Nginx双主集群也需要去除掉Keepalived中原先的配置,按照的后文进行配置

(1)使用keepalived配置Master LVS

在LVS的机器上安装keepalived,安装过程参考上文

(1)修改keepalived的配置

复制代码
global_defs {
    router_id keep_151 
} 
vrrp_instance VI_1 { 
    state MASTER 
    interface ens33 
    virtual_router_id 41 
    priority 100 
    advert_int 1 
    authentication { 
        auth_type PASS 
        auth_pass 1111 
    } 
    virtual_ipaddress { 
        192.168.1.150
    }
} 

#配置集群访问的ip+端口,端口和nginx保持一致
virtual_server 192.168.1.150 80{
    #健康检查的时间,单位:秒
    delay_loop 6
    #配置负载均衡的算法,默认的轮询
    lb_algo rr
    #设置LVS的模式 NAT|TUN|DR
    lb-kind DR
    #设置会话持久化的时间
    persistence_timeout 5
    #协议
    protocol TCP
    
    #配置负载均衡的真实服务器,也就是nginx节点的具体的ip地址
    real_server 192.168.1.171 80{
        #轮询权重配比
        weight 1
        #设置健康检查
        TCP_CHECK {
            #检查80端口
            connect_port 80
            #超时时间
            connect_timeout 2
            #重试次数
            nb_get_retry 2
            #重试间隔时间
            delay_before_retry 3
        }
    }
    real_server 192.168.1.171 80{
        weight 1
        TCP_CHECK {
            connect_port 80
            connect_timeout 2
            nb_get_retry 2
            delay_before_retry 3
        }
    }
}

(2)启动/重启keepalived

复制代码
systemctl restart keepalived

配置在备用机上

复制代码
global_defs {
    router_id keep_152 
} 
vrrp_instance VI_1 { 
    state  BACKUP
    interface ens33 
    virtual_router_id 41 
    priority 50 
    advert_int 1 
    authentication { 
        auth_type PASS 
        auth_pass 1111 
    } 
    virtual_ipaddress { 
        192.168.1.150
    }
} 

#配置集群访问的ip+端口,端口和nginx保持一致
virtual_server 192.168.1.150 80{
    #健康检查的时间,单位:秒
    delay_loop 6
    #配置负载均衡的算法,默认的轮询
    lb_algo rr
    #设置LVS的模式 NAT|TUN|DR
    lb-kind DR
    #设置会话持久化的时间
    persistence_timeout 5
    #协议
    protocol TCP
    
    #配置负载均衡的真实服务器,也就是nginx节点的具体的ip地址
    real_server 192.168.1.171 80{
        #轮询权重配比
        weight 1
        #设置健康检查
        TCP_CHECK {
            #检查80端口
            connect_port 80
            #超时时间
            connect_timeout 2
            #重试次数
            nb_get_retry 2
            #重试间隔时间
            delay_before_retry 3
        }
    }
    real_server 192.168.1.171 80{
        weight 1
        TCP_CHECK {
            connect_port 80
            connect_timeout 2
            nb_get_retry 2
            delay_before_retry 3
        }
    }
}

推荐一个免费的pdf转换网站,包含pdf转word、pdf拆分等功能。

PDF转换网站​编辑http://test.aipaca-cbec.com/index

相关推荐
盟接之桥2 分钟前
盟接之桥说制造:引流品 × 利润品,全球电商平台高效产品组合策略(供讨论)
大数据·linux·服务器·网络·人工智能·制造
会员源码网30 分钟前
理财源码开发:单语言深耕还是多语言融合?看完这篇不踩坑
网络·个人开发
米羊1211 小时前
已有安全措施确认(上)
大数据·网络
Fcy6481 小时前
Linux下 进程(一)(冯诺依曼体系、操作系统、进程基本概念与基本操作)
linux·运维·服务器·进程
袁袁袁袁满1 小时前
Linux怎么查看最新下载的文件
linux·运维·服务器
主机哥哥2 小时前
阿里云OpenClaw部署全攻略,五种方案助你快速部署!
服务器·阿里云·负载均衡
Harvey9032 小时前
通过 Helm 部署 Nginx 应用的完整标准化步骤
linux·运维·nginx·k8s
ManThink Technology2 小时前
如何使用EBHelper 简化EdgeBus的代码编写?
java·前端·网络
珠海西格电力科技3 小时前
微电网能量平衡理论的实现条件在不同场景下有哪些差异?
运维·服务器·网络·人工智能·云计算·智慧城市
QT.qtqtqtqtqt3 小时前
未授权访问漏洞
网络·安全·web安全