轻量级容器Microverse:边缘计算与嵌入式AI的极简部署方案

news2026/5/5 12:18:10
1. 项目概述一个轻量级、可移植的“微宇宙”开发沙箱最近在折腾一些边缘计算和嵌入式AI应用的原型验证经常遇到一个头疼的问题开发环境和部署环境不一致。在本地笔记本上跑得好好的Python脚本放到树莓派或者Jetson Nano上各种依赖库版本冲突、系统库缺失调试起来费时费力。后来在GitHub上闲逛偶然发现了KsanaDock/Microverse这个项目第一眼看到“Microverse”这个名字就觉得挺有意思——微宇宙听起来像是一个自包含的小世界。点进去一看果然这是一个旨在为资源受限的边缘设备提供轻量级、一致化应用运行环境的容器化解决方案。简单来说KsanaDock/Microverse的核心目标是打造一个极度精简的容器运行时和镜像格式让开发者能够将应用及其所有依赖打包成一个独立的、可移植的“微宇宙”然后在从x86服务器到ARM边缘网关的各种设备上以近乎原生性能的方式运行起来。它不像Docker那样追求功能的全面性而是把“小”和“快”做到了极致。镜像体积可以做到只有几MB启动时间在毫秒级这对于存储空间有限、算力紧张的边缘侧设备来说吸引力巨大。这个项目适合谁呢如果你是一名IoT开发者、嵌入式软件工程师或者正在从事边缘AI应用的部署和运维经常和不同的硬件架构、五花八门的Linux发行版打交道那么Microverse很可能成为你工具箱里的一件利器。它帮你屏蔽了底层环境的差异让你能更专注于应用逻辑本身。当然对容器技术底层原理感兴趣想学习如何从零构建一个极简容器运行时的小伙伴也能从这个项目中挖到不少宝藏。2. 核心设计理念与架构拆解2.1 为什么是“Micro”与Docker的差异化定位要理解Microverse首先要明白它和Docker这类成熟容器引擎的根本区别。Docker经过多年发展已经成为一个功能庞大的平台包含了镜像构建、仓库管理、集群编排Swarm等一系列生态。它的容器运行时containerd/runc功能完善但也相对较重。一个最小的Alpine Linux Docker镜像也要5MB左右加上运行时开销在只有256MB内存的设备上跑起来就比较吃力了。Microverse的设计哲学是“做减法”。它问自己的第一个问题是在边缘场景下一个容器真正必须的核心功能是什么答案是隔离与打包。基于这个思路它做了大量精简剥离容器编排Microverse不关心Swarm或Kubernetes它的定位就是单机容器运行时。边缘设备往往是独立节点复杂的编排需求不强。简化镜像格式它定义了自己的、更简单的镜像层格式和元数据结构去掉了Docker镜像中许多用于兼容历史版本和复杂分发场景的字段使得镜像解析和加载更快。聚焦Linux原生隔离主要利用Linux NamespaceUTS, PID, Mount, Network等和Cgroups实现进程视图、文件系统和资源的隔离。它没有去实现一个完整的、类似runc的OCI运行时规范而是实现了一个更轻量的管理器直接调用系统调用完成容器的创建。极简的客户端工具配套的命令行工具microctl功能非常聚焦只有run,images,rmi等几个核心命令学习成本极低。这种极简设计带来的直接好处就是极致的轻量。Microverse的运行时本身可能只有几百KB它启动一个容器不需要启动一个常驻的守护进程daemon而是采用了一种更接近fork/exec的模式这使得它的启动延迟极低资源占用几乎可以忽略不计。2.2 核心架构组件与工作流程Microverse的架构清晰明了主要由三个部分组成镜像仓库Registry用于存储和分发Microverse格式的容器镜像。它兼容OCI标准的一部分但做了简化。你可以使用microctl pull从仓库拉取镜像或者通过microctl build从Dockerfile支持子集构建镜像。容器运行时Runtime这是核心中的核心。它负责镜像解压与rootfs准备将镜像层展开联合挂载通常使用overlayfs成一个完整的容器根文件系统。命名空间与Cgroups创建调用Linux内核接口为容器进程创建独立的运行环境。进程生命周期管理启动容器内的初始进程如/bin/sh或你的应用并监控其状态。命令行工具microctl用户交互的入口。它将用户命令如microctl run myapp:latest转化为对运行时的调用。一个典型的容器启动流程如下用户执行 microctl run nginx:micro - microctl 解析镜像标签 - 检查本地是否存在否则从仓库拉取 - 解压镜像层使用overlayfs准备rootfs - 运行时调用unshare()等系统调用创建命名空间 - 设置cgroup限制如内存、CPU - 在新建的命名空间内chroot到rootfs并execve()执行容器入口点程序 - 容器进程独立运行。注意Microverse默认可能不配置网络命名空间或者提供非常简单的网络模式如host模式。复杂的网络管理如自定义网桥、端口映射不是其优先考虑项这符合边缘设备常常使用单一网络接口的实际情况。2.3 关键技术选型解析文件系统OverlayFS的必然选择Microverse使用OverlayFS作为联合文件系统的驱动这是性能与功能平衡后的最佳选择。相比AUFS未并入内核主线和DeviceMapper配置复杂OverlayFS是Linux内核原生支持效率高且稳定。它的“lowerdir”镜像层只读、“upperdir”容器可写层和“merged”统一视图模型完美契合容器镜像的分层概念。在资源受限环境下OverlayFS的内存和CPU开销相对较小。镜像格式自定义简化格式Microverse没有完全采用OCI镜像规范而是定义了自己的manifest.json和层文件格式。例如它的清单文件可能只包含架构、入口点、层哈希等最关键的字段去掉了历史记录、作者等元数据。每一层就是一个普通的tar.gz压缩包。这种简化使得镜像的生成和解析速度更快工具链也更简单。进程隔离深度利用Namespace这是容器安全的基石。Microverse会至少创建以下NamespaceMount (CLONE_NEWNS)隔离文件系统挂载点容器内的/proc、/sys都是独立的。PID (CLONE_NEWPID)容器内进程的PID从1开始看不到宿主机进程。UTS (CLONE_NEWUTS)独立主机名和域名。IPC (CLONE_NEWIPC)隔离进程间通信如信号量、消息队列。Network (CLONE_NEWNET)可选。提供独立的网络栈、网卡、IP、路由表。 通过精细控制这些Namespace的创建Microverse在提供足够隔离的同时避免了创建不必要的Namespace如User Namespace带来的性能开销。3. 从零开始构建与运行你的第一个Microverse容器3.1 环境准备与运行时安装Microverse目前可能更偏向于概念验证或早期应用阶段因此安装方式可能不像Docker那样有各大发行版的官方仓库支持。典型的安装方式是从源码编译。假设我们在一个Ubuntu 20.04的x86开发机或ARM边缘设备上操作# 1. 安装基础依赖 sudo apt-get update sudo apt-get install -y build-essential git libseccomp-dev pkg-config # 2. 克隆源码假设项目托管在GitHub git clone https://github.com/KsanaDock/Microverse.git cd Microverse # 3. 编译项目可能使用Go或Rust这里以假设的Makefile为例 make # 编译成功后会在当前目录生成 microverse-runtime 和 microctl 二进制文件 # 4. 安装到系统路径 sudo cp microverse-runtime microctl /usr/local/bin/实操心得在ARM设备如树莓派上编译时务必确认Go或Rust工具链已正确配置为对应架构。如果遇到依赖库缺失错误信息通常会指明需要根据提示安装对应的-dev包例如libssl-dev。3.2 构建一个Microverse格式的镜像虽然可以从头开始制作一个rootfs的tar包但更常用的方式是使用DockerfileMicroverse支持一个子集来构建。假设我们有一个简单的Python应用。项目结构my-micro-app/ ├── app.py ├── requirements.txt └── Dockerfile.microapp.py:from flask import Flask app Flask(__name__) app.route(/) def hello(): return Hello from Microverse Container! if __name__ __main__: app.run(host0.0.0.0, port8080)requirements.txt:Flask2.3.2Dockerfile.micro:# 使用一个极小的基础镜像例如 Alpine Linux 的 Microverse 变种 FROM alpine:latest as builder # Microverse 构建器可能要求一个特定的标签这里用 alpine 示例 # 实际中可能需要 FROM microverse/alpine:latest # 安装Python和pip RUN apk add --no-cache python3 py3-pip # 设置工作目录 WORKDIR /app # 复制依赖文件并安装 COPY requirements.txt . RUN pip3 install --no-cache-dir -r requirements.txt # 复制应用代码 COPY app.py . # 指定容器启动命令 CMD [python3, app.py]使用microctl进行构建# 在 my-micro-app 目录下执行 microctl build -f Dockerfile.micro -t myapp:latest .这个过程会解析Dockerfile.micro。以alpine:latest为基础创建一个临时容器执行其中的RUN指令。将每一层的变化如安装的软件包、复制的文件保存为Microverse的镜像层。最终打包并打上myapp:latest的标签。3.3 运行与基础操作镜像构建成功后运行它就非常简单了# 运行容器 microctl run -d --name my-running-app myapp:latest # 查看运行中的容器Microverse可能使用 ps 子命令 microctl ps # 查看容器日志 microctl logs my-running-app # 进入容器shell如果镜像包含/bin/sh microctl exec -it my-running-app /bin/sh # 停止容器 microctl stop my-running-app # 删除容器 microctl rm my-running-app # 列出本地镜像 microctl images # 删除本地镜像 microctl rmi myapp:latest参数解析-d后台运行detached mode。--name为容器指定一个名字便于后续管理。-it通常与exec连用分配一个伪终端并保持标准输入打开用于交互式操作。运行后你可以通过宿主机的IP和8080端口访问这个Flask应用。由于Microverse可能默认使用host网络模式容器直接使用宿主机的网络栈所以端口是直接暴露的。4. 深入实践边缘场景下的高级配置与优化4.1 资源限制为容器戴上“紧箍咒”边缘设备资源紧张放任容器占用所有资源是灾难性的。Microverse通过Cgroups来实现资源限制。虽然microctl的命令可能不如docker run的参数丰富但通常支持核心限制。# 限制容器最多使用 256MB 内存和 100MB 交换分区 microctl run -d --name limited-app --memory 256m --memory-swap 360m myapp:latest # 限制容器使用最多 50% 的单个 CPU 核心通过配额方式 # 假设 microctl 使用 --cpus 参数它背后会设置 cpu.cfs_quota_us microctl run -d --name cpu-limited-app --cpus 0.5 myapp:latest # 更精细的 CPU 绑定将容器进程绑定到特定的 CPU 核心上 # 这能减少缓存失效提升性能尤其在多核异构 CPU如 big.LITTLE上很重要 microctl run -d --name cpu-pinned-app --cpuset-cpus 0,2 myapp:latest背后的原理当执行--memory 256m时microctl会在/sys/fs/cgroup/memory/microverse/目录下或类似路径为容器创建一个子目录并向该目录的memory.limit_in_bytes文件写入26843545625610241024。Linux内核的Cgroup子系统会强制实施这个限制。4.2 存储与数据持久化容器内的文件更改默认发生在可写层OverlayFS的upperdir容器删除数据就丢了。边缘应用常需要保存配置、日志或数据。绑定挂载Bind Mount将宿主机目录直接挂载到容器内。这是最简单直接的方式。# 将宿主机的 /opt/app/config 挂载到容器的 /app/config microctl run -d --name app-with-config \ -v /opt/app/config:/app/config:ro \ myapp:latest:ro表示只读挂载防止容器意外修改宿主机文件。对于日志目录我们通常用rw读写默认挂载方便容器写入宿主机进行日志收集。使用Volume如果Microverse实现Volume是由Microverse管理的数据卷生命周期独立于容器更适合数据持久化。但Microverse这类轻量级运行时可能不实现完整的Volume驱动绑定挂载是更通用的选择。注意事项在边缘设备上挂载的宿主机路径需要特别注意权限问题。容器内进程通常以非root用户运行出于安全考虑其UID/GID可能无法访问宿主机上的目录。解决方法有二一是在宿主机上调整目录权限如chmod 777不安全二是在构建镜像时确保容器内应用用户的UID与宿主机上拥有目录权限的用户UID匹配。更安全的做法是使用user namespace映射但这会增加复杂度Microverse可能默认未开启。4.3 网络模式简析Microverse为了极简化网络支持可能比较基础。常见模式有host模式容器直接使用宿主机的网络命名空间。性能最好端口无需映射但隔离性最差。这是边缘场景下最常见的选择因为设备通常只有一个网络接口用于业务通信。# 可能通过 --nethost 指定或者默认就是host模式 microctl run -d --name host-net-app --net host myapp:latestnone模式容器有自己的网络命名空间但内部只有lo环回接口没有外网连接。适用于完全不需要网络的离线计算任务。bridge模式如果支持容器连接到一个Linux网桥上通过NAT与外界通信。这需要更复杂的设置创建网桥、配置iptables规则Microverse可能不原生支持或支持有限。对于边缘设备如果应用需要独立的IP或特定的网络配置更常见的做法是让容器跑在host网络下由宿主机上的网络管理工具如NetworkManager、systemd-networkd或应用自身来配置更复杂的网络策略。5. 实战案例将AI模型服务部署到边缘设备让我们用一个真实场景串联所有知识点将一个基于PyTorch的图像分类模型服务部署到Jetson NanoARM架构上。5.1 准备阶段模型与依赖梳理假设我们有一个训练好的ResNet-18模型并提供了一个简单的FastAPI服务。依赖包括Python 3.8, PyTorch 1.12带ARM CUDA支持 torchvision, FastAPI, uvicorn等。在x86开发机上我们需要为ARM架构构建PyTorch的wheel包或者找到预编译的兼容版本。NVIDIA为Jetson系列提供了torch-2.x的pip安装包。编写Dockerfile.micro明确指定基础镜像为ARM架构的版本。Dockerfile.micro (arm64v8):# 使用针对 ARM64 优化的轻量级 Python 镜像 FROM arm64v8/python:3.8-slim-buster # 设置工作目录 WORKDIR /app # 安装系统依赖如 libgl1-mesa-glx 用于图像处理 RUN apt-get update apt-get install -y \ libgl1-mesa-glx \ libglib2.0-0 \ --no-install-recommends \ rm -rf /var/lib/apt/lists/* # 复制依赖清单并安装Python包 # 注意torch 和 torchvision 需要特定于 Jetson 的版本这里假设已下载到本地 context COPY requirements.jetson.txt . RUN pip3 install --no-cache-dir -r requirements.jetson.txt # 复制模型文件和应用代码 COPY resnet18.pth . COPY model_server.py . # 暴露端口 EXPOSE 8000 # 启动命令 CMD [uvicorn, model_server:app, --host, 0.0.0.0, --port, 8000]requirements.jetson.txt内容可能类似fastapi0.104.1 uvicorn[standard]0.24.0 pillow10.1.0 # PyTorch for Jetson (预下载的wheel文件通过本地路径安装) ./torch-2.1.0-cp38-cp38-linux_aarch64.whl ./torchvision-0.16.0-cp38-cp38-linux_aarch64.whl5.2 构建与传输在x86开发机上我们无法直接构建ARM镜像除非使用交叉编译或模拟。更实用的流程是在x86机上准备好所有文件Dockerfile, 代码, 模型, ARM版wheel包。将整个构建上下文上传到Jetson Nano。在Jetson Nano上本地执行构建。# 在开发机上打包上下文 tar -czf app_context.tar.gz ./my-ai-app/ # 传输到 Jetson Nano scp app_context.tar.gz nanojetson-ip:~/projects/ # 在 Jetson Nano 上 cd ~/projects tar -xzf app_context.tar.gz cd my-ai-app microctl build -f Dockerfile.micro -t ai-model-server:jetson .这个过程可能会比较慢因为需要在ARM设备上编译一些Python包的C扩展。但确保了二进制兼容性。5.3 运行与资源调优在Jetson Nano上运行容器需要仔细配置资源限制因为其内存和CPU资源非常有限。# 运行容器限制内存绑定到所有CPU核心Jetson Nano是4核A57 # 挂载一个目录用于缓存模型或临时文件 # 使用host网络模式以获得最佳网络性能 microctl run -d \ --name ai-service \ --memory 1.5g \ # Jetson Nano 共有 4GB 内存分1.5G给容器 --cpuset-cpus 0-3 \ # 绑定所有核心 -v /data/model_cache:/app/cache:rw \ --net host \ ai-model-server:jetson关键调优点内存Jetson Nano的GPU和CPU共享内存。分配给容器的1.5G是系统内存。如果模型加载到GPU还会占用GPU内存也是同一块共享内存需要确保总和不超过物理限制。CPU绑定绑定所有核心可以避免进程在核心间跳跃但也可以根据负载情况只绑定大核如果有大小核设计。存储挂载/data/model_cache可以避免每次启动都从镜像内解压大模型文件加快启动速度。网络host模式避免了NAT开销对于需要高吞吐量推理服务的场景很重要。5.4 服务测试与监控容器启动后在Jetson Nano上或同一网络的机器上可以使用curl测试服务curl -X POST http://jetson-ip:8000/predict \ -H Content-Type: multipart/form-data \ -F imagetest_cat.jpg同时需要监控容器的运行状态# 查看容器资源使用情况如果 microctl 有 stats 命令 microctl stats ai-service # 或者直接使用宿主机工具查看容器进程 # 1. 找到容器主进程PID ps aux | grep uvicorn | grep -v grep # 2. 查看该进程的Cgroup信息 cat /proc/PID/cgroup # 3. 使用 top 或 htop 查看该进程的资源占用6. 常见问题、排查技巧与安全考量6.1 问题排查实录在边缘设备上使用Microverse这类轻量级运行时遇到的问题往往与资源、架构和系统配置相关。问题1容器启动失败报错“exec format error”。现象microctl run后容器立即退出查看日志显示此错误。原因镜像架构与宿主机不匹配。最常见的就是在x86设备上运行了ARM架构的镜像或者反之。排查使用microctl images或file命令检查镜像的架构信息。在构建镜像时确保FROM的基础镜像标签包含正确的架构如arm64v8/alpine:latest。如果是多架构镜像确保镜像仓库支持并返回了正确的清单manifest。解决在目标设备上重新构建镜像或拉取对应架构的镜像。问题2容器内进程被“Killed”无错误日志。现象容器运行一段时间后突然消失microctl logs看不到明显错误。原因触发了Cgroup内存限制。当容器内进程申请的内存超过--memory限制时Linux内核的OOM Killer会强制终止该进程。排查检查容器启动时的内存限制设置是否合理。查看宿主机内核日志dmesg | grep -i kill或journalctl -k | grep -i oom通常能找到被杀死进程的记录。使用microctl stats如果支持或cat /sys/fs/cgroup/memory/microverse/container-id/memory.usage_in_bytes监控内存使用。解决适当增加--memory限制或者优化应用内存使用如减少批处理大小、及时释放不用的变量。问题3容器内无法访问宿主机设备如USB摄像头、GPU。现象应用需要调用/dev/video0摄像头或/dev/nvhost-*Jetson GPU但容器内找不到设备节点。原因默认情况下容器的/dev目录是独立的不包含宿主机的设备文件。解决使用--device参数如果Microverse支持将设备挂载到容器内。# 挂载摄像头 microctl run -d --device /dev/video0:/dev/video0 myapp:latest # 挂载GPU设备Jetson microctl run -d --device /dev/nvhost-ctrl:/dev/nvhost-ctrl --device /dev/nvhost-ctrl-gpu:/dev/nvhost-ctrl-gpu ... myapp:latest更复杂的情况可能需要挂载多个设备节点和相关的库文件。问题4容器时间与宿主机时间不一致。现象容器内日志时间戳不对或与外部系统交互时出现时间错误。原因容器默认使用自己的/etc/localtime如果镜像内未正确配置时区就会使用UTC。解决推荐在构建镜像时设置时区RUN apk add --no-cache tzdata \ cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \ echo Asia/Shanghai /etc/timezone启动时挂载宿主机时间文件microctl run -d -v /etc/localtime:/etc/localtime:ro -v /etc/timezone:/etc/timezone:ro myapp:latest6.2 安全最佳实践尽管Microverse追求轻量但安全底线不能放松。非Root用户运行永远不要在容器内以root用户运行应用进程。在Dockerfile中使用USER指令。FROM alpine:latest RUN addgroup -S appgroup adduser -S appuser -G appgroup USER appuser CMD [python3, app.py]这能限制容器被突破后对宿主机造成的破坏。最小化镜像只安装应用必需的包。多阶段构建对于编译型语言如Go非常有用可以确保最终镜像只包含运行时必需的二进制文件而不包含编译工具链。只读根文件系统如果应用不需要向容器内写入文件可以以只读模式运行根文件系统防止恶意篡改。microctl run -d --read-only myapp:latest对于需要写入的目录如临时文件/tmp再单独以tmpfs或Volume挂载。microctl run -d --read-only --tmpfs /tmp myapp:latest限制内核能力默认情况下容器拥有不少Linux能力Capabilities。通过--cap-drop可以丢弃不需要的能力例如--cap-drop ALL --cap-add NET_BIND_SERVICE只保留绑定特权端口1024的能力。定期更新虽然边缘设备更新不便但仍需制定策略定期更新基础镜像和应用以修复安全漏洞。6.3 性能调优小贴士镜像层优化尽量将不经常变化的操作如安装系统包放在Dockerfile的前面将经常变化的操作如复制应用代码放在后面。这样可以充分利用镜像缓存加快构建速度。使用.dockerignore文件在构建上下文中忽略不必要的文件如.git,__pycache__, 日志文件减少构建上下文大小加速构建过程。选择合适的存储驱动在宿主机上确保使用的是overlay2存储驱动docker info可查看。对于Microverse如果支持也应优先使用overlayfs。主机内核参数调优对于高并发网络服务可能需要调整宿主机的网络参数如net.core.somaxconn,net.ipv4.tcp_tw_reuse等。这些调整需要在宿主机层面进行并评估对整体系统的影响。Microverse这类工具的出现反映了边缘计算领域对“小而美”基础设施的迫切需求。它舍弃了通用容器平台的庞杂换来了在资源苛刻环境下的生存能力。在实际项目中引入它之前务必进行充分的POC测试评估其功能如网络、存储、监控是否满足你的业务场景。对于复杂的、多容器编排的边缘场景可能仍需要KubernetesK3s或更专业的边缘计算框架。但对于大量部署的、功能单一的边缘智能终端一个几MB大小、秒级启动的“微宇宙”或许正是最优解。

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

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

相关文章

SpringBoot-17-MyBatis动态SQL标签之常用标签

文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…

wordpress后台更新后 前端没变化的解决方法

使用siteground主机的wordpress网站,会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后,网站没有变化的情况。 不熟悉siteground主机的新手,遇到这个问题,就很抓狂,明明是哪都没操作错误&#x…

网络编程(Modbus进阶)

思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…

UE5 学习系列(二)用户操作界面及介绍

这篇博客是 UE5 学习系列博客的第二篇,在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下: 【Note】:如果你已经完成安装等操作,可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作,重…

IDEA运行Tomcat出现乱码问题解决汇总

最近正值期末周,有很多同学在写期末Java web作业时,运行tomcat出现乱码问题,经过多次解决与研究,我做了如下整理: 原因: IDEA本身编码与tomcat的编码与Windows编码不同导致,Windows 系统控制台…

利用最小二乘法找圆心和半径

#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式

一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明&#xff1a;假设每台服务器已…

XML Group端口详解

在XML数据映射过程中&#xff0c;经常需要对数据进行分组聚合操作。例如&#xff0c;当处理包含多个物料明细的XML文件时&#xff0c;可能需要将相同物料号的明细归为一组&#xff0c;或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码&#xff0c;增加了开…

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造&#xff0c;完美适配AGV和无人叉车。同时&#xff0c;集成以太网与语音合成技术&#xff0c;为各类高级系统&#xff08;如MES、调度系统、库位管理、立库等&#xff09;提供高效便捷的语音交互体验。 L…

(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)

题目&#xff1a;3442. 奇偶频次间的最大差值 I 思路 &#xff1a;哈希&#xff0c;时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况&#xff0c;哈希表这里用数组即可实现。 C版本&#xff1a; class Solution { public:int maxDifference(string s) {int a[26]…

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型

摘要 拍照搜题系统采用“三层管道&#xff08;多模态 OCR → 语义检索 → 答案渲染&#xff09;、两级检索&#xff08;倒排 BM25 向量 HNSW&#xff09;并以大语言模型兜底”的整体框架&#xff1a; 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后&#xff0c;分别用…

【Axure高保真原型】引导弹窗

今天和大家中分享引导弹窗的原型模板&#xff0c;载入页面后&#xff0c;会显示引导弹窗&#xff0c;适用于引导用户使用页面&#xff0c;点击完成后&#xff0c;会显示下一个引导弹窗&#xff0c;直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…

接口测试中缓存处理策略

在接口测试中&#xff0c;缓存处理策略是一个关键环节&#xff0c;直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性&#xff0c;避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明&#xff1a; 一、缓存处理的核…

龙虎榜——20250610

上证指数放量收阴线&#xff0c;个股多数下跌&#xff0c;盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型&#xff0c;指数短线有调整的需求&#xff0c;大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的&#xff1a;御银股份、雄帝科技 驱动…

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析

1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具&#xff0c;该工具基于TUN接口实现其功能&#xff0c;利用反向TCP/TLS连接建立一条隐蔽的通信信道&#xff0c;支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式&#xff0c;适应复杂网…

铭豹扩展坞 USB转网口 突然无法识别解决方法

当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?

编辑&#xff1a;陈萍萍的公主一点人工一点智能 未来机器人的大脑&#xff1a;如何用神经网络模拟器实现更智能的决策&#xff1f;RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战&#xff0c;在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…

Linux应用开发之网络套接字编程(实例篇)

服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …

华为云AI开发平台ModelArts

华为云ModelArts&#xff1a;重塑AI开发流程的“智能引擎”与“创新加速器”&#xff01; 在人工智能浪潮席卷全球的2025年&#xff0c;企业拥抱AI的意愿空前高涨&#xff0c;但技术门槛高、流程复杂、资源投入巨大的现实&#xff0c;却让许多创新构想止步于实验室。数据科学家…

深度学习在微纳光子学中的应用

深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向&#xff1a; 逆向设计 通过神经网络快速预测微纳结构的光学响应&#xff0c;替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…