HAproxy反向代理与负载均衡

目录

一、HAproxy介绍

1. 概述

2. 关于4/7层负载均衡

2.1 无负载均衡

2.1.1 图示

2.1.2 说明

2.2 四层负载均衡

2.2.1 图示

2.2.2 说明

2.3 七层负载

2.3.1 图示

2.3.2 说明

3. 特性

4. HAProxy负载均衡常见策略

5. 处理模式

二、HAproxy安装

1. yum安装

2. 第三方安装包

3. 编译安装

三、HAproxy配置与调优

1. 配置文件详解

2. global配置

2.1 状态页

2.2 指定进程线程个数

2.3 cpu亲缘性

2.4 日志

2.4.1 指定本地路径

2.4.2 指定远端路径

2.5 Proxies配置

2.5.1 Proxies配置-defaults

2.5.2 Proxies配置-listen 简化配置


一、HAproxy介绍

1. 概述

HAProxy提供高可用性、负载均衡以及基于TCP和HTTP应用的代理,支持虚拟主机,它是免费、快速并且可靠的一种解决方案。HAProxy特别适用于那些负载特大的web站点, 这些站点通常又需要会话保持或七层处理。HAProxy运行在当前的硬件上,完全可以支持数以万计的并发连接。并且它的运行模式使得它可以很简单安全的整合进您当前的架构中, 同时可以保护你的web服务器不被暴露到网络上。

支持的功能:

  • TCP 和 HTTP反向代理
  • SSL/TSL服务器
  • 可以针对HTTP请求添加cookie,进行路由后端服务器
  • 可平衡负载至后端服务器,并支持持久连接
  • 支持所有主服务器故障切换至备用服务器 keepalive
  • 支持专用端口实现监控服务
  • 支持停止接受新连接请求,而不影响现有连接
  • 可以在双向添加,修改或删除HTTP报文首部字段
  • 响应报文压缩
  • 支持基于pattern实现连接请求的访问控制
  • 通过特定的URI(url)为授权用户提供详细的状态信息

2. 关于4/7层负载均衡

2.1 无负载均衡

没有负载平衡的简单Web应用程序环境可能如下所示

2.1.1 图示

2.1.2 说明

在此示例中,用户直接连接到Web服务器,在yourdomain.com上,并且没有负载平衡。如果单个Web服务器出现故障,用户将无法再访问Web服务器。此外,如果许多用户试图同时访问服务器并且无法处理负载,他们可能会遇到缓慢的体验,或者可能根本无法连接。

2.2 四层负载均衡

将网络流量负载,平衡到多个服务器的最简单方法,是使用第4层(传输层)负载平衡。以这种方式进行负载均衡将根据IP范围和端口转发用户流量(即,如果请求进入http://yourdomain.com/anything,则流量将转发到处理yourdomain.com的所有请求的后端。端口80)。

2.2.1 图示

2.2.2 说明

用户访问负载均衡器,负载均衡器将用户的请求转发给后端服务器的Web后端组。无论选择哪个后端服务器,都将直接响应用户的请求。通常,Web后端中的所有服务器应该提供相同的内容 - 否则用户可能会收到不一致的内容。

2.3 七层负载

7层负载平衡是更复杂的负载均衡网络流量的方法是使用第7层(应用层)负载均衡。使用第7层允许负载均衡器根据用户请求的内容将请求转发到不同的后端服务器。这种负载平衡模式允许您在同一域和端口下运行多个Web应用程序服务器。

2.3.1 图示

2.3.2 说明

示例中,如果用户请求yourdomain.com/blog,则会将其转发到博客后端,后端是一组运行博客应用程序的服务器。其他请求被转发到web-backend,后端可能正在运行另一个应用程序。

3. 特性

① 支持tcp / http 两种协议层的负载均衡,使得其负载均衡功能非常丰富

② 支持8种左右的负载均衡算法,尤其是在http模式时,有许多非常实在的负载均衡算法,适用各种需求

③ 性能非常优秀,基于事件驱动的链接处理模式及单进程处理模式(和Nginx类似)让其性能卓越。

④ 拥有一个功能出色的监控页面,实时了解系统的当前状况

⑤ 功能强大的ACL支持,给用户极大的方便

4. HAProxy负载均衡常见策略

① Round Robin(轮询):按照请求顺序依次将请求分发给后端服务器;static-rr,表示根据权重

② Least Connections(最小连接数):将请求发送到当前连接数最少的服务器上,以确保负载更加均衡。

③ Source(源IP):根据客户端的源IP地址来决定将请求发送到哪台后端服务器上,这样可以确保相同的客户端IP每次都会被发送到相同的后端服务器。

④ URI(基于URI):根据请求中的URI信息来进行负载均衡,通常用于特定类型的应用或者内容分发。

⑤ URL参数:类似于URI策略,但是它会考虑URL参数来进行负载均衡。

⑥ Static-rr(静态轮询):类似于Round Robin,但是在长期运行的负载均衡环境中,该策略会尽量避免频繁的切换。

⑦ Cookie(基于Cookie):根据请求中的Cookie信息来进行负载均衡,适用于需要会话保持的场景。

⑧ Custom(自定义):HAProxy还支持自定义负载均衡策略,管理员可以根据具体需求编写自己的负载均衡算法。

5. 处理模式

单进程处理模式:

所有客户端连接全部都由同一个服务进程来处理,目标就是等待连接,来一个分配一个,主要消耗cpu

多进程模式:

适合于需要更好利用多核处理器的情况,多进程模式可以充分利用硬件资源,但需要更多的系统资源以及进程间通信开销。

多线程处理模式:

适合于需要更好利用多核处理器的情况,相比多进程模式,多线程模式可以减少一些进程间通信的开销,但需要更复杂的线程管理和同步机制。

二、HAproxy安装

1. yum安装

CentOS 7 的默认的base仓库中包含haproxy的安装包文件,但是版本比较旧,是1.5.18的版本,距离当前版本已经有较长时间没有更新,由于版本比较旧所以有很多功能不支持,如果对功能和性能没有要求可以使用此版本,否则推荐使用新版本。

[root@localhost ~]# yum list haproxy     #列出所有可用的软件包
已加载插件:fastestmirror, langpacks
Loading mirror speeds from cached hostfile* base: mirrors.ustc.edu.cn* epel: mirrors.bfsu.edu.cn* extras: mirrors.ustc.edu.cn* updates: mirrors.ustc.edu.cn
可安装的软件包
haproxy.x86_64                              1.5.18-9.el7_9.1                               update[root@localhost ~]# yum provides haproxy #搜索可用的软件包列表,包括软件包名称、版本和来源等
已加载插件:fastestmirror, langpacks
Loading mirror speeds from cached hostfile* base: mirrors.ustc.edu.cn* epel: mirror.nju.edu.cn* extras: mirrors.ustc.edu.cn* updates: mirrors.ustc.edu.cn
haproxy-1.5.18-9.el7.x86_64 : TCP/HTTP proxy and load balancer for high availability environments
源    :base
haproxy-1.5.18-9.el7_9.1.x86_64 : TCP/HTTP proxy and load balancer for high availability environments
源    :updates
haproxy-1.5.18-9.el7_9.1.x86_64 : TCP/HTTP proxy and load balancer for high availability environments
源    :@updates[root@localhost ~]# yum install haproxy -y
已安装:haproxy.x86_64 0:1.5.18-9.el7_9.1  
[root@localhost ~]# systemctl start haproxy.service

2. 第三方安装包

官方没有提供rpm相关的包,可以通过第三方仓库的rpm包

从第三方网站下载rpm包:https://pkgs.org/download/haproxy,基于互联网第三方仓库在线安装

[root@localhost data]# ls
keepalived.log  rh-haproxy18-haproxy-1.8.24-3.el7.x86_64.rpm  rh-haproxy18-runtime-3.1-2.el7.x86_64.rpm
[root@localhost data]# yum install rh-haproxy18-runtime-3.1-2.el7.x86_64.rpm -y   #依赖包
[root@localhost data]# yum install rh-haproxy18-haproxy-1.8.24-3.el7.x86_64.rpm -y
已安装:rh-haproxy18-haproxy.x86_64 0:1.8.24-3.el7 
[root@localhost data]# systemctl start rh-haproxy18-haproxy.service

第三方yum仓库:

yum install centos-release-scl-rh 
yum install rh-haproxy18-haproxy

3. 编译安装

编译安装HAProxy 2.0 LTS版本,更多源码包下载地址:http://www.haproxy.org/download/

AProxy 支持基于lua实现功能扩展, 由于CentOS7 之前版本自带的lua版本比较低并不符合HAProxy要求的lua最低版本(5.3)的要求,因此需要编译安装较新版本的lua环境,然后才能编译安装HAProxy。

① 查看本地lua语言版本,安装依赖环境

[root@localhost ~]# lua -v
Lua 5.1.4  Copyright (C) 1994-2008 Lua.org, PUC-Rio
[root@localhost ~]# yum -y install gcc openssl-devel pcre-devel systemd-devel

② 访问官网下载新版本Lua: download 

③ 查看安装方法,并安装

[root@localhost data]# curl -L -R -O https://www.lua.org/ftp/lua-5.4.6.tar.gz
[root@localhost data]# ls
lua-5.4.6.tar.gz
[root@localhost data]# tar zxf lua-5.4.6.tar.gz
[root@localhost data]# ls
lua-5.4.6  lua-5.4.6.tar.gz
[root@localhost data]# cd lua-5.4.6
[root@localhost lua-5.4.6]# make all
[root@localhost lua-5.4.6]# cd ..
[root@localhost data]# ls
lua-5.4.6  lua-5.4.6.tar.gz
[root@localhost data]# ln -s lua-5.4.6 lua
[root@localhost data]# ls
lua  lua-5.4.6  lua-5.4.6.tar.gz

④ 官网下载HAproxy源码包

⑤ 查看说明,安装

[root@localhost data]# cd haproxy-2.4.25/
[root@localhost haproxy-2.4.25]# cat INSTALL
[root@localhost haproxy-2.4.25]# make ARCH=x86_64 TARGET=linux-glibc USE_PCRE=1 USE_OPENSSL=1 USE_ZLIB=1 USE_SYSTEMD=1 USE_LUA=1 LUA_INC=/data/lua/src/  LUA_LIB=/data/lua/src/
[root@localhost haproxy-2.4.25]# make install PREFIX=/apps/haproxy
[root@localhost haproxy-2.4.25]# ls /apps/haproxy/
doc  sbin  share
[root@localhost haproxy-2.4.25]# ln -s /apps/haproxy/sbin/haproxy /usr/sbin/
[root@localhost haproxy-2.4.25]# haproxy -v
HAProxy version 2.4.25-6cfe787 2023/12/14 - https://haproxy.org/

⑥ 配置system服务

[root@localhost ~]# tee /usr/lib/systemd/system/haproxy.service  <<eof
> 
> [Unit]
> Description=HAProxy Load Balancer 
> After=syslog.target network.target
> 
> [Service]
> ExecStartPre=/usr/sbin/haproxy -f /etc/haproxy/haproxy.cfg  -c -q
> ExecStart=/usr/sbin/haproxy -Ws -f /etc/haproxy/haproxy.cfg -p /var/lib/haproxy/haproxy.pid
> ExecReload=/bin/kill -USR2 $MAINPID
> LimitNOFILE=100000
> 
> [Install]
> WantedBy=multi-user.target
> 
> eof

 ⑦ 创建配置文件

[root@localhost ~]# mkdir /etc/haproxy
[root@localhost ~]# mkdir /var/lib/haproxy
[root@localhost ~]# vim /etc/haproxy/haproxy.cfg
global
maxconn 100000
chroot /apps/haproxy
stats socket /var/lib/haproxy/haproxy.sock mode 600 level admin
uid 99
gid 99
daemon
#nbproc 4
#cpu-map 1 0
#cpu-map 2 1
#cpu-map 3 2
#cpu-map 4 3
pidfile /var/lib/haproxy/haproxy.pid
log 127.0.0.1 local3 infodefaults
option http-keep-alive
option  forwardfor
maxconn 100000
mode http
timeout connect 300000ms
timeout client  300000ms
timeout server  300000mslisten statsmode httpbind 0.0.0.0:9999stats enablelog globalstats uri     /haproxy-statusstats auth    haadmin:123456listen  web_portbind 0.0.0.0:8899mode httplog globalserver web1  127.0.0.1:8080  check inter 3000 fall 2 rise 5

⑧ 设置用户和目录权限,立即启动并自启

[root@localhost ~]# useradd -r -s /sbin/nologin  haproxy
[root@localhost ~]# id haproxy
uid=990(haproxy) gid=985(haproxy) 组=985(haproxy)
[root@localhost ~]# systemctl enable --now haproxy

三、HAproxy配置与调优

HAProxy 的配置文件haproxy.cfg由两大部分组成,分别是global和proxies部分

global:全局配置段

进程及安全配置相关的参数
性能调整相关参数调优
Debug参数

proxies:代理配置段(块)

defaults:为frontend, backend, listen提供默认配置
frontend:前端,相当于nginx中的server {},定义虚拟机,监听分配请求
backend:后端,相当于nginx中的upstream {},真实服务器
listen:同时拥有前端和后端配置,配置简单,生产推荐使用 

1. 配置文件详解

配置文件目录:/etc/haproxy/haproxy.cfg 

global                         #全局部分
maxconn 100000                 #最大并发连接数为 100,000
chroot /apps/haproxy           #在启动后将当前目录更改为 /apps/haproxy,锁定运行目录
stats socket /var/lib/haproxy/haproxy.sock mode 600 level admin 
#定义用于统计的 UNIX 套接字,并设置了受限访问权限
uid 99                         #设置 HAProxy 运行时的用户和组ID
gid 99
daemon                         #以守护进程的形式在后台运行 HAProxy
#nbproc 4                      #开启4个进程                    
#cpu-map 1 0                   #cpu亲缘性
#cpu-map 2 1
#cpu-map 3 2
#cpu-map 4 3
maxconn n   		           #每个haproxy进程的最大并发连接数
maxsslconn n   		           #每个haproxy进程ssl最大连接数,用于haproxy配置了证书的场景下
maxconnrate n   	           #每个进程每秒创建的最大连接数量
spread-checks n 	           #后端server状态check随机提前或延迟百分比时间,建议2-5(20%-50%)之间,默认值0
pidfile /var/lib/haproxy/haproxy.pid  #指定主进程的进程 ID 文件位置
log 127.0.0.1 local3 info             #将日志消息发送到指定地址和 "info" 级别的设施defaults                       #默认部分
option http-keep-alive         #启用 HTTP keep-alive 以提高性能
option forwardfor              #添加 X-Forwarded-For 头部以转发给服务器的请求
maxconn 100000                 #将最大并发连接数设置为 100,000
mode http                      #为所有后续的 listen 部分设置模式为 HTTP
timeout connect 300000ms       #配置连接、客户端和服务器交互的各种超时时间
timeout client 300000ms
timeout server 300000mslisten stats                   #监听统计信息部分
mode http                      #为此监听器设置模式为 HTTP
bind 0.0.0.0:9999              #将监听器绑定到端口 9999 上的所有可用 IPv4 地址
stats enable                   #启用此监听器上的统计信息
log global                     #将日志发送到全局日志设置
stats uri /haproxy-status      #设置访问统计信息的 URI
stats auth haadmin:123456      #为访问统计信息设置基本身份验证凭据listen web_port                #监听 web_port 部分
bind 0.0.0.0:8899              #将监听器绑定到端口 8899 上的所有可用 IPv4 地址
mode http                      #为此监听器设置模式为 HTTP
log global                     #将日志发送到全局日志设置
server web1 127.0.0.1:8080 check inter 3000 fall 2 rise 5  
定义名为 "web1" 的服务器,位于本地 8080 端口,带有健康检查

2. global配置

2.1 状态页

listen statsmode httpbind 0.0.0.0:9999stats enablelog globalstats uri     /haproxy-statusstats auth    haadmin:123456访问http://192.168.190.100:9999/haproxy-status

2.2 指定进程线程个数

进程与线程会有冲突,即如果开启单进程可以多线程,但是开启多进程则无法开启线程。

nbproc    n     #开启的haproxy work 进程数,默认进程数是一个
#nbthread  1    #和多进程 nbproc配置互斥(版本有关,CentOS8的haproxy1.8无此问题),指定每个haproxy进程开启的线程数,默认为每个进程一个线程
#如果同时启用nbproc和nbthread 会出现以下日志的错误,无法启动服务

默认未开启进程:

[root@localhost ~]# pstree -p | grep haproxy|-haproxy(4186)---haproxy(4192)---{haproxy}(4193)主进程          worker进程        线程

开启进程后:

[root@localhost ~]# vim /etc/haproxy/haproxy.cfg 
nbproc 2                #根据cpu核心数修改
[root@localhost ~]# systemctl restart haproxy.service
[root@localhost ~]# pstree -p | grep haproxy|-haproxy(42377)-+-haproxy(42380)|                `-haproxy(42381)

2.3 cpu亲缘性

CPU亲缘性是指操作系统和硬件平台提供的一种特性,用于控制进程或线程与特定处理器核心之间的关联关系。这种关联可以影响性能和资源利用情况。

nbproc  2
cpu-map 1  0     #绑定haproxy worker 进程至指定CPU,将第1个work进程绑定至0号CPU
cpu-map 2  1     #绑定haproxy worker 进程至指定CPU,将第2个work进程绑定至1  号CPU  ps axo  pid,cmd,psr  |grep haprox

修改前cpu与进程和线程的绑定关系是随机的:

[root@localhost ~]# ps axo  pid,cmd,psr | grep haproxy42377 /usr/sbin/haproxy -Ws -f /e   042380 /usr/sbin/haproxy -Ws -f /e   142381 /usr/sbin/haproxy -Ws -f /e   042468 grep --color=auto haproxy     1
[root@localhost ~]# ps axo  pid,cmd,psr | grep haproxy42377 /usr/sbin/haproxy -Ws -f /e   142380 /usr/sbin/haproxy -Ws -f /e   142381 /usr/sbin/haproxy -Ws -f /e   042470 grep --color=auto haproxy     0

修改global参数:

root@localhost ~]# vim /etc/haproxy/haproxy.cfg
nbproc 2
cpu-map 1 0
cpu-map 2 1
[root@localhost ~]# systemctl restart haproxy.service

查看进程详情:cpu核心号与进程保持绑定

[root@localhost ~]# ps axo  pid,cmd,psr | grep haproxy42517 /usr/sbin/haproxy -Ws -f /e   142522 /usr/sbin/haproxy -Ws -f /e   042523 /usr/sbin/haproxy -Ws -f /e   142525 grep --color=auto haproxy     0
[root@localhost ~]# ps axo  pid,cmd,psr | grep haproxy42517 /usr/sbin/haproxy -Ws -f /e   142522 /usr/sbin/haproxy -Ws -f /e   042523 /usr/sbin/haproxy -Ws -f /e   142527 grep --color=auto haproxy     0

2.4 日志

HAproxy本身不记录客户端的访问日志,此外为减少服务器负载,一般生产中HAProxy不记录日志,也可以配置HAProxy利用rsyslog服务记录日志到指定日志文件中。

haproxy默认日志文件路径:/var/log/messages

2.4.1 指定本地路径

① 在配置文件第14行已经定义了 log 127.0.0.1 local3 info 级别

② 修改系统日志管理工具服务的配置文件

[root@localhost ~]# vim /etc/rsyslog.con15 $ModLoad imudp        #模块加载指令,用于加载 imudp 模块。imudp 模块是 rsyslog 的输入模块之一,它允许接收通过 UDP 协议发送的日志消息 16 $UDPServerRun 514     #配置 rsyslog 服务监听 UDP 端口 514 的指令。默认情况下,rsyslog 会监听 UDP 514 端口以接收通过 UDP 发送的日志消息。
#取消注释15,16行74 local3.*                                                /var/log/haproxy.log
#指定配置文件保存路径
[root@localhost ~]# systemctl restart haproxy.service rsyslog.service

③ 查看新路径是否生成日志

[root@localhost ~]# ll /var/log/haproxy.log 
-rw-------. 1 root root 650 3月  10 21:48 /var/log/haproxy.log
2.4.2 指定远端路径

由于haproxy只能做单一的代理服务,建议将日志文件存放在远端日志服务器。

① 修改配置文件

[root@localhost ~]# vim /etc/haproxy/haproxy.cfg
log 192.168.190.101 local6 info

② 修改远端服务器系统日志管理工具服务的配置文件

[root@localhost ~]# vim /etc/rsyslog.conf15 $ModLoad imudp16 $UDPServerRun 51474 local6.*                                                /var/log/haproxy.log
[root@localhost ~]# systemctl restart rsyslog.service

③ 重启haproxy服务,查看日志服务器内容

haproxy代理端:
[root@localhost ~]# systemctl restart haproxy.service日志服务器:
[root@localhost ~]# ll /var/log/haproxy.log
-rw-------. 1 root root 337 3月  10 22:00 /var/log/haproxy.log

2.5 Proxies配置

在HAProxy中,proxies部分通常用于定义服务器池和负载均衡策略。

defaults [<name>] #默认配置项,针对以下的frontend、backend和listen生效,可以多个name也可以没有name
frontend <name>   #前端servername,类似于Nginx的一个虚拟主机 server和LVS服务集群。
backend <name>   #后端服务器组,等于nginx的upstream和LVS中的RS服务器
listen  <name>   #将frontend和backend合并在一起配置,相对于frontend和backend配置更简洁,生产常用

2.5.1 Proxies配置-defaults
option redispatch    			#当server Id对应的服务器挂掉后,强制定向到其他健康的服务器,重新派发
option abortonclose   			#当服务器负载很高时,自动结束掉当前队列处理比较久的连接,针对业务情况选择开启
option http-keep-alive 			#开启与客户端的会话保持
option forwardfor     			#透传客户端真实IP至后端web服务器
mode http|tcp 					#设置默认工作类型,使用TCP服务器性能更好,减少压力
timeout http-keep-alive 120s 	#session 会话保持超时时间,此时间段内会转发到相同的后端服务器
timeout connect 120s 			#客户端请求从haproxy到后端server最长连接等待时间(TCP连接之前),默认单位ms
timeout server 600s 			#客户端请求从haproxy到后端服务端的请求处理超时时长(TCP连接之后),默认单位ms,如果超时,会出现502错误,此值建议设置较大些,访止502错误
timeout client 600s 			#设置haproxy与客户端的最长非活动时间,默认单位ms,建议和timeout server相同
timeout check   5s   			#对后端服务器的默认检测超时时间
default-server inter 1000 weight 3   #指定后端服务器的默认设置
2.5.2 Proxies配置-listen 简化配置

使用listen替换 frontend和backend的配置方式,可以简化设置,通常只用于TCP协议的应用

#官网业务访问入口
listen WEB_PORT_80    #业务名称bind 10.0.0.7:80   #ip加端口mode http          #默认 可以不写option forwardfor  #透传客户端真实IP至后端web服务器server web1   10.0.0.17:8080   check inter 3000 fall 3 rise 5server web2   10.0.0.27:8080   check inter 3000 fall 3 rise 5

示例:

① 修改haproxy配置

listen  web_port_80bind 192.168.190.100:80mode httplog globalserver sr1  192.168.190.101:80server sr1  192.168.190.102:80

② 后端服务器创建web文件

[root@localhost ~]# systemctl start httpd
[root@localhost ~]# echo 7-1 > /var/www/html/index.htm[root@localhost ~]# systemctl start httpd
[root@localhost ~]# echo 7-2 > /var/www/html/index.html

③ 访问代理端

[root@localhost ~]# curl 192.168.190.100
7-1
[root@localhost ~]# curl 192.168.190.100
7-2
[root@localhost ~]# curl 192.168.190.100
7-1
[root@localhost ~]# curl 192.168.190.100
7-2

加入健康性检测 check

① 加入前,模拟sr1故障,测试访问

[root@localhost ~]# curl 192.168.190.100
<html><body><h1>503 Service Unavailable</h1>
No server is available to handle this request.
</body></html>
[root@localhost ~]# curl 192.168.190.100
7-2

② 加入健康检测

[root@localhost ~]# vim /etc/haproxy/haproxy.cfg
listen  web_port_80bind 192.168.190.100:80mode httplog globalserver rs1  192.168.190.101:80 checkserver rs2  192.168.190.102:80 check
[root@localhost ~]# systemctl restart haproxy.service

③ 再次访问

[root@localhost ~]# curl 192.168.190.100
7-2
[root@localhost ~]# curl 192.168.190.100
7-2
[root@localhost ~]# curl 192.168.190.100
7-2
[root@localhost ~]# curl 192.168.190.100

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

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

相关文章

3月11日代码随想录电话号码的字母组合

17.电话号码的字母组合 给定一个仅包含数字 2-9 的字符串&#xff0c;返回所有它能表示的字母组合。答案可以按 任意顺序 返回。 给出数字到字母的映射如下&#xff08;与电话按键相同&#xff09;。注意 1 不对应任何字母。 示例 1&#xff1a; 输入&#xff1a;digits &q…

mysql的索引、事务、分库分表问题

1.了解MySQL的索引吗&#xff1f;它为什么使用Btree作为底层&#xff0c;而不是其他呢&#xff1f; 这里我们要谈的是其他数据结构的缺点&#xff0c;然后说说Btree的优点&#xff0c;也就看你对MySQL的Btree与其他数据结构熟不熟悉。 Hash &#xff08;1&#xff09;Hash 索引…

[HackMyVM]靶场 Espo

kali:192.168.56.104 主机发现 arp-scan -l # arp-scan -l Interface: eth0, type: EN10MB, MAC: 00:0c:29:d2:e0:49, IPv4: 192.168.56.104 Starting arp-scan 1.10.0 with 256 hosts (https://github.com/royhills/arp-scan) 192.168.56.1 0a:00:27:00:00:05 (Un…

openAI key 与ChatGPTPlus的关系,如何升级ChatGPTPLus

一、前言 先详细介绍一下Plus会员和Open API之间的区别&#xff1a; 实际上&#xff0c;这两者是相互独立的。举例来说&#xff0c;虽然您开通了Plus会员&#xff0c;并不意味着您就可以使用4.0版本的API。尽管这两个账户可以是同一个&#xff0c;但它们是完全独立的平台。 …

rocketmq学习笔记(一)安装部署

初次使用rocketmq&#xff0c;记录一下全流程步骤。 1、下载安装包 首先在官网&#xff0c;下载安装包&#xff0c;可也根据官方文档进行部署&#xff0c;但有一些细节没说明&#xff0c;可能会有坑&#xff0c;本文会尽量详细的描述每个步骤&#xff0c;把我踩过的坑填补上。…

后端八股笔记------Redis

Redis八股 上两种都有可能导致脏数据 所以使用两次删除缓存的技术&#xff0c;延时是因为数据库有主从问题需要更新&#xff0c;无法达到完全的强一致性&#xff0c;只能达到控制一致性。 一般放入缓存中的数据都是读多写少的数据 业务逻辑代码&#x1f447; 写锁&#x1f4…

基础 | JVM - [指令 性能监控]

INDEX jps&#xff08;jvm 进程工具&#xff09;jinfo&#xff08;java 配置信息工具&#xff09;jstack &#xff08;查看虚拟机栈信息&#xff09;jmap&#xff08;jvm 内存影像工具&#xff09;jstat&#xff08;jvm 统计信息监控工具&#xff09;jvisualvm&#xff08;查看…

【NR 定位】3GPP NR Positioning 5G定位标准解读(十)-增强的小区ID定位

前言 3GPP NR Positioning 5G定位标准&#xff1a;3GPP TS 38.305 V18 3GPP 标准网址&#xff1a;Directory Listing /ftp/ 【NR 定位】3GPP NR Positioning 5G定位标准解读&#xff08;一&#xff09;-CSDN博客 【NR 定位】3GPP NR Positioning 5G定位标准解读&#xff08;…

对比才有伤害!ChatGPT 4.0 VS Claude 3,这就是ChatGPT偷懒变慢的根本原因!附解决方案

大家好&#xff0c;我是木易&#xff0c;一个持续关注AI领域的互联网技术产品经理&#xff0c;国内Top2本科&#xff0c;美国Top10 CS研究生&#xff0c;MBA。我坚信AI是普通人变强的“外挂”&#xff0c;所以创建了“AI信息Gap”这个公众号&#xff0c;专注于分享AI全维度知识…

每日一练:LeeCode-56、合并区间【数组+滑动窗口】

4.合并区间 LeeCode-56、合并区间 以数组 intervals 表示若干个区间的集合&#xff0c;其中单个区间为 intervals[i] [starti, endi] 。请你合并所有重叠的区间&#xff0c;并返回 一个不重叠的区间数组&#xff0c;该数组需恰好覆盖输入中的所有区间 。 1 < intervals.le…

Math类 --Java学习笔记

Math 代表数学&#xff0c;是一个工具类&#xff0c;里面提供的都是对数据进行操作的一些静态方法 Math提供的常用方法

C语言分析基础排序算法——交换排序

目录 交换排序 冒泡排序 快速排序 Hoare版本快速排序 挖坑法快速排序 前后指针法快速排序 快速排序优化 快速排序非递归版 交换排序 冒泡排序 见C语言基础知识指针部分博客C语言指针-CSDN博客 快速排序 Hoare版本快速排序 Hoare版本快速排序的过程类似于二叉树前序…

安卓玩机工具推荐----MTK芯片读写分区 备份分区 恢复分区 制作线刷包 工具操作解析

安卓玩机工具推荐----高通芯片9008端口读写分区 备份分区 恢复分区 制作线刷包 工具操作解析 安卓玩机工具推荐----ADB状态读写分区 备份分区 恢复分区 查看分区号 工具操作解析 前面做了两期教程。分别解析了下ADB端口与高通9008端口备份分区一些基础的常识&#xff0c;那么…

【探索程序员职业赛道:挑战与机遇】

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学习,不断总结,共同进步,活到老学到老导航 檀越剑指大厂系列:全面总结 jav…

EMC技术:基础概念到应用的解读?|深圳比创达电子

电磁兼容性&#xff08;Electromagnetic Compatibility&#xff0c;简称EMC&#xff09;作为一项重要的技术领域&#xff0c;在现代电子设备中扮演着至关重要的角色。本文将从基础概念开始&#xff0c;逐步深入探讨EMC技术的原理、应用和意义。 一、EMC的基础概念 EMC是指电子…

ELFK 分布式日志收集系统

ELFK的组成&#xff1a; Elasticsearch: 它是一个分布式的搜索和分析引擎&#xff0c;它可以用来存储和索引大量的日志数据&#xff0c;并提供强大的搜索和分析功能。 &#xff08;java语言开发&#xff0c;&#xff09;logstash: 是一个用于日志收集&#xff0c;处理和传输的…

收割机案例-简单的动态规划

#include<iostream> using namespace std; // 创建土地 short land[32][32]; short n,m;// 实际使用的土地大小 short landA[32][32];//用A收割机收割数量记录 short landB[32][32];// 用B收割机收割数量记录 int main(){cin>>n>>m;// 存储农作物产量for(sho…

C#,子集和问题(Subset Sum Problem)的算法与源代码

1 子集和问题&#xff08;Subset Sum Problem&#xff09; 给定一组非负整数和一个值和&#xff0c;确定给定集合中是否存在和等于给定和的子集。 示例&#xff1a; 输入&#xff1a;set[]{3&#xff0c;34&#xff0c;4&#xff0c;12&#xff0c;5&#xff0c;2}&#xff…

【快速入门 Vue 框架:从基础到实践】

在现代的 Web 开发中&#xff0c;Vue.js 已经成为了一种非常流行的 JavaScript 框架。它的简洁性和灵活性使得开发者能够快速构建交互性强、高效的用户界面。本文将带领读者从基础开始&#xff0c;逐步掌握 Vue 框架的核心概念&#xff0c;并通过实例演示如何快速上手 Vue 框架…

WPF LinearGradientBrush立体效果

WPF LinearGradientBrush立体效果 渐变方向 1. 默认是左上角到右下角 2.从左到右 <Border Height"35" Width"120"><Border.Background><LinearGradientBrush EndPoint"1,0"><GradientStop Color"Yellow"Offs…