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.loc

   sysadmin@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 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

}

这里实际上和系统里面命令配置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 ,httpd

group {

http

mysql

}

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 

}

其中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 ,httpd

state MASTER

interface eth0

dont_track_primary

track_interface {

eth0

eth1

}

mcast_src_ip <IPADDR>

garp_master_delay 10

virtual_router_id 51

priority 100

advert_int 1

authentication {

auth_type PASS

autp_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

}

nopreempt

preemtp_delay 300

debug

}

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 10

   weight 10

}



vrrp_instance http {

   state BACKUP

   smtp_alert

   interface eth0

   virtual_router_id 101

   priority 90

   advert_int 3

   authentication {

   auth_type PASS

   auth_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.com

       smtp_server 127.0.0.1

       stmp_connect_timeout 30

       router_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 10

   weight 10

}



vrrp_instance lvs_http {

state MASTER

interface eth0

#dont_track_primary

track_interface {

eth0

eth1

}

mcast_src_ip 127.0.0.1

garp_master_delay 10

virtual_router_id 51

priority 100

advert_int 1

authentication {

auth_type PASS

autp_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 

}



nopreempt

preemtp_delay 300

#debug

}



#virtual_server_group <STRING> {

# VIP port

#<IPADDR> <PORT>

#<IPADDR> <PORT>

#fwmark <INT>

#}



virtual_server 192.168.1.2 80 {

delay_loop 3

lb_algo rr

lb_kind DR

persistence_timeout 120

#persistence_granularity <NETMASK>

protocol TCP

#ha_suspend

#virtualhost <string>



sorry_server 127.0.0.1



real_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   3

     nb_get_retry 3

     delay_before_retry 2

     } 

   }

}   

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于Redisson实现分布式锁

基于redisson实现分布式锁 之前背过分布式锁几种实现方案的八股文&#xff0c;但是并没有真正自己实操过。现在对AOP有了更深一点的理解&#xff0c;就自己来实现一遍。 1、分布式锁的基础知识 分布式锁是相对于普通的锁的。普通的锁在具体的方法层面去锁&#xff0c;单体应…

搜维尔科技:详谈ART的工具追踪技术

您的生产流程中是否已经受益于刀具跟踪系统&#xff1f;您是否意识到它们的价值&#xff1f;因为它们可以优化您的装配顺序&#xff0c;从而节省您的时间和金钱。 目前我们提供两种工具跟踪解决方案&#xff1a; 1.ART与 VERPOSE的解决方案——易于使用的图像识别 安装在工…

探索智能合约在医疗健康领域的革新应用

随着区块链技术的发展&#xff0c;智能合约作为其重要应用之一&#xff0c;在医疗健康领域展示了巨大的潜力和革新性。智能合约是一种基于区块链的自动化执行协议&#xff0c;它可以在无需中介的情况下执行和验证合同。在医疗健康领域&#xff0c;智能合约不仅简化了数据管理和…

房屋租赁管理小程序的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;用户管理&#xff0c;中介管理&#xff0c;房屋信息管理&#xff0c;房屋类型管理&#xff0c;租房订单管理&#xff0c;租房信息管理 微信端账号功能包括&#xff1a;系统首页&#xff0c;房屋信息&a…

ctfshow-web入门-命令执行(web66-web70)

目录 1、web66 2、web67 3、web68 4、web69 5、web70 1、web66 show_source 被禁用 highlight_file 发现 flag 不在 flag.php 里面 先使用 scandir() 进行目录扫描&#xff1a; cprint_r(scandir("./")); 当前目录下只有 index.php 和 flag.php 扫一下根目…

图书商城系统java项目ssm项目jsp项目java课程设计java毕业设计

文章目录 图书商城系统一、项目演示二、项目介绍三、部分功能截图四、部分代码展示五、底部获取项目源码&#xff08;9.9&#xffe5;带走&#xff09; 图书商城系统 一、项目演示 图书商城系统 二、项目介绍 语言: Java 数据库&#xff1a;MySQL 技术栈&#xff1a;SpringS…

「ETL趋势」FDL定时任务区分开发/生产模式、API输入输出支持自定义响应解析

FineDataLink作为一款市场上的顶尖ETL工具&#xff0c;集实时数据同步、ELT/ETL数据处理、数据服务和系统管理于一体的数据集成工具&#xff0c;进行了新的维护迭代。本文把FDL4.1.7最新功能作了介绍&#xff0c;方便大家对比&#xff1a;&#xff08;产品更新详情&#xff1a;…

spark shuffle——shuffle管理

ShuffleManager shuffle系统的入口。ShuffleManager在driver和executor中的sparkEnv中创建。在driver中注册shuffle&#xff0c;在executor中读取和写入数据。 registerShuffle&#xff1a;注册shuffle&#xff0c;返回shuffleHandle unregisterShuffle&#xff1a;移除shuff…

LED显示屏跟COB显示屏有哪些不同?

COB显示屏跟LED显示屏的主要区别在于产品的显示效果、封装技术、耐用性、防护力、维护以及制造成本方面的不同&#xff0c;这里所说的LED显示屏主要指的是使用SMD封装的LED显示屏&#xff0c;今天跟随COB显示屏厂家中品瑞科技一起来详细看看具体分析&#xff1a; 一、封装技术 …

视图库对接系列(GA-T 1400)九、视图库对接系列(本级)机动车数据推送

背景 在上几章中,我们已经可以将视图库的平台写到我们的数据库中了。 换句话说就已经接入我们的平台了,这几期的话,我们就对接设备, 将设备的数据接入到我们平台来。 机动车数据推送 接入机动车数据推送相对比较简单,我们只需要实现对应的接口就ok了。 具体如图: 有增…

77. UE5 RPG 创建角色的技能栏

在前面的文章里&#xff0c;我们实现了角色属性技能和场景。接下来&#xff0c;我们要优化角色显示UI&#xff0c;在屏幕底部显示角色血量&#xff0c;蓝量&#xff0c;技能和经验值。 创建新的用户控件 选择创建新的控件蓝图 父类为我们自定义的RPGUserWidget&#xff0c;这…

这样拼板帮你省近万元,堪称PCB工程师成本终结者!

别再被骗了&#xff0c;打PCB板价格高不是单价高&#xff01;而是你的拼板导致利用率太低了&#xff01; 今天给大家讲个小故事&#xff0c;教大家如何省钱...... 一个爽朗的晴天&#xff0c;我听闻同事说有客户对他吐槽打板子价格太高&#xff0c;说着说着就开始吹起了牛逼...…

【论文阅读】VASA-1: Lifelike Audio-Driven Talking FacesGenerated in Real Time

整体框架。不直接生成视频帧&#xff0c;而是在潜在空间中生成整体面部动态和头部运动&#xff0c;条件是音频和其他信号。给定这些运动潜在编码&#xff0c;通过面部解码器生成视频帧&#xff0c;还接受从输入图像中提取的外观和身份特征作为输入。 构建了一个面部潜在空间并…

【C#】ProgressBar进度条异步编程思想

1.控件介绍 进度条通常用于显示代码的执行进程进度&#xff0c;在一些复杂功能交互体验时告知用户进程还在继续。 在属性栏中&#xff0c;有三个值常用&#xff1a; Value表示当前值&#xff0c;Minimum表示进度条范围下限&#xff0c;Maximum表示进度条范围上限。 2.简单实…

【网络安全】第8讲 网络安全协议(笔记)

一、网络安全协议概述 1、协议 是指两个或多个以上参与者为完成某项特定的任务而采取的一系列步骤。 2、网络协议 是指计算机网络中通信各方关于如何进行数据交换所达成的一致性规则、标准或约定的集合&#xff0c;即由参与通信的各方按确定的步骤做出一系列通信动作&#xff…

Linux系统安装青龙面板结合内网穿透实现使用公网地址远程访问

文章目录 前言一、前期准备本教程环境为&#xff1a;Centos7&#xff0c;可以跑Docker的系统都可以使用。本教程使用Docker部署青龙&#xff0c;如何安装Docker详见&#xff1a; 二、安装青龙面板三、映射本地部署的青龙面板至公网四、使用固定公网地址访问本地部署的青龙面板 …

Embedded Coder生成C代码注释

学习目标 本教程将向您说明如何生成包含以下内容的代码&#xff1a; 在函数前注中包含函数签名和函数帮助文本。包含 MATLAB 源代码&#xff0c;以带有可追溯性标记的注释表示。在代码生成报告中&#xff0c;可追溯性标记链接到对应的 MATLAB 源代码。 前提条件 要完成本教…

入门PHP就来我这(纯干货)08

~~~~ 有胆量你就来跟着路老师卷起来&#xff01; -- 纯干货&#xff0c;技术知识分享 ~~~~ 路老师给大家分享PHP语言的知识了&#xff0c;旨在想让大家入门PHP&#xff0c;并深入了解PHP语言。 1 PHP对象的高级应用 1.1 final关键字 final 最终的、最后的。被final修饰过的类…

固相提取铕和铀

固相萃取&#xff08;Solid Phase Extraction&#xff0c;SPE&#xff09;是一种常用的化学分离技术&#xff0c;它利用固体吸附剂&#xff08;固定相&#xff09;与样品中的目标化合物&#xff08;流动相&#xff09;之间的相互作用力&#xff0c;将目标化合物从样品中分离出来…

JVM的五大内存区域

JVM的五大内存区域 JVM内存区域最粗略的划分可以分为 堆 和 栈 &#xff0c;当然&#xff0c;按照虚拟机规范&#xff0c;可以划分为以下几个区域&#xff1a; JVM内存分为线程独享区和线程共享区&#xff0c; 其中 方法区 和 堆 是线程共享区&#xff0c; 虚拟机栈, 本地方法…