Zookeeper使用详解

介绍
ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,是Hadoop和Hbase的重要组件。它是一个为分布式应用提供一致性服务的软件,提供的功能包括:配置维护、域名服务、分布式同步、组服务等。ZooKeeper的目标就是封装好复杂易出错的关键服务,将简单易用的接口和性能高效、功能稳定的系统提供给用户。
ZooKeeper包含一个简单的原语集,提供Java和C的接口。ZooKeeper代码版本中,提供了分布式独享锁、选举、队列的接口,代码在$zookeeper_home\src\recipes。其中分布锁和队列有Java和C两个版本,选举只有Java版本。
ZooKeeper的每一个ZNode默认能够存储1MB的数据,每个ZNode都可以通过其路径唯一标识。其应用场景包括统一命名服务、统一配置管理、统一集群管理、服务器节点动态上下线、软负载均衡等。


使用场景
ZooKeeper的使用场景非常广泛,主要包括以下几个方面:
- 配置中心 :ZooKeeper可以用来存储和管理配置信息,例如集群中的机器配置、服务地址配置等。通过Zookeeper,可以将配置信息统一管理,同时实现动态加载和更新。
- 统一命名服务 :Zookeeper可以用来实现命名服务,例如将集群中的机器名称和IP地址进行映射,或者将服务的唯一标识和实际地址进行映射。这样,客户端可以通过名称或标识来访问服务,而不需要知道服务的实际地址。
- 分布式锁 :Zookeeper可以用来实现分布式锁,通过创建一个特殊的节点,各个节点可以竞争同一个锁,从而保证分布式系统中的一致性。
- 分布式队列 :Zookeeper可以用来实现分布式队列,通过创建一个特殊的节点,各个节点可以加入或离开队列,同时队列中的节点可以按照一定的顺序进行排序。
- 数据发布订阅 :通过发布者将数据信息存储到ZooKeeper的节点上,订阅者对数据进行订阅,达到动态获取数据的一个效果。
- 集群管理 :Zookeeper可以用于监测集群中的机器退出和加入、选举master等。

主要特点
Zookeeper是一个开源的分布式协调服务,它主要用于分布式系统中的服务发现、配置管理和分布式同步等。
- Zookeeper的优点:
- 简单易用:Zookeeper提供了简洁的API和数据模型,使得开发人员可以轻松地使用它来协调和管理分布式系统中的服务和节点。
- 高性能:Zookeeper具有高可用性、高性能和低延迟的特点,能够处理大量的请求和数据。
- 稳定可靠:Zookeeper具有稳定可靠的特点,能够在分布式环境中提供一致、可靠的服务。
- 可扩展性:Zookeeper可以轻松地扩展到数千个节点的规模,并且可以保证系统的可扩展性和可靠性。
- 数据一致性:Zookeeper提供了强一致性的数据模型,保证了在分布式系统中的数据一致性。
- Zookeeper也有一些缺点:
- 依赖网络:Zookeeper的性能和可靠性高度依赖于网络通信的质量。如果网络出现故障或延迟,Zookeeper可能会受到影响。
- 不适合存储大量数据:Zookeeper主要是为了协调和管理分布式系统中的配置信息和服务状态而设计的,不适合用于存储大量数据。如果需要存储大量数据,可能需要考虑其他解决方案。
- 不适合实时应用:Zookeeper的响应时间可能会影响到实时应用的性能和稳定性。因此,对于实时性要求高的应用,可能需要寻找其他更适合的解决方案。

工作原理
ZooKeeper的工作原理基于原子广播机制,该机制保证了各个Server之间的同步。这个机制由Zab协议实现,Zab协议有两种模式:恢复模式(选主)和广播模式(同步)。
当服务启动或者在领导者崩溃后,Zab就进入了恢复模式。当领导者被选举出来,且大多数Server完成了和leader的状态同步以后,恢复模式就结束了。状态同步保证了leader和Server具有相同的系统状态。
ZooKeeper采用了递增的事务id号(zxid)来标识事务,所有的提议(proposal)都在被提出的时候加上了zxid,从而保证了事务的顺序一致性。

架构模式
ZooKeeper的架构模式包括以下几种:
- 领导者(Leader)模式:在这种模式下,ZooKeeper集群中只有一个领导者节点,负责处理所有的写请求,并将这些请求广播给其他从节点。所有的读请求可以直接从领导者节点或者从节点中获取。
- 分布式(Distributed)模式:在这种模式下,ZooKeeper集群中的每个节点都可以处理读写请求。每个节点都会复制一份数据,并且通过互相监视来保持数据的一致性。
- 集群(Cluster)模式:在这种模式下,ZooKeeper集群中的每个节点都是对等的,每个节点都可以处理读写请求。通过互相监视和同步,来保持数据的一致性。

节点角色划分
ZooKeeper的节点角色划分主要分为三种:领导者(Leader)、跟随者(Follower)和观察者(Observer)。
领导者(Leader):负责协调集群中的其他节点,处理所有的写请求,并将这些请求广播给其他节点。同时,领导者也负责维护数据的一致性。
跟随者(Follower):为客户端提供读服务,参与Leader选举过程。
观察者(Observer):为客户端提供读服务,不参与Leader选举过程。

Leader选举机制
ZooKeeper的Leader选举机制基于Zab协议,该协议有两种模式:恢复模式(选主)和广播模式(同步)。
在初始化集群分布式的时候会进行Leader选举,或者在运行期间Leader出现故障也会进行选举。当ZooKeeper集群中的节点启动时,它们都会默认认为自己是Leader,然后通过投票机制来确定Leader。
投票机制基于(myid, ZXID)来表示,每个节点都会将自己认为的Leader信息(包括myid和ZXID)发送给集群中的其他节点。每个节点都会统计投票信息,判断是否已经有过半的节点接受了相同的投票信息。如果有,那么这个节点就被认为是被选举为Leader。
一旦确定了Leader,每个节点就会更新自己的状态。如果是Follower,那么就变更为FOLLOWING,如果是Leader,就变更为LEADING。

数据一致性保证
ZooKeeper通过Zab协议来保证数据一致性。Zab协议是一种原子广播协议,支持崩溃恢复,实现分布式数据一致性。Zab协议包括两种基本的模式:崩溃恢复和消息广播。
在消息广播模式下,Leader节点的写入是一个两步操作,第一步是广播事务操作,第二步是广播提交操作。过半数指的是反馈的节点数 >=N/2+1。如果收到超过半数的Follower的反馈,Leader就会提交事务。
在崩溃恢复模式下,如果发生故障导致Leader节点宕机,会进行新一轮的Leader选举。当与过半的机器同步完成后,就退出恢复模式,然后进入消息广播模式。
ZooKeeper还通过保证数据的一致性来保证数据的安全性。ZooKeeper中的每个节点都有一个唯一的路径,并且每个节点都有一个与之关联的数据。当数据发生变化时,ZooKeeper会保证这个变化对所有节点都是一致的。
此外,ZooKeeper还提供了事务日志来保证数据的持久性和可靠性。事务日志记录了所有对数据的修改操作,如果发生故障导致数据损坏,可以通过事务日志来恢复数据。
ZooKeeper通过Zab协议、保证数据一致性和提供事务日志等方式来保证数据的安全性和可靠性。

数据冗余性保证
ZooKeeper通过数据复制来保证数据冗余性。为了提高数据可靠性和可用性,ZooKeeper将数据放在内存中,并支持数据的复制。每个ZNode(节点)都有一个与之关联的Data攥取句柄,可以获取该节点的数据。同时,ZooKeeper支持对节点的子节点进行监视,当子节点发生变化时,会收到通知。
在数据复制方面,ZooKeeper支持同步和异步两种复制方式。在同步复制方式下,当主节点发生写操作时,需要等待从节点完成写操作后再返回结果,这种方式可以保证数据的一致性,但是可能会影响性能。在异步复制方式下,主节点只需要将写操作结果发送给从节点,不需要等待从节点完成写操作,这种方式可以提高性能,但是可能会牺牲一些数据一致性。
ZooKeeper还支持节点的事务性保证,即每个事务都有一个唯一的事务ID(zxid),并且每个事务在执行过程中都按照严格的顺序执行,从而保证了数据的一致性和操作的原子性。
ZooKeeper通过数据复制、同步和异步复制方式以及事务性保证等方式来保证数据冗余性和可用性。

集群模式中的数据查询与更新机制
ZooKeeper集群中的数据查询与更新机制基于Zab协议,主要包括以下步骤:
- 数据查询:
- 当客户端向ZooKeeper集群发送数据查询请求时,该请求首先会被路由到一个领导者节点上。
- 领导者节点会查询自己的内存中的数据,如果数据存在,则直接返回给客户端。
- 如果领导者节点中不存在该数据,则会向其他节点发送查询请求,并将查询结果返回给客户端。
- 数据更新:
- 当客户端向ZooKeeper集群发送数据更新请求时,该请求首先会被路由到一个领导者节点上。
- 领导者节点会记录下要更新的数据项以及更新操作,然后将其广播给其他节点。
- 其他节点在收到广播消息后,会执行相应的更新操作,并将更新结果发送给领导者节点。
- 领导者节点在收到所有节点的更新结果后,会进行汇总,然后将汇总结果返回给客户端。
在数据查询与更新过程中,ZooKeeper集群通过领导者选举和数据同步机制来保证数据的一致性和可用性。当领导者节点出现故障时,其他节点会重新选举一个领导者节点,并保证数据的一致性。同时,ZooKeeper集群中的每个节点都会定期与其他节点进行数据同步,以保证数据的实时性和一致性。
CAP理论在Zookeeper中的应用
CAP理论在Zookeeper中的应用主要体现在其数据一致性、可用性和分区容错性方面。
首先,Zookeeper遵循一致性原则(Consistency)。在分布式系统中,Zookeeper保证所有节点在同一时刻具有完全相同的数据备份。这意味着在Zookeeper中,每个节点都可以提供一个一致的数据视图。
其次,Zookeeper在可用性方面(Availability)有所牺牲。Zookeeper不能保证每次服务请求的可用性。例如,在极端环境下,Zookeeper可能会丢弃一些请求,消费者程序需要重新请求才能获得结果。
最后,Zookeeper具有分区容错性(Partition Tolerance)。Zookeeper能够容忍节点之间的网络通信故障,也就是说,即使集群因为网络或者机器故障等原因分成几个区域(分区),Zookeeper集群也能保持其功能性。
根据CAP理论,一个分布式系统不可能同时满足一致性、可用性和分区容错性这三个基本需求,最多只能同时满足其中的两项。由于分区容错性是必须的,因此Zookeeper选择了CP原则,即选择了一致性和分区容错性,而牺牲了可用性。

安装部署
单节点安装部署
Zookeeper单节点安装部署可以按照以下步骤进行:
- 下载Zookeeper:访问Zookeeper官网,下载对应版本的Zookeeper压缩包。
- 解压缩:将压缩包解压缩到目标目录,例如“/usr/local/zookeeper”。
- 配置文件:进入解压缩后的目录,找到“conf”文件夹,修改“zoo_sample.cfg”文件为“zoo.cfg”,配置Zookeeper的相关参数。
- 启动Zookeeper:在终端中输入“bin/zkServer.sh start”命令,启动Zookeeper服务。
- 创建数据目录和日志目录:进入“/usr/local/zookeeper-3.4.6”目录,创建“data”和“logs”文件夹。
- 创建myid文件:在“data”文件夹下创建一个名为“myid”的文件,并在文件中输入当前机器的IP地址。
- 配置防火墙:如果需要在防火墙中开放Zookeeper的端口,需要配置防火墙规则。
- 测试Zookeeper:通过Zookeeper客户端连接Zookeeper服务,测试是否能够正常连接和使用。
以上是Zookeeper单节点安装部署的基本步骤,按照步骤进行操作即可完成安装部署。
集群安装部署
Zookeeper集群安装部署可以按照以下步骤进行:
- 准备节点:准备多个Zookeeper节点,确保每个节点都有足够的内存和磁盘空间。
- 安装Zookeeper:在每个节点上安装Zookeeper,具体步骤与单节点安装部署相同。
- 配置文件:修改每个节点的“zoo.cfg”文件,配置集群的相关参数,例如集群节点地址、端口号等。
- 创建数据目录和日志目录:在每个节点的指定目录下创建“data”和“logs”文件夹。
- 创建myid文件:在每个节点的“data”文件夹下创建一个名为“myid”的文件,并在文件中输入当前机器的IP地址。
- 启动Zookeeper:在每个节点上启动Zookeeper服务,使用“bin/zkServer.sh start”命令。
- 测试集群:通过Zookeeper客户端连接集群,测试是否能够正常连接和使用。
以上是Zookeeper集群安装部署的基本步骤,需要注意的是,在配置文件时需要确保每个节点的配置文件中的端口号不冲突,并且每个节点的IP地址和端口号需要正确配置。同时,在启动Zookeeper服务时,需要按照指定的顺序启动节点,以确保集群的正常运行。
常用配置参数
Zookeeper常用配置参数包括:
- tickTime:这是Zookeeper的基本时间单位,用于表示心跳时间间隔。
- dataDir:指定存储数据的目录。
- clientPort:指定客户端连接的端口号。
- initLimit:该参数用于配置Leader服务器等待Follower启动,并完成数据同步的时间。Follower服务器在启动过程中,会与Leader建立连接并完成对数据的同步,从而确定自己对外提供服务的起始状态。Leader服务器允许Follower在initLimit时间内完成这个工作。
- syncLimit:集群中flower服务器(F)跟leader(L)服务器之间的请求和答应最多能容忍的心跳数。
此外,Zookeeper还有许多其他参数,可以根据实际需求进行配置。具体参数可以参考Zookeeper的官方文档或配置文件中的说明。
Java使用Zookeeper示例
以下是一个简单的Java使用Zookeeper的示例,演示了如何使用Zookeeper创建一个简单的分布式锁:
import org.apache.zookeeper.ZooKeeper;
import org.apache.zookeeper.CreateMode;
import org.apache.zookeeper.ZooDefs.Ids;public class DistributedLock {private ZooKeeper zooKeeper;private String lockPath;public DistributedLock(String host, int port) throws Exception {zooKeeper = new ZooKeeper(host, port, new Watcher() {@Overridepublic void process(WatchedEvent event) {// 处理事件}});lockPath = "/lock";}public boolean lock() throws Exception {String createdPath = zooKeeper.create(lockPath, new byte[0], Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL_SEQUENTIAL);return createdPath.equals(lockPath);}public boolean unlock() throws Exception {return zooKeeper.delete(lockPath, -1);}
}
这个示例中,我们创建了一个DistributedLock类,它通过Zookeeper实现了分布式锁的功能。在构造函数中,我们连接到Zookeeper服务器,并指定了锁的路径。lock()方法尝试在Zookeeper中创建一个临时节点作为锁,如果成功则返回true,表示获得锁。unlock()方法删除锁节点,表示释放锁。在Watcher中,我们可以处理Zookeeper事件,例如节点变化、会话断开等。
Spring Boot集成Zookeeper
要在Spring Boot应用程序中集成Zookeeper,您需要执行以下步骤:
- 添加依赖项
在您的pom.xml文件中添加Spring Boot Starter Curator依赖项。这将包含Spring Boot对Zookeeper的集成。
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-curator</artifactId>
</dependency>
- 配置Zookeeper连接信息
在application.properties或application.yml文件中配置Zookeeper的连接信息,例如主机名和端口号。
spring.curator.connect-string=localhost:2181
spring.curator.namespace=myapp
- 创建Zookeeper客户端
创建一个CuratorFramework的Bean实例,该实例将用于与Zookeeper进行交互。您可以在Spring Boot应用程序的配置类中添加以下代码:
@Configuration
public class ZookeeperConfig {@Beanpublic CuratorFramework curatorFramework() throws Exception {return CuratorFrameworkFactory.newClient(environment.getProperty("spring.curator.connect-string"), new ExponentialBackoffRetry(1000, 3));}
}
- 使用Zookeeper客户端进行操作
现在您可以使用创建的CuratorFramework客户端进行各种操作,例如创建节点、获取子节点数、设置节点数据等。以下是一些常见操作的示例:
@Autowired
private CuratorFramework curatorFramework;public void createNode(String path) throws Exception {if (curatorFramework.exists().forPath(path) == null) {curatorFramework.create().creatingParentsIfNeeded().forPath(path);}
}public int getChildrenCount(String path) throws Exception {return curatorFramework.getChildren().forPath(path).size();
}public void setNodeData(String path, String data) throws Exception {if (curatorFramework.exists().forPath(path) != null) {curatorFramework.setData().forPath(path, data.getBytes());} else {curatorFramework.create().forPath(path, data.getBytes());}
}
拓展
Zab协议协议介绍
Zab协议(Zookeeper Atomic Broadcast)是一种为分布式协调服务Zookeeper专门设计的支持崩溃恢复的原子广播协议,是Zookeeper保证数据一致性的核心算法。
Zab协议借鉴了Paxos算法,但又不完全相同。Zab协议主要应用于Zookeeper系统,通过该协议,Zookeeper集群中的每个节点可以保持数据的一致性。Zab协议有两个主要的工作模式:广播模式和恢复模式。在广播模式下,当集群正常运行时,一个节点作为领导者(Leader)负责协调事务,将服务器数据的状态变更以事务提议(proposal)的形式广播到所有的副本(Follower)进程上去。在恢复模式下,当集群启动或领导者崩溃时,系统进入恢复模式,选举新的领导者并将集群中各节点的数据同步到最新状态。
Zab协议通过确保那些已经在领导者(Leader)服务器上提交(Commit)的事务最终被所有的服务器提交,以及丢弃那些只在领导者(Leader)上被提出而没有被提交的事务,来保证数据的一致性。同时,Zab协议还保证了全局的变更序列被顺序引用,即保证了事务的顺序一致性。
Paxos算法
Paxos算法是一种基于消息传递的一致性算法,旨在解决分布式系统中的一致性问题。它由莱斯利·兰伯特于1990年提出,被认为是解决这类问题的最有效算法之一。
Paxos算法通过一系列的提案和投票过程来达成一致,节点在分布式系统中分为三种角色:Proposer(提议者)、Acceptor(接受者)和Learner(学习者)。
Proposer负责提出提案,Acceptor负责对提案进行投票,Learner则从Acceptor处获取已确定的提案内容。在一个集群中,会有多个提议者提出不同的提案,而一个提案会有多个接受者。
Paxos算法通过以下过程达成一致:
- Prepare阶段:Proposer向所有Acceptor发送Prepare请求,请求中包含一个提案编号。Acceptor收到请求后,如果该提案编号大于其之前接收到的最大提案编号,则接受该提案,否则拒绝。
- Promise阶段:如果Acceptor接受了提案,则向Proposer发送Promise响应,同时将该提案编号记录下来。如果其他Acceptor已经接受了该提案,则将该Acceptor的编号记录下来。
- Accept阶段:如果Proposer收到了足够多的Promise响应(超过半数),则认为该提案被选定,并向所有Acceptor发送Accept请求。Acceptor收到请求后,如果该提案编号等于其之前接收到的最大提案编号,则接受该提案。
- Learning阶段:当一个提案被选定后,Learner会从已接受该提案的Acceptor处获取提案内容。
Paxos算法通过这种机制确保了在分布式系统中的一致性,即使在节点故障或网络分区的情况下也能保证系统的可用性和可靠性。然而,Paxos算法的实现难度较大,需要解决诸如选举领导者、处理故障恢复等问题。
Apriori算法
Apriori算法是一种关联规则挖掘算法,用于在大型数据库中找出频繁项集,从而生成关联规则。该算法主要用于市场篮子分析、用户购买习惯分析、推荐系统等领域。
Apriori算法的基本思想是利用频繁项集的子集必须也是频繁的特性,采用逐层搜索的方法找出数据库中的频繁项集。具体而言,Apriori算法通过扫描一次数据库,对每个候选项集计数,然后删除不满足最小支持度阈值的项集,接着对剩下的项集重复上述过程,直到所有候选项集都满足最小支持度阈值或无法再生成新的候选项集为止。
Apriori算法的时间复杂度较高,因此需要进行优化以提高效率。优化方法包括使用哈希树、使用垂直数据格式等。同时,Apriori算法也面临一些挑战,例如如何选择合适的最小支持度阈值和置信度阈值、如何处理大规模数据集等。
总体来说,Apriori算法是一种非常实用的关联规则挖掘算法,可以应用于多种领域。它通过对数据库的深度扫描和对候选项集的计数,可以有效地找出频繁项集并生成关联规则,为数据分析和商业决策提供有力支持。
Paxos算法和Apriori算法的区别
Paxos算法和Apriori算法是两种完全不同的算法,它们被用于解决不同的问题。
Paxos算法是一种基于消息传递的一致性算法,旨在解决分布式系统中的一致性问题。它通过一系列的提案和投票过程来达成一致,确保在分布式系统中的多个节点能够就某个决议达成一致。
Apriori算法则是一种关联规则挖掘算法,用于发现数据库中项集的关系,以形成规则。它采用一种基于搜索的迭代方法,通过不断合并项集来生成更大的项集,直到找到所有频繁项集。
因此,Paxos算法和Apriori算法的主要区别在于它们的用途和实现方式。Paxos算法用于解决分布式系统中的一致性问题,而Apriori算法用于关联规则挖掘。同时,Paxos算法基于消息传递,通过提案和投票过程达成一致,而Apriori算法则采用基于搜索的迭代方法来发现频繁项集。

Zookeeper官网
zookeeper服务端和客户端的启动与停止
相关文章:
Zookeeper使用详解
介绍 ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,是Hadoop和Hbase的重要组件。它是一个为分布式应用提供一致性服务的软件,提供的功能包括:配置维护、域名服务、分布…...
C#属性(Property)
文章目录 一、C#属性(Property)?二、属性的用法总结 一、C#属性(Property)? C#属性(Property)是一种访问器(accessor),用于封装一个类的字段&…...
在docker中搭建部署clickhouse
因需要给网关日志拉取并存储供数据分析师分析,由于几十个项目的网关请求数量很大,放在mysql不合适,MongoDB不适合分析,于是准备存放在clickhouse,clickhouse对于读写支持也比较友好,说干就干 1、在服务器中…...
第九部分 使用函数 (三)
目录 一、文件名操作函数 1、dir 2、notdir 3、suffix 4、basename 5、addsuffix 6、addprefix 7、join 一、文件名操作函数 下面我们要介绍的函数主要是处理文件名的。每个函数的参数字符串都会被当做一个或是 一系列的文件名来对待。 1、dir $(dir <names..>…...
基础命令继续
1:创建目录命令 mkdir命令 注意:创建文件夹需要修改权限,请确保操作均在HOME目录内,不要在Home外操作,涉及到权限问题,HOME外无法识别 小结: 练习: 2:touch创建文件 2:c…...
uni-app做A-Z排序通讯录、索引列表
上图是效果图,三个问题 访问电话通讯录,拿数据拿到用户的联系人数组对象,之后根据A-Z排序根据字母索引快速搜索 首先说数据怎么拿 - 社区有指导https://ask.dcloud.net.cn/question/64117 uniapp 调取通讯录 // #ifdef APP-PLUSplus.contac…...
Codeforces Round 768 (Div. 1) D. Flipping Range(思维题 等价类性质 dp)
题目 思路来源 官方题解 洛谷题解 题解 可操作的最短区间长度肯定是gcd,记为g,然后考虑如何dp 考虑g个等价类,每个等价类i,ig,i2*g,... 每次翻转长度为g的区间,会同时影响到g个等价类总的翻转的奇偶性, 性质一&…...
springboot集成kafka消费数据
springboot集成kafka消费数据 文章目录 springboot集成kafka消费数据1.引入pom依赖2.添加配置文件2.1.添加KafkaConsumerConfig.java2.2.添加KafkaIotCustomProperties.java2.3.添加application.yml配置 3.消费者代码 1.引入pom依赖 <dependency><groupId>org.spri…...
单例模式---JAVA
目录 “饿汉”模式 完整代码 “懒汉”模式 完整代码 单例模式:保证某个类在程序中只存在唯一一份实例, 而不会创建出多个实例。 单例模式可以通过实例创建的时间来分为两种:“饿汉”和“懒汉”模式。 “饿汉”模式 所谓的“饿汉”模式实则就是在类…...
maven管理使用
maven基本使用 一、简介二、配置文件三、项目结构maven基本标签实践(例子) 四、pom插件配置五、热部署六、maven 外部手动加载jar打包方式Maven上传私服或者本地 一、简介 基于Ant 的构建工具,Ant 有的功能Maven 都有,额外添加了其他功能.本地仓库:计算机中一个文件夹,自己定义…...
如何在一个系统中同时访问异构的多种数据库
如何在一个系统中同时访问异构的多种数据库 比如在一个系统中,要同时访问MySQL,H2, MsAccess, Mongodb. 要是使用Hibernate, MyBatis这些ORM,难度简直不敢想像。 要是MySQL还使用了分库分表,那更加不得了,一大堆的组件都要配合着…...
半监督学习 - 半监督聚类(Semi-Supervised Clustering)
什么是机器学习 半监督聚类是一种集成了有标签数据和无标签数据的聚类方法,其目标是在聚类的过程中利用有标签数据的信息来提高聚类性能。在半监督聚类中,一部分数据集有已知的标签,而另一部分没有标签。 以下是半监督聚类的基本思想和一些…...
实现STM32烧写程序-(3) Hex文件结构
简介 要对STM32进行更新动作, 就需要对程序文件进行解析, 大部分编译的生成程序文件是Hex或者Bin, 先来看看Hex的结构吧。 资料 Hex文件 简介 Hex文件格式最早由Intel公司于1973年创建。它最初是为了在Intel 8080微处理器上存储和传输二进制数据而设计的。随后,Hex…...
精品量化公式——“区域突破”,应对当下行情较好的主图看盘策略
不多说,直接上效果如图: ► 日线表现 代码评估 技术指标代码评估: VAR1, VAR2, VAR3:这些变量是通过指数移动平均(EMA)计算得出的。EMA是一种常用的技术分析工具,用于平滑价格数据并减少市场“…...
自然语言处理5——发掘隐藏规律 - Python中的关联规则挖掘
目录 写在开头1. 了解关联规则挖掘的概念和实际应用1.1 关联规则挖掘在市场分析和购物篮分析中的应用1.2 关联规则的定义和基本原理1.3 应用场景2. 使用Apriori算法和FP-growth算法进行关联规则挖掘2.1 Apriori算法的工作原理和实现步骤2.2 FP-growth算法的优势和使用方法2.3 A…...
【记录】重装系统后的软件安装
考完研重装了系统,安装软件乱七八糟,用到什么装什么。在这里记录一套标准操作,备用。一个个装还是很麻烦,我为什么不直接写个脚本直接下载安装包呢?奥,原来是我太菜了还不会写脚本啊!先记着吧&a…...
Android 13 - Media框架(31)- ACodec(七)
之前的章节中我们解了 input buffer 是如何传递给 OMX 的,以及Output buffer 是如何分配并且注册给 OMX 的。这一节我们就来看ACodec是如何处理OMX的Callback的。 1、OMXNodeInstance Callback 这一节我们只大致记录Callback是如何传递给ACodec的。在之前的学习中我…...
快速了解VR全景拍摄技术运用在旅游景区的优势
豆腐脑加了糖、烤红薯加了勺,就连索菲亚大教堂前都有了“人造月亮”,在这个冬季,“尔滨”把各地游客宠上了天。面对更多的游客无法实地游玩,哈尔滨冰雪世界再添新玩法,借助VR全景拍摄技术对冬季经典冰雪体验项目进行全…...
分布形态的度量_峰度系数的探讨
集中趋势和离散程度是数据分布的两个重要特征,但要全面了解数据分布的特点,还应掌握数据分布的形态。 描述数据分布形态的度量有偏度系数和峰度系数, 其中偏度系数描述数据的对称性,峰度系数描述与正态分布的偏离程度。 峰度系数反映分布峰的尖峭程度的重要指标. 当…...
HCIP 重发布
拓扑图&IP划分如下: 第一步,配置接口IP&环回地址 以R1为例,R2~R4同理 interface GigabitEthernet 0/0/0 ip address 12.1.1.1 24 interface GigabitEthernet 0/0/1 ip address 13.1.1.1 24 interface LoopBack 0 ip address 1.1.1.…...
【人工智能】神经网络的优化器optimizer(二):Adagrad自适应学习率优化器
一.自适应梯度算法Adagrad概述 Adagrad(Adaptive Gradient Algorithm)是一种自适应学习率的优化算法,由Duchi等人在2011年提出。其核心思想是针对不同参数自动调整学习率,适合处理稀疏数据和不同参数梯度差异较大的场景。Adagrad通…...
c#开发AI模型对话
AI模型 前面已经介绍了一般AI模型本地部署,直接调用现成的模型数据。这里主要讲述讲接口集成到我们自己的程序中使用方式。 微软提供了ML.NET来开发和使用AI模型,但是目前国内可能使用不多,至少实践例子很少看见。开发训练模型就不介绍了&am…...
SpringCloudGateway 自定义局部过滤器
场景: 将所有请求转化为同一路径请求(方便穿网配置)在请求头内标识原来路径,然后在将请求分发给不同服务 AllToOneGatewayFilterFactory import lombok.Getter; import lombok.Setter; import lombok.extern.slf4j.Slf4j; impor…...
全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比
目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec? IPsec VPN 5.1 IPsec传输模式(Transport Mode) 5.2 IPsec隧道模式(Tunne…...
GC1808高性能24位立体声音频ADC芯片解析
1. 芯片概述 GC1808是一款24位立体声音频模数转换器(ADC),支持8kHz~96kHz采样率,集成Δ-Σ调制器、数字抗混叠滤波器和高通滤波器,适用于高保真音频采集场景。 2. 核心特性 高精度:24位分辨率,…...
push [特殊字符] present
push 🆚 present 前言present和dismiss特点代码演示 push和pop特点代码演示 前言 在 iOS 开发中,push 和 present 是两种不同的视图控制器切换方式,它们有着显著的区别。 present和dismiss 特点 在当前控制器上方新建视图层级需要手动调用…...
如何应对敏捷转型中的团队阻力
应对敏捷转型中的团队阻力需要明确沟通敏捷转型目的、提升团队参与感、提供充分的培训与支持、逐步推进敏捷实践、建立清晰的奖励和反馈机制。其中,明确沟通敏捷转型目的尤为关键,团队成员只有清晰理解转型背后的原因和利益,才能降低对变化的…...
uniapp 实现腾讯云IM群文件上传下载功能
UniApp 集成腾讯云IM实现群文件上传下载功能全攻略 一、功能背景与技术选型 在团队协作场景中,群文件共享是核心需求之一。本文将介绍如何基于腾讯云IMCOS,在uniapp中实现: 群内文件上传/下载文件元数据管理下载进度追踪跨平台文件预览 二…...
高防服务器价格高原因分析
高防服务器的价格较高,主要是由于其特殊的防御机制、硬件配置、运营维护等多方面的综合成本。以下从技术、资源和服务三个维度详细解析高防服务器昂贵的原因: 一、硬件与技术投入 大带宽需求 DDoS攻击通过占用大量带宽资源瘫痪目标服务器,因此…...
uni-app学习笔记三十五--扩展组件的安装和使用
由于内置组件不能满足日常开发需要,uniapp官方也提供了众多的扩展组件供我们使用。由于不是内置组件,需要安装才能使用。 一、安装扩展插件 安装方法: 1.访问uniapp官方文档组件部分:组件使用的入门教程 | uni-app官网 点击左侧…...
