Zookeeper 底层原理解析
一、引言
在分布式系统的浩瀚星空中,Zookeeper 宛如一颗最为闪耀的导航星,为众多分布式应用指引方向、保驾护航。无论是大名鼎鼎的 Hadoop、HBase,还是其他各类复杂的分布式架构,Zookeeper 都扮演着不可或缺的关键角色。它如同一个智慧的中枢协调者,管理着分布式系统中的配置信息、命名服务、分布式锁等诸多核心事务,确保系统各组件能够有条不紊地协同运作。然而,要想真正驾驭这一强大工具,深入理解其底层原理就显得尤为重要。本文将开启一场深度探索之旅,剖析 Zookeeper 的底层奥秘,带您领略分布式协调的精妙之处。
二、Zookeeper 基本概念
数据模型
Zookeeper 采用了一种类似文件系统的层次化数据模型,以树状结构来组织数据。树中的每个节点被称为 “znode”,它可以存储数据,并且这些数据通常以字节数组的形式存在。每个 znode 都有一个唯一的路径标识,类似于文件系统中的绝对路径,通过这些路径,客户端可以方便快捷地访问和操作特定的 znode。例如,在一个分布式配置管理的场景下,我们可以创建一个路径为 “/config/app1” 的 znode,用来存储应用 1 的配置信息,如数据库连接字符串、端口号等。
节点类型
- 持久节点(PERSISTENT):这是最基本的节点类型,一旦创建,除非显式删除,否则将一直存在于 Zookeeper 树中。持久节点适用于存储那些需要长期保留的关键信息,比如系统的全局配置参数。
- 持久顺序节点(PERSISTENT_SEQUENTIAL):在创建持久节点的基础上,Zookeeper 会为其自动添加一个单调递增的序号后缀。这种节点类型在需要对创建顺序有严格要求的场景下非常实用,例如分布式系统中的任务队列,通过顺序节点可以确保任务按照创建的先后顺序依次被处理。
- 临时节点(EPHEMERAL):与持久节点截然不同,临时节点的生命周期与创建它的客户端会话紧密绑定。当客户端会话结束(可能是因为网络故障、客户端主动断开连接或超时等原因),临时节点会被自动删除。临时节点常用于表示分布式系统中的临时状态,比如某个客户端正在占用的资源锁,一旦客户端失去连接,资源锁自动释放,避免了死锁的发生。
- 临时顺序节点(EPHEMERAL_SEQUENTIAL):结合了临时节点和持久顺序节点的特点,既在客户端会话结束时自动删除,又拥有顺序编号。在分布式锁的实现中,常利用这种节点类型来保证公平性,多个客户端竞争锁时,按照顺序依次获取,避免 “饥饿” 现象。
三、Zookeeper 核心特性
一致性保证
Zookeeper 提供了强一致性的数据视图,这意味着无论客户端连接到哪个 Zookeeper 服务器实例,所获取到的数据都是一致的。背后的实现依赖于其独特的 Zab 协议(原子广播协议)。当有数据更新操作时,Zab 协议确保在集群中的大多数服务器完成数据同步之前,不会对外提供更新后的数据,从而有效防止了数据的不一致性。例如,在一个分布式集群中,节点 A 更新了配置信息,Zookeeper 通过 Zab 协议协调其他节点,保证所有节点要么都更新到最新配置,要么都维持旧配置,绝不会出现部分节点更新、部分节点未更新的混乱局面。
可靠性保障
为了应对分布式系统中常见的服务器故障、网络分区等问题,Zookeeper 构建了一套高可靠的架构。首先,它采用集群模式部署,通常由多个服务器节点组成,这些节点共同维护数据的一致性和可用性。其次,Zookeeper 具备自动容错能力,当部分节点出现故障时,只要集群中存活的节点数量满足一定的法定人数(通常为超过半数),整个系统就能继续正常运行,对外提供服务。这就好比一艘有多个船舱的大船,即使几个船舱进水(部分节点故障),只要大部分船舱完好无损,船依然能够航行(系统正常运行)。
顺序性保证
Zookeeper 严格保证所有事务操作的顺序性,无论是来自同一个客户端的多次操作,还是不同客户端的并发操作。这种顺序性是通过为每个事务分配一个全局唯一的递增 zxid(Zookeeper Transaction ID)来实现的。客户端发起的每一个写操作,Zookeeper 都会为其赋予一个新的 zxid,并且按照 zxid 的大小顺序依次执行这些操作。这一特性在分布式系统中有着广泛的应用,比如在分布式锁的实现中,依据 zxid 的顺序可以确定锁的获取顺序,确保系统的公平性和稳定性。
四、Zookeeper 集群搭建与工作原理
集群角色
- 领导者(Leader):集群中的核心决策者,负责处理所有的写操作请求。当客户端发送写请求时,只有领导者有权对数据进行修改,并且领导者要负责将修改后的信息同步给其他追随者。领导者的选举是一个关键过程,通过 Zab 协议来选出最适合领导集群的节点,选举过程基于节点的 zxid 和服务器 ID 等因素,确保选出的领导者具有最新的数据状态和较高的稳定性。
- 追随者(Follower):主要负责接收并处理来自客户端的读操作请求,同时它们也是领导者数据同步的接收者。追随者时刻关注领导者的状态,当领导者发生变更或数据有更新时,追随者会及时进行同步,以保持自身数据与领导者一致。在整个集群中,追随者起到了分担读负载、提高系统整体性能的作用。
- 观察者(Observer):类似于追随者,观察者也可以处理读操作请求,但它们不参与领导者选举过程,也不参与写操作的同步。观察者的存在主要是为了进一步扩展系统的读性能,在一些对读操作需求较大的场景下,通过添加观察者节点,可以在不增加写操作负担的前提下,提升系统的整体吞吐量。
集群搭建步骤
- 首先,准备多台服务器(通常为奇数台,以满足选举的法定人数要求),确保它们之间网络连通,并且安装好 JDK 环境,因为 Zookeeper 是基于 Java 开发的。
- 下载并解压 Zookeeper 安装包,进入到配置目录,修改 zoo.cfg 文件。在文件中配置集群节点信息,包括每个节点的服务器 ID、IP 地址以及通信端口等。例如:
server.1=192.168.1.101:2888:3888server.2=192.168.1.102:2888:3888server.3=192.168.1.103:2888:3888
其中,“server.x” 中的 “x” 是服务器 ID,第一个端口是节点间通信端口,第二个端口是选举端口。
- 在每台服务器对应的数据目录下(在 zoo.cfg 中指定),创建一个名为 “myid” 的文件,文件内容只包含该服务器的 ID,如在第一台服务器上,“myid” 文件内容为 “1”。
- 启动每台服务器上的 Zookeeper 服务,通过查看日志文件可以确认服务是否正常启动以及集群是否成功组建。
领导者选举过程详解
当 Zookeeper 集群启动或领导者出现故障时,就会触发领导者选举过程。选举基于 Zab 协议,每个节点都会向其他节点发送自己的选举信息,选举信息主要包含节点的 zxid 和服务器 ID。节点首先比较 zxid,拥有最大 zxid 的节点具有更高的选举优先级,因为这意味着它拥有最新的数据状态;如果多个节点的 zxid 相同,则比较服务器 ID,通常服务器 ID 较大的节点胜出。选举过程是一个多轮投票的过程,在每一轮投票中,节点根据收到的其他节点的选举信息,更新自己的投票策略,直到有一个节点获得超过半数节点的支持,成为新的领导者。例如,假设有三个节点 A、B、C,初始时它们各自发送自己的选举信息,A 的 zxid 为 10,服务器 ID 为 1;B 的 zxid 为 12,服务器 ID 为 2;C 的 zxid 为 10,服务器 ID 为 3。第一轮投票后,B 因为拥有最大 zxid,获得了部分节点的支持,A 和 C 根据收到的信息,调整自己的投票,在后续几轮投票中,B 持续获得多数支持,最终当选为领导者。
五、Zookeeper 客户端与服务器交互
客户端连接建立
客户端与 Zookeeper 服务器建立连接时,首先要指定要连接的服务器地址列表。客户端会尝试依次连接列表中的服务器,直到成功建立连接为止。一旦连接成功,客户端会与服务器进行一次握手过程,交换一些基本信息,如协议版本等,以确保双方能够正常通信。在连接过程中,客户端还会启动一个心跳机制,定时向服务器发送心跳包,以维持连接的活跃度,服务器如果在一定时间内没有收到心跳包,就会认为客户端已经断开连接,进而清理与该客户端相关的临时节点等资源。
请求处理流程
当客户端发起一个读操作请求时,请求会被发送到它所连接的服务器上,如果该服务器是追随者,追随者会直接从本地缓存的数据中获取信息并返回给客户端,因为追随者时刻与领导者保持数据同步,本地缓存的数据是最新的;如果连接的服务器是领导者,领导者同样从本地数据中获取信息返回。而对于写操作请求,客户端只能将其发送给领导者,领导者收到请求后,会先将写请求转换为一个事务,并为其分配一个新的 zxid,然后通过 Zab 协议将这个事务广播给所有的追随者。追随者收到事务后,会将其写入本地的事务日志中,并应用到内存数据模型中,完成数据更新。只有当大多数追随者成功完成事务的写入和应用后,领导者才会向客户端确认写操作成功,确保数据的一致性得到保障。
会话管理机制
客户端与 Zookeeper 服务器之间的交互是基于会话(Session)的。一个会话从客户端连接成功开始,到客户端主动断开连接或因超时而结束。在会话期间,客户端的所有操作都在这个会话的上下文环境中进行。Zookeeper 为每个会话分配一个唯一的会话 ID,并且通过心跳机制和超时设置来管理会话的生命周期。如果客户端在规定的超时时间内没有发送心跳包,服务器会认为该会话已经过期,进而关闭会话,并清理与该会话相关的临时节点。同时,Zookeeper 还提供了会话重连机制,当客户端因为短暂的网络故障等原因断开连接后,在一定时间内重新连接,能够恢复到原来的会话状态,继续之前的操作,这为分布式系统的稳定性提供了有力支持。
六、Zookeeper 典型应用场景剖析
分布式配置管理
在分布式系统中,各个组件往往需要共享一些配置参数,如数据库连接字符串、服务器端口号等。传统的配置文件方式在分布式环境下显得力不从心,因为一旦配置需要修改,要在多个节点上手动更新,容易出错且效率低下。Zookeeper 提供了完美的解决方案,将配置信息存储在特定的 znode 中,各个组件作为客户端连接到 Zookeeper,实时监听配置节点的变化。当配置需要更新时,管理员只需修改 Zookeeper 中的配置 znode,Zookeeper 会自动通知所有监听该节点的客户端,客户端收到通知后,及时更新本地的配置,实现了配置的动态更新,大大提高了系统的运维效率。例如,在一个微服务架构的电商系统中,订单服务、支付服务等多个微服务都需要共享数据库配置,通过 Zookeeper 存储和管理这些配置,能够确保配置的一致性和及时性,避免因配置不一致导致的业务问题。
分布式锁实现
分布式锁是分布式系统中解决资源竞争问题的关键工具。Zookeeper 利用其临时顺序节点特性巧妙地实现了分布式锁。当一个客户端想要获取锁时,它会在 Zookeeper 中创建一个临时顺序节点,节点路径通常表示为 “/locks/lock-”,然后客户端会获取所有以 “/locks” 开头的子节点列表,并检查自己创建的节点是否是列表中序号最小的节点。如果是,说明客户端成功获取锁,可以执行业务逻辑;如果不是,客户端会监听序号比自己小的前一个节点的删除事件,一旦监听到该事件,意味着轮到自己获取锁,再次检查并获取锁。当客户端完成业务逻辑后,释放锁只需删除自己创建的临时顺序节点即可,由于节点是临时的,即使客户端异常退出,节点也会自动删除,避免死锁的发生。这种分布式锁实现方式公平、可靠,广泛应用于各种分布式系统,如分布式任务调度系统中,确保多个任务不会同时抢占同一资源。
命名服务提供
分布式系统中的各个组件往往需要有唯一的名称标识,以便相互识别和通信。Zookeeper 的命名服务就如同一个分布式的全局命名空间,它可以为系统中的对象(如服务实例、分布式队列等)分配唯一的名称。通过在 Zookeeper 中创建相应的持久节点,将对象的名称与节点路径对应起来,其他组件就可以通过查询这些节点来获取对象的信息。例如,在一个大规模的分布式消息队列系统中,生产者和消费者需要知道队列的名称和位置才能进行消息的发送和接收,利用 Zookeeper 的命名服务,创建如 “/queues/queue1” 这样的节点来表示队列,生产者和消费者通过访问 Zookeeper 来确定队列的存在和相关信息,确保了系统的有序运行。
七、Zookeeper 与其他分布式组件对比
与 Etcd 对比
- 数据模型:Zookeeper 采用类似文件系统的树状结构,层次分明,易于理解和组织数据;而 Etcd 基于键值对模型,数据存储相对扁平,在一些简单场景下,键值对模型操作更为直接,但在复杂的层次化数据管理方面,Zookeeper 更具优势。
- 一致性协议:Zookeeper 依赖 Zab 协议实现强一致性,经过多年实践验证,在大规模分布式系统中表现稳定;Etcd 采用 Raft 协议,Raft 协议在算法实现上较为简洁易懂,近年来也得到广泛应用,两者在一致性保障方面都有出色表现,但在一些细节特性上,如领导者选举的触发条件、日志压缩机制等方面存在差异。
- 应用场景侧重:Zookeeper 在分布式协调领域应用广泛,如配置管理、分布式锁等场景经验丰富;Etcd 除了作为分布式协调组件外,在容器编排领域(如 Kubernetes 中作为存储后端)大放异彩,更侧重于与云原生技术的结合。
与 Consul 对比
- 功能特性:Zookeeper 核心聚焦于分布式协调,功能相对纯粹;Consul 不仅具备强大的分布式协调能力,还集成了服务发现、健康检查等功能,形成了一个较为完整的分布式服务治理平台,对于一些希望一站式解决多种分布式问题的场景,Consul 更具吸引力。
- 数据一致性:两者都致力于提供高一致性的数据服务,但实现方式有所不同。Zookeeper 通过 Zab 协议确保数据的强一致性;Consul 采用了一种基于 Gossip 协议的多数据中心一致性算法,在应对跨数据中心场景时,Consul 能够在一定程度上兼顾一致性和可用性,灵活性较高。
- 易用性:Zookeeper 的 API 相对较为底层,开发人员在使用时需要对其底层原理有较深入了解,上手难度略高;Consul 提供了更简洁易用的 HTTP API,对于初次接触分布式协调的开发者来说,Consul 的学习曲线相对平缓,能够快速构建分布式应用。
八、Zookeeper 性能优化策略
硬件层面优化
- 内存配置:Zookeeper 大量的数据操作依赖于内存,如缓存 znode 数据、事务日志等,因此充足的内存是保障性能的关键。为服务器配置足够大的内存,并且合理设置 JVM 内存参数,如调整堆内存大小,确保 Zookeeper 进程有足够的空间运行,避免频繁的 GC(垃圾回收)操作影响性能。
- 磁盘性能:事务日志和快照文件的写入速度对 Zookeeper 性能至关重要。选用高性能的 SSD 硬盘,相较于传统机械硬盘,SSD 能够显著提高日志写入和快照保存的速度,减少因磁盘 I/O 瓶颈导致的延迟。同时,合理规划磁盘阵列,采用 RAID 技术提高磁盘的冗余性和读写性能。
集群配置优化
- 节点数量选择:虽然增加节点数量可以提高系统的可靠性,但过多的节点也会带来额外的通信开销和领导者选举的复杂性。在满足可靠性要求(通常保持奇数个节点,确保多数派可用)的前提下,根据实际业务的读、写负载合理确定节点数量,一般来说,3 - 7 个节点在大多数场景下能取得较好的平衡。
- 观察者节点运用:对于读操作频繁的场景,适当添加观察者节点。观察者不参与写操作同步,能够分担读负载,提高系统整体的吞吐量。通过合理配置观察者节点的比例,优化集群的性能,如在一个以读为主的分布式缓存系统中,引入一定数量的观察者节点,可有效提升缓存数据的读取速度。
客户端优化
- 连接池管理:在客户端频繁与 Zookeeper 交互的场景下,使用连接池技术可以减少连接建立和销毁的开销。通过预先创建一定数量的连接并保存在连接池中,客户端需要时直接从池中获取连接,使用完毕后归还,避免每次操作
相关文章:
Zookeeper 底层原理解析
一、引言 在分布式系统的浩瀚星空中,Zookeeper 宛如一颗最为闪耀的导航星,为众多分布式应用指引方向、保驾护航。无论是大名鼎鼎的 Hadoop、HBase,还是其他各类复杂的分布式架构,Zookeeper 都扮演着不可或缺的关键角色。它如同一…...
面试题整理9----谈谈对k8s的理解1
谈谈对k8s的理解 1. Kubernetes 概念 1.1 Kubernetes是什么 Kubernetes 是一个可移植、可扩展的开源平台,用于管理容器化的工作负载和服务,方便进行声明式配置和自动化。Kubernetes 拥有一个庞大且快速增长的生态系统,其服务、支持和工具的…...
PromptGIP:Unifying lmage Processing as Visual Prompting Question Answering
“Unifying Image Processing as Visual Prompting Question Answering” 文章提出了一种名为 PromptGIP 的通用模型,将图像处理任务统一为视觉提示问答范式,在多个图像处理任务上展现出良好性能,为通用图像处理提供了新的思路和方法。 confe…...
chart文件结构
在 Helm 中,Chart 是一个用于定义、安装和升级 Kubernetes 应用程序的包。Chart 文件结构遵循一定的目录和文件组织方式,以下是典型的 Helm Chart 文件结构: 1. Chart 文件结构示例 mychart/ ├── Chart.yaml # 描述 Chart 的基…...
SQL优化
SQL优化 插入数据 insert优化 批量插入 insert into tb_test 2values(1, Tom), (2, Cat), (3, jerry); 手动提交事务 start transaction; insert into test1 values(4, Tom), (5, Cat), (6, jerry); insert into test1 values(7, Tom), (8, Cat), (9, jerry); insert int…...
输出1-100之间的随机数,控制输出格式,每行10个(注释有详解)
C 随机数生成与格式化输出 在编程中,随机数的生成是一个常见的需求,尤其是在游戏开发、模拟实验和数据分析等领域。本文将通过一个简单的 C 程序来演示如何生成随机数并进行格式化输出。我们将逐步解析代码,并讨论其工作原理及应用场景。 代…...
【数字化】华为数字化转型架构蓝图-2
目录 1、客户联结的架构思路 1.1 ROADS体验设计 1.2 具体应用场景 1.3 统一的数据底座 1.4 案例与成效 2、一线作战平台的架构思路 2.1 核心要素 2.2 关键功能 2.3 实施路径 2.4 案例与成效 3、能力数字化的架构思路 3.1 能力数字化的核心目标 3.2 能力数字化的实…...
MyBatis是什么?为什么有全自动ORM框架还是MyBatis比较受欢迎?
MyBatis是什么? MyBatis是一个半自动的ORM持久层框架,内部封装了JDBC,mybatis是通过XML或注解的方式将需要执行的statement配置,支持定制化sql,存储过程以及高级映射。 解释 所谓的半自动ORM意思就是将JDBC的工作交…...
基础元器件的学习
1、二极管 1.1二极管的符号 ZD是稳压二极管 VD、V、D是普通二极管的符号。 1.2二极管的反向恢复时间 首先交流电为上正下负,然后下正上负。当二极管接到反向电压,二极管存在寄生电容,电压不能立刻突变,当输入频率变高时&#…...
GTID下复制问题和解决
环境介绍 数据库1主2从,mysql版本是v5.19 表结构 一、主库新增记录,从库提示主键冲突 模拟故障 1, master上关闭 sql_log_bin,删除id 103 后打开 2, 确认此时从库有id103,主库没有 3, master insert id103 主从异常…...
Linux 下的 GPT 和 MBR 分区表详解
文章目录 Linux 下的 GPT 和 MBR 分区表详解一、分区表的作用二、MBR(Master Boot Record)1. **特点**2. **优点**3. **缺点**4. **适用场景** 三、GPT(GUID Partition Table)1. **特点**2. **优点**3. **缺点**4. **适用场景** 四…...
mysql的事务控制和数据库的备份和恢复
事务控制语句 行锁和死锁 行锁 两个客户端同时对同一索引行进行操作 客户端1正常运行 客户端2想修改,被锁行 除非将事务提交才能继续运行 死锁 客户端1删除第5行 客户端2设置第1行为排他锁 客户端1删除行1被锁 客户端2更新行5被锁 如何避免死锁 mysql的备份和还…...
2014年IMO第4题
△ A B C \triangle ABC △ABC 中, B C BC BC 上有一点 P P P 满足 ∠ B A P = ∠ A C B \angle BAP=\angle ACB ∠BAP=∠ACB, 还有一点 Q Q Q 满足 ∠ A = Q A C = ∠ A B C \angle A=QAC=\angle ABC ∠A=QAC=∠ABC. 分别延长 A P AP AP, A Q AQ AQ 一倍至 M M M, N …...
如何实现层叠布局
文章目录 1 概念介绍2 使用方法3 示例代码我们在上一章回中介绍了GirdView Widget,本章回中将介绍Stack这种Widget,闲话休提,让我们一起Talk Flutter吧。 1 概念介绍 在Flutter中Stack主要用来叠加显示其它的Widget,类似我们日常生活中的楼层或者说PS中的图层,因此它也是一…...
Qwen2.5-7B-Instruct Lora微调
Qwen2.5-7B-Instruct Lora 微调 本文简要介绍如何基于 transformers、peft 等框架,对 Qwen2.5-7B-Instruct 模型进行 Lora 微调。Lora 是一种高效微调方法。 环境配置 在完成基本环境配置和本地模型部署的情况下,你还需要安装一些第三方库,…...
MacOS安装MySQL
官网下载MySQL 苹果芯片选择ARM版本 安装过程中会要求你输入root的密码(不少于8位),这里设置为12345678 打开系统设置查看是否成功安装MySQL 配置MySQL环境变量 vi ~/.zshrc加入一行export PATH$PATH:/usr/local/mysql/bin 执行source ~/…...
基础库正则表达式
我们已经可以用requests 库来获取网页的源代码,得到 HTML 代码。但我们真正想要的数据是包含在 HTML代码之中的,要怎样才能从 HTML,代码中获取想要的信息呢?正则表达式就是其中一个有效的方法。 本篇博客我们将了解一下正则表达式的相关用法。正则表达…...
Matlab 和 R 语言的数组索引都是从 1 开始,并且是左闭右闭的
文章目录 一、前言二、主要内容三、小结 🍉 CSDN 叶庭云:https://yetingyun.blog.csdn.net/ 一、前言 在早期的计算机科学中,数组索引从 1 开始是很常见的。例如,Fortran 和 Pascal 等编程语言也采用了从 1 开始的索引。 这种索引…...
选择排序和冒泡排序;MySQL架构
1. 选择排序和冒泡排序 (1)选择排序 原理: 选择排序有升序和降序两种排序方法。升序排序的原理是:对于一个无序数列,先假定其中一个数为这个数列的最小值,然后让这个假定最小值和其他数依次比较࿰…...
蓝桥杯算法训练 黑色星期五
题目描述 有些西方人比较迷信,如果某个月的13号正好是星期五,他们就会觉得不太吉利,用古人的说法,就是“诸事不宜”。请你编写一个程序,统计出在某个特定的年份中,出现了多少次既是13号又是星期五的情形&am…...
Mybatis-Plus快速入门
参考:黑马MyBatisPlus教程全套视频教程,快速精通mybatisplus框架 1.Mapper-plus配置 1.MapperScan("Mapper目录的位置") 2.Mapper层文件需要继承BaseMapper extends BaseMapper<实体类> 3.开启日志 4.配置类 Configuration public cl…...
MySQL库的操作
目录 1. 创建数据库2. 创建数据库案例3. 认识系统编码以及字符集和校验规则4. 操纵数据库4.1 查看数据库4.2 显示创建语句4.3 修改数据库4.4 数据库的删除4.5 备份和恢复4.6 查看连接情况 1. 创建数据库 (1)语法: create database db_name;…...
JVM性能优化一:初识内存泄露-内存溢出-垃圾回收
本文主要是让你充分的认识到什么叫做内存泄露,什么叫做内存溢出,别再傻傻分不清了,别再动不动的升级服务器的内存了。 文章目录 1.基本概念1.1.内存泄露1.2.内存溢出1.3.垃圾回收1.4.内存泄露-垃圾回收-内存溢出三者的关系关系 2.代码示例2.…...
2024年山东省职业院校技能大赛网络建设与运维X86架构与ARM架构搭建赛题
完整赛题解析主页联系! 一、X86架构计算机操作系统安装与管理 1.PC1 系统为 ubuntu-desktop-amd64 系统(已安装,语言为英文),登录用户为 ubuntu,密码为Key-1122。配置ubuntu用户能免密使用sudo命令。 sud…...
flask_sqlalchemy event监听查询事件
flask_sqlalchemy event监听查询事件 在Flask-SQLAlchemy中,可以使用事件监听器来监控查询事件。这可以通过listens_for(ModelClass, “event_name”)装饰器来实现,其中ModelClass是你想要监控的模型类,event_name是你想要监控的事件名称&…...
解决vscode ssh远程连接服务器一直卡在下载 vscode server问题
目录 方法1:使用科学上网 方法2:手动下载 方法3 在使用vscode使用ssh远程连接服务器时,一直卡在下载"vscode 服务器"阶段,但MobaXterm可以正常连接服务器,大概率是网络问题,解决方法如下: 方…...
OpenAI发布全新AI模型 o3 与 o3-mini:推理与编码能力迎来重大突破. AGI 来临
每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…...
Java --- 多线程
目录 前言: 一.线程的创建: 1.通过继承 Thread 类来创建线程: 2.通过Runnable接口创建线程: 3.通过Java8引入的lambda语法: 线程的优先级: 二.线程的生命周期: 三. 中断线程:…...
医学图像 三维重建,原图与灰度图叠加,原图与多图叠加显示;多图像融合显示,彩色灰度图像融合
Part1: Summary 我们在做图像分割或融合时,有时需要显示多份数据进行叠加显示;可能需要这种效果: 四视图: 基于这个,我看一下网上的实现总结了一下;实现了以下几种效果: Part2:多种…...
Linux中的多线程
1.Linux线程概念 什么叫做线程? 我们认为,线程操作系统调度的基本单位!重新理解进程? Linux内核观点:进程是承担分配系统资源的基本实体,即操作系统分配资源,是以进程为单位进行分配的。线程是进程内部的执行流资源…...
hive常用函数有哪些
Hive是一个基于Hadoop的数据仓库工具,它提供了类似于SQL的接口,用于数据查询和分析。Hive提供了许多内置函数,这些函数可以分为几种类型,包括: • 字符串函数:用于处理字符串数据。 • concat()࿱…...
深度学习试题及答案解析(二)
1. 神经风格转换中,优化算法的每次迭代更新的是什么? 神经风格转换(Neural Style Transfer, NST)是一种使用深度学习技术,特别是卷积神经网络(CNN),来将一幅图像的风格应用到另一幅图…...
【CSS in Depth 2 精译_089】15.2:CSS 过渡特效中的定时函数
当前内容所在位置(可进入专栏查看其他译好的章节内容) 第五部分 添加动效 ✔️【第 15 章 过渡】 ✔️ 15.1 状态间的由此及彼15.2 定时函数 ✔️ 15.2.1 定制贝塞尔曲线 ✔️15.2.2 阶跃 ✔️ 15.3 非动画属性 文章目录 15.2 定时函数 Timing function…...
LINUX内核常用加锁
1、mutex互斥锁 互斥锁的实现主要利用到了原子变量可以锁内存总线的机制来对lock变量值进行原子修改,并通过在加锁及释放锁过程中引入内存屏障(加锁引入lfence,释放锁引入sfence),来确保锁临界区资源(Critical Section)能够在不同的CPU之间可…...
【Select 语法全解密】.NET开源ORM框架 SqlSugar 系列
系列文章目录 🎀🎀🎀 .NET开源 ORM 框架 SqlSugar 系列 🎀🎀🎀 文章目录 系列文章目录前言一、Select 执行位置二、返回一个字段和多个字段三、单表返回DTO四、多表返回DTO4.1 手动DTO4.2 实体自动映射14.…...
STM32之GPIO输出与输出
欢迎来到 破晓的历程的 博客 ⛺️不负时光,不负己✈️ 文章目录 一.GPIO输入1.1GPIP简介1.2GPIO基本结构1.3GPIO位结构1.4GPIO的八种模式1.4.1浮空/上拉/下拉输入1.4.2 模拟输入1.4.3 推挽输出\开漏输出 二.GPIO输入2.1.按键介绍2.2传感器模块介绍2.3按键电路 一.G…...
【数据库】Redis—Java 客户端
一、常见的几种 Java 客户端 Jedis:以 Redis 命令作为方法的名称,便于学习,简单实用,但其实例是线程不安全的,多线程下需要基于连接池来使用。lettce:基于 Netty 实现,支持同步、异步和响应式编…...
《图解机器学习》(杉山将著)第一部分绪论学习笔记
《图解机器学习》(杉山将著)第一部分绪论学习笔记 《图解机器学习》(杉山将著)第一部分绪论学习笔记一、什么是机器学习1.1 学习的种类1.2 机器学习任务的例子1.3 机器学习的方法 二、学习模型2.1 线性模型2.2 核模型2.3 层级模型…...
Deepin和Windows传文件(Xftp,WinSCP)
在Linux系统和Windows系统传输文件,通常通过Windows系统中安装的Xftp和WinSCP访问Linux系统,在访问前需要安装配置SSH-Server 安装SSH-Server 安装SSH-Server sudo apt-get install openssh-server ssh -v 启动SSH服务 sudo systemctl start ssh //也…...
C语言习题2.0
C语言习题1.0 C语言习题-CSDN博客 目录 C语言习题1.0 C语言习题-CSDN博客 找一个数字的连续因子 求N个分数的和 正整数AB 函数 预处理 文件处理 操作符 找一个数字的连续因子 //找连续因子,及其个数 int main() {int a;scanf("%d", &a);int num 0; …...
达梦 本地编码:PG_GBK, 导入文件编码:PG_UTF8错误
问题 达梦 本地编码:PG_GBK, 导入文件编码:PG_UTF8错误 解决 右键管理服务器 查看配置 新建一个数据库实例,配置跟之前的保持一致 新建一个用户,跟以前的用户名一样 在用户上,右键导入,选择dmp的位置 导…...
【Apache Paimon】-- 11 -- Flink 消费 kakfa 写 S3 File
目录 1、项目构建 2、项目新增和修改 2.1 pom.xml 新增依赖 2.2 本地测试或者 flink on k8s 时,新增 S3FileSystemFactory.java 第一步:创建包=org.apache.flink.fs.s3hadoop 第二步:新增 java 类 S3FileSystemFactory 特别注意 (1)本地测试时需要新增以下内容 (…...
使用C语言编写UDP循环接收并打印消息的程序
使用C语言编写UDP循环接收并打印消息的程序 前提条件程序概述伪代码C语言实现编译和运行C改进之自由设定端口注意事项在本文中,我们将展示如何使用C语言编写一个简单的UDP服务器程序,该程序将循环接收来自指定端口的UDP消息,并将接收到的消息打印到控制台。我们将使用POSIX套…...
QT6静态编译并配置及错误解决
使用Github workflow进行编译,无需本地编译。 断断续续半年间,试了很多次静态编译,也尝试过别人编译的静态包,但一直失败。不是无法成功编译,就是编译后无法正常使用,经常报错链接失败。 参考的教程&#…...
Docker部署GitLab服务器
一、GitLab介绍 1.1 GitLab简介 GitLab 是一款基于 Git 的开源代码托管平台,集成了版本控制、代码审查、问题跟踪、持续集成与持续交付(CI/CD)等多种功能,旨在为团队提供一站式的项目管理解决方案。借助 GitLab,开发…...
flink实现复杂kafka数据读取
接上文:一文说清flink从编码到部署上线 环境说明:MySQL:5.7;flink:1.14.0;hadoop:3.0.0;操作系统:CentOS 7.6;JDK:1.8.0_401。 常见的文章中&…...
小雅Alist缓存太多怎么清理?教程来了
声明:不喜欢小白在开头唠嗑的小伙伴可以直接滑动到【 正文开始】处阅读。 前言 前段时间讲到在飞牛OS上部署小雅超集AList,后台看到很多小伙伴都部署了。 飞牛NAS上的小雅根本没有资源?只剩下打赏码?那得按照这个重新配置了&…...
Python字符串及正则表达式(十一):正则表达式、使用re模块实现正则表达式操作
前言:在 Python 编程的广阔天地中,字符串处理无疑是一项基础而关键的技能。正则表达式,作为处理字符串的强大工具,以其灵活的模式匹配能力,在文本搜索、数据清洗、格式验证等领域发挥着不可替代的作用。本系列博客已经…...
前端:金额高精度处理
Decimal 是什么 想必大家在用js 处理 数字的 加减乘除的时候,或许都有遇到过 精度不够 的问题,还有那些经典的面试题 0.20.1 ! 0.3, 至于原因,那就是 js 计算底层用的是 IEEE 754 ,精度上有限制, 那么Deci…...
WPF 依赖属性和附加属性
除了普通的 CLR 属性, WPF 还有一套自己的属性系统。这个系统中的属性称为依赖属性。 1. 依赖属性 为啥叫依赖属性?不叫阿猫阿狗属性? 通常我们定义一个普通 CLR 属性,其实就是获取和设置一个私有字段的值。假设声明了 100 个 …...