Zookeeper 基础知识汇总

news2024/11/15 23:35:32

一、zookeeper 概述

中文教程:https://www.docs4dev.com/docs/zh/zookeeper/r3.5.6/reference/zookeeperOver.html

1.1 概述

ZooKeeper 是⼀种分布式协调服务,⽤于管理⼤型主机。在分布式环境中协调和管理服务是 ⼀个复杂的过程。ZooKeeper 通过其简单的架构和 API 解决了这个问题。ZooKeeper 允许开 发⼈员专注于核⼼应⽤程序逻辑,⽽不必担⼼应⽤程序的分布式特性。

1.2 使用场景

  • 分布式协调组讲

分布式服务下需要对数据状态进行统计管理,比如用户的登录情况。

  • 分布式锁

zk在实现分布式锁上,可以做到强⼀致性,关于分布式锁相关的知识,在之后的ZAB协议中介绍。

  • 无状态实现

img

二、zookeeper 服务配置与使用

2.1 zookeeper 服务搭建

2.1.1 安装包部署

官方网址:https://zookeeper.apache.org/releases.html

详细安装过程大家可以自行百度

2.1.2 Docker 部署

docker run -d \
-e TZ="Asia/Shanghai" \
-p 2181:2181 \
-v /Users/rion/Data/DockerVolumesData/zookeeper/zookeeper01/data:/data  \
-v /Users/rion/Data/DockerVolumesData/zookeeper/zookeeper01/conf:/conf/ \
-v /Users/rion/Data/DockerVolumesData/zookeeper/zookeeper01/log:/datalog/ \
--name zookeeper01  zookeeper

参数:

-e:表示添加环境变量

-p:设置宿主机和容器内部端口的映射

-v:表示挂载目录

/data : zookeeper 的数据目录

/conf :zookeeper 的配置文件目录

/datalog : zookeeper 的日志目录

2.2 配置文件

# zookeeper时间配置中的基本单位 (毫秒)
tickTime=2000
# 允许follower初始化连接到leader最⼤时⻓,它表示tickTime时间倍数
即:initLimit*tickTime
initLimit=10
# 允许follower与leader数据同步最⼤时⻓,它表示tickTime时间倍数
syncLimit=5
#zookeper 数据存储⽬录及⽇志保存⽬录(如果没有指明dataLogDir,则⽇志也保存在这个
⽂件中)
dataDir=/tmp/zookeeper
#对客户端提供的端⼝号
clientPort=2181
#单个客户端与zookeeper最⼤并发连接数
maxClientCnxns=60
# 保存的数据快照数量,之外的将会被清除
autopurge.snapRetainCount=3
#⾃动触发清除任务时间间隔,⼩时为单位。默认为0,表示不⾃动清除。
autopurge.purgeInterval=1
# zookeeper Web UI
admin.enableServer=true
# 它表示ZooKeeper运行在单个服务器上,没有复制或分布式的特性。
# 当standaloneEnabled设置为true时,ZooKeeper将以Standalone模式启动,这意味着它将在单个服务器上运行,
# 并且没有复制或高可用性的功能。这对于测试、开发或单服务器环境可能是合适的。
# 当standaloneEnabled设置为false时,ZooKeeper将以分布式模式启动,可以在多个服务器上组成一个ZooKeeper集群。
# 在分布式模式下,ZooKeeper可以实现数据的复制和高可用性,以提供更好的容错和可扩展性。
standaloneEnabled=true

2.3 服务启动与停止

  1. 先进入docker 容器中
docker exec -it <containerd_name> | <containerd_id> bash
  1. 在bin目录下存放则服务启动的脚本

img

zkCli.sh :连接服务端的脚本

zkServer.sh:服务端服务控制脚本

zkServer.sh start /conf/zoo.cfg   # 默认会使用该文件,不存在会提示
zkServer.sh status 								# 查看服务器状态
zkServer.sh stop

三、zookeeper 数据模型

3.1 zookeeper 如何保存数据结构

zk中的数据是保存在节点上的,节点就是znode,多个znode之间构成⼀颗树的⽬录结构。

ZooKeeper 提供的名称空间与标准文件系统的名称空间非常相似。名称是由斜杠(/)分隔的一系列路径元素。 ZooKeeper 名称空间中的每个节点都由路径标识。

img

节点路径可以理解为key,同时还可以给key设置value。

3.2 znode 结构

zookeeper 中的node包含一下四个部分:

  • data:保存数据

  • acl:权限,定义了什么样的⽤户能够操作这个节点,且能够进⾏怎样的操作。

    • c: create 创建权限,允许在该节点下创建⼦节点
    • w:write 更新权限,允许更新该节点的数据
    • r:read 读取权限,允许读取该节点的内容以及⼦节点的列表信息
    • d:delete 删除权限,允许删除该节点的⼦节点
    • a:admin 管理者权限,允许对该节点进⾏acl权限设置 /动物/猫 /汽⻋/宝⻢ 1 2
  • stat:描述当前znode的元数据(节点的信息),get -s <nodeName>

  • child:当前节点的⼦节点

3.3 znode 类型

  • 持久节点: 创建出的节点,在会话结束后依然存在。保存数据
  • 持久序号节点: 创建出的节点,根据先后顺序,会在节点之后带上⼀个数值,越后执⾏数 值越⼤,适⽤于分布式锁的应⽤场景- 单调递增 , 就类似于数据库中加锁时使用version字段,逐步增加version字段的值。
  • 临时节点: 临时节点是在会话结束后,⾃动被删除的,通过这个特性,zk可以实现服务注册与发现的 效果。那么临时节点是如何维持⼼跳呢?

img

  • 临时序号节点:跟持久序号节点相同,适⽤于临时的分布式锁。
  • Container节点(3.5.3版本新增):Container容器节点,当容器中没有任何⼦节点,该 容器节点会被zk定期删除(60s)。
  • TTL节点:可以指定节点的到期时间,到期后被zk定时删除。只能通过系统配置 zookeeper.extendedTypesEnabled=true 开启

3.4 数据持久化

zk的数据是运⾏在内存中,zk提供了两种持久化机制:

  • 事务⽇志

zk把执⾏的命令以⽇志形式保存在dataLogDir指定的路径中的⽂件中(如果没有指定 dataLogDir,则按dataDir指定的路径)。

  • 数据快照

zk会在⼀定的时间间隔内做⼀次内存数据的快照,把该时刻的内存数据保存在快照⽂件中。

zk通过两种形式的持久化,在恢复时先恢复快照⽂件中的数据到内存中,再⽤⽇志⽂件中的 数据做增量恢复,这样的恢复速度更快。

你会发现和redis的数据持久化有些类似。

四、zkCli 客户端

4.1 创建节点

create /t     # 默认为持久化节点
create -s /t  # 创建持久化序号节点,即有事务序号, 会在节点末尾添加序号
create -c /t  # 容器节点
create -ttl 	# 有时限的节点,就像rediskey设置过期时间一样
create -e /t  # 临时节点,当前会话存在时,该节点会存在,若会话关闭,则该节点会被删除
            	# 常被用于注册中心服务发现等

节点元数据信息

[zk xxx] get -s /t

	cZxid: 创建节点的事务ID
  mZxid:修改节点的事务ID
  pZxid:添加和删除⼦节点的事务ID
  ctime:节点创建的时间
  mtime: 节点最近修改的时间
  dataVersion: 节点内数据的版本,每更新⼀次数据,版本会+1
  aclVersion: 此节点的权限版本
  ephemeralOwner: 如果当前节点是临时节点,该值是当前节点所有者的session
  id。如果节点不是临时节点,则该值为零。
  dataLength: 节点内数据的⻓度
  numChildren: 该节点的⼦节点个数

4.2 查询节点

  • ls
ls /t   			# 默认显示当前节点下的一级子节点信息
ls -w /t      # 监听⽬录,创建和删除⼦节点会收到通知。⼦节点中新增节点不会收到通知
ls -R /t      # 递归显示该节点下的所有子节点
ls -w -R /t   # 对于⼦节点中⼦节点的变化,但内容的变化不会收到通知
  • get
get -s 			# 查询节点的元信息
get -w 			# w (watch) 监听节点的数据变化(一次性的)

get -w znode

一旦数据节点发送变化,会出发一个监听事件,type 表明了数据变化类型,如下:

WATCHER::

WatchedEvent state:SyncConnected type:NodeDataChanged path:/t

4.3 设置值

set <znode> <value>
# set /t "hello"

set -v <dataVersion> <znode> <data>
# set -v 2 /t 1234
# 只有当节点的版本号与提供的版本号匹配时,才会进行更新。如果版本号不匹配,操作将失败。

set <znode> -f <filePath>
# set /myNode -f /path/to/data.txt

需要注意的是,在使用set命令设置节点值时,节点路径和数据值都需要用引号括起来(除非路径或数据中不包含空格)。还要确保指定的节点路径在ZooKeeper中存在,否则会创建一个新的节点。

4.4 删除节点

delete <znode>

delete -v <dataVersion> <znode>
# 指定节点的版本进行删除,乐观锁。适用于读多写少的情况

deleteall <znode>
# 递归删除节点,即删除该节点下的所有子节点

4.5 权限

# 设置摘要
add auth digest root:123456

# 设置test节点值为abcd,并且需要进行认证,只有xiaowang:123456才可以进行增删写读的权限
create /test abcd auth:xiaowang:123456:cdwr

五、zookeeper 实现分布式锁

5.1 zookeeper 锁类型

5.1.1 读锁

⼤家都可以读,要想上读锁的前提之前的锁没有写锁

5.1.2 写锁

只有得到写锁的才能写。要想上写锁的前提是,之前没有任何锁。

5.2 zookeeper 如何上读锁

  1. 创建⼀个临时序号节点,节点的数据是read,表示是读锁

  2. 获取当前zk中序号⽐⾃⼰⼩的所有节点

  3. 判断最⼩节点是否是读锁:

    1. 如果不是读锁的话,则上锁失败,为最⼩节点设置监听。阻塞等待,zk的watch机制 会当最⼩节点发⽣变化时通知当前节点,于是再执⾏第⼆步的流程
    2. 如果是读锁的话,则上锁成功

img

5.3 zookeeper 如何上写锁

  1. 创建⼀个临时序号节点,节点的数据是write,表示是 写锁

  2. 获取zk中所有的⼦节点

  3. 判断⾃⼰是否是最⼩的节点:

    1. 如果是,则上写锁成功
    2. 如果不是,说明前⾯还有锁,则上锁失败,监听最⼩的节点,如果最⼩节点有变化, 则回到第⼆步。

img

5.4 zookeeper 羊群效应

如果⽤上述的上锁⽅式,只要有节点发⽣变化,就会触发其他节点的监听事件,这样的话对 zk的压⼒⾮常⼤,——⽺群效应。可以调整成链式监听。解决这个问题。

img

六、zookeeper 集群实战

6.1 zookeeper 集群角色

zookeeper 集群有三种角色:

  • Leader:处理集群的所有事务请求,集群中只有⼀个Leader。
  • Follower:只能处理读请求,参与Leader选举。
  • Observer:只能处理读请求,提升集群读的性能,但不能参与Leader选举。

6.2 集群搭建

本次搭建以视频内容为模版,使用docker 部署应该也是类似的

搭建4个节点,其中⼀个节点为Observer

(1)创建4个节点的myid,并设值

在/usr/local/zookeeper中创建以下四个⽂件

/usr/local/zookeeper/zkdata/zk1# echo 1 > myid
/usr/local/zookeeper/zkdata/zk2# echo 2 > myid
/usr/local/zookeeper/zkdata/zk3# echo 3 > myid
/usr/local/zookeeper/zkdata/zk4# echo 4 > myid

(2)编写4个zoo.cfg

# The number of milliseconds of each tick
tickTime=2000
# The number of ticks that the initial
# synchronization phase can take
initLimit=10
# The number of ticks that can pass between
# sending a request and getting an acknowledgement
syncLimit=5
# 修改对应的zk1 zk2 zk3 zk4
dataDir=/usr/local/zookeeper/zkdata/zk1
# 修改对应的端⼝ 2181 2182 2183 2184
clientPort=2181
# 2001为集群通信端⼝,3001为集群选举端⼝,observer表示不参与集群选举
server.1=172.16.253.54:2001:3001
server.2=172.16.253.54:2002:3002
server.3=172.16.253.54:2003:3003
server.4=172.16.253.54:2004:3004:observer

(3)启动4台Zookeeper

./bin/zkServer.sh status ./conf/zoo1.cfg
./bin/zkServer.sh status ./conf/zoo2.cfg
./bin/zkServer.sh status ./conf/zoo3.cfg
./bin/zkServer.sh status ./conf/zoo4.cfg

(4)zkCli 连接集群

./bin/zkCli.sh -server 172.16.253.54:2181,172.16.253.54:2182,172.16.253.54:2183

七、ZAB 协议

7.1 什么是ZAB协议

zookeeper作为⾮常重要的分布式协调组件,需要进⾏集群部署,集群中会以⼀主多从的形式 进⾏部署。zookeeper为了保证数据的⼀致性,使⽤了ZAB(Zookeeper Atomic Broadcast)协议,这个协议解决了Zookeeper的崩溃恢复和主从数据同步的问题。

img

7.2 zookeeper 定义四种节点状态

  • Looking :选举状态。
  • Following :Follower 节点(从节点)所处的状态。
  • Leading :Leader 节点(主节点)所处状态。
  • Observing:观察者节点所处的状态

7.3 集群上线的leader选举

Zookeeper集群中的节点在上线时,将会进⼊到Looking状态,也就是选举Leader的状态,这 个状态具体会发⽣什么?

img

  • 第一轮
  1. 节点1服务启动,生成一个一张自己的选票(1, 0)1表示节点myid,0 表示事务id,因为刚启动服务,所以事务id为0

  2. 节点2服务启动,生成一个一张自己的选票(2, 0)1表示节点myid,0 表示事务id,因为刚启动服务,所以事务id为0

  3. 节点1节点2 都将自己的选票投给对方,即节点1存在2张选票,节点2存在2张选票

  4. 节点1节点2 选出最大的选票,选择方式:先比较zxid,再比较myid。 故节点1和节点2都选择了选票(2, 0)投入到投票箱中。

  5. 第一轮选票结束,此时选票箱中存在1张选票,由于当前存在三个节点,配置文件中(6.2小节)定义了server.1=ip:port1:port2, server.2=xxx, server.3=xxxserver.4=xxx 是observer节点,不参与选票。

  6. 在选举leader过程中,需要投票箱中的票数超过集群的半数才可以。所以会进行第二轮选举

  • 第二轮
  1. 此时节点1中含有 1 张选票(2, 0),因为会保留它选择投到投票箱中的票。它会将最大的选票投递给对方,节点2也是如此。所以都会把选票(2, 0) 投给对方
  2. 节点1节点2此时再次进行对比,然后把选票(2, 0) 投递到投票箱中
  3. 此时投票箱中存在2张选票,大于集群数量的一半。故而节点2成为leader节点1成为follower
节点3` 启动时发现已经存在`leader`,便会直接成为`follower

以上就是leader选举的全过程

7.4 崩溃恢复时的leader选举

Leader建⽴完后,Leader周期性地不断向Follower发送⼼跳(ping命令,没有内容的 socket)。

当Leader崩溃后,Follower发现socket通道已关闭,于是Follower开始进⼊到 Looking状态,重新回到7.3节中的Leader选举过程,此时集群不能对外提供服务。

7.5 主从服务器之间的数据同步

主要包含两阶段提交

  • 第一阶段为节点将数据写入到本地数据文件中
  • 第二阶段为节点将数据写入到内存中

img

7.6 zookeeper 的NIO和BIO

NIO

NIO (non-blocking IO)同步非阻塞IO

  • ⽤于被客户端连接的2181端⼝,使⽤的是NIO模式与客户端建⽴连接
  • 客户端开启Watch时,也使⽤NIO,等待Zookeeper服务器的回调

BIO

BIO(blocking IO)

  • 集群在选举时,多个节点之间的投票通信端⼝,使⽤BIO进⾏通信。

详细解释nio&bio:https://blog.csdn.net/CSDN2497242041/article/details/120278946

八、CAP理论

8.1 CAP 定理

2000 年 7 ⽉,加州⼤学伯克利分校的 Eric Brewer 教授在 ACM PODC 会议上提出 CAP 猜 想。2年后,麻省理⼯学院的 Seth Gilbert 和 Nancy Lynch 从理论上证明了 CAP。之后, CAP 理论正式成为分布式计算领域的公认定理。

CAP 理论为:

⼀个分布式系统最多只能同时满⾜⼀致性(Consistency)、可⽤性 (Availability)和分区容错性(Partition tolerance)这三项中的两项。

⼀致性(Consistency) ⼀致性指 “all nodes see the same data at the same time”,即更新操作成功并返回客户端 完成后,所有节点在同⼀时间的数据完全⼀致。

可⽤性(Availability)可⽤性指“Reads and writes always succeed”,即服务⼀直可⽤,⽽且是正常响应时间。

分区容错性(Partition tolerance) 分区容错性指“the system continues to operate despite arbitrary message loss or failure of part of the system”,即分布式系统在遇到某节点或⽹络分区故障的时候,仍然能够对外 提供满⾜⼀致性或可⽤性的服务。——避免单点故障,就要进⾏冗余部署,冗余部署相当于 是服务的分区,这样的分区就具备了容错性。

8.2 CAP 权衡

通过 CAP 理论,我们知道⽆法同时满⾜⼀致性、可⽤性和分区容错性这三个特性,那要舍弃哪个呢?

对于多数⼤型互联⽹应⽤的场景,主机众多、部署分散,⽽且现在的集群规模越来越⼤,所 以节点故障、⽹络故障是常态,⽽且要保证服务可⽤性达到 N 个 9,即保证 P 和 A,舍弃 C(退⽽求其次保证最终⼀致性)。虽然某些地⽅会影响客户体验,但没达到造成⽤户流程的 严重程度。 对于涉及到钱财这样不能有⼀丝让步的场景,C 必须保证。⽹络发⽣故障宁可停⽌服务,这是 保证 CA,舍弃 P。貌似这⼏年国内银⾏业发⽣了不下 10 起事故,但影响⾯不⼤,报到也不 多,⼴⼤群众知道的少。还有⼀种是保证 CP,舍弃 A。例如⽹络故障是只读不写。

孰优孰略,没有定论,只能根据场景定夺,适合的才是最好的。

img

8.3 BASE 理论

eBay 的架构师 Dan Pritchett 源于对⼤规模分布式系统的实践总结,在 ACM 上发表⽂章提出 BASE 理论,BASE 理论是对 CAP 理论的延伸,核⼼思想是即使⽆法做到强⼀致性(Strong Consistency,CAP 的⼀致性就是强⼀致性),但应⽤可以采⽤适合的⽅式达到最终⼀致性 (Eventual Consitency)。

  • 基本可⽤(Basically Available)

基本可⽤是指分布式系统在出现故障的时候,允许损失部分可⽤性,即保证核⼼可⽤。 电商⼤促时,为了应对访问量激增,部分⽤户可能会被引导到降级⻚⾯,服务层也可能只提 供降级服务。这就是损失部分可⽤性的体现。

  • 软状态(Soft State)

软状态是指允许系统存在中间状态,⽽该中间状态不会影响系统整体可⽤性。分布式存储中 ⼀般⼀份数据⾄少会有三个副本,允许不同节点间副本同步的延时就是软状态的体现。mysql replication 的异步复制也是⼀种体现。

  • 最终⼀致性(Eventual Consistency)

最终⼀致性是指系统中的所有数据副本经过⼀定时间后,最终能够达到⼀致的状态。弱⼀致 性和强⼀致性相反,最终⼀致性是弱⼀致性的⼀种特殊情况。

8.4 Zookeeper追求的⼀致性

Zookeeper在数据同步时,追求的并不是强⼀致性,⽽是顺序⼀致性(事务id的单调递增)。

本文中内容依照千锋的视频课程:https://www.bilibili.com/video/BV1Ph411n7Ep/?spm_id_from=333.999.top_right_bar_window_custom_collection.content.click&vd_source=08c2f1f4d2e43d15d6addcceb732feff

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

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

相关文章

网内计算:可编程数据平面和技术特定应用综述

网内计算&#xff1a;可编程数据平面和技术特定应用综述 摘要——与云计算相比&#xff0c;边缘计算提供了更靠近终端设备的处理&#xff0c;降低了用户体验的延迟。最新的In-Network Computing范例采用可编程网络元素在数据达到边缘或云服务器之前计算&#xff0c;促进了常见…

Linux性能分析之perf(1)基础知识总结

Linux(09)之perf(1)基础知识总结 Author&#xff1a;Onceday Date&#xff1a;2023年1月31日 漫漫长路&#xff0c;才刚刚开始… 参考文档&#xff1a; Tutorial - Perf Wiki (kernel.org) linux性能分析工具专题-perf&#xff08;事件采样&#xff0c;全面性能分析&#x…

时钟树综合跑不下去,怎么破?

吾爱IC社区第二十一期IC训练营正式开始招募啦&#xff08;5月21号开营&#xff09;&#xff01;不知不觉小编的IC后端训练营课程已经举办21期了。每一期的报名时间也就1-3天&#xff0c;而且几乎每期都是爆满的情况。这背后的逻辑很简单。大家都信任吾爱IC社区这个品牌&#xf…

做副业的我很迷茫,但ChatGPT却治好了我——AI从业者被AI模型治愈的故事

迷茫&#xff0c;无非就是不知道自己要做什么&#xff0c;没有目标&#xff0c;没有方向。 当有一个明确的目标时&#xff0c;往往干劲十足。但做副业过程中&#xff0c;最大的问题往往就是 不知道自己该干什么。 干什么&#xff1f;怎么干&#xff1f;干到什么程度&#xff1f…

通过部署Java工程学习Jenkins

今天来学习Jenkins部署应用&#xff0c;在工作中一般都是提交代码到git之后&#xff0c;通过自动打包的功能形成jar包&#xff0c;然后运行jar包。服务器自动从git拉取最新代码进行打jar包的这个过程就通过Jenkins来进行。 Jenkins官网地址 首先我们可以看一下官网的版本 我们…

智能学习 | MATLAB实现GWO-SVM多输入单输出回归预测(灰狼算法优化支持向量机)

智能学习 | MATLAB实现GWO-SVM多输入单输出回归预测(灰狼算法优化支持向量机) 目录 智能学习 | MATLAB实现GWO-SVM多输入单输出回归预测(灰狼算法优化支持向量机)预测效果基本介绍模型原理程序设计参考资料预测效果 基本介绍 Matlab实现GWO-SVM灰狼算法优化支持向量机的多输…

Vue中如何进行状态持久化(LocalStorage、SessionStorage)

Vue中如何进行状态持久化&#xff08;LocalStorage、SessionStorage&#xff09;&#xff1f; 在Vue应用中&#xff0c;通常需要将一些状态进行持久化&#xff0c;以便在用户关闭浏览器或刷新页面后&#xff0c;仍能保留之前的状态。常见的持久化方式包括LocalStorage和Sessio…

Cracking C++(8): 开发环境的选择

Cracking C(8): 开发环境的选择 文章目录 Cracking C(8): 开发环境的选择1. 目的2. 工具代码编辑器 和 IDEWindows命令行界面编译器gcc/gclang/clangMicrosoft Visual Studio基于浏览器的编译器 3. 其他工具补充调试器代码分析工具其他 1. 目的 在看了 hackingcpp 的 C Develo…

《百年孤独》15句经典语录

句句都是人生真相&#xff0c;说透了所有人的孤独。 1、生命中曾经有过的所有灿烂&#xff0c;原来终究&#xff0c;都需要用寂寞来偿还。 2、过去都是假的&#xff0c;回忆是一条没有尽头的路。 这句话是最受读者欢迎的一句话&#xff0c;回忆就是一条没有尽头的路&#xf…

shell脚本基础5——常用命令写作技巧

文章目录 一、grep命令二、sed命令2.1 选项参数2.2 常用命令 三、AWK命令3.1 常用参数3.2 常用示例 四、find与xargs五、date命令六、对话框6.1 消息框6.2 yes/no对话框6.3 表单输入框6.4 密码输入框6.5 菜单栏6.6 单选对话框6.7 多选对话框6.8 进度条 七、常用写作技巧7.1 EOF…

我,ChatGPT,打钱

「作者简介」&#xff1a;CSDN top100、阿里云博客专家、华为云享专家、网络安全领域优质创作者 「推荐专栏」&#xff1a;对网络安全感兴趣的小伙伴可以关注专栏《网络安全入门到精通》 一、ChatGPT是个啥&#xff1f; chat&#xff1a;表示“聊天”。 GPT&#xff1a;则是G…

提升Python函数调用灵活性:参数传递类型详解

前言 在Python编程中&#xff0c;函数参数起着非常重要的作用。函数参数允许我们向函数传递数据&#xff0c;并在函数内部使用这些值。Python提供了多种参数传递类型&#xff0c;包括位置参数、关键字参数、默认参数、可变数量的位置参数、可变数量的关键字参数。这些不同的参数…

数据结构——串(字符串)

文章目录 **一 串的定义和实现****1 定义****2 串的存储结构****2.1 定长顺序存储表示****2.2 堆分配存储表示****2.3 块链存储表示** **3 串的基本操作** **二 串的模式匹配****1 简单的模式匹配算法****2 串的模式匹配算法——KMP算法****2.1 字符串的前缀&#xff0c;后缀和…

一起学SF框架系列5.4-模块Beans-DefaultListableBeanFactory

在生成ApplicationContext过程中&#xff0c;AbstractRefreshableApplicationContext.refreshBeanFactory()完成旧BeanFactory关闭&#xff0c;创建新的BeanFactory&#xff0c;即new DefaultListableBeanFactory(…)。然后bean实例化时调用本类的preInstantiateSingletons方法…

网安笔记12 IPsec

IPSec 基于通信IP环境下一种端到端&#xff0c;保证数据安全的机制 包含 两个安全协议&#xff0c;一个密钥管理协议&#xff0c; 标准价秘密技术为基础 DES/其他分组加密算法键值hash算法认证公钥有效的数字证书 AH协议提供信息源验证、完整性保证ESP提供信息源验证、机密…

华为OD机试真题 JavaScript 实现【求解立方根】【牛客练习题】

一、题目描述 计算一个浮点数的立方根&#xff0c;不使用库函数。保留一位小数。 数据范围&#xff1a;∣val∣≤20 。 二、输入描述 待求解参数&#xff0c;为double类型&#xff08;一个实数&#xff09; 三、输出描述 输出参数的立方根。保留一位小数。 四、解题思路…

Git工作流(随笔)

目录 前言 一、工作流概述 1、概念 2、分类 二、集中式工作流 1、概述 2、介绍 3、操作过程 三、功能分支工作流 1、概述 2、介绍 3、操作过程 1&#xff09;创建远程分支 2&#xff09;删除远程分支 四、GitFlow工作流 1、概述 2、介绍 3、操作过程 五、Forki…

Linux系统:CentOS编译Linux内核

目录 一、实验 1.下载内核 2.解压内核源码 3.配置依赖的环境 4.进入源码目录&#xff0c;使用make menuconfig开启菜单选项&#xff0c;手动选择内核功能 5.编译内核 6.安装模块 7.安装内核 8.验证新内核版本 一、实验 1.下载内核 &#xff08;1&#xff09;官网下载…

010:vue中el-table 隐藏表头的两种方法

第010个 查看专栏目录: VUE — element UI echarts&#xff0c;openlayers&#xff0c;cesium&#xff0c;leaflet&#xff0c;mapbox&#xff0c;d3&#xff0c;canvas 免费交流社区 专栏目标 在vue和element UI联合技术栈的操控下&#xff0c;本专栏提供行之有效的源代码示例…

【Kubernetes存储篇】StorageClass存储类动态生成PV详解

文章目录 一、StorageClass存储类理论二、案例&#xff1a;Storageclass存储类实战演示1、搭建NFS服务端2、搭建NFS供应商(provisioner)3、创建StorageClass存储类4、创建PVC&#xff0c;通过StorageClass动态生成PV5、创建Pod挂载PVC 三、步骤总结 一、StorageClass存储类理论…