【探索 Kubernetes|作业管理 Deployment 篇 系列 12】水平扩展 / 收缩、滚动 / 回滚更新

news2024/9/20 18:38:00

前言

大家好,我是秋意零。

在上一篇中,我们介绍了控制器的基本设计思想:控制器模式。通过这个 “控制器模式” 我们来看看 Deployment 是如何依靠它来实现的。

最近搞了一个扣扣群,旨在技术交流、博客互助,希望各位大佬多多支持!

获取方式:

  • 1.在我主页推广区域,如图:

在这里插入图片描述

  • 2.文章底部推广区域,如图:

在这里插入图片描述

👿 简介

  • 🏠 个人主页: 秋意零
  • 🧑 个人介绍:在校期间参与众多云计算相关比赛,如:🌟 “省赛”、“国赛”,并斩获多项奖项荣誉证书
  • 🎉 目前状况:24 届毕业生,拿到一家私有云(IAAS)公司 offer,暑假开始实习
  • 🔥 账号:各个平台, 秋意零 账号创作者、 云社区 创建者
  • 💕欢迎大家:欢迎大家一起学习云计算,走向年薪 30 万

在这里插入图片描述

系列文章目录


【云原生|探索 Kubernetes-1】容器的本质是进程
【云原生|探索 Kubernetes-2】容器 Linux Cgroups 限制
【云原生|探索 Kubernetes 系列 3】深入理解容器进程的文件系统
【云原生|探索 Kubernetes 系列 4】现代云原生时代的引擎
【云原生|探索 Kubernetes 系列 5】简化 Kubernetes 的部署,深入解析其工作流程



更多点击专栏查看:深入探索 Kubernetes

文章目录

  • 前言
  • 系列文章目录
  • 一、介绍水平扩展、水平收缩、滚动更新
  • 二、水平扩展/收缩的实现
  • 三、滚动更新
  • 四、回滚
    • 回滚到上一个版本
    • 回滚到更早之前版本
    • 删除多余的 RplicaSet
  • 总结

正文开始

  • 快速上船,马上开始掌舵了(Kubernetes),距离开船还有 3s,2s,1s…

在这里插入图片描述

一、介绍水平扩展、水平收缩、滚动更新

Deployment 实现了非常重要的功能:Pod 的水平扩展、水平收缩、滚动更新。

举个栗子

想象一个场景,现在我们有一个 Deployment 控制器上面部署的是一个 Web 服务,期望 Pod 的个数为:3。对外发布后,起初用户量比较少,我们的 Web 服务还能扛住,但是某一天(618、双11)为了宣传搞活动,导致用户量访问量突然暴涨,这个时候我们 3 个 Pod 部署的 Web 服务就扛不住了

  • 这个时候,我们怎么办呢?当活动结束访问量不大的时候怎么办?手动一个一个添加、删除 Pod 服务吗?这种显然是不现实的。因为,手动操作即费时间,又费人力资源,最重要的是损失了大量流量导致错过商机。

  • 这种情况下就需要使用水平扩展、水平收缩(弹性机制)了。而我们控制器就包含这些功能,看看是怎么实现的吧。

    • 水平扩展:我们可以设置一个资源阈值,当 CPU 或者 Mem 利用率达到 80% 或 90% 时就利用 Deployment 扩展我们 Pod 服务;
    • 水平收缩:当 CPU 或者 Mem 利用率降低到 20% 或 40% 时就利用 Deployment 收缩我们 Pod 服务。
  • 如果 Web 程序需要更新版本这时候怎么办?

    • 滚动更新:滚动更新,在 Kubernetes 中就是替换掉 YAML 文件中的镜像版本,替换之后,控制器会重新创建一组新版本的服务,一个新版 Pod 服务创建成功之后,会删除一个旧版本的 Pod 服务,这样依次循环直到替换完毕;如果新版不稳定也可以马上回到之前旧版本,这个操作称为:“回滚”。这样的好处是对于用户是透明的,无感知的;对于管理人员来说是便捷高效的。

注意:目前这篇还不会提到监控资源的利用率自动来扩展和收缩 Pod(感兴趣可以先去了解 HorizontalPodAutoscaler(HPA)),这里介绍的是手动执行命令来扩展和收缩 Pod

二、水平扩展/收缩的实现

知道了这三个功能水平扩展、水平收缩、滚动更新,那么我们就来看看它们是由谁实现的,是 Deployment ?

其实答案在上一篇中结尾部分,我们介绍了 Deployment 管理的 Pod ,这个 Pod 的 ownerReference(所有者)是 ReplicaSet;ReplicaSet 的 ownerReference(所有者)是 Deployment。

答案:所以,水平扩展、水平收缩、滚动更新三个功能主要依靠 ReplicaSet 来实现。不过还是需要 Deployment 管理辅助。

明白了这个原理之后,我们接着来看看 Deployment,如下:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  labels:
    app: nginx
spec:
  replicas: 3  # 指定副本数量
  selector:
    matchLabels:
      app: nginx  # 选择标签为`app: nginx`的Pod进行管理
  template:
    metadata:
      labels:
        app: nginx  # Pod的标签,与 matchLabels 字段下的标签绑定
    spec:
      containers:
        - name: nginx-web
          image: nginx  # 指定应用程序的镜像
          imagePullPolicy: IfNotPresent
          ports:
            - containerPort: 80  # 应用程序监听的端口号

上述 Deployment 的 YAML 文件,可以用下图表示:

  • 通过这张图,我们可以看到,一个定义了 replicas: 3 的 Deployment 与 ReplicaSet 和 Pod 的关系结构,是 “层层控制” 的。
  • ReplicaSet 负责通过 “控制器模式”,保证 Pod 的个数永远是 YAML 文件中所期望的个数(replicas: 3),所以 Deployment 只允许容器的 restartPolicy=Always ,这样才能保证,容器始终是 Running 状态的前提下,ReplicaSet 调整 Pod 的个数才有意义。

在这里插入图片描述
Deployment 同样通过 “控制器模式”,来操作 ReplicaSet 的个数和属性,从而实现 “水平扩展 / 收缩” 和 “滚动更新” 这两个编排动作。

“水平扩展 / 收缩” 的实现,Deployment 只需要修改它所控制的 ReplicaSet 的 Pod 副本个数就可以了,也就是 replicas: 3 字段。我们将上面 Deployment 的 YAML 文件创建,如下:

1.创建 Deployment:

[root@master01 yaml]# kubectl apply -f deploy-web.yaml
deployment.apps/nginx-deployment created
[root@master01 yaml]#
[root@master01 yaml]# kubectl get -f deploy-web.yaml
NAME               READY   UP-TO-DATE   AVAILABLE   AGE
nginx-deployment   3/3     3            3           6s

2.扩展 Pod 的副本数为:6

[root@master01 yaml]# kubectl scale deployment nginx-deployment --replicas=6
deployment.apps/nginx-deployment scaled
[root@master01 yaml]#
[root@master01 yaml]# kubectl get -f deploy-web.yaml
NAME               READY   UP-TO-DATE   AVAILABLE   AGE
nginx-deployment   6/6     6            6           119s
[root@master01 yaml]# kubectl get pod
NAME                                READY   STATUS    RESTARTS   AGE
nginx-deployment-54fdb8fb59-948nn   1/1     Running   0          2s
nginx-deployment-54fdb8fb59-bgqhd   1/1     Running   0          3m13s
nginx-deployment-54fdb8fb59-hl9pv   1/1     Running   0          2s
nginx-deployment-54fdb8fb59-ptwz2   1/1     Running   0          3m13s
nginx-deployment-54fdb8fb59-s9rkp   1/1     Running   0          2s
nginx-deployment-54fdb8fb59-wf4mh   1/1     Running   0          2s

3.收缩 Pod 的副本数为:2

[root@master01 yaml]# kubectl scale deployment nginx-deployment --replicas=2
deployment.apps/nginx-deployment scaled
[root@master01 yaml]#
[root@master01 yaml]# kubectl get -f deploy-web.yaml
NAME               READY   UP-TO-DATE   AVAILABLE   AGE
nginx-deployment   2/2     2            2           2m46s
[root@master01 yaml]# kubectl get pod
NAME                                READY   STATUS    RESTARTS   AGE
nginx-deployment-54fdb8fb59-bgqhd   1/1     Running   0          2m59s
nginx-deployment-54fdb8fb59-ptwz2   1/1     Running   0          2m59s
[root@master01 yaml]#

三、滚动更新

首先查看 Deployment 所控制的 ReplicaSet

这个 ReplicaSet 的名字,是由 Deployment 的名字和一个随机字符串共同组成。这个随机字符串叫作 pod-template-hash,在我们这个例子里就是:54fdb8fb59。ReplicaSet 会把这个随机字符串加在它所控制的所有 Pod 的标签里,从而保证这些 Pod 不会与集群里的其他 Pod 混淆。

[root@master01 yaml]# kubectl get rs
NAME                          DESIRED   CURRENT   READY   AGE
nginx-deployment-54fdb8fb59   2         2         2       65s

现在,修改了 Deployment 的 Pod 模板,“滚动更新” 就会被自动触发。

我们可以使用 kubectl edit 指令编辑 Etcd 里的 API 对象。 kubectl edit 指令,会帮你直接打开 nginx-deployment 的 API 对象。然后,你就可以修改这里的 Pod 模板部分了。

  • kubectl edit 并不神秘,它不过是把 API 对象的内容下载到了本地文件,让你修改完成后再提交上去。

1.修改 deployment 模板。

这里将原本镜像是: nginx:latest 的版本,修改为:nginx:alpine

kubectl edit deploy/nginx-deployment

在这里插入图片描述

2.通过查看 Deployment 的 Events,看到这个“滚动更新”的流程:

  • 第二条 Events:Deployment 首先创建了一个新的 ReplicaSet (nginx-deployment-86d5bf894b),初始 Pod 副本数为:0。
  • 第三条 Events:缩放 ReplicaSet 控制器 nginx-deployment-54fdb8fb59 从 3 缩小到 2。
  • 第四条 Events:缩放 ReplicaSet 控制器 nginx-deployment-86d5bf894b 从1 放大到 2。
  • 第五条 Events:缩放 ReplicaSet 控制器 nginx-deployment-54fdb8fb59 从 2 缩小到 1。
  • 第六条 Events:缩放 ReplicaSet 控制器 nginx-deployment-86d5bf894b 从 2 放大到 3。
  • 第七条 Events:缩放 ReplicaSet 控制器 nginx-deployment-54fdb8fb59 从1 缩小到 0。

像这样,交替逐一升级的过程,就是 “滚动更新”。这个过程保证了用户的体验,因为在升级的过程中,只有当新版本的运行成功之后旧版本才会删除,所以这个过程始终都会有服务提供给用户。

[root@master01 ~]# kubectl describe deploy/nginx-deployment
...
...
Events:
  Type    Reason             Age   From                   Message
  ----    ------             ----  ----                   -------
  Normal  ScalingReplicaSet  55m   deployment-controller  Scaled up replica set nginx-deployment-54fdb8fb59 to 3
  Normal  ScalingReplicaSet  32m   deployment-controller  Scaled up replica set nginx-deployment-86d5bf894b to 1
  Normal  ScalingReplicaSet  31m   deployment-controller  Scaled down replica set nginx-deployment-54fdb8fb59 to 2 from 3
  Normal  ScalingReplicaSet  31m   deployment-controller  Scaled up replica set nginx-deployment-86d5bf894b to 2 from 1
  Normal  ScalingReplicaSet  31m   deployment-controller  Scaled down replica set nginx-deployment-54fdb8fb59 to 1 from 2
  Normal  ScalingReplicaSet  31m   deployment-controller  Scaled up replica set nginx-deployment-86d5bf894b to 3 from 2
  Normal  ScalingReplicaSet  31m   deployment-controller  Scaled down replica set nginx-deployment-54fdb8fb59 to 0 from 1

3.再次查看 ReplicaSet:

  • 这里,可以看到有两个 ReplicaSet,一个新创建的,一个旧的。旧的 ReplicaSet 还存在的意义就是为了保证,切换为之前的版本,“回滚” 的操作。
[root@master01 yaml]# kubectl get rs
NAME                          DESIRED   CURRENT   READY   AGE
nginx-deployment-54fdb8fb59   0         0         0       25m
nginx-deployment-86d5bf894b   3         3         3       2m13s

综上所述,再来看看此时 Deployment、ReplicaSet 和 Pod 的关系图(黄色代表旧 Pod,绿色代表新 Pod,目前状态是 新 Pod 只更新了一个):

  • 通过图我们了解到,Deployment 可以控制 ReplicaSet 的数量,以及每个 ReplicaSet 的属性;
  • 而一个应用的版本,对应的是一个 ReplicaSet。

在这里插入图片描述

四、回滚

首先,我们使用 kubectl set image 的指令,直接修改 nginx-deployment 所使用的镜像。这个命令的好处就是,你可以不用像 kubectl edit 那样需要打开编辑器。

这次,我们把镜像改为一个不存在的镜像,如改为 nginx:1.111,这个 Deployment 就会出现一个升级失败的版本(nginx-deployment-746bd689d9)。

1.修改 Deployment 的 image 版本:

[root@master01 ~]# kubectl get deploy -o wide
NAME               READY   UP-TO-DATE   AVAILABLE   AGE    CONTAINERS   IMAGES         SELECTOR
nginx-deployment   3/3     3            3           126m   nginx-web    nginx:alpine   app=nginx
[root@master01 ~]#
[root@master01 ~]# kubectl set image deploy/nginx-deployment nginx-web=nginx:1.111
deployment.apps/nginx-deployment image updated

2.查看 RplicaSet 情况:

  • nginx-deployment-746bd689d9 控制器,可以看到 READY 状态的个数为:0
[root@master01 ~]# kubectl get deploy
NAME               READY   UP-TO-DATE   AVAILABLE   AGE
nginx-deployment   3/3     1            3           127m
[root@master01 ~]#
[root@master01 ~]# kubectl get rs   #746bd689d9
NAME                          DESIRED   CURRENT   READY   AGE
nginx-deployment-54fdb8fb59   0         0         0       127m
nginx-deployment-746bd689d9   1         1         0       20s
nginx-deployment-86d5bf894b   3         3         3       104m

查看 Pod,可以看到不正常状态的 Pod。这是因为 “滚动更新” 被触发后,报错会立刻停止。

[root@master01 ~]# kubectl get pod
NAME                                READY   STATUS             RESTARTS   AGE
nginx-deployment-746bd689d9-qcsxf   0/1     ImagePullBackOff   0          34m
nginx-deployment-86d5bf894b-fzcd7   1/1     Running            0          138m
nginx-deployment-86d5bf894b-hc28d   1/1     Running            0          138m
nginx-deployment-86d5bf894b-vfkxg   1/1     Running            0          138m

回滚到上一个版本

执行一条 kubectl rollout undo 命令,就能把整个 Deployment 回滚到上一个版本:

kubectl rollout undo deployment/nginx-deployment

查看 RplicaSet

[root@master01 ~]# kubectl get rs
NAME                          DESIRED   CURRENT   READY   AGE
nginx-deployment-54fdb8fb59   0         0         0       170m
nginx-deployment-746bd689d9   0         0         0       43m
nginx-deployment-86d5bf894b   3         3         3       147m

回滚到更早之前版本

如果我想回滚到更早之前的版本,要怎么办呢?

1.首先,使用 kubectl rollout history 命令,查看每次 Deployment 变更对应的版本。

  • 我们的的操作从最开始依次顺序的记录在了这里,那次失败的更新操作,则对应的是版本 3,因为在这之前执行了回滚的命令。
[root@master01 ~]# kubectl rollout history deployment/nginx-deployment
deployment.apps/nginx-deployment
REVISION  CHANGE-CAUSE
1         kubectl create --filename=deploy-web.yaml --record=true
3         kubectl create --filename=deploy-web.yaml --record=true
4         kubectl create --filename=deploy-web.yaml --record=true

2.查看对应版本细节。

通过 --revision=3 参数加上对应的步骤版本,就可以查看细节,如:

[root@master01 ~]# kubectl rollout history deployment/nginx-deployment --revision=3
deployment.apps/nginx-deployment with revision #3
Pod Template:
  Labels:       app=nginx
        pod-template-hash=746bd689d9
  Annotations:  kubernetes.io/change-cause: kubectl create --filename=deploy-web.yaml --record=true
  Containers:
   nginx-web:
    Image:      nginx:1.111
    Port:       80/TCP
    Host Port:  0/TCP
    Environment:        <none>
    Mounts:     <none>
  Volumes:      <none>

3.回滚到指定版本。

通过 kubectl rollout undo 命令,加上 --to-revision=2 要回滚到的指定版本的版本号,就可以回到指定版本了。


[root@master01 ~]# kubectl rollout undo deployment/nginx-deployment --to-revision=1
deployment.apps/nginx-deployment rolled back
[root@master01 ~]#

回到指定版本后,可以看到 RplicaSet 控制器也就发生了变化,一个 RplicaSet 对应一个版本

[root@master01 ~]# kubectl get rs
NAME                          DESIRED   CURRENT   READY   AGE
nginx-deployment-54fdb8fb59   3         3         3       3h5m
nginx-deployment-746bd689d9   0         0         0       57m
nginx-deployment-86d5bf894b   0         0         0       162m

删除多余的 RplicaSet

不过,Deployment 进行的每一次更新操作,都会生成一个新的 ReplicaSet 对象,是不是有些多余,甚至浪费资源呢?

  • 我们在确定了,不需要某个版本之后就可以将其删除。
[root@master01 ~]# kubectl get rs
NAME                          DESIRED   CURRENT   READY   AGE
nginx-deployment-54fdb8fb59   3         3         3       3h12m
nginx-deployment-746bd689d9   0         0         0       65m
nginx-deployment-86d5bf894b   0         0         0       169m

[root@master01 ~]# kubectl delete rs/nginx-deployment-746bd689d9
replicaset.apps "nginx-deployment-746bd689d9" deleted

[root@master01 ~]# kubectl get rs
NAME                          DESIRED   CURRENT   READY   AGE
nginx-deployment-54fdb8fb59   3         3         3       3h12m
nginx-deployment-86d5bf894b   0         0         0       169m

除了删除之外

  • Kubernetes 项目还提供了一个指令,使得我们对 Deployment 的多次更新操作,最后 只生成一个 ReplicaSet。
  • 具体的做法是,在更新 Deployment 前,你要先执行一条 kubectl rollout pause 指令。

步骤如下:

  • 1.让 Deployment 进入了 “暂停” 状态。
[root@master01 ~]# kubectl get rs
NAME                          DESIRED   CURRENT   READY   AGE
nginx-deployment-54fdb8fb59   3         3         3       3h12m
nginx-deployment-86d5bf894b   0         0         0       169m

[root@master01 ~]# kubectl rollout pause deployment/nginx-deployment
deployment.apps/nginx-deployment paused
  • 2.修改 Image 镜像版本。
[root@master01 ~]# kubectl set image deploy/nginx-deployment nginx-web=nginx:alpine
deployment.apps/nginx-deployment image updated
[root@master01 ~]#
[root@master01 ~]#  kubectl get rs
NAME                          DESIRED   CURRENT   READY   AGE
nginx-deployment-54fdb8fb59   3         3         3       3h46m
nginx-deployment-86d5bf894b   0         0         0       3h22m
  • 3.“恢复” Deployment
[root@master01 ~]#  kubectl rollout resume deployment/nginx-deployment
deployment.apps/nginx-deployment resumed

[root@master01 ~]#  kubectl get rs
NAME                          DESIRED   CURRENT   READY   AGE
nginx-deployment-54fdb8fb59   0         0         0       3h46m
nginx-deployment-86d5bf894b   3         3         3       3h23m

如果,你将 spec.revisionHistoryLimit 字段设置为:0;那么,你就不能做回滚操作了。

总结

今天讲解了,Deploymen 最基本的编排控制器的实现原理和使用方法。

分别说明了,水平扩展/收缩、滚动更新、回滚的机制实现。

最后:技术交流、博客互助,点击下方或主页推广加入哦!!

在这里插入图片描述

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

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

相关文章

第40步 深度学习图像识别:DenseNet201建模(Tensorflow)

基于WIN10的64位系统演示 一、写在前面 &#xff08;1&#xff09;DenseNet201 DenseNet201是一种深度卷积神经网络&#xff0c;是DenseNet网络的一种变体。DenseNet&#xff0c;全称Dense Convolutional Network&#xff08;密集卷积网络&#xff09;&#xff0c;是由Faceb…

【VC 7/8】vCenter Server 更新(小版本升级)Ⅱ—— 使用 Shell 命令行更新 vCenter Server

目录 2. 使用 Shell 升级 vCenter Server&#xff08;1&#xff09;下载更新 ISO 镜像&#xff08;2&#xff09;挂载 ISO 镜像&#xff08;3&#xff09;验证 ISO 镜像已被挂载通过VAMI 更新界面将ISO 挂载到 VC 的文件系统 &#xff08;4&#xff09;更新 VC | 安装 vCenter …

Elasticsearch:如何通过 3 个简单步骤从 Elastic 数据中删除个人身份信息

作者&#xff1a;Peter Titov 对于任何组织来说&#xff0c;个人身份信息 (Personally Identifiable information, PII) 合规性都是一个日益严峻的挑战。 无论你是在电子商务、银行、医疗保健还是其他数据敏感的领域&#xff0c;PII 都可能会在无意中被捕获和存储。 拥有结构化…

丰田汽车投资人要求董事长下台

&#x1f699; 丰田电动车推广不力&#xff0c;股东要求董事长下台 Toyota faced down two proxy votes at its annual general meeting. In an unusual challenge to the management of a Japanese company, activist investors in America and Europe recommended voting aga…

跨境电商产品的评价怎么获取?

对于在亚马逊、沃尔玛、eBay、Wish、Newegg、速卖通、阿里国际站、Shopee、Lazada、Temu、乐天、Toktok、Joom、Ozon等跨境电商平台的卖家来说&#xff0c;产品评价和补单&#xff08;增加订单数&#xff09;是一个常见但至关重要的话题 优质的产品评价可以向潜在买家展示我们…

想学习大数据,主要学什么?

什么是大数据 什么是“大数据”呢&#xff1f;如果从字面意思来看&#xff0c;大数据指的是巨量数据。那么可能有人会问&#xff0c;多大量级的数据才叫大数据&#xff1f;不同的机构或学者有不同的理解&#xff0c;难以有一个非常定量的定义&#xff0c;只能说&#xff0c;大…

【技术干货】高精度室内定位方案,影响UWB定位精度的因素分析

物联网时代&#xff0c;室内定位已然成为物联网建设的技术纽带&#xff0c;想要真正发挥位置数据的价值&#xff0c;就需要采集的位置数据有足够精度。基于UWB技术的厘米级UWB高精度室内定位方案已广泛应用于物联网各行业领域的人员定位及资产管理。本篇小编就来带大家了解一下…

QGIS 3D功能操作说明

QGIS可以轻松快速地创建 3D 地图和可视化。可用于3d数据效果浏览及与2D数据的对比及数据的打印输出。具体功能如下。 1.在 QGIS 中&#xff0c;您可以通过几个简单的步骤创建 3D 模型。 (1)在QGIS中添加3D 数据的数据层&#xff0c;例如DEM&#xff0c;以供3D功能使用。 …

快速下载操作系统镜像文件-ubuntu-centos

一键搞定镜像文件下载 操作方式 链接地址&#xff1a;阿里云镜像文件链接地址 点击【OS镜像】弹框中选择相应版本 弹框中选择好相应的发行版本后点击【下载】即可

将数组内的元素变为指定格式的字符串类型numpy.char.mod()方法

【小白从小学Python、C、Java】 【计算机等考500强证书考研】 【Python-数据分析】 将数组内的每个元素 修改为指定格式的字符串 numpy.char.mod() [太阳]选择题 关于以下代码说法错误的一项是? import numpy as np a np.array([1, 2, 3]) print("【显示】a ",a) p…

前端Vue自定义导航栏菜单 定制左侧导航菜单按钮 中部logo图标 右侧导航菜单按钮

前端Vue自定义导航栏菜单 定制左侧导航菜单按钮 中部logo图标 右侧导航菜单按钮&#xff0c; 下载完整代码请访问uni-app插件市场地址&#xff1a;https://ext.dcloud.net.cn/plugin?id13152 效果图如下&#xff1a; # cc-navHeader #### 使用方法 使用方法 在page.json设…

轻量级的深度学习框架Tinygrad

Tinygrad是一个轻量级的深度学习库&#xff0c;它提供了一种简化和直观的方法来理解和实现神经网络。在本文中&#xff0c;我们将探讨Tinygrad及其主要功能&#xff0c;以及它如何成为那些开始深度学习之旅的人的有价值的工具。 什么是Tinygrad? Tinygrad是一个开源的深度学习…

Redis持久化机制介绍

Redis持久化 1.Redis持久化2.Redis 的持久化机制是什么&#xff1f;各自的优缺点&#xff1f;2.1.RDB&#xff1a;是Redis DataBase缩写快照2.2.AOF&#xff1a;持久化2.3.AOF和RDB优缺点是什么&#xff1f; 3. 如何选择合适的持久化方式4.Redis持久化数据和缓存怎么做扩容&…

[Pytorch]Broadcasting广播机制

文章目录 Broadcasting广播机制BroadcastableBroadcasting Broadcasting广播机制 Broadcasting机制用于在不同维度的张量进行运算时进行维度的自动增加与扩展&#xff0c;Broadcasting机制使用的前提是两个参与运算的张量是可broadcastable的。 Broadcastable 怎样的两个向量…

【libdatachannel】pycharm运行streamer的信令服务及streamer与js客户端联调1

一 信令服务&#xff1a;启动py服务器 ssl必须额外指定 # Usage: ./server.py [[host:]port] [SSL certificate file]文档给出了服务的启动命令&#xff1a; python3 -m http.server --bind 127.0.0.1 8080 直接运行&#xff1a; python的信令服务 #!/usr/bin/env python # # …

图的广度优先遍历和深度优先遍历

前言&#xff1a;在上一篇博客我们学习了图的基本操作&#xff0c;包括图的建立、结点插入与删除等操作&#xff0c;怎么判断我们建立的图是否正确&#xff0c;很简单把它输出出来就是&#xff0c;但是如何输出它&#xff0c;这就是图的遍历问题了。 一.图的遍历 图的遍历是指…

初识C语言的static关键字(修饰局部变量、全局变量和函数)

目录 学习目标 1.static 修饰局部变量 2.static 修饰全局变量 3.static 修饰函数 学习目标 static修饰局部变量static修饰全局变量static修饰函数 1.static 修饰局部变量 &#xff08;1&#xff09;static修饰局部变量后&#xff0c;这时局部变量就是静态的局部变量。 &am…

光模块安规认证简介

背景 认证是指由认证机构证明产品、服务、管理体系符合相关技术规范的强制性要求或者标准的合格评定活动。其中产品认证是通过对产品的不同层级认证实现各级材料的可追溯性。认证按照内容分类大致包括&#xff1a;安全、电磁兼容&#xff08;EMC&#xff09;和环保等。按照必要…

PyTorch 中通道在最后的内存格式(beta)

PyTorch 中通道在最后的内存格式&#xff08;beta&#xff09; 什么是通道在最后 通道在最后的内存格式是在保留内存尺寸的顺序中对 NCHW 张量进行排序的另一种方法。 通道最后一个张量的排序方式使通道成为最密集的维度&#xff08;又称为每像素存储图像&#xff09;。 例如…

Java——《面试题——SpringCloud》

前文 java——《面试题——基础篇》 Java——《面试题——JVM篇》 Java——《面试题——多线程&并发篇》 Java——《面试题——Spring篇》 Java——《面试题——SpringBoot篇》 Java——《面试题——MySQL篇》​​​​​​ 目录 前文 1、什么是SpringCloud 2、什…