当前位置: 首页 > news >正文

keepalived+LVS配置详解

keepalived+LVS配置详解

  • keepalived简介
  • keepalived的应用场景
  • keepalived工作原理
    • VRRP协议
    • 核心组件
    • 分层工作
    • 工作状态
  • LVS简介
  • LVS三种模式
    • NAT模式(网络地址映射)
    • IPTUN模式(IP隧道)
    • DR模式(直接路由)
      • 三种模式对比
  • keepalived+LVS配置
    • 1.master配置
    • 2. keepalived配置文件
    • 3 修改keepalived配置文件
      • 3.1配置VIP
      • 3.2 配置负载均衡策略
    • 4 配置web01节点(192.168.182.132)
      • 4.1 安装httpd服务
      • 4.2 调整proc响应参数
      • 4.3 设置路由
    • `web02的操作和上面web01一样`
    • 测试

keepalived简介

Keepalived的作用是检测服务器的状态,如果有一台web服务器宕机,或工作出现故障,Keepalived将检测到,并将有故障的服务器从系统中剔除,同时使用其他服务器代替该服务器的工作,当服务器工作正常后Keepalived自动将服务器加入到服务器群中,这些工作全部自动完成,不需要人工干涉,需要人工做的只是修复故障的服务器。

Keepalived软件起初是专为LVS负载均衡软件设计的,用来管理并监控LVS集群系统中各个服务节点的状态,后来又加入了可以实现高可用的VRRP功能。因此,Keepalived除了能够管理LVS软件外,还可以作为其他服务(例如:Nginx、Haproxy、MySQL等)的高可用解决方案软件。

Keepalived软件主要是通过VRRP协议实现高可用功能的。VRRP全名Virtual Route RedundancyProtocol(虚拟路由冗余协议),VRRP出现的目的就是为了解决静态路由单点故障问题,它能够保证当个别节点宕机时,整个网络可以不间断地运行,所以,keepalived 一方面具有配置管理LVS的功能,同时还具有对LVS下面节点进行健康检查的功能,另一方面也可实现系统网络服务的高可用功能。

keepalived的应用场景

  • 管理LVS软件
  • 基于VRRP实现高可用
  • 健康检查,故障切换
    keepalived官网地址
    通过官网介绍,我们可以得知keepalived提供的两个重要的功能:loadbalancing和high-availability。最初是专门为了LVS负载均衡软件设计的,可以用来管理并监控LVS集群系统中各个服务节点的状态,后来的版本中又加入了可以实现高可用的VRRP功能。

keepalived主要有两种应用场景,一个是通过配置keepalived结合ipvs做到负载均衡(LVS+Keepalived);另一个是通过自身健康检查、资源接管等功能做高可用(双机热备),实现故障转移,功能近似于Heartbeat。

keepalived工作原理

VRRP协议

keepalived是以VRRP协议为实现基础的,VRRP全称Vritual Router Redundancy Protocol,即虚拟路由冗余协议,可以认为是实现路由器高可用的协议。

  • VRRP是用来实现路由器冗余的协议。
  • VRRP协议是为了消除在静态缺省路由环境下路由器单点故障引起的网络失效而设计的主备模式的协议,使得发生故障而进行设计设备功能切换时可以不影响内外数据通信,不需要再修改内部网络的网络参数。
  • VRRP协议需要具备有IP备份,优先路由选择,减少不必要的路由器通信等功能。
  • VRRP协议将两台或多台路由器虚拟成一个设备,对外提供虚拟路由器IP(一个或多个)。然而,在路由器组内部,如果实际拥有这个对外IP的路由器如果工作正常的话,就是master,或者是通过算法选举产生的,master实现针对虚拟路由器IP的各种网络功能,如ARP请求,ICMP,以及数据的转发等,其他设备不具有该IP,状态时backup。除了接收master的VRRP状态通告信息外,不执行对外的网络功能,当主机失效时,backup将接管原先master的网络功能。
  • VRRP协议配置时,需要配置每个路由器的虚拟路由ID(VRID)和优先权值,使用VRID将路由器进行分组,具有相同VRID值的路由器为同一个组,VRID是一个0-255的整整数;同一个组中的路由器通过使用优先权值来选举MASTER。优先权大者为MASTER,优先权也是一个0-255的正整数。
    在高可用场景,就是把路由器换成服务器或者服务器上的应用:

通常情况下是将两台linux服务器组成一个热备组(master-backup),同一时间热备组内只有一台主服务器(master)提供服务,同时master会虚拟出一个共用IP地址(VIP),这个VIP只存在master上并对外提供服务。

如果keepalived检测到master宕机或服务故障,备服务器(backup)会自动接管VIP成为master,keepalived并将master从热备组移除,当master恢复后,会自动加入到热备组,默认再抢占成为master,起到故障转移功能。

核心组件

keepalived是模块化设计,不同模块负责不同的功能,主要有三个模块,分别是core、check和VRRP。

  • core模块:为keepalived的核心组件,负责住进程启动、维护以及全局配置文件的加载和解析;
  • check模块:负责健康检查,包括常见的各种检查方式,这里的配置决定了工作在哪个层;
  • VRRP模块:是实现VRRP协议的。

此外还有:

  • system call:系统调用
  • watch dog:监控check和vrrp进程的看管者
  • libipfwc:iptables(ipchains)库,配置LVS会用到
  • libipvs*:配置LVS时会用到

分层工作

keepalived做负载均衡时工作在TCP/IP协议的3/4/5层,做高可用时工作在OSI七层模型的3/4/7层,基本上一样的。

分层功能相关协议
应用层网络服务和最终用户的一个接口TFTP,HTTP,SNMP,DNS,FTP,SMTP,TELNET
表示层数据的表示、安全、压缩无协议
会话层会话的建立、管理、中止无协议
传输层定义传输数据的协议端口号,以及流程和差错校验TCP,UDP
网络层进行逻辑地址寻址,实现不同网络之间的路径选择IP,ICMP,RIP,OSPF,BGP,IGMP
数据链路层建立逻辑连接、硬件地址寻址、差错校验等功能SLIP,CSLIP,PPP,ARP,RARP,MTU
物理层建立、连接、断开物理连接ISO2110,IEEE802,IEEE802.2

具体工作层数,区别于使用的哪一个网络协议来进行的健康检查:

Layer3:工作在三层时,keepalived会定期向热备组中的服务器发送一个ICMP数据包,来判断某台服务器是否故障,如果没有响应则将这台服务器从热备组移除。

Layer4:工作在四层时,keepalived以TCP端口的状态判断服务器是否故障,比如MySQL的3306端口,如果无法访问则将这台服务器从热备组移除。

Layer7:工作在七层时,keepalived根据用户设定的策略判断服务器上的程序是否正常运行,比如HTTP请求的方式,如果返回错误状态码则将这台服务器从热备组移除。

在Keepalived服务器群之间,只有作为主的服务器不断发送VRRP广播包,告诉备它还活着,此时备不会抢占主,只有当主不可用,既备接受不到主的VRRP广播包,这时候备就会启动相关的服务接管主的任务向外提供服务,以保证服务的正常使用。

工作状态

keepalived正常启动的时候,共启动3个进程:
一个父进程,负责监控其子进程;一个时VRRP子进程,另外一个是checkers子进程;两个子进程都被系统watchlog看管,Healthcheck子进程检查各自服务器的健康状况。如果healthchecks进程检查到master上服务不可用了,就会通知本机上的VRRP子进程,让他删除通告,兵器去掉虚拟IP,转换为BACKUP状态。

LVS简介

LVS官网
LVS中文站点
LVS 是 Linux Virtual Server 的简写,即Linux虚拟服务器,是一个虚拟的服务器集群系统,是根据iptables的实现来开发的,所以使用时会和iptables相似。

LVS三种模式

NAT模式(网络地址映射)

NAT模式工作原理是:客户端访问LVS时,LVS通过重写请求报文的目标地址,且根据预设的调度算法,将请求分派给后端真实服务器,真实服务器接收到请求处理后,发出响应报文也需要通过LVS返回,返回时需要修改报文的源地址,然后返回给客户,完成整个负载调度过程

  1. DNAT:目标地址转换,改变的是目标地址
  2. SNAT:源地址转换,改变的是源地址

NAT 模式就是使用 SNAT 和 DNAT 技术完成报的转发,NAT 方式可支持任何的操作系统,以及私有网络,并且只需一个 Internet IP 地址,非常节省成本,但是整个系统的性能受到限制。因为执行 NAT 每次需要重写数据包,有一定的延迟,另外,大部分应用有 80%的数据是从服务器流向客户机,也就是用户的请求非常短,而服务器的回应非常大,对LVS形成很大压力,容易成为瓶颈

IPTUN模式(IP隧道)

IP TUN当LVS分配请求到不同的 real server,real server 处理请求后直接回应给用户,这样 LVS 仅处理客户机与服务器的一半连接。IP TUN 技术极大地提高了 LVS 的调度处理能力,同时也极大地提高了系统能容纳的最大节点数,可以超过 100 个节点。real server 可以在任何 LAN 或 WAN 上运行,这意味着允许地理上的分布,这在灾难恢复中有重要意义。但此模式要求所有服务器必须支持 IP 隧道协议,因此只能在 linux 下使用,在 windows 无法使用。

DR模式(直接路由)

DR与 IP TUN 类似,负载均衡器仅处理一半的连接,避免了新的性能瓶颈,同样增加了系统的可伸缩性,DR 与 IP TUN 相比,没有 IP 封装的开销,但由于采用物理层(修改 MAC地址)技术,所有服务器都必须在同一个局域网

DR和IP TUN区别
DR和IP TUN相比,没有IP封装的开销,但由于采用数据链路层(修改MAV地址)技术,所有服务器都必须在一个物理网段

三种模式对比

NAT模式IP TUN模式DR模式
对服务器要求任何操做系统都支持必须支持IP隧道协议,目前只有Linux支持
网络要求局域网局域网或广域网
支持的节点数10-20个,据Diretor处理能力而定可以支持100个节点
安全性较高,可以隐藏real server较差,real server容易暴露
IP要求仅需要一个合法IP地址作为VIP除VIP外,每个服务器需要拥有合法IP地址可以直接路由至客户端
拓展性
特点地址转换封装IP地址

keepalived+LVS配置

环境说明:

系统版本软件版本节点名称节点IP地址
centos7.9keepalived-2.2.7、LVS-1.27master192.168.182.130
centos7.9keepalived-2.2.7、LVS-1.27backup192.168.182.131
centos7.9httpd不同发行版本,httpd版本也不同web01192.168.182.132
centos7.9httpd不同发行版本,httpd版本也不同web02192.168.182.133

1.master配置

// 安装前的准备工作

[root@master ~]# systemctl disable --now firewalld  //关闭防火墙
[root@master ~]# setenforce 0  //关闭selinux
[root@master ~]# head -7 /etc/selinux/config # This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
#     enforcing - SELinux security policy is enforced.
#     permissive - SELinux prints warnings instead of enforcing.
#     disabled - No SELinux policy is loaded.
SELINUX=disabled  //改为disabled[root@master opt]# wget https://www.keepalived.org/software/keepalived-2.2.7.tar.gz  //下载keepalived[root@master opt]# tar -zxf keepalived-2.2.7.tar.gz -C /usr/local/  //这里我解压到/usr/local 目录下,各位根据自己需求进行解压[root@master keepalived-2.2.7]# pwd
/usr/local/keepalived-2.2.7
[root@master keepalived-2.2.7]# yum -y install gcc openssl-devel libnl3-devel //解决依赖问题
[root@master ~]# modprobe ip_vs  //加载ip_vs模块
[root@master ~]# modprobe ip_vs 
[root@master ~]# cat /proc/net/ip_vs
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags-> RemoteAddress:Port Forward Weight ActiveConn InActConn[root@master ~]# vim /etc/sysctl.conf  //调整proc响应参数,并关闭linux内核重定向参数,添加下面内容
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.send_redirects = 0
net.ipv4.conf.ens33.send_redirects = 0
net.ipv4.ip_forward = 1
[root@master ~]# sysctl -p  //加载,使其生效

// 编译安装keepalived

[root@master keepalived-2.2.7]# ./configure --prefix=/usr/local/keepalived
[root@master keepalived-2.2.7]# make && make install

// 启动keepalived

[root@master keepalived]# pwd
/usr/local/keepalived/etc/keepalived
[root@master keepalived]# cp keepalived.conf.sample keepalived.conf  //因为没有keepalived配置文件,并且没有配置文件keepalived是启动不了的,所以需要我们自己copy一个配置文件
[root@master keepalived]# cp keepalived.conf keepalived.conf-bak  //做一个备份,这一步可做可不做
// 完成上面的步骤依旧启动不了,还需要做以下步骤
[root@master keepalived]# mkdir /etc/keepalived/
[root@master keepalived]# ln -s /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/
[root@master keepalived]# vim keepalived.conf
interface ens33  //找到21行,将eth0改为ens33,这里的网卡名根据自己的网卡名来修改
[root@master keepalived]# systemctl enable --now keepalived  //这样就可以启动keepalived了。

// 安装LVS

[root@master keepalived]# yum -y install ipvsadm 

// 在第一次启动LVS时可能会出现报错,解决措施如下

[root@master keepalived]# systemctl cat ipvsadm.service 
# /usr/lib/systemd/system/ipvsadm.service
[Unit]
Description=Initialise the Linux Virtual Server
After=syslog.target network.target[Service]
Type=oneshot
ExecStart=/bin/bash -c "exec /sbin/ipvsadm-restore < /etc/sysconfig/ipvsadm"  //我们可以看到LVS启动依赖etc下的ipvsadm这个文件,但是这个文件恰恰没有。
ExecStop=/bin/bash -c "exec /sbin/ipvsadm-save -n > /etc/sysconfig/ipvsadm"
ExecStop=/sbin/ipvsadm -C
RemainAfterExit=yes[Install]
WantedBy=multi-user.target
[root@master keepalived]# touch /etc/sysconfig/ipvsadm //创建完成之后百年可重新启动了。
[root@master keepalived]# systemctl enable --now ipvsadm

2. keepalived配置文件

配置文件分为: 全局配置、VRRP配置、LVS配置
配置文件又包括以下模块

  • LOBAL CONFIGURATION
  • BFO CONFIGURATION
  • VRRP CONFIGURATION
  • LVS CONFIGURATION
! Configuration File for keepalivedglobal_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 server 地址,可以ip或域名,可选端口号(默认是25)smtp_connect_timeout 30  //设置连接 smtp server超时时间router_id LVS_DEVEL  //主机标识,用于邮件通知vrrp_skip_check_adv_addrvrrp_strict  //严格执行VRRP协议规范,此模式不支持节点单播vrrp_garp_interval 0vrrp_gna_interval 0script_user keepalived_script   //指定运行脚本的用户名和组。默认使用用户的默认组。如未指定,默认为keepalived_script 用户,如无此用户,则使用root。enable_script_security  //如果路径为非root可写,不要配置脚本为root用户执行。
}vrrp_instance VI_1 {  //VRRP实例部分定义,VI_1自定义的名称state MASTER  // 指定keepalived的角色,必须大写,可选值为MASTER|BACKUPinterface eth0  //网卡设置,lvs需要绑定在网卡上,realserver绑定在回环口。区别:lvs对访问为外,realserver为内不易暴露本机信息virtual_router_id 51  // 虚拟路由标识,是一个数字,同一个vrrp 实例使用唯一的标识,MASTER和BACKUP 的 同一个 vrrp_instance 下 这个标识必须保持一致priority 100  // 定义优先级,数字越大,优先级越高advert_int 1  // 设定 MASTER 与 BACKUP 负载均衡之间同步检查的时间间隔,单位为秒,两个节点设置必须一样authentication {  //设置验证类型和密码,两个节点必须一致auth_type PASSauth_pass 1111}virtual_ipaddress {  //设置虚拟IP地址,可以设置多个192.168.200.16192.168.200.17192.168.200.18track_script {    // 脚本监控状态chk_nginx_service // 可加权重,但会覆盖声明的脚本权重值chk_nginx_service weight -20}notify_master “写脚本的绝对路径”      //当前节点成为master时,通知脚本执行此脚本notify_backup “写脚本的绝对路径”  //当前节点成为master时,通知脚本执行此脚本notify_fault “写脚本绝对路径” //当前节点出现故障时,执行此脚本}
}virtual_server 192.168.200.100 443 {  // 定义RealServer对应的VIP及服务端口,IP和端口之间用空格隔开delay_loop 6  // 每隔6秒查询realserver状态lb_algo rr  // 后端调试算法(load balancing algorithm)lb_kind NAT  //LVS调度类型NAT/DR/TUNpersistence_timeout 50  // 同一IP的连接60秒内被分配到同一台realserverprotocol TCP  // 用TCP协议检查realserver状态real_server 192.168.201.100 443 {weight 1  //权重值越大优先级越高,优先级越大lvs就越优先访问SSL_GET {  // keepalived的健康检查方式HTTP_GET | SSL_GET | TCP_CHECK | SMTP_CHECK | MISCurl {path /digest ff20ad2481f97b1754ef3e12ecd3a9cc}url {path /mrtg/digest 9b3a0c85a887a256d6939da88aabd8cd}connect_timeout 3  3秒无响应为超时retry 3   //重连次数delay_before_retry 3  //重连间隔时间connect_port 80  //健康检查realserver的端口}}
}

3 修改keepalived配置文件

[root@master ~]# vim /etc/keepalived/keepalived.conf
router_id LVS_01  //修改此行,指定服务器名称,主备服务器名称须不同这里我修改为LVS_01
!vrrp_strict  //注释掉此行内容
state MASTER  //指定热备状态,主就改为MASTER,备就为BACKUP
interface ens33  //网卡名也要和自己的网卡名匹配
virtual_router_id 51 
nopreempt  //设置为非抢占模式,就是MASTER挂了之后BACKUP就不会去替代,如果想设置可以加上此行,这里我们不加virtual_ipaddress {  //指定集群的VIP192.168.182.100
virtual_server 192.168.182.100 80 { //指定虚拟服务器地址(VIP)、端口号,定义虚拟服务器和web服务器
delay_loop 6  //健康检查时间间隔,就是每隔6秒,检查MASTER是否存活
lb_algo rr  //指定调度算法,轮询(rr)
protocol TCP  //应用服务使用的是tcp协议
persistence_timeout 0  //连接保持时间默认是秒
real_server 192.168.182.132 80 {  //第一个web服务器的ip加端口号weight 1  节点权重TCP_CHECK { connect_port 80  //检查目标端口connect_timeout 3  //添加连接超时nb_get_retry 3  //添加重试次数!retry 3 delay_before_retry 3  //添加重试间隔}}real_server 192.168.182.133 80 {weight 1TCP_CHECK {connect_port 80connect_timeout 3nb_get_retry 3delay_before_retry 3}}
}[root@master ~]# systemctl restart keepalived.service  //修改完之后重启keepalived

3.1配置VIP

[root@master ~]# vim /etc/sysconfig/network-scripts/ifcfg-ens33  //添加下面两行内容结即可
IPADDR1=192.168.182.100  //VIP地址 
NETMASK1=255.255.255.255  //VIP的子网掩码
[root@master ~]# systemctl restart network  //重启网卡服务[root@master ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00inet 127.0.0.1/8 scope host lovalid_lft forever preferred_lft foreverinet6 ::1/128 scope host valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000link/ether 00:0c:29:95:56:2e brd ff:ff:ff:ff:ff:ffinet 192.168.182.130/24 brd 192.168.182.255 scope global noprefixroute ens33valid_lft forever preferred_lft foreverinet 192.168.182.100/32 scope global ens33  //这里就是我们刚才添加的VIP

3.2 配置负载均衡策略

[root@master ~]# ipvsadm-save > /etc/sysconfig/ipvsadm  //这条命令是用来保存负载分配策略的
[root@master ~]# ipvsadm -C  //此命令是用来清空分配策略的
[root@master ~]# ipvsadm -A -t 192.168.182.100:80 -s rr  //A表示的是添加虚拟服务器,t是指定VIP和端口号,s是指定算法,rr表示的是轮询算法
[root@master ~]# ipvsadm -a -t 192.168.182.100:80 -r 192.168.182.132:80 -g //a是添加真实服务器地址,r指定RIP以及端口号,RIP也就是后端服务器ip地址,g表示的是DR模式
[root@master ~]# ipvsadm -a -t 192.168.182.100:80 -r 192.168.182.133:80 -g  //132和133分别是web01和02[root@master ~]# ipvsadm -ln  //查看节点状态
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags-> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  192.168.182.100:80 rr
TCP  10.10.10.2:1358 rr persistent 50-> 192.168.200.200:1358         Masq    1      0          0

backup也就是192.168.182.131的配置和上面的步骤一样,除以下地方不同之外,其他都一样

[root@backup ~]# vim /etc/sysctl.conf
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.send_redirects = 0
net.ipv4.conf.ens33.send_redirects = 0keepalived配置文件中根据你BACKUP进行修改
router_id LVS_02
state BACKUP
priority 90  //优先级要比主上面小

4 配置web01节点(192.168.182.132)

// 关闭防火墙和selinux
[root@web01 ~]# systemctl disable --now firewalld
[root@web01 ~]# setenforce 0
[root@web01 ~]# head -7 /etc/sysconfig/selinux # This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
#     enforcing - SELinux security policy is enforced.
#     permissive - SELinux prints warnings instead of enforcing.
#     disabled - No SELinux policy is loaded.
SELINUX=disabled

4.1 安装httpd服务

[root@web01 ~]# yum -y install httpd
[root@web01 ~]# systemctl enable --now httpd  //设置开机自启
[root@web01 ~]# touch /var/www/html/index.html
[root@web01 ~]# vim /var/www/html/index.html 
<marquee><font color=blue><h1>this is web01<marquee>
[root@web01 ~]# systemctl restart httpd[root@web01 ~]# vim /etc/sysconfig/network-scripts/ifcfg-lo
DEVICE=lo:1
IPADDR1=192.168.182.100
NETMASK1=255.255.255.255
[root@web01 ~]# systemctl restart network
[root@web01 ~]# ifup lo:1  //开启网卡
没有ifconfig命令,解决措施
[root@web01 ~]# yum -y install net-tools
[root@web01 ~]# ifconfig lo:1  //查看lo:1,网卡
lo:1: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536inet 192.168.182.100  netmask 255.255.255.255loop  txqueuelen 1000  (Local Loopback)

4.2 调整proc响应参数

[root@web01 ~]# vim /etc/sysctl.conf
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
net.ipv4.conf.default.arp_ignore = 1
net.ipv4.conf.default.arp_announce = 2
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.lo.arp_announce = 2
[root@web01 ~]# sysctl -p 

4.3 设置路由

[root@web01 ~]# route add -host 192.168.182.100 dev lo:1
[root@web01 ~]# route -n

web02的操作和上面web01一样

测试

关闭master上的keepalived
[root@master keepalived]# systemctl stop keepalived.service

相关文章:

keepalived+LVS配置详解

keepalivedLVS配置详解keepalived简介keepalived的应用场景keepalived工作原理VRRP协议核心组件分层工作工作状态LVS简介LVS三种模式NAT模式(网络地址映射)IPTUN模式(IP隧道)DR模式(直接路由)三种模式对比keepalivedLVS配置1.master配置2. keepalived配置文件3 修改keepalived配…...

Unity之C#端使用protobuf

什么是protobuf protobuf全称Protocol Buffers&#xff0c;由Google推出的一种平台、语言无关的数据交互格式&#xff0c;目前使用最广泛的一种数据格式&#xff0c;尤其在网络传输过程中&#xff0c;有很强的安全性&#xff0c;而且数据量比json和xml要小很多。 最主要的是pr…...

C++设计模式(18)——模板方法模式

亦称&#xff1a; Template Method 意图 模板方法模式是一种行为设计模式&#xff0c; 它在超类中定义了一个算法的框架&#xff0c; 允许子类在不修改结构的情况下重写算法的特定步骤。 问题 假如你正在开发一款分析公司文档的数据挖掘程序。 用户需要向程序输入各种格式…...

SQLserver 索引碎片

Oracle 不需要整理碎片&#xff0c;原因&#xff1f; 1. rowid 默认的索引是&#xff22;&#xff0d;树索引。索引建立在表中的一个或多个列或者是表的表达式上&#xff0c;将列值和行编号一起存储。行编号是唯一标记表中行的伪列。 行编号是物理表中的行数据的内部地址&am…...

【Storm】【二】安装

1 准备 1.1 准备linux服务器 本文搭建的是3节点的集群&#xff0c;需要3台linux服务器&#xff0c;我这里使用的是centos7版本的linux虚拟机&#xff0c;虚拟机网络配置如下&#xff1a; 主节点&#xff1a; master 192.168.92.90 从节点&#xff1a; slave1 192.168.92.…...

Android ConditionVariable

Android ConditionVariable 线程操作经常用到wait和notify&#xff0c;用起来稍显繁琐&#xff0c;而Android给我们封装好了一个ConditionVariable类&#xff0c;用于线程同步。提供了三个方法block()、open()、close()。 void block() //阻塞当前线程&#xff0c;直到条件为…...

Action Segmentation数据集介绍——Breakfast

文章目录简介细节Cooking actibitiesillustration of the actions论文讲解Breakfast&#xff08;The Breakfast Action Dataset&#xff09;简介 早餐动作数据集包括与早餐准备相关的10个动作&#xff0c;由18个不同厨房的52个不同的人执行。该数据集是最大的完全带注释的数据…...

横道图时间标尺在P6软件中的设置

卷首语 由于其直观简洁且易于管理的特性&#xff0c;使其成为展示项目活动顺序及时间安排的最常用的进度管理工具。 甘特图 甘特图&#xff08;Gantt Chart&#xff09;&#xff0c;又称为横道图或棒条图&#xff0c;是最早的项目进度管理工具之一。由于其直观简洁且易于管理…...

空间复杂度(超详解+例题)

全文目录引言空间复杂度例题test1test2&#xff08;冒泡排序&#xff09;test3&#xff08;求阶乘&#xff09;test4&#xff08;斐波那契数列&#xff09;总结引言 在上一篇文章中&#xff0c;我们提到判断一个算法的好坏的标准是时间复杂度与空间复杂度。 时间复杂度的作用…...

Document-Level event Extraction via human-like reading process 论文解读

Document-Level event Extraction via human-like reading process 论文&#xff1a;2202.03092v1.pdf (arxiv.org) 代码&#xff1a;无 期刊/会议&#xff1a;ICASSP 2022 摘要 文档级事件抽取(DEE)特别困难&#xff0c;因为它提出了两个挑战:论元分散和多事件。第一个挑战…...

H5盲盒抽奖系统源码

盲盒抽奖系统4.0&#xff0c;带推广二维码防洪炮灰功能和教程。 支持微信无限回调登录 标价就是源码价格&#xff0c;vuetp5框架编写&#xff0c;H5网页&#xff0c;前后端分离 此源码为正规开发&#xff0c;正版产品已申请软著。 开源无加密无授权&#xff0c;可以二开使用…...

低代码平台和无代码平台哪个更适合开发企业管理系统?

编者按&#xff1a;本文分析了开发企业管理系统所需要的平台特性&#xff0c;并根据这些特点和低代码无代码的优劣比较&#xff0c;得出低代码平台更适合开发企业管理系统。关键词&#xff1a;私有化部署&#xff0c;可视化设计&#xff0c;源码交付&#xff0c;数据集成&#…...

75岁彪马再发NFT 复活美洲狮IP

在“运动品牌Web3”的潮流里&#xff0c;彪马&#xff08;PUMA&#xff09;绝对算是发烧友级别。2月22日&#xff0c;这家德国服装品牌的新NFT又来了&#xff0c;总量10000个Super PUMA NFT中&#xff0c;将有4000个以0.15 ETH&#xff08;约为255美元&#xff09;价格正式公售…...

大学生成人插画培训机构盘点

成人插画培训机构哪个好&#xff0c;成人学插画如何选培训班&#xff1f;给大家梳理了国内较好的插画培训机构排名&#xff0c;各有优势和特色&#xff0c;供大家参考&#xff01; 一&#xff1a;国内成人插画培训机构排名 1、轻微课&#xff08;五颗星&#xff09; 主打课程有…...

【算法基础】一维差分 + 二维差分

&#x1f466;个人主页&#xff1a;Weraphael ✍&#x1f3fb;作者简介&#xff1a;目前正在学习c和算法 ✈️专栏&#xff1a;【C/C】算法 &#x1f40b; 希望大家多多支持&#xff0c;咱一起进步&#xff01;&#x1f601; 如果文章有啥瑕疵 希望大佬指点一二 如果文章对你有…...

游戏服务器框架 技能buff篇

游戏服务器框架 技能buff篇 1.状态 state 全局API 用于定义各种状态检查 bool IsDead(){ // 死亡buff if (buff->id 10001){ return true; } return false; } bool IsInvincible(){ if (buff->id 20001 || buff->id 20002){…...

网友说socket通信讲的不彻底,原来这才是Socket

关于对 Socket 的认识&#xff0c;大致分为下面几个主题&#xff0c;Socket 是什么&#xff0c;Socket 是如何创建的&#xff0c;Socket 是如何连接并收发数据的&#xff0c;Socket 套接字的删除等。 Socket 是什么以及创建过程 一个数据包经由应用程序产生&#xff0c;进入到…...

Nginx第二讲

目录 二、Nginx02 2.1 keepalived和heartbeat介绍 2.1.1 两者的介绍 2.1.2 keepalived简介 2.1.3 VRRP协议与工作原理 2.1.4 Keepalvied的工作原理 2.2 安装环境及keepalived 2.3 启动与验证keepalived 2.4 keepalived测试 2.4.1 环境准备 2.4.2 配置keepalived 2.…...

redis(win版)

1. 前言1.1 什么是RedisRedis是一个基于内存的key-value结构数据库。Redis 是互联网技术领域使用最为广泛的存储中间件&#xff0c;它是「Remote Dictionary Service」的首字母缩写&#xff0c;也就是「远程字典服务」。基于内存存储&#xff0c;读写性能高适合存储热点数据&am…...

【Linux】编辑器——vim(最小集+指令集+自动化配置)

目录 1.vim最小集 1.1 vim的三种模式 1.2 vim的基本操作 2.vim指令集 2.1 命令模式指令集 移动光标 删除文字 复制 替换 撤销上一次操作 更改 跳至指定的行 2.2 底行模式指令集 列出行号 跳到文件中的某一行 查找字符 保存文件 多文件操作 3.如何配置vim 配…...

Centos7+Xshell+Jenkins堆装

windows系统崩坏&#xff0c;重装测试类工具&#xff0c;心情崩了 windows硬盘损坏前&#xff0c;运行应用具慢。。。。。。慢着慢着就走了 从前部署在本地的jenkins&#xff0c;python&#xff0c;gitblit等相关脚本都凉透了&#xff0c;所以这次把服务部署到Centos7上…...

Android system实战 — Android R(11) 进程保活白名单

Android system实战 — Android R 进程保活白名单0. 前言1. 具体实现1.1 准备工作1.2 源码实现1.2.1 源码1.2.2 diff文件0. 前言 最近在Android R上实现一些需求&#xff0c;进行记录一下&#xff0c;关于进程保活的基础知识可以参考Android system — 进程生命周期与ADJ&#…...

oracle表 分组,并查每组第一条

oracle主要用到的函数:OVER(PARTITION BY) mysql主要用到的函数:LIMIT &#xff08;用到3个地方&#xff1a;分组列、组内排序列、表名&#xff09; oracle&#xff1a; select t.* from ( select a.*, ROW_NUMBER() OVER (PARTITION BY 分组列 ORDER BY 组内排…...

Java代码弱点与修复之——DE: Dropped or ignored exception(无视或忽略异常)

弱点描述 Dropped or ignored exception(DE)指的是在代码中抛出的异常被捕获后被无视或忽略了,而不是被适当地处理。这种情况通常发生在程序员没有处理异常或处理异常时不小心忽略了异常的情况下。 Dropped or ignored exception会导致程序无法正常工作,因为异常会阻塞程…...

JavaEE简单示例——动态SQL之更新操作<set>元素

简单介绍&#xff1a; 在之前我们做的学生管理系统的时候&#xff0c;曾经有一个环节是修改学生的数据。我们在修改的时候是必须将student对象的三个属性全部填入信息&#xff0c;然后全部修改才可以&#xff0c;这样会造成一个问题就是在我们明明只需要修改一个属性的时候却要…...

【极海APM32替代笔记】低功耗模式配置及配置汇总

【极海APM32替代笔记】低功耗模式配置及配置汇总 文章总结&#xff1a;&#xff08;后续更新以相关文章为准&#xff09; 【STM32笔记】低功耗模式、WFI命令等进入不了休眠的可能原因&#xff08;系统定时器SysTick一直产生中断&#xff09; 【STM32笔记】HAL库低功耗模式配置…...

攻击者失手,自己杀死了僵尸网络 KmsdBot

此前&#xff0c;Akamai 的安全研究员披露了 KmsdBot 僵尸网络&#xff0c;该僵尸网络主要通过 SSH 爆破与弱口令进行传播。在对该僵尸网络的持续跟踪中&#xff0c;研究人员发现了一些有趣的事情。 C&C 控制 对恶意活动来说&#xff0c;最致命的就是夺取对 C&C 服务…...

东阿县高新技术企业认定条件和优惠政策 山东同邦科技分享

东阿县高新技术企业认定条件和优惠政策 山东同邦科技分享 高新技术企业 在《国家重点支持的高新技术领域》内&#xff0c;持续进行研究开发与技术成果转化&#xff0c;形成企业核心自主知识产权&#xff0c;并以此为基础开展经营活动&#xff0c;在中国境内&#xff08;不包…...

【基础算法】哈希表(拉链法)

&#x1f339;作者:云小逸 &#x1f4dd;个人主页:云小逸的主页 &#x1f4dd;Github:云小逸的Github &#x1f91f;motto:要敢于一个人默默的面对自己&#xff0c;强大自己才是核心。不要等到什么都没有了&#xff0c;才下定决心去做。种一颗树&#xff0c;最好的时间是十年前…...

硬件学习 软件Cadence day07 PCB 底板电路图布线

1.根据原理图的元器件&#xff0c; 选择在 PCB 芯片制作的元器件 &#xff08;allegro中原理图和pcb中元件的交互&#xff09; 1.首先完成下列操作 可以尝试先关闭再打开&#xff0c; 等下操作的时候就好 发现新增的发光物体&#xff01;&#xff01; 2.完成操作 &#xff0c;…...