LVS+Keepalived 实现高可用负载均衡

前言

在业务量达到一定量的时候,往往单机的服务是会出现瓶颈的。此时最常见的方式就是通过负载均衡来进行横向扩展。其中我们最常用的软件就是 Nginx。通过其反向代理的能力能够轻松实现负载均衡,当有服务出现异常,也能够自动剔除。但是负载均衡服务自身也可能出现故障,因此需要引入其他的软件来实现负载均衡服务的高可用。本文就介绍了一种基于 LVS+Keepalived 的方式,来实现高可用 Web 集群。

LVS 与 Keepalived

LVS 是一种预装在 Linux 系统中,基于四层、具有强大性能的反向代理服务器。ipvsadm 是 LVS 的命令行管理工具。

LVS 特点是:

  1. 首先它是基于 4 层的网络协议的,抗负载能力强,对于服务器的硬件要求除了网卡外,其他没有太多要求;
  2. 配置性比较低,这是一个缺点也是一个优点,因为没有可太多配置的东西,大大减少了人为出错的几率;
  3. 应用范围比较广,不仅仅对 web 服务做负载均衡,还可以对其他应用(mysql)做负载均衡;
  4. LVS 架构中存在一个虚拟 IP 的概念,需要向 IDC 多申请一个 IP 来做虚拟 IP。

Keepalived 是一个基于 VRRP 协议来实现的服务高可用方案,可以利用其来避免 IP 单点故障,一般与其它负载均衡技术(如 LVS 、HAProxy 、Nginx)一起工作来达到集群的高可用。Keepalived 是 LVS 的扩展项目, 因此它们之间具备良好的兼容性,可直接通过 Keepalived 的配置文件来配置 LVS。

LVS 的工作原理可见参考文献

关于 LVS 和 Keepalived 详细的结构和原理,以及 LVS 和我们常用的 LB 软件 Nginx 的异同,可以阅读末尾提供的参考文献。接下来将介绍如何部署一个高可用的负载均衡集群。

相关术语

  • LB (Load Balancer 负载均衡)
  • HA (High Available 高可用)
  • Failover (失败切换)
  • Cluster (集群)
  • LVS (Linux Virtual Server Linux 虚拟服务器)
  • DS (Director Server),指的是前端负载均衡器节点
  • RS (Real Server),后端真实的工作服务器
  • VIP (Virtual IP),虚拟的 IP 地址,向外部直接面向用户请求,作为用户请求的目标的 IP 地址
  • DIP (Director IP),主要用于和内部主机通讯的 IP 地址
  • RIP (Real Server IP),后端服务器的 IP 地址
  • CIP (Client IP),访问客户端的 IP 地址

测试环境

软件环境:CentOS7、Keepalived1.3.5、ipvsadm1.27

DS1(MASTER):172.17.13.120

DS1(BACKUP):172.17.13.123

RS1:172.17.13.142:80 Nginx

RS1:172.17.13.173:80 Nginx

VIP:172.17.13.252

解释

| +----------------+-----------------+ | | 172.17.13.120|---- VIP:172.17.13.252 ----|172.17.13.123 +-------+--------+ +--------+-------+ | DS1 | | DS2 | | LVS+Keepalived | | LVS+Keepalived | +-------+--------+ +--------+-------+ | | +----------------+-----------------+ | +------------+ | +------------+ | RS1 |172.17.13.142 | 172.17.13.173| RS2 | | Web Server +--------------+---------------+ Web Server | +------------+ +------------+

集群的架构图如上图所示。DS1、DS2 为两个 LB 节点,RS1、RS2 为两个真实的服务节点,通过一个虚拟的 IP 地址对外提供服务。

最终我们要达到的目标为:

  1. Client 通过 VIP 访问服务能够将请求根据配置的规则进行分发(LB)
  2. 当 MATSER 的 LB 节点故障时,自动切换到 BACKUP 的 LB 节点上,保证服务正常访问;MASTER 恢复后,再次作为主 LB 负载节点
  3. 当某个 RS 节点故障时,自动剔除该节点;恢复后,再次加入集群

详细配置流程

安装相关软件

[root@localhost ~]# yum install ipvsadm keepalived -y

配置 Keepalived

  1. DS1(MASTER) 节点

解释

[root@localhost ~]# vi /etc/keepalived/keepalived.conf ! Configuration File for keepalived global_defs { router_id LVS_DEVEL } vrrp_instance VI_1 { state MASTER # 两个 DS,一个为 MASTER 一个为 BACKUP interface enp1s0 # 当前 IP 对应的网络接口,通过 ifconfig 查询 virtual_router_id 62 # 虚拟路由 ID(0-255),在一个 VRRP 实例中主备服务器 ID 必须一样 priority 200 # 优先级值设定:MASTER 要比 BACKUP 的值大 advert_int 1 # 通告时间间隔:单位秒,主备要一致 authentication { # 认证机制,主从节点保持一致即可 auth_type PASS auth_pass 1111 } virtual_ipaddress { 172.17.13.252 # VIP,可配置多个 } } # LB 配置 virtual_server 172.17.13.252 80 { delay_loop 3 # 设置健康状态检查时间 lb_algo rr # 调度算法,这里用了 rr 轮询算法 lb_kind DR # 这里测试用了 Direct Route 模式 persistence_timeout 50 # 持久连接超时时间 protocol TCP real_server 172.17.13.173 80 { weight 1 TCP_CHECK { connect_timeout 10    retry 3       # 旧版本为 nb_get_retry delay_before_retry 3    connect_port 80 } } real_server 172.17.13.142 80 { weight 1 TCP_CHECK { connect_timeout 10 retry 3 delay_before_retry 3 connect_port 80 } } }

  1. DS2(BACKUP) 节点

复制之前的配置文件,修改 vrrp_instance VI_1 中的 state 为 BACKUP

配置完成后,分别重启 Keepalived 服务。

[root@localhost ~]# systemctl restart keepalived

配置 RS

RS 配置主要分两部分,一部分是 web 服务,另一部分是网络转发配置。

web 服务部署不多展开了,根据实际情况来,可以是 Tomcat 也可以是 Nginx,只要能通过 ip:port 能访问到即可。

在网络转发配置上,LVS 支持多种通信模型(NAT、DR、TUN),本文采用 DR 模型来进行通信,大致的流程如下图所示。请求数据包从到达 LB 后,LVS 会将这个数据包的 MAC 地址改成轮询到的 RS 的 MAC 地址,并丢给交换机;RS 收到后进行处理并从网卡的 lo 端口发送出去,响应报文到达交换机后直接转发给 Client。

NAT-3

因此,我们需要在 RS 的网卡上配置 lo 为 VIP。配置脚本如下

解释

#!/bin/bash SNS_VIP=172.17.13.252 case "$1" in start) ifconfig lo:0 $SNS_VIP netmask 255.255.255.255 broadcast $SNS_VIP /sbin/route add -host $SNS_VIP dev lo:0 echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce sysctl -p >/dev/null 2>&1 echo "RealServer Start OK" ;; stop) ifconfig lo:0 down route del $SNS_VIP >/dev/null 2>&1 echo "0" >/proc/sys/net/ipv4/conf/lo/arp_ignore echo "0" >/proc/sys/net/ipv4/conf/lo/arp_announce echo "0" >/proc/sys/net/ipv4/conf/all/arp_ignore echo "0" >/proc/sys/net/ipv4/conf/all/arp_announce echo "RealServer Stoped" ;; *) echo "Usage: $0 {start|stop}" exit 1 esac exit 0

本地创建完后,并执行。

[root@localhost ~]# chmod a+x lvs-web.sh
[root@localhost ~]# ./lvs-web.sh start

配置完成后,通过 VIP 就可以访问到 RS 上的服务了。

HA 测试

配置完双机热备后,我们就可以测试下,节点发生故障后以及 LB 切换失败后,能否保证服务的 HA。

在 LB 的主节点上输入 ip a,可以看到 VIP 目前已经正确配置在网卡上。

image-20200728165028112

输入 watch ipvsadm -Ln --stats 可实时看到负载均衡的结果,正常。

image-20200723101409290

接下面我们试着访问一下 VIP。

[root@localhost ~]# while true ; do curl 172.17.13.252; sleep 1;done

看到服务可正常轮询。

image-20200723100952996

此时手动停止一个 RS,再次访问 VIP,LVS 会自动剔除无法访问的服务,重启后,服务会被自动添加。

image-20200723103233100

image-20200723102858257

如果此时,手动停止 MASTER 上的 Keepalived,模拟 LB MASTER 节点挂了,VIP 会自动飘到 BACKUP LB 上。

image-20200723103504355

image-20200723103315113

此时,如果重启 MASTER 后,VIP 又会飘回去。MASTER 的优先级高于 BACKUP,从而实现 HA。

image-20200723103538358

总结

本文介绍了使用 LVS+Keepalived 来实现高可用负载均衡,这能使得我们的服务能够更加的稳定。Keepalived 默认是运行在 LVS 之上的,有较好的兼容性,当然我们也可以使用户 Nginx 作为 LB 的软件,可根据业务和两者的异同进行选择。

Keepalived  命令配置精解

keepalived的配置文件说明 

一.全局定义部分
全局配置又包括两个子配置1.全局定义(global definition) ;2.静态路由配置(static ipaddress/routes)
1. 全局定义(global definition) global_defs {                      notification_email {      acassen@firewall.loc     failover@firewall.locsysadmin@firewall.loc}notification_email_from Alexandre.Cassen@firewall.loc   smtp_server 192.168.200.1                         smtp_connect_timeout 30                                  router_id LVS_DEVEL     }

notification_email: 表示keepalived在发生诸如切换操作时需要发送email通知以及email发送给哪些邮件地址邮件地址可以多个每行一个
notification_email_from admin@example.com: 表示发送通知邮件时邮件源地址是谁
smtp_server 127.0.0.1: 表示发送email时使用的smtp服务器地址这里可以用本地的sendmail来实现
smtp_connect_timeout 30: 连接smtp连接超时时间
router_id node1: 机器标识,fa

2.静态地址和路由配置范例

static_ipaddress{192.168.1.1/24 brd + dev eth0 scope global192.168.1.2/24 brd + dev eth1 scope global}static_routes{src $SRC_IP to $DST_IP dev $SRC_DEVICEsrc $SRC_IP to $DST_IP via $GW dev $SRC_DEVICE}

这里实际上和系统里面命令配置IP地址和路由一样例如
192.168.1.1/24 brd + dev eth0 scope global 相当于: ip addr add 192.168.1.1/24 brd + dev eth0 scope global
就是给eth0配置IP地址路由同理,一般这个区域不需要配置
这里实际上就是给服务器配置真实的IP地址和路由的在复杂的环境下可能需要配置一般不会用这个来配置我们可以直接用vi /etc/sysconfig/network-script/ifcfg-eth1来配置切记这里可不是VIP不要搞混淆了切记切记

二.VRRP配置
包括三个类:1.VRRP同步组(synchroization group) 2.VRRP实例(VRRP Instance) 3.VRRP脚本

2.1.VRRP同步组(synchroization group)配置范例

vrrp_sync_group VG_1 {   //注意vrrp_sync_group  后面可自定义名称如lvs_httpd ,httpdgroup {httpmysql}notify_master /path/to/to_master.shnotify_backup /path_to/to_backup.shnotify_fault "/path/fault.sh VG_1"notify /path/to/notify.shsmtp_alert }

其中http和mysql是实例名和下面的实例名一致

notify_master /path/to/to_master.sh //表示当切换到master状态时要执行的脚本notify_backup /path_to/to_backup.sh //表示当切换到backup状态时要执行的脚本notify_fault "/path/fault.sh VG_1"  // keepalived出现故障时执行的脚本notify /path/to/notify.sh  smtp_alert           //表示切换时给global defs中定义的邮件地址发送邮件通知

2.2 VRRP实例(instance)配置范例

vrrp_instance http {  //注意vrrp_instance 后面可自定义名称如lvs_httpd ,httpdstate MASTERinterface eth0dont_track_primarytrack_interface {eth0eth1}mcast_src_ip <IPADDR>garp_master_delay 10virtual_router_id 51priority 100advert_int 1authentication {auth_type PASSautp_pass 1234}virtual_ipaddress {#<IPADDR>/<MASK> brd <IPADDR> dev <STRING> scope <SCOPT> label <LABEL>192.168.200.17/24 dev eth1192.168.200.18/24 dev eth2 label eth2:1}virtual_routes {# src <IPADDR> [to] <IPADDR>/<MASK> via|gw <IPADDR> dev <STRING> scope <SCOPE> tabsrc 192.168.100.1 to 192.168.109.0/24 via 192.168.200.254 dev eth1192.168.110.0/24 via 192.168.200.254 dev eth1192.168.111.0/24 dev eth2192.168.112.0/24 via 192.168.100.254}nopreemptpreemtp_delay 300debug}

state: state指定instance(Initial)的初始状态就是说在配置好后这台 服务器的初始状态就是这里指定的但这里指定的不算还是得要通过竞选通过优先级来确定里如果这里设置为master但如若他的优先级不及另外一台 那么这台在发送通告时会发送自己的优先级另外一台发现优先级不如自己的高那么他会就回抢占为master

interface: 实例绑定的网卡因为在配置虚拟VIP的时候必须是在已有的网卡上添加的

dont track primary: 忽略VRRP的interface错误

track interface: 跟踪接口设置额外的监控里面任意一块网卡出现问题都会进入故障(FAULT)状态例如用nginx做均衡器的时候内网必须正常工作如果内网出问题了这个均衡器也就无法运作了所以必须对内外网同时做健康检查

mcast src ip: 发送多播数据包时的源IP地址这里注意了这里实际上就是在那个地址上发送VRRP通告这个非常重要一定要选择稳定的网卡端口来发送这里相当于heartbeat的心跳端口如果没有设置那么就用默认的绑定的网卡的IP也就是interface指定的IP地址

garp master delay: 在切换到master状态后延迟进行免费的ARP(gratuitous ARP)请求,默认5s


virtual router id: 这里设置VRID这里非常重要相同的VRID为一个组他将决定多播的MAC地址

priority 100: 设置本节点的优先级优先级高的为master

advert int: 设置MASTER与BACKUP负载均衡之间同步即主备间通告时间检查的时间间隔,单位为秒,默认1s

virtual ipaddress: 这里设置的就是VIP也就是虚拟IP地址他随着state的变化而增加删除当state为master的时候就添加当state为backup的时候删除这里主要是有优先级来决定的和state设置的值没有多大关系这里可以设置多个IP地址

virtual routes: 原理和virtual ipaddress一样只不过这里是增加和删除路由

lvs sync daemon interface: lvs syncd绑定的网卡,类似HA中的心跳检测绑定的网卡

authentication: 这里设置认证

auth type: 认证方式可以是PASS或AH两种认证方式


auth pass: 认证密码

nopreempt: 设置不抢占master,这里只能设置在state为backup的节点上而且这个节点的优先级必须别另外的高,比如master因为异常将调度圈交给了备份serve,master serve检修后没问题,如果不设置nopreempt就会将调度权重新夺回来,这样就容易造成业务中断问题

preempt delay: 抢占延迟多少秒,即延迟多少秒后竞选master

debug: debug级别

notify master: 和sync group这里设置的含义一样可以单独设置例如不同的实例通知不同的管理人员http实例发给网站管理员mysql的就发邮件给DBA

3. VRRP脚本

如下所示为相关配置示例

vrrp_script check_running {script "/usr/local/bin/check_running"interval 10weight 10}vrrp_instance http {state BACKUPsmtp_alertinterface eth0virtual_router_id 101priority 90advert_int 3authentication {auth_type PASSauth_pass whatever}virtual_ipaddress {1.1.1.1}track_script {check_running }}

首先在vrrp_script区域定义脚本名字和脚本执行的间隔和脚本执行的优先级变更,如下所示:

vrrp_script check_running {script "/usr/local/bin/check_running"interval 10     #脚本执行间隔weight 10       #脚本结果导致的优先级变更10表示优先级+10-10则表示优先级-10}

然后在实例(vrrp_instance)里面引用有点类似脚本里面的函数引用一样先定义后引用函数名

track_script {check_running }

注意:

VRRP脚本(vrrp_script)和VRRP实例(vrrp_instance)属于同一个级别

keepalived会定时执行脚本并对脚本执行的结果进行分析,动态调整vrrp_instance的优先级。一般脚本检测返回的值为0,说明脚本检测成功,如果为非0数值,则说明检测失败

如果脚本执行结果为0,并且weight配置的值大于0,则优先级相应的增加, 如果weight为非0,则优先级不变

如果脚本执行结果非0,并且weight配置的值小于0,则优先级相应的减少, 如果weight为0,则优先级不变

其他情况,维持原本配置的优先级,即配置文件中priority对应的值。

这里需要注意的是:

1) 优先级不会不断的提高或者降低

2) 可以编写多个检测脚本并为每个检测脚本设置不同的weight

3) 不管提高优先级还是降低优先级,最终优先级的范围是在[1,254],不会出现优先级小于等于0或者优先级大于等于255的情况

这样可以做到利用脚本检测业务进程的状态,并动态调整优先级从而实现主备切换。

三.virtual_server配置
virtual_server配置分为两大部分:1.虚拟主机组配置; 2.虚拟主机配置

1.虚拟主机组配置文件详解

这个配置是可选的根据需求来配置吧这里配置主要是为了让一台realserver上的某个服务可以属于多个Virtual Server并且只做一次健康检查

virtual_server_group <STRING> {# VIP port<IPADDR> <PORT><IPADDR> <PORT>fwmark <INT>}

2. 虚拟主机配置

关于keeplived的虚拟主机配置有三种如下所示

virtual server IP port
virtual server fwmark int
virtual server group string

通常我们比较常用的是第一种配置语法下面以第一种比较常用的方式来配详细解说一下相关配置项说明

virtual_server 192.168.1.2 80 {        delay_loop 3                          lb_algo rr|wrr|lc|wlc|lblc|sh|dh    lb_kind NAT|DR|TUN                                    persistence_timeout 120                persistence_granularity <NETMASK>     protocol TCP                           ha_suspend                            virtualhost <string>                  sorry_server <IPADDR> <PORT>          real_server <IPADDR> <PORT>  {weight 1                              inhibit_on_failure                   notify_up <STRING> | <QUOTED-STRING>   notify_down <STRING> | <QUOTED-STRING> HTTP_GET                              {url {                                  path /                                digest <STRING>                                            status_code 200                        }connect_port 80                        bindto <IPADD>                         connect_timeout   3                   nb_get_retry 3                         delay_before_retry 2                   } 

配置项说明
virtual_server 192.168.1.2 80         

含义设置一个virtual server: VIP:Vport

delay_loop 3                                  

含义:健康检查的时间间隔


lb_algo rr|wrr|lc|wlc|lblc|sh|dh       

含义:设置LVS调度算法

lb_kind NAT|DR|TUN

含义:设置LVS集群模式  

                   
persistence_timeout 120                               

含义:设置会话保持时间秒为单位即以用户在120秒内被分配到同一个后端realserver,超过此时间就重新分配

persistence_granularity <NETMASK>            

含义:设置LVS会话保持粒度ipvsadm中的-M参数默认是0xffffffff即每个客户端都做会话保持


protocol TCP                                                 

含义:设置健康检查用的是TCP还是UDP


ha_suspend                                                  

含义:suspendhealthchecker’s activity

virtualhost <string>                                      

含义:HTTP_GET做健康检查时检查的web服务器的虚拟主机即host头

sorry_server <IPADDR> <PORT>                 

含义:设置backupserver就是当所有后端realserver节点都不可用时就用这里设置的也就是临时把所有的请求都发送到这里

real_server <IPADDR> <PORT>     

含义:设置后端真实节点主机的权重等设置主要后端有几台这里就要设置几个

weight 1                               

含义:设置给每台的权重0表示失效(不知给他转发请求知道他恢复正常)默认是1

inhibit_on_failure                               

含义:表示在节点失败后把他权重设置成0而不是冲IPVS中删除

notify_up <STRING> | <QUOTED-STRING> 

含义:设置检查服务器正常(UP)后要执行的脚本
notify_down <STRING> | <QUOTED-STRING> 

含义:设置检查服务器失败(down)后要执行的脚本

注:keepalived检查机制说明

keepalived健康检查方式有:HTTP_GET|SSL_GET|TCP_CHECK|SMTP_CHECK|MISC_CHECK几种如下所示

1:TCP_CHECK:工作在第4层,keepalived向后端服务器发起一个tcp连接请求,如果后端服务器没有响应或超时,那么这个后端将从服务器池中移除。

2:HTTP_GET:工作在第5层,向指定的URL执行http请求,将得到的结果用md5加密并与指定的md5值比较看是否匹配,不匹配则从服务器池中移除;此外还可以指定http返回码来判断检测是否成功。HTTP_GET可以指定多个URL用于检测,这个一台服务器有多个虚拟主机的情况下比较好用。

3:SSL_GET:跟上面的HTTP_GET相似,不同的只是用SSL连接

4:MISC_CHECK:用脚本来检测,脚本如果带有参数,需将脚本和参数放入双引号内。脚本的返回值需为:

            0)  检测成功

            1)  检测失败,将从服务器池中移除

            2-255)检测成功;如果有设置misc_dynamic,权重自动调整为 退出码-2,如退出码为200,权重自动调整为198=200-2。

5:SMTP_CHECK:用来检测邮件服务的smtp的

#HTTP/HTTPS方式 

HTTP_GET|SSL_GET {    设置健康检查方式


url {             设置要检查的URL可以有多个

path /             设置URL具体路径

digest <STRING>       #检查后的摘要信息这些摘要信息可以通过genhash命令工具获取                                   
status_code 200       设置返回状态码
}
connect_port 80       设置监控检查的端口
bindto  <IPADD>      设置健康检查的IP地址
connect_timeout   3   设置连接超时时间
nb_get_retry  3      设置重连次数
delay_before_retry  2  设置重连间隔


#TCP方式  
TCP_CHECK     {

connect_port 80       设置监控检查的端口
bindto  <IPADD>      设置健康检查的IP地址
connect_timeout   3   设置连接超时时间
nb_get_retry  3      设置重连次数
delay_before_retry  2  设置重连间隔

}

#SMTP方式 (这个可以用来给邮件服务器做集群)
SMTP_CHECK {
host {
connect_ip <IP ADDRESS>
connect_port <PORT>     #默认检查25端口
14 KEEPALIVED
bindto <IP ADDRESS>
}
connect_timeout <INTEGER>
retry <INTEGER>
delay_before_retry <INTEGER>
# "smtp HELO"|·-ê§à"
helo_name <STRING>|<QUOTED-STRING>


#MISC方式 这个可以用来检查很多服务器只需要自己会些脚本即可
MISC_CHECK {

misc_path <STRING>|<QUOTED-STRING>  #外部程序或脚本
misc_timeout <INT>            #脚本或程序执行超时时间
misc_dynamic                                              

#这个就很好用了可以非常精确的来调整权重是后端每天服务器的压力都能均衡调配这个主要是通过执行的程序或脚本返回的状态代码来动态调整weight值使权重根据真实的后端压力来适当调整不过这需要有过硬的脚本功夫才行哦
#返回0健康检查没问题不修改权重
#返回1健康检查失败权重设置为0
#返回2-255健康检查没问题但是权重却要根据返回代码修改为返回码-2例如如果程序或脚本执行后返回的代码为200#那么权重这回被修改为 200-2
}
以上就是keepalived的配置项说明虽然配置项很多但很多时候很多配置项保持默认即可。如下为一个keepalived的配置参考模板样例

global_defs {notification_email {admin@example.com}notification_email_from admin@example.comsmtp_server 127.0.0.1stmp_connect_timeout 30router_id web_cluster}#static_ipaddress {#192.168.1.1/24 brd + dev eth0 scope global#192.168.1.2/24 brd + dev eth1 scope global#}#static_routes {#src $SRC_IP to $DST_IP dev $SRC_DEVICE#src $SRC_IP to $DST_IP via $GW dev $SRC_DEVICE#}#vrrp_sync_group lvsg_1 {#group {#lvs_http#}#notify_master /path/to/to_master.sh#notify_backup /path_to/to_backup.sh#notify_fault "/path/fault.sh VG_1"#notify /path/to/notify.sh#smtp_alert#}vrrp_script check_running {script "/usr/local/bin/check_running"interval 10weight 10}vrrp_instance lvs_http {state MASTERinterface eth0#dont_track_primarytrack_interface {eth0eth1}mcast_src_ip 127.0.0.1garp_master_delay 10virtual_router_id 51priority 100advert_int 1authentication {auth_type PASSautp_pass 1234}virtual_ipaddress {#<IPADDR>/<MASK> brd <IPADDR> dev <STRING> scope <SCOPT> label <LABEL>192.168.200.17/24 dev eth1#192.168.200.18/24 dev eth2 label eth2:1}#virtual_routes {# src <IPADDR> [to] <IPADDR>/<MASK> via|gw <IPADDR> dev <STRING> scope <SCOPE> tab#src 192.168.100.1 to 192.168.109.0/24 via 192.168.200.254 dev eth1#192.168.110.0/24 via 192.168.200.254 dev eth1#192.168.111.0/24 dev eth2#192.168.112.0/24 via 192.168.100.254#}track_script {check_running }nopreemptpreemtp_delay 300#debug}#virtual_server_group <STRING> {# VIP port#<IPADDR> <PORT>#<IPADDR> <PORT>#fwmark <INT>#}virtual_server 192.168.1.2 80 {delay_loop 3lb_algo rrlb_kind DRpersistence_timeout 120#persistence_granularity <NETMASK>protocol TCP#ha_suspend#virtualhost <string>sorry_server 127.0.0.1real_server 192.168.0.100 80 {weight 1#inhibit_on_failure #notify_up <STRING> | <QUOTED-STRING>#notify_down <STRING> | <QUOTED-STRING>HTTP_GET  {url { path / digest <STRING>                                            status_code 200}connect_port 80 #bindto <IPADD>connect_timeout   3nb_get_retry 3delay_before_retry 2} }}   

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/866604.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MViT(ICCV 2021, Meta)论文解读

paper&#xff1a;Multiscale Vision Transformers official implementation&#xff1a;https://github.com/facebookresearch/SlowFast 背景和出发点 这篇文章提出了多尺度视觉Transformer&#xff08;Multiscale Vision Transformers, MViT&#xff09;的概念&#xff0c…

全网视频下载之IDM下载安装,软破解

全网视频下载之IDM下载安装&#xff0c;软破解 介绍![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/c94f612f7a8845c8a649f74f6b18fd70.png)下载安装配置浏览器Google浏览器Ddge浏览器 界面如何下载不破解如何重复使用总结 介绍 今天给大家分享一个更加简便的全网视…

小型气象站在现代农业中的应用与前景

随着科技的飞速发展&#xff0c;智慧农业已成为现代农业发展的重要趋势。在这一背景下&#xff0c;小型气象站作为智慧农业的重要组成部分&#xff0c;正逐渐展现出其独特的价值和广阔的应用前景。本文将从小型气象站的定义、功能、应用案例以及未来展望等方面&#xff0c;探讨…

【数据结构/C++】位图

这里写自定义目录标题 哈希思想的应用位图位图概念经典面试题位图所开的空间大小STL库中的 bitset 位图 位图实现大框架位运算符<<左移 和 >>右移 移动的方位set()&#xff1a;把x映射的位标记成1set() 接口实现reset&#xff1a;把x映射的位标记成0reset() 接口te…

Static关键字的用法详解

Static关键字的用法详解 1、Static修饰内部类2、Static修饰方法3、Static修饰变量4、Static修饰代码块5、总结 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&#x1f496; 在Java编程语言中&#xff0c;static是一个关键字&#xff0c;它可以用于多种上…

React+TS前台项目实战(二十三)-- 基于属性自定义数值显示组件Decimal封装

文章目录 前言Decimal组件1. 功能分析2. 代码详细注释3. 使用方式4. 效果展示 总结 前言 今天要封装的Decimal 组件&#xff0c;是通过传入的属性进行定制化显示数值&#xff0c;在渲染时&#xff0c;会根据不同的情况显示整数部分、小数部分和单位&#xff0c;支持自定义样式…

shell脚本awk中使用for循环

今天想使用shell脚本处理一ini文件下的ip地址&#xff0c;也就是INTRANET&#xff0c;前面的ip地址&#xff0c;折腾挺久。文件格式如下&#xff1a; 正确代码&#xff1a; grep -E INTRANET /home/aaaa/bbbb/hostinfo.ini | awk -F , {for(i1; i<NF; i) if($i~"INT…

全国现状建筑数据,选中范围即可查询下载,富含建筑物位置、层数、建筑物功能、名称地址等信息!

今天分享的是一个绘制范围即可下载范围内的建筑数据下载工具&#xff0c;内含高质量建筑数据数据源&#xff0c;助力场地建设规模一目了然。 数据可视化&#xff1a; 建筑物位置、层数、建筑轮廓地图可见&#xff0c;辅助分析。 数据字段&#xff1a; 建筑高度、层数、基地面…

2024年度最佳大型语言模型(LLMs)汇总大全

大型语言模型(LLMs)是人工智能文本处理的主要类型&#xff0c;也现在最流行的人工智能应用形态。ChatGPT是迄今为止最著名的使用LLM的工具&#xff0c;它由OpenAI的GPT模型的特别调整版本提供动力。但还有许多其他聊天机器人和文本生成器&#xff0c;包括从Google Bard和Anthro…

加速度传感器信号处理注意事项

1 传感器分类 对于压电式压力传感器而言&#xff0c;输出信号是最重要的选择标准之一。压电式压力传感器与电子电路相连&#xff0c;电子电路将传感器产生的电荷成比例转换为电压。 如果选用外部设备&#xff08;电荷放大器&#xff09;充当电子元件&#xff0c;则称其为电…

【毛发教程】使用 Maya、XGen 和虚幻引擎创建马尾辫发型

Malte Resenberger-Loosmann是国外一名首席艺术家&#xff0c;他负责指导整个艺术部门来制作独立游戏项目中的3D建模。在本文中&#xff0c;Loosmann展示了马尾辫发型背后的工作流程&#xff0c;分享了 Maya 和虚幻引擎中的场景设置&#xff0c;并解释了 GS CurveTools 如何帮助…

基于IIS的Windows系统Django项目本地部署

参考&#xff1a; 1. 基于Windows平台的Django本地部署和腾讯云服务器上部署&#xff08;1&#xff09;_如何在服务器上发布部署django程序 csdn-CSDN博客 2.Windows server iis部署Django详细操作 - Django中文 - 博客园 (cnblogs.com) 3.在IIS中部署pythonDjango项目时出…

Python: 分块读取文本文件

在处理大文件时&#xff0c;逐行或分块读取文件是很常见的需求。下面是几种常见的方法&#xff0c;用于在 Python 中分块读取文本文件&#xff1a; 1、问题背景 如何分块读取一个较大的文本文件&#xff0c;并提取出特定的信息&#xff1f; 问题描述: fopen(blank.txt,r) quot…

使用任意电脑通过内网穿透生成的公网地址远程SSH连接本地Windows电脑

文章目录 前言1. Windows安装SSH服务2. Windows本地连接测试3. Windows安装Cpolar工具4. 配置SSH公网地址5. 远程SSH 连接测试6. 固定SSH公网地址7. 固定SSH地址测试 前言 在当今的数字化转型时代&#xff0c;远程连接和管理计算机已成为日常工作中不可或缺的一部分。对于Wind…

微信小程序留言板1

wxml&#xff1a; <view class"view2"> <text class"test1">留言&#xff1a;</text><input type"text" class"input1" bindinput"ipt"/><button class"btn" bindtap"btn"…

spring mvc学习

第四章 Spring MVC 第一节 Spring MVC 简介 1. Spring MVC SpringMVC是一个Java 开源框架&#xff0c; 是Spring Framework生态中的一个独立模块&#xff0c;它基于 Spring 实现了Web MVC&#xff08;数据、业务与展现&#xff09;设计模式的请求驱动类型的轻量级Web框架&am…

「媒体邀约」全国巡演,多地推介会,如何做好媒体宣传

传媒如春雨&#xff0c;润物细无声&#xff0c;大家好&#xff0c;我是51媒体网胡老师。 媒体宣传加速季&#xff0c;100万补贴享不停&#xff0c;一手媒体资源&#xff0c;全国100城线下落地执行。详情请联系胡老师。 我们在做多地活动的时候&#xff0c;比如演唱会&#xff…

【LeetCode】十一、滑动窗口:长度最小的子数组 + 定长子串的元音最大数目

文章目录 1、滑动窗口2、leetcode209&#xff1a;长度最小的子数组3、leetcode1456&#xff1a;定长子串中元音的最大数目 1、滑动窗口 如下&#xff0c;有一个数组&#xff0c;现三个元素为一组&#xff0c;求最大的和&#xff0c;自然可以while循环实现&#xff1a;i 、i1、…

数据结构(Java):迭代器遍历【底层源码解析】

1、引言 我们知道&#xff0c;对于List系列集合&#xff0c;添加的元素是有序、可重复、有索引的&#xff1b;而对于Set系列集合&#xff0c;添加的元素是无序、不重复、无索引的。 那么使用for循环通过下标来对Set系列集合进行遍历&#xff0c;那显然是不行的。 迭代器就可…

51单片机-让一个LED灯闪烁、流水灯(涉及:自定义单片机的延迟时间)

目录 设置单片机的延迟&#xff08;睡眠&#xff09;函数查看单片机的时钟频率设置系统频率、定时长度、指令集 完整代码生成HEX文件下载HEX文件到单片机流水灯代码 (自定义延迟时间) 设置单片机的延迟&#xff08;睡眠&#xff09;函数 查看单片机的时钟频率 检测前单片机必…