k8s 1.28.2 集群部署 MinIO 分布式存储

文章目录

    • @[toc]
    • MinIO 介绍
      • MinIO 生产硬件要求
      • MinIO 存储要求
      • MinIO 内存要求
      • MinIO 网络要求
      • MinIO 部署架构
        • 分布式 MinIO
        • 复制的 MinIO
    • 部署 MinIO
      • 创建目录
      • 节点打标签
      • 创建 namespace
      • 创建 pv
      • 创建 MinIO
      • 配置 ingress
      • 问题记录
        • 通过代理服务器访问 MinIO 的 `Object Browser` 界面一直显示 loading

MinIO 介绍

  • MinIO 官网
  • MinIO 官方 linux 的部署文档
  • 以下内容从官方翻译
  • MinIO 是一款软件定义的高性能分布式对象存储服务器
  • 所有 MinIO 部署都实施纠删码后端
    • MinIO 有以下三种拓扑
      • SNSD 或者 StandaloneSingle-Node Single-Drive单节点驱动器
        • 除了底层存储卷实现的范围之外,它不会提供额外的可靠性或可用性。这些部署最适合本地测试和评估,或者没有可用性或性能要求的小型数据工作负载。
      • SNMD 或者 Standalone Multi-DriveSingle-Node Multi-Drive单节点多驱动器
        • 性能、规模和容量要求较低的工作负载
        • 驱动器级可靠性,具有可配置的容差,可丢失高达 1/2 的所有驱动器
      • MNMD 或者 DistributedMulti-Node Multi-Drive多节点多驱动器分布式
        • 提供企业级性能、可用性和可扩展性,是所有生产工作负载的推荐拓扑,该配置可容忍部署中最多丢失一半的节点或驱动器,同时继续提供读取操作
        • 多节点 / 驱动器级可靠性,可配置的容差,损失高达 1/2 所有节点 / 驱动器
        • AI/ML、分布式查询、分析和其他数据湖组件的主存储
        • 可针对 PB + 工作负载进行扩展 - 存储容量和性能
  • 站点复制(Site Replication
    • 站点复制扩展了存储桶复制的功能,包括在所有站点中都相同的 IAM、安全令牌、访问密钥和存储桶功能
    • 站点复制将多个 MinIO 部署链接在一起,并使存储桶、对象和 Identity and Access Management (IAM) 设置在所有连接的站点之间保持同步
    • 每个 MinIO 部署(“对等站点”)都会在其他对等站点之间同步以下更改:
      • 创建、修改和删除存储桶和对象
        • 存储桶和对象配置
        • Policies
        • mc tag set
        • Locks,锁定,包括保留和依法保留配置
        • 加密设置
    • 创建和删除 IAM 用户、组、策略以及到用户或组的策略映射(适用于 LDAP 用户或组)
    • 为可从本地 root 凭据验证的会话令牌创建安全令牌服务 (STS) 凭据
    • 创建和删除访问密钥(root 用户拥有的密钥除外)
    • 站点复制为所有复制站点上的所有新存储桶和现有存储桶启用存储桶版本控制
  • Not Replicate
    • 并非所有内容都可以跨站点复制
      • 存储桶通知
      • 生命周期管理 (ILM) 配置
      • 站点配置设置

MinIO 生产硬件要求

  • Production Hardware Recommendations
  • 以下清单遵循 MinIO 的生产部署推荐配置。提供的指南旨在作为基准,不能取代 MinIO SUBNET 性能诊断、架构审查和直接工程支持
  • 与任何分布式系统一样,MinIO 受益于为给定服务器池中的所有节点选择相同的配置。确保在池节点之间一致地选择硬件(CPU、内存、主板、存储适配器)和软件(操作系统、内核设置、系统服务)
  • 如果节点具有不同的硬件或软件配置,则部署可能会表现出不可预测的性能。受益于在低成本硬件上存储过时数据的工作负载应部署专用的 “暖” 或 “冷” MinIO 部署,并将数据转换到该层
硬件类型最低要求推荐配置
主机4个专用主机8+ 专用主机
每个主机的专用本地驱动器4个用于 MinIO 的驱动器每个 MinIO 服务器 8+ 个驱动器
网络基础设施25GbE 网络100GbE 网络
支持现代 SIMD 指令 (AVX-512) 的服务器级 CPU每台主机 8 个 CPU / 插槽或 vCPU每台主机 16+ CPU / 插槽或 vCPU
可用内存,以合理的缓冲区满足或超过每个服务器的使用量每台主机 32GB 可用内存每台主机 128GB+ 的可用内存
  • 以下方面对 MinIO 性能的影响最大,按重要性顺序列出
类型影响
网络基础设施吞吐量不足或受限会限制性能
存储控制器旧固件、吞吐量受限或硬件故障会限制性能并影响可靠性
存储 (驱动器)旧固件或硬件运行缓慢 / 老化 / 故障会限制性能并影响可靠性
  • 以上最低建议反映了 MinIO 在协助企业客户在各种 IT 基础设施上部署同时保持所需 SLA/SLO 的经验。
  • 虽然 MinIO 可能在低于建议的最低拓扑上运行,但任何潜在的成本节省都存在可靠性、性能或整体功能降低的风险

MinIO 存储要求

  • storage
  • 使用本地存储

    • 与网络存储(NAS、SAN、NFS)相比,直连存储 (DAS) 具有显著的性能和一致性优势。MinIO 强烈建议将闪存存储(NVMe、SSD)用于主数据或 “热” 数据
  • 使用 XFS 文件系统

    • MinIO 强烈建议配置 XFS 格式的文件系统进行存储。MinIO 使用 XFS 作为内部测试和验证套件的一部分,为所有规模的性能和行为提供额外的信心

      • 将驱动器格式化为 XFS,并将它们作为 JBOD 阵列呈现给 MinIO,没有 RAID 或其他池配置。使用任何其他类型的后备存储(SAN/NAS、ext4、RAID、LVM)通常会导致性能、可靠性、可预测性和一致性降低
    • 禁用 XFS 出错时重试

      • MinIO 强烈建议对以下错误类使用 max_retries 配置禁用 retry-on-error 行为

        • EIO :读取或写入时出错
        • ENOSPC :device no space left on device
        • default :所有其他错误
      • 默认的 max_retries 设置通常指示文件系统无限期地在出错时重试,而不是传播错误。MinIO 可以适当地处理 XFS 错误,因此 retry-on-error 行为最多会导致不必要的延迟或性能下降。

      • 下面是官方提供的脚本,遍历指定挂载路径上的所有驱动器,并将建议的错误类的 XFS max_retries 设置设置为 0 或 “fail immediately on error”。该脚本会忽略任何未挂载的驱动器,无论是手动挂载还是通过 /etc/fstab 挂载。修改 /mnt/drive 行以匹配用于 MinIO 驱动器的模式

        • 必须在所有 MinIO 节点上运行此脚本,并将脚本配置为在重新启动时重新运行,因为 Linux 操作系统通常不会保留这些更改

        • #!/bin/bashfor i in $(df -h | grep /mnt/drive | awk '{ print $1 }'); domountPath="$(df -h | grep $i | awk '{ print $6 }')"deviceName="$(basename $i)"echo "Modifying xfs max_retries and retry_timeout_seconds for drive $i mounted at $mountPath"echo 0 > /sys/fs/xfs/$deviceName/error/metadata/EIO/max_retriesecho 0 > /sys/fs/xfs/$deviceName/error/metadata/ENOSPC/max_retriesecho 0 > /sys/fs/xfs/$deviceName/error/metadata/default/max_retries
          done
          exit 0
          
  • 使用一致类型的驱动器

    • MinIO 不区分驱动器类型,并且不会从混合存储类型中受益。每个池必须使用相同的类型(NVMe、SSD)
    • 例如,部署一个仅包含 NVMe 驱动器的池。如果您将某些驱动器部署为 SSD 或 HDD,则 MinIO 会将这些驱动器视为与 NVMe 驱动器相同。这可能会导致性能问题,因为某些驱动器具有不同或更差的读 / 写特性,并且无法以与 NVMe 驱动器相同的速率响应
  • 使用一致大小的驱动器

    • MinIO 将每个驱动器使用的大小限制为部署中的最小驱动器
    • 例如,部署一个由相同数量的 NVMe 驱动器组成的池,这些驱动器具有相同的容量 7.68TiB。如果使用 3.84TiB 部署一个驱动器,则 MinIO 会将池中的所有驱动器视为具有较小的容量
  • 在重新启动后保留驱动器挂载和映射

    • Linux 操作系统,需要确保在 /etc/fstab 配置了驱动器挂载
      • MinIO 强烈建议使用基于标签(mkfs.xfs /dev/xxx -L MINIODRIVEx)的挂载规则,而不是基于 UUID 的规则。基于标签的规则允许将运行状况不佳或不工作的驱动器与具有匹配格式和标签的替代驱动器交换。
      • 基于 UUID 的规则需要编辑 /etc/fstab 文件以将映射替换为新的驱动器 UUID
    • 非 Linux 操作系统应使用等效的驱动器挂载管理工具
  • 独占驱动器

    • MinIO 需要为对象存储提供的驱动器或卷的独占访问权限。任何其他进程、软件、脚本或人员都不应直接对提供给 MinIO 的驱动器或卷或 MinIO 放置在其上的对象或文件执行任何操作
    • 除非 MinIO Engineering 指示,否则请勿使用脚本或工具直接修改、删除或移动所提供驱动器上的任何数据分片、奇偶校验分片或元数据文件,包括从一个驱动器或节点移动到另一个驱动器或节点。此类操作很可能导致超出 MinIO 修复能力的大范围损坏和数据丢失

MinIO 内存要求

  • Memory
  • 内存计算公式
  • 内存主要限制每个节点的并发同时连接数
    • 使用以下公式计算每个节点的最大并发请求数
      • totalRam / ramPerRequest
    • 使用以下公式计算每个请求使用的 RAM 量
      • ((2MiB + 128KiB) * driveCount) + (2 * 10MiB) + (2 * 1 MiB)
      • 10 MiB 是默认纠删块大小 v1
      • 1 MiB 是默认的纠删块大小 v2
  • RELEASE.2024-01-28T22-35-53Z 开始
    • 分布式设置中为每个节点预分配 2GiB 内存
    • 单节点设置预分配 1GiB 内存
  • 下表列出了基于主机驱动器数量和可用系统 RAM 的节点上的最大并发请求数
驱动器32GiB 内存64GiB 内存128GiB 内存256GiB 内存512GiB 内存
41,0742,1494,2978,59517,190
88401,6803,3616,72213,443
165851,1702.3414,6819,362
  • 下表提供了根据节点上的本地存储总量分配内存以供 MinIO 使用的一般准则
主机总存储建议的内存大小
最高 1Ti8GiB
最高 10Ti16GiB
最高 100Ti32GiB
最高 1PB64GiB
超过 1PB128GiB

MinIO 网络要求

  • Networking
  • MinIO 建议高速联网以支持附加存储(聚合驱动器、存储控制器和 PCIe 总线)的最大可能吞吐量。下表提供了给定物理或虚拟网络接口支持的最大存储吞吐量的一般准则。下表假定所有网络基础设施组件(如路由器、交换机和物理布线)也支持 NIC 带宽
NIC 带宽 (Gbps)估计的聚合存储吞吐量 (GBps)
10Gbps1.25GBps
25Gbps3.125GBps
50Gbps6.25GBps
100Gbps12.5GBps
  • 联网对 MinIO 性能的影响最大,其中每个主机的低带宽人为地限制了存储的潜在性能。以下网络吞吐量约束示例假定旋转驱动器具有~100MB/S 的持续 I/O
    • 1GbE 网络链接可支持高达 125MB/s 或 1 个旋转驱动器
    • 10GbE 网络可以支持大约 1.25GB/s,可能支持 10-12 个旋转驱动器
    • 25GbE 网络可以支持大约 3.125GB/s,可能支持~30 个旋转驱动器

MinIO 部署架构

  • 部署架构
  • 硬件清单
  • 安全检查表
  • 软件清单
  • 阈值和限制
  • 可用性和弹性
分布式 MinIO
  • Distributed MinIO Deployments
  • 生产 MinIO 部署由至少 4 个 MinIO 主机组成,这些主机具有同构存储和计算资源

在这里插入图片描述

MinIO 将这些资源聚合在一起作为一个池,并将自身呈现为单个对象存储服务

  • MinIO 会自动将池中的驱动器分组到纠删集中
    • 纠删集是 MinIO 可用性和弹性的基础组件
    • MinIO 在池中的节点之间对称地对纠删集进行条带化,以保持纠删集驱动器的均匀分布
    • 然后,MinIO 根据部署奇偶校验将对象划分为数据分片和奇偶校验分片,并将它们分布在纠删集中
    • 有关 MinIO 冗余和修复的更完整讨论,请参阅 纠删码对象修复
  • MinIO 使用基于对象名称和路径的确定性哈希算法来选择为给定对象设置的纠删集
    • 对于每个唯一的对象命名空间 BUCKET/PREFIX/[PREFIX/...]/OBJECT.EXTENSION,MinIO 始终为读 / 写操作选择相同的纠删集。MinIO 处理池和纠删集中的所有路由,使选择 / 读 / 写过程对应用程序完全透明
  • 每个 MinIO 服务器都有分布式拓扑的完整图,因此应用程序可以连接部署中的任何节点并针对部署中的任何节点执行直接操作
    • MinIO 响应节点会自动处理将内部请求路由到部署中的其他节点,并将最终响应返回给客户端
    • 应用程序通常不应管理这些连接,因为对部署拓扑的任何更改都需要应用程序更新。生产环境应部署负载均衡器或类似的网络控制平面组件来管理与 MinIO 部署的连接。例如,您可以部署 NGINX 负载均衡器,以对部署中的可用节点执行 “最少连接” 或 “循环” 负载均衡
  • 可以通过池扩展来扩展 MinIO 部署的可用存储
    • 每个池都由一组独立的节点组成,这些节点具有自己的纠删集。MinIO 必须查询每个池,以确定它将读取和写入操作定向到的正确擦除集,以便每个额外的池都会增加每次调用的节点间流量。然后,包含正确纠删集的池将响应该操作,对应用程序保持完全透明
    • 如果您通过池扩展修改 MinIO 拓扑,则可以通过修改负载均衡器以包含新池的节点来更新您的应用程序。应用程序可以继续使用 MinIO 部署的负载均衡器地址,而无需进行任何更新或修改。这可确保在所有池中均匀分配请求,同时应用程序继续使用单个负载均衡器 URL 进行 MinIO 操作
复制的 MinIO
  • Replicated MinIO Deployments
  • MinIO 对等站点的站点复制,可以在不同的机架、数据中心或地理区域中部署对等站点,以此来实现 BC/DR (业务连续性与灾难恢复:Business Continuity and Disaster Recovery)或提升读 / 写性能等功能
  • 复制性能主要取决于每个对等站点之间的网络延迟
    • 对于地理位置分散的对等站点,站点之间的高延迟可能会导致严重的复制滞后。这可能会与接近或等于部署整体性能容量的工作负载复合,因为复制过程本身需要足够的可用 I/O 来同步对象
  • 部署支持 Site-to-Site 故障转移协议的 Global Load Balancer 或类似网络设备对于多站点部署的功能至关重要
    • 负载均衡器应支持运行状况探测 / 检查设置,以检测一个站点的故障并自动将应用程序重定向到任何剩余的运行状况良好的对等体
    • 负载均衡器应满足与单站点部署相同的连接平衡和标头保留要求。MinIO 复制通过对要复制的对象进行排队来处理暂时性故障

部署 MinIO

我这里是自己学习使用的,部署的是 4 节点的 MinIO 分布式集群

创建目录

MinIO 运行的节点都需要创建目录

mkdir -p /approot/k8s_data/minio

节点打标签

MinIO 运行的节点都需要打标签,以自己的节点为准

kubectl label node 192.168.22.122 minio=true
kubectl label node 192.168.22.123 minio=true
kubectl label node 192.168.22.124 minio=true
kubectl label node 192.168.22.125 minio=true

创建 namespace

kubectl create ns storage

创建 pv

  • pv 采用 hostPath 的方式,并且 pv 绑定到不同的节点,我这边是 4 节点的 MinIO 集群,要创建 4 个 pv,并且绑定到 4 个不同的节点(目的是让 pod 的副本固定节点运行,如果节点发生飘移,会导致 MinIO 不可用,可以参考官方的文档:local 卷),下面的 pv yaml 内容是我自己环境的,大家需要修改成自己环境的 ip 地址
  • pvc 会直接采用 volumeClaimTemplates 的方式自动申领
---
apiVersion: v1
kind: PersistentVolume
metadata:name: minio-minio-0
spec:accessModes:- ReadWriteOncecapacity:storage: 10GiclaimRef:apiVersion: v1kind: PersistentVolumeClaimname: minio-minio-0namespace: storagehostPath:path: /approot/k8s_data/miniotype: DirectoryOrCreatenodeAffinity:required:nodeSelectorTerms:- matchExpressions:- key: kubernetes.io/hostnameoperator: Invalues:- 192.168.22.122persistentVolumeReclaimPolicy: Retain
---
apiVersion: v1
kind: PersistentVolume
metadata:name: minio-minio-1
spec:accessModes:- ReadWriteOncecapacity:storage: 10GiclaimRef:apiVersion: v1kind: PersistentVolumeClaimname: minio-minio-1namespace: storagehostPath:path: /approot/k8s_data/miniotype: DirectoryOrCreatenodeAffinity:required:nodeSelectorTerms:- matchExpressions:- key: kubernetes.io/hostnameoperator: Invalues:- 192.168.22.123persistentVolumeReclaimPolicy: Retain
---
apiVersion: v1
kind: PersistentVolume
metadata:name: minio-minio-2
spec:accessModes:- ReadWriteOncecapacity:storage: 10GiclaimRef:apiVersion: v1kind: PersistentVolumeClaimname: minio-minio-2namespace: storagehostPath:path: /approot/k8s_data/miniotype: DirectoryOrCreatenodeAffinity:required:nodeSelectorTerms:- matchExpressions:- key: kubernetes.io/hostnameoperator: Invalues:- 192.168.22.124persistentVolumeReclaimPolicy: Retain
---
apiVersion: v1
kind: PersistentVolume
metadata:name: minio-minio-3
spec:accessModes:- ReadWriteOncecapacity:storage: 10GiclaimRef:apiVersion: v1kind: PersistentVolumeClaimname: minio-minio-3namespace: storagehostPath:path: /approot/k8s_data/miniotype: DirectoryOrCreatenodeAffinity:required:nodeSelectorTerms:- matchExpressions:- key: kubernetes.io/hostnameoperator: Invalues:- 192.168.22.125persistentVolumeReclaimPolicy: Retain

创建 MinIO

---
apiVersion: v1
kind: Service
metadata:labels:app: minioname: minio-svcnamespace: storage
spec:ports:- name: httpport: 9000protocol: TCPtargetPort: 9000- name: consoleport: 8000protocol: TCPtargetPort: 8000selector:app: miniotype: ClusterIP
---
apiVersion: v1
kind: Secret
metadata:name: minio-secretnamespace: storage
stringData:password: 1q@W3e$Rusername: admin
type: kubernetes.io/basic-auth
---
apiVersion: apps/v1
kind: StatefulSet
metadata:name: minionamespace: storage
spec:podManagementPolicy: Parallelreplicas: 4selector:matchLabels:app: minioserviceName: minio-svctemplate:metadata:labels:app: miniospec:affinity:nodeAffinity:requiredDuringSchedulingIgnoredDuringExecution:nodeSelectorTerms:- matchExpressions:- key: miniooperator: Invalues:- "true"podAntiAffinity:requiredDuringSchedulingIgnoredDuringExecution:- labelSelector:matchExpressions:- key: appoperator: Invalues:- miniotopologyKey: kubernetes.io/hostnamecontainers:- args:- server- http://minio-{0...3}.minio-svc.storage.svc.cluster.local/data- --console-address- :8000- --address- :9000env:- name: MINIO_ROOT_USERvalueFrom:secretKeyRef:key: usernamename: minio-secret- name: MINIO_ROOT_PASSWORDvalueFrom:secretKeyRef:key: passwordname: minio-secretimage: m.daocloud.io/minio/minio:RELEASE.2024-09-22T00-33-43ZimagePullPolicy: IfNotPresentname: minioports:- containerPort: 9000name: httpprotocol: TCP- containerPort: 8000name: consoleprotocol: TCPresources:limits:cpu: 1000mmemory: 2048Mirequests:cpu: 100mmemory: 100MivolumeMounts:- mountPath: /dataname: minio# 自动申领 pvcvolumeClaimTemplates:- metadata:name: miniospec:accessModes:- ReadWriteOnceresources:requests:storage: 10Gi

配置 ingress

---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:name: minionamespace: storage
spec:ingressClassName: nginxrules:- host: minio.devops.icuhttp:paths:- backend:service:name: minio-svcport:number: 8000path: /pathType: Prefix

通过浏览器访问 minio.devops.icu 就可以了,用户名密码是 secret 里面配置的 usernamepassword,找到 metrics 界面,查看当前的集群情况

在这里插入图片描述

然后可以自己创建 Buckets ,然后上传文件尝试

问题记录

通过代理服务器访问 MinIO 的 Object Browser 界面一直显示 loading

在这里插入图片描述

通过浏览器的开发者工具,可以看到 console 这里很多 websocket 的报错,需要让代理服务器支持 websocket

  • 对应的 location 这块加上下面三个参数来支持 websocket
            proxy_http_version      1.1;proxy_set_header Upgrade $http_upgrade;proxy_set_header Connection "upgrade";
  • 重载 nginx 的配置,或者重启 nginx 服务来生效配置文件,刷新一下就发现正常了

在这里插入图片描述

然后可以自己创建 Buckets ,然后上传文件尝试

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

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

相关文章

免费获取的8个SVG图标库,轻松下载与复制!

SVG图标相比传统的JPG、PNG图标具有诸多优势,适用于各种类型的图像,不仅能在不同尺寸下保持清晰度,还具备高度压缩性和轻量特性,支持静态和动态效果。因此,SVG格式在网页设计中往往是优选。尽管如今有很多免费的图标库…

微信小程序-APP-软件开发

微信小程序开发,作为当下移动互联网领域的一股强劲势力,正以其便捷性、轻量化及高用户粘性的特点,深刻改变着我们的生活与工作方式。它不仅为企业和个人开发者提供了一个全新的服务入口,更极大地拓宽了商业应用的边界。 在微信小…

python+request+unittest+ddt自动化框架

参考资料: 用户中心 - 博客园 抓包模拟器笔记 肖sir__接口自动化pythonrequestddt(模版) - xiaolehua - 博客园 pythonrequestunittestddt自动化框架 博文阅读密码验证 - 博客园 肖sir__python之模块configparser - xiaolehua - 博客园 c…

byte[]/InputStream/MultipartFile之间进行转换

前言 问题产生: 最近开发项目的时候,遇到了文件上传对象转换的问题 -> 我在对接抖音开放平台的时候,有一个图片上传的接口,需要将byte[]转为MultipartFile 对象,但是发现根本没有这样的工具类,后面翻阅…

python list, tuple dict,set的区别 以及**kwargs 的基本用法

在python中, list, tuple, dict, set有什么区别, 主要应用在什么样的场景? 定义: list:链表,有序的项目, 通过索引进行查找,使用方括号”[]”; tuple:元组,元组将多样的对象集合到一起,不能修改,通过索引进行查找, 使用括号”()”; dict:字典,字典是一组键(key)和值(value…

多元线性回归:机器学习中的经典模型探讨

引言 多元线性回归是统计学和机器学习中广泛应用的一种回归分析方法。它通过分析多个自变量与因变量之间的关系,帮助我们理解和预测数据的行为。本文将深入探讨多元线性回归的理论背景、数学原理、模型构建、技术细节及其实际应用。 一、多元线性回归的背景与发展…

【杭州马拉松:文化之旅,感受千年古城的魅力】

杭州马拉松,作为国内外知名的马拉松赛事,一直以来都以其独特的魅力和严谨的组织而备受瞩目。今年,杭马将于11月3日再次鸣枪起跑,为跑者们提供一个挑战自我、超越极限的舞台。赛事主办方在今年的比赛中引入了多项创新举措&#xff…

经典蓝牙BLE版本区别:【图文讲解】

蓝牙是一种短距的无线通讯技术,可实现固定设备、移动设备之间的数据交换。一般将蓝牙3.0之前的BR/EDR蓝牙称为传统蓝牙,而将蓝牙4.0规范下的LE蓝牙称为低功耗蓝牙(BLE)。 1:蓝牙4.0 BLE 4.0版本是3.0版本的升级版本&a…

20240904 华为笔试 二叉树消消乐

文章目录 题目解题思路代码BUG 代码最终代码题目 题目描述 给定原始二叉树和参照二叉树(输入的二叉树均为满二叉树,二叉树节点的值范围为[1,1000],二叉树的深度不超过1000),现对原始二叉树和参照二又树中相同层级目值相同的节点进行消除,消除规则为原始二叉树和参照二又树中…

Tetra Pak利乐触摸屏维修beijer北尔触摸屏维修E1151

TetraPak利乐包装机触摸显示屏维修,北尔全系列型号触摸屏修理 维修注意事项: 上电前,应检查负载是否接上或是否正确; 测量电压时,确认档位是否在电压档。要确认仪器仪表的量程应大于测试点的电压; 更换电…

太速科技-607-基于FMC的12收和12发的光纤子卡

基于FMC的12收和12发的光纤子卡 一、板卡概述 本卡是一个FPGA夹层卡(FMC)模块,可提供高达2个CXP模块接口,提供12路收,12路发的光纤通道。每个通道支持10Gbps,通过Aurora协议,可以组成X4&#xff0…

嵌入式学习-线性表Day05-双向链表

嵌入式学习-线性表Day05-双向链表 双向链表 操作函数 1)创建一个空的双向链表 2)双向链表中间插入 3)双向链表尾插 4)双线链表中间删除 5)双线链表删除最后一个节点 双向循环链表 双向链表 //双向链表的节点定义 typedef int dat…

力扣题11~20

题11(中等): 思路: 这种题目第一眼就是双循环,但是肯定不行滴,o(n^2)这种肯定超时,很难接受。 所以要另辟蹊径,我们先用俩指针(标志位)在最左端和最右端&am…

补图、同构图、自补图是什么意思

补图、同构图、自补图的解释网上很多文章写的不是很明确,所以我写一段小笔记记录一下。 同构图 同构图的数学定义为:给定两个图G(V,E)和G(V,E),若存在一个双射函数f:V->V,使得对于任意的顶点u,v∈V,(u,v)∈E当且仅…

日语学习零基础生活日语口语柯桥外语学校|股票用日语怎么说?

在日语中,“股票”可以说: • 株(かぶ) 这是最常用的表达方式,直接表示“股票”。 例如: 株を買う - 买股票 株を売る - 卖股票 • 株式(かぶしき) 这个词也是“股票”的意…

回答网友的一个问题socket_server的问题

今天网上有人讨论在Midas数据库编程中,如果客户端采用Socket连接,服务端运行Borland Socket Server程序,在服务器(一个CPU以上)上运行有问题。俺就找出了这个:

【工具使用】使用Docsify搭建个人文档网站

检查Node.js安装状态 首先,打开命令提示符(CMD),输入以下命令以验证Node.js是否已经安装在您的电脑上: node -v安装Docsify CLI工具 接下来,通过以下命令全局安装Docsify的命令行工具: npm …

布隆过滤器(Bloom Filter)详解

一、引言 在处理大量数据的场景中,我们经常会遇到判断一个元素是否在某个集合中的问题。传统的方法可能是使用 HashMap 等集合将数据保存起来,然后进行比较确定,但在元素很多的情况下,这种方式会非常浪费空间,检索速度…

知识蒸馏介绍

一、知识蒸馏介绍 1.1 概念介绍 知识蒸馏(knowledge distillation)是模型压缩的一种常用的方法,不同于模型压缩中的剪枝和量化,知识蒸馏是通过构建一个轻量化的小模型,利用性能更好的大模型的监督信息,来…

极客兔兔Gee-Cache Day7

protobuf配置: 从 Protobuf Releases 下载最先版本的发布包安装。解压后将解压路径下的 bin 目录 加入到环境变量即可。 如果能正常显示版本,则表示安装成功。 $ protoc --version libprotoc 3.11.2在Golang中使用protobuf,还需要protoc-g…