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

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 ,然后上传文件尝试

相关文章:

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

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

HAL库常用的函数:

目录 HAL库: 1.GPIO常用函数: 1.HAL_GPIO_ReadPin( ) 2.HAL_GPIO_WritePin( ) 3.HAL_GPIO_TogglePin( ) 4.HAL_GPIO_EXTI_IRQHandler( ) 5.HAL_GPIO_EXTI_Callback( ) 2.UART常用函数: 1.HAL_U…...

如何捕捉行情爆发的前兆

在金融市场的激烈角逐中,每一次行情的爆发都是投资者获取丰厚回报的关键时刻。然而,如何识别并把握这些时刻,却是一门需要深厚金融专业知识和敏锐洞察力的艺术。今天,我们就来深入探讨行情爆发的初期信号,揭示那些能够…...

【万字长文】Word2Vec计算详解(一)CBOW模型

【万字长文】Word2Vec计算详解(一)CBOW模型 写在前面 本文用于记录本人学习NLP过程中,学习Word2Vec部分时的详细过程,本文与本人写的其他文章一样,旨在给出Word2Vec模型中的详细计算过程,包括每个模块的计…...

React Native源码学习

核心组件 基础组件:View、Text、Image、TextInput、ScrollView(性能没有FlatList好,因为它会一次性把子元素渲染出来)、StyleSheet交互组件:button列表视图:FlatList(优先渲染屏幕上可见的元素&…...

【计网】从零开始认识https协议 --- 保证安全的网络通信

在每个死胡同的尽头, 都有另一个维度的天空, 在无路可走时迫使你腾空而起, 那就是奇迹。 --- 廖一梅 --- 从零开始认识https协议 1 什么是https协议2 https通信方案2.1 只使用对称加密2.2 只使用非对称加密2.3 双方都使用非对称加密2.4 …...

Ubuntu安装 MySQL【亲测有效】

在Ubuntu上安装MySQL数据库的步骤通常包括更新软件包列表、安装MySQL服务器、启动并配置MySQL服务等。以下是一个详细的安装指南: 一、更新软件包列表 首先,打开终端并输入以下命令来更新Ubuntu的软件包列表: sudo apt update二、安装MySQ…...

Unity 从零开始搭建一套简单易用的UGUI小框架 扩展与优化篇(完结)

一个通用的UGUI小框架就算是写完了,下面是一步步的思考与优化过程 Unity 从零开始搭建一套简单易用的UGUI小框架 基础分析篇-CSDN博客 Unity 从零开始搭建一套简单易用的UGUI小框架 功能撰写与优化篇-CSDN博客 从使用者的角度来整理一下可能会发出的疑问 0. Panel…...

MySQL多表操作--外键约束多表关系

外键约束介绍 Mysql外键约束(foreign key)是表的一个特殊字段,常与主键约束一起使用。外键约束是一种用于维护两个表之间数据一致性的方法。它确保引用表中的每个值都存在于主表中的某个列中。外键约束通常用于实现数据库的参照完整性。对于两…...

【python入门到精通专题】8.装饰器

装饰器是python语言中的语法糖,可以通过装饰器对函数的功能进行拓展。 为什么需要装饰器 我们假设你的程序实现了say_hello()和say_goodbye()两个函数。 def say_hello():print("hello!")def say_goodbye():print("hello!") # 此处应打印go…...

Halcon Blob分析提取小光斑

文章目录 算子complement 返回一个区域的补集select_region_point 选择包含指定像素的所有区域intensity 计算灰度值的均值和偏差 案例 算子 complement 返回一个区域的补集 complement(Region : RegionComplement : : )Region (输入对象):这指的是输入的一个或多…...

Lua

1.声明一个变量 只要赋值一个变量,就相当于新建了一个变量,默认全局变量,加一个local前缀之后,这个变量就变成了局部变量 a1//全局变量 local b2//局部变量2.nil类型 在Lua里没有被声明过的变量都是nil,nil是一种类…...

模型 总观效应

系列文章 分享 模型,了解更多👉 模型_思维模型目录。超越自我,洞见生命之渺小。 1 总观效应的呈现和应用 1.1 回首创业路,星辰大海的启示 陈浩是一名连续创业者,他的创业历程充满了起伏和挑战。在经历了几次失败后&a…...

【HarmonyOS NEXT】实现页面水印功能

关键词:鸿蒙、水印、Watermark、页面、触摸问题 注:本期文章同样适用 OpenHarmony 的开发 在app开发过程中时常会出现敏感信息页面,为保护信息安全和及时的数据追踪,通常会采用给页面加水印的形式,那么本期文章会介绍…...

selenium自动化测试之Junit

1. 常用的注解 将junit的索引添加到pom文件&#xff1a; <!-- https://mvnrepository.com/artifact/org.junit.jupiter/junit-jupiter-api --><dependency><groupId>org.junit.jupiter</groupId><artifactId>junit-jupiter-api</artifactId&…...

【氮化镓】基于氮化镓的互补逻辑集成电路[Nature Electronics]

【摘要】本文介绍了一种基于氮化镓(GaN)的互补金属氧化物半导体(CMOS)逻辑集成电路,该电路利用氧等离子体处理技术实现了增强型n沟道和p沟道GaN场效应晶体管的单片集成。研究者们展示了包括反相器、与非门、或非门和传输门在内的基本逻辑门,以及多级逻辑电路,如锁存器和…...

Linux之如何找回 root 密码?

1、启动系统&#xff0c;进入开界面&#xff0c;在界面中按“e"进入编辑界面 2、进入编辑界面&#xff0c;使用键盘上的上下键把光标往下移动&#xff0c;找到以”Linux16“开通内容所在的行数&#xff0c;在行的最后面输入&#xff1a;init/bin/sh 3、输入完成后&…...

后端参数校验方式

1. 使用Hibernate Validator进行注解校验 这是Java中最常用的参数校验方式&#xff0c;基于JSR 303/JSR 380规范的实现&#xff0c;通常结合Valid或Validated注解进行参数校验。 使用步骤&#xff1a; 添加依赖&#xff08;如果使用Spring Boot&#xff0c;通常已经内置了Hi…...

访问控制列表(课内实验)

实验2&#xff1a;访问控制列表 实验目的及要求&#xff1a; 通过实验&#xff0c;进一步的理解标准ACL与扩展ACL的工作原理及执行过程。理解通配符的概念&#xff0c;熟练掌握标准ACL与扩展ACL的配置指令&#xff0c;掌握将访问控制列表应用VTY线路上&#xff0c;并且能够判断…...

处理Java内存溢出问题(java.lang.OutOfMemoryError):增加JVM堆内存与调优

处理Java内存溢出问题&#xff08;java.lang.OutOfMemoryError&#xff09;&#xff1a;增加JVM堆内存与调优 在进行压力测试时&#xff0c;遇到java.lang.OutOfMemoryError: Java heap space错误或者nginx报错no live upstreams while connecting to upstream通常意味着应用的…...

数据分析库Pandas

一、认识Pandas数据分析库 Pandas是一个功能强大的数据分析库&#xff0c;它提供了丰富的数据结构和函数来处理和分析表格数据。在处理类似您提供的Excel文件时&#xff0c;首先需要导入Pandas库并读取数据&#xff0c;然后进行数据清洗和预处理&#xff0c;最后进行数据分析和…...

nginx做负载均衡的策略有哪些和模块

文章目录 策略模块 策略 轮询&#xff1a;轮询是Nginx默认的负载均衡策略&#xff0c;每个请求会按时间顺序分配到不同的后端服务器。这种方式适用于服务器配置相当且无状态的服务场景。加权轮询&#xff1a;在轮询的基础上&#xff0c;通过设置权重来调整不同服务器处理请求的…...

基于SSM社区医院预约转诊管理系统JAVA|VUE|Springboot计算机毕业设计源代码+数据库+LW文档+开题报告+答辩稿+部署教+代码讲解

源代码数据库LW文档&#xff08;1万字以上&#xff09;开题报告答辩稿 部署教程代码讲解代码时间修改教程 一、开发工具、运行环境、开发技术 开发工具 1、操作系统&#xff1a;Window操作系统 2、开发工具&#xff1a;IntelliJ IDEA或者Eclipse 3、数据库存储&#xff1a…...

Android适配器更改,ListView未收到通知解析

只需要在每次适配器发生变化时&#xff0c;调用函数adapter.notifyDataSetChanged(); 其中的adapter是适配器名。 需要说明的适配器对应的数组&#xff1a;List<String>也是适配器的一部分。 如&#xff1a;以下代码中的lists数组 List<T> lists new ArrayLis…...

ubuntu18.04系统中图形化界面

一、Ubuntu 18.04 中&#xff0c;使用 GDM 作为默认的图形用户界面&#xff08;GUI&#xff09;管理器。GDM 是 GNOME Display Manager 的缩写&#xff0c;它是用于 Ubuntu 的显示管理器&#xff0c;负责处理登录和会话管理。 通过命令行重启 Ubuntu 18.04 上的图形界面服务&am…...

深入Semantic Kernel:插件开发与实践应用(进阶篇)

文章目录 一、引言二、开发Semantic Kernel插件三、实战3.1 时间信息插件3.2 小部件工厂插件3.3 初始化Semantic Kernel实例3.4 四个实战示例3.4.1 模型幻觉3.4.2 给模型提供时间信息3.4.3 AI自动调用函数3.4.4 AI自动调用和使用枚举 四、结论 一、引言 在上一篇入门文章《探索…...

基于SpringBoot+Vue+Uniapp的植物园管理小程序系统(2024最新,源码+文档+远程部署+讲解视频等)

3. 论文参考 4. 项目运行截图 5. 技术框架 5.1 后端采用SpringBoot框架 Spring Boot 是一个用于快速开发基于 Spring 框架的应用程序的开源框架。它采用约定大于配置的理念&#xff0c;提供了一套默认的配置&#xff0c;让开发者可以更专注于业务逻辑而不是配置文件。Spring …...

2024zzuacm新生选拔赛第一场

2024zzuacm新生选拔赛第一场https://ac.nowcoder.com/acm/contest/92409 python代码源自我有异议症QAQ A - 降智视频 题意 起初有n个数都在丁丁手中&#xff0c;进行如下操作k次&#xff1a; 豆豆从丁丁手中拿走标号为奇数的数。对丁丁的其他的数进行重新标号。 问进行k次…...

IP地址如何支持远程办公?

由于当今社会经济的飞速发展&#xff0c;各个方向的业务都不免接触到跨省、跨市以及跨国办公的需要&#xff0c;随之而来的远程操作的不方便&#xff0c;加载缓慢&#xff0c;传输文件时间过长等困难&#xff0c;如何在万里之外实现远程办公呢&#xff1f;我们以以下几点进行阐…...

spring 集合注入格式

数组 List Set Map properties 案例 package org.example.dao.impl;import org.example.dao.BookDao;import java.util.List; import java.util.Map; import java.util.Properties; import java.util.Set;public class BookDaoImpl implements BookDao {private int[] array;p…...