`

zookerpeer

 
阅读更多

1.       Zookeeper:攘其外必先安其内。攘其外:是指zookeeper对外提供了分布式协调服务(例如datanode集群中,协调的意思是指哪个是主哪个是备)。安其内是指对内(也就是他自己)是高可用。对外提供高可用的前提是对内高可用。

2.       Server.1=192.168.9.11:2888:3888server.2=192.168.9.12:2888:3888server.3=192.168.9.13:2888:3888Server.1,server.2,server.3中的数字表示myid。其中2888端口是攘其外的时候用的,对外给出主服务器。3888端口是安其内用的,对zookeeper自己选择主服务器用的。2181是客户端连接zookeeper集群用的端口号。而前面这个myid说明此myid对应的服务器是zookeeper集群中的服务器。

3.       在配置的时候有一个myid,里面写1,2,3等等。他的作用是决定谁是leader主服务器,还有一个作用就是他也是事物id。这里myid=3的最大,因此myid=3是主服务器。例如:先启动前两个服务器(这前两个先启动哪个都行),启动zookeeper的命令是:zkServer.sh start,此时会选举出myid=2的服务器作为leader主节点。之后在启动第三台服务器,由于集群中已经有了leader,因此即使myis=3启动了,他仍然是Follower从节点

4.       Sessionid:客户端向zookeeper集群中的某server节点创建连接的时候需要获得一个sessionidclientserver通信之前, 首先需要建立连接, 该连接称为session。如果该server出了问题,在sessionid没有失效的时候可以自动的连接其他的server节点,这就是因为session的一致性。

 

5.       Session的一致性:假如客户端连接zookeeper集群中server1节点,向server1发出增删改的操作,由于server1Follower节点,不具备增删改的操作只具备查询操作,因此server1节点会把增删改的操作转给leader主节点,由leader处理完之后在返回给server1节点,server1节点在返回给客户端。leader在创建seesionid的时候,leader会给每个follower节点的消息队列中都传送sessinid,通知zookeeper集群内的所有follower节点,问他们是否同意。当过半的follower同意之后,才能创建此sessionid(过半原则),当leader创建好session之后,不仅给server1,而是给每个follower节点都发一份此sessionid。这样的最终结果就是所有的follower节点跟leader节点的数据都一样(注意:leader有增删改查的功能,而follower只有查询的功能)。

6.       客户端的概念:在图中我们可以看到zookeeper集群外,需要连接一个zookeeper的客户端,也就是说外界如果想用zookeeper服务,就要先连接这个zookeeper客户端,因此在外界看来这里的client客户端就是zookeeper服务(即:以zookeeper集群的角度来说client是客户端,但是以外界来说client就是zookeeper的服务的入口)。

7.       Znodezookeeper中的目录节点,分为两种,一种是短暂的,一种是持久的。后面能跟序列号,目的是保证即使文件名称一样也不会重名,因为后面还跟着序列号呢。每个目录在zookeeper中叫做znode,并且其有一个唯一的路径标识。客户端应用可以在znode上设置监视器(Watcher

8.       短暂的zonde节点:是由session 的生命周期决定的,当一个客户端连接集群中的一个server的时候,集群中的leader会给客户端一个sessionid。此时客户端有了sessionid之后,leader也会创建一个znode目录节点。当客户端与这个server节点断开连接了,过一段时间此sessionid就会超时,超时一定时间就会失效,失效之后sessionid就会被销毁(leader会销毁所有节点的该sessionid,做法是给所有follower节点发一个销毁的事物id),同时此znode短暂目录节点也会消失。这时候就类似于zkfc

9.       Zkfc:集群中,当把其中一个zkfc进程杀死后,此zkfc和客户端就断开连接了,zkfc有两只手,一只手拉着zookeeper集群,另一只手拉着namenode。其中拉着zookeeper集群的这只手就是连接zookeeper的客户的代码(也就是说zookeeper集群是通过zookeeper客户端对外提供服务的,如果一个外部集群想用zookeeper进行高可用服务,那么肯定是需要一个zookeeper的客户端连接这个zookeeper集群的)。

10.   所以,zkfc进程启动之后,zkfc内部会有一个zookeeper集群的客户端(图中的client),这个客户端会和zookeeper集群中的某个server建立连接,建立连接之后就会产生sessionidsessionidzookeeper集群为客户端产生的,也就是leader创建的,他会返回给server1以及其他follower节点,并由server1返回给客户端,此时客户端就有了sessionid),产生sessionid的同时,在客户端还会创建一个znode目录结构(由zookeeper集群中的leader创建此目录结构,此目录结构在集群中,用于客户端1sessionid与此目录结构的沟通,但是其他客户端也可以看到这个目录结构)。如果此时杀死了zkfczkfc中的客户端机会消失了,zkfc消失之后过一段时间,sessionid就会超时失效,sessionid失效之后zkfc曾经创建的这个节点也会跟着消失,也就是删除这个znode节点。Znode中记录了zxid(事物id)等信息。

11.   启动zookeeper客户端是zkCli.sh,可以启动多个。启动zookeeper服务是zkServer.sh

12.   Znode的目录结构有四种:持久的、短暂的、持久+序列化、短暂+序列化。

13.   我们可以在zookeeper中创建一个znode节点,里面有mzxidczxidctimepzxid等,zxid就是事物idCzxid是一个线性增长的序列号。

14.   攘其外:zookeeper集群中使用消息队列,leader为每个follower提供一个消息队列,当客户端向任何一个的follower提交一个增删改查的操作,此follower会把此操作转发给leaderleader操作完成之后,leader会把此操作结果放到每个follower中的消息队列中(每个操作都带着事物zxid,这样就可以区分出版本来了),当follower把这个消息队列中的数据消费后就会给客户端返回操作成功,当过半(由于每个follower的网络传输速不一样)的follower返回操作成功,那么就认为客户端的此操作成功了。

15.   最终一致性:只要所有的follower中消息队列里的数据都消费完,此时攘其外的结果就保证了最终一致性。

16.   安其内:能够快速的选出leader主节点,当现在的leader挂掉了,这时是一个无主模式,此时会有一个或者多个follower会知道(这得看网络速度情况),follower中有两个对象,一个是自己的zxid事物id,另一个是自己的myid。在多个follower节点中,zxid可能一样,但是自己的myid肯定跟其他follower不一样。我们会根据zxidmyid选择出leader主节点,选择的办法是投票,投票还具有传递性,投票的结果是找到一个zxid最大的节点当做leader主节点,如果有多个follower节点都是事物最大,那么在比较myid,因为每个follower节点的myid都不一样,因此肯定能够选择出唯一的一个leader节点(其实就是在leader主节点挂掉之后,会在所有follower中会以投票的方式选举一个作为leader,选举出来的这个leader会是一个zxid最大且myid最大的那个follower)。

17.   虽然当leader挂掉之后,会很快选举出来一个新的leader,但是如果有成千上万台的集群就会很慢了,此时出现了observerobserver是观察者的意思,不参与投票,如果leader挂了,就在这些follower中选举一个作为leader,选举之后产生的新leader会把数据同步到所有的follower中和所有的observer中。因此1000zookeeper集群中,可能有10台是follower,其他的都是observer,而选择的时候只有这10follower参与,这样速度就快了。follower是跟随者的意思,leader是领导者的意思。

18.   Follower的作用:用于接收客户端的请求并向客户端返回结果,在选主过程中参与投票。

19.   Leader的作用:负责进行投票的发起和决议,更新系统的状态(例如follower中的增删改的操作都要转发给leader来进行操作,当leader操作完成之后,给集群中的所有follower节点用消息队列的形式发送zxid事物进行系统更新)

20.   Observer的作用:可以接受客户端连接,将写请求转发给leader,但是observer不参与投票过程,只同步leader的状态,observer的目的是为了扩展系统,提高读取速度

 

 

21.   客户端client的作用:第一:向zookeeper集群发送请求。第二:客户端注册监听它关心的目录节点(此目录节点都是zookeeper集群中的),当目录节点发生变化(数据改变、被删除、子目录节点增加删除)时,会调用回调函数(其实就是注册在zookeeper中的监听方法中有一行代码是执行回调函数的,当目录节点发生了变化就会被监听器监听到,随后执行监听的方法,在执行监听的方法的时候,里面有一行代码是定义一个回调函数,此时就会执行回调函数,回调函数是写在客户端client中的,回调函数也是个方法,此方法中会执行自己想干的时候)

22.   事件监听Watcher监听器在 ZooKeeper 是一个核心功能Watcher 可以监控目录节点的数据变化以及子目录的变化,一旦这些状态发生变化,服务器就会通知所有设置在这个目录节点上的Watcher,从而每个客户端都很快知道它所  关注的目录节点的状态发生变化,而做出相应的反应。客户端注册的监听方法只会被执行一次。

23.   比如,namenode1使用zkfc1连接着zookeeper集群,namenode2使用zkfc2连接着zookeeper集群。两个namenode都会使用zkfc(一只手连着zookeeper的客户端client呢)给zookeeper集群发送请求,假如zkfc1的请求比较快,那么leader节点就会为zkfc1zookeeper集群中创建一个znode目录结构。然后两个zkfc都会通过一些方法(方法有exists,getChildren,getData。其实就是在监听目录是否存在、目录是否被改动等等)去监听这个目录结构,当znode目录机构发生变化之后,会调用zkfc中的回调函数(方法有create,delete,setData,回调函数在zkfc中,注册的监听方法在zookeeper中,因为需要使用接口),回调函数的出现,是由于zkfc先对znode目录节点有了监听的方法,监听到目录改变之后就会在回调zkfc中的增删改方法。

24.   比如说,当zkfc2监听到znode目录结构被删除了之后,会把namenode1降低为备份节点,把namenode2提升为主节点,并由zkfc2告诉zookeeper集群去创建一个新的znode目录结构。

25.   Zookeeper的客户端ZkClient去连接zookeeperserver时候都会创建sendThreadeventThread两个线程,其中sendThread主要用于clientserver端之间的网络连接,真正的处理线程由eventThread来执行。

26.   步骤:

第一步:zookeeper集群内部通过选举机制选出一个leader,然后此leader向集群内的follower同步数据(此时集群内的数据最新了)。此时集群就可以向外提供服务了。

 

第二步:客户端clientzookeeper集群中的server1节点发送增删改的请求。我们下面以namenode集群为例,zkfc一手抓着namenode,另一个手抓着zookeeper集群(其实这里就是zookeeper的客户端client)。当搭建namenode高可用集群的时候,两台namenode都会通过zkfc(也是zookeeper的客户端)给zookeeper集群发送增删改的请求,谁先请求到zookeeper集群,谁就是主节点。

 

第三步:由于server1只具备查询的功能,只有leader具备增删改的功能,因此serve1会把客户端client的请求转发给leader。此时假设zkfc1成功与zookeeper集群建立了连接,那么namenode1成为了主节点。

 

第四步:Leader接收到以后开始发起投票并通知Follwer进行投票,follower把投票结果发送给leader。当有过半的follower通过之后,会产生一个sessionid并创建znode目录结构(znode中记录着zxid事物编号等信息),leader会把sessionid发给集群中所有的follower(每个follower中都有一个消息队列,sessionid是发送到了follower中的消息队列里了)。

 

第五步:leadersession发送给集群中的所有follower节点(servre),这样整个集群就有了此sessionid(还能保证每个server的数据都是最新的)。

 

第六步:由server1sessionid返回给客户端。这里的客户端是zkfc1zkfc2

 

第七步:zkfc1zkfc2都会使用监听器来监听zookeeper集群中的这个znode目录节点,监听的方法是注册在zookeeper内存中的,当监听到这个目录有增删改的操作的时候,就会触发回调函数,回调函数是写在zkfc中(zkfc的其中一只手就是zookeeper的客户端client代码)的。这个注册方法与监听方法之间是使用接口来连接的。因为一个在zookeeper的服务器端,另一个在zookeeper的客户端。

 

第八步:(可选)当server1挂掉后,在此sessionid还没失效的时候,可以连接上集群中的其他server,因为session的一致性,每个server中都包含这个sessionid

 

第九步:当leader挂掉后,此时就是个无主模式了,会通过投票机制选举出一个新的leaderzxid最大,如果有多个serverzxid都是最大,那在找出myid最大的)

 

第十步:当sessionid失效之后,znode目录结构也会被删除,此时监听器监听到此事件,会触发回调函数的执行,回调函数里面写的方法体是程序员自己指定的,大体内容就是提升namenode2为主节点。

总结一下:

   zookeeper能对外提供分布式协调服务,是因为监听事件机制和回调函数。

   Zookeeper内部的稳定是由于快速选举机制和session最终一致性。

       clientserver通信之前, 首先需要建立连接, 该连接称为session,sessionid创建好之后会返回给客户端。在zookeeper集群中会有一个这个sessionid相对应的znode目录节点,此节点中的内容大小为1兆,用来记录此sessionid的信息,例如zxid事物编号等。clientserver通信会产生很多事物,都会一一记录下来。当客户端clientserver断开连接,就会导致session失效,此时这个znode也会被删除(因为这个znode中记录着这个session本次连接的事物信息等)

 

 

27.   Zookeeper是分布式协调服务,对外提供服务,那么对外提供的是什么服务呢?

28.   客户端连接Zookeeper集群,会在集群中随机找出一台follower来连接,这也是负载均衡的体现

 

 

 

 

 

下面是网上的总结:https://www.cnblogs.com/felixzh/p/5869212.html

https://www.cnblogs.com/yuyijq/p/3424473.html

https://www.cnblogs.com/raphael5200/p/5285583.html

1.  Zookeeper设计的目的


1.
最终一致性:client不论连接到哪个Server,展示给它都是同一个视图,这是zookeeper最重要的性能。 

2.
可靠性:具有简单、健壮、良好的性能,如果消息被到一台服务器接受,那么它将被所有的服务器接受。 

3.
实时性:Zookeeper保证客户端将在一个时间间隔范围内获得服务器的更新信息,或者服务器失效的信息。但由于网络延时等原因,Zookeeper不能保证两个客户端能同时得到刚更新的数据,如果需要最新数据,应该在读数据之前调用sync()接口。 

4.
等待无关(wait-free):慢的或者失效的client不得干预快速的client的请求,使得每个client都能有效的等待。 

5.
原子性:更新只能成功或者失败,没有中间状态。 

6.
顺序性:包括全局有序和偏序两种:全局有序是指如果在一台服务器上消息a在消息b前发布,则在所有Server上消息a都将在消息b前被发布;偏序是指如果一个消息b在消息a后被同一个发送者发布,a必将排在b前面。 

2.  Zookeeper工作原理


Zookeeper
的核心是原子广播,这个机制保证了各个Server之间的同步。实现这个机制的协议叫做Zab协议。Zab协议有两种模式,它们分别是恢复模式(选主)和广播模式(同步)。当服务启动或者在领导者崩溃后,Zab就进入了恢复模式,当领导者被选举出来,且大多数Server完成了和 leader的状态同步以后,恢复模式就结束了。状态同步保证了leaderServer具有相同的系统状态。 

为了保证事务的顺序一致性,zookeeper采用了递增的事务id号(zxid)来标识事务。所有的提议(proposal)都在被提出的时候加上了zxid。实现中zxid是一个64位的数字,它高32位是epoch用来标识leader关系是否改变,每次一个leader被选出来,它都会有一个新的epoch,标识当前属于那个leader的统治时期。低32位用于递增计数(即:高32位是标识当前leader是哪台服务器,因为leader可能会经常变;低32位是个序列号,目的是为了防止两个相同名字的目录节点导致重名,所以后面加上一个累加的序列号就可以了)。

3.  Zookeeperserver的工作状态

每个Server在工作过程中有三种状态: 

LOOKING
:当前Server不知道leader是谁,正在搜寻
LEADING
:当前Server即为选举出来的leader
FOLLOWING
leader已经选举出来,当前Server与之同步

4.  Zookeeper选主流程(basic paxos模式)

leader崩溃或者leader失去大多数的follower,这时候zk进入恢复模式(无主模式),恢复模式需要重新选举出一个新的leader,让所有的Server都恢复到一个正确的状态。Zk的选举算法有两种:一种是基于basic paxos实现的,另外一种是基于fast paxos算法实现的。系统默认的选举算法为fast paxos

1.
选举线程由当前Server发起选举的线程担任,其主要功能是对投票结果进行统计,并选出推荐的Server 

2.
选举线程首先向所有Server发起一次询问(包括自己) 

3.
选举线程收到回复后,验证是否是自己发起的询问(验证zxid是否一致),然后获取对方的id(myid),并存储到当前询问对象列表中,最后获取对方提议的leader相关信息(id,zxid),并将这些信息存储到当次选举的投票记录表中; 

4.
收到所有Server回复以后,就计算出zxid最大的那个Server,并将这个Server相关信息设置成下一次要投票的Server 

5.
线程将当前zxid最大的Server设置为当前Server要推荐的Leader,如果此时获胜的Server获得n/2 + 1Server票数,设置当前推荐的leader为获胜的Server,将根据获胜的Server相关信息设置自己的状态,否则,继续这个过程,直到leader被选举出来。通过流程分析我们可以得出:要使Leader获得多数Server的支持,则Server总数必须是奇数2n+1,且存活的Server的数目不得少于n+1. 每个Server启动后都会重复以上流程。在恢复模式下,如果是刚从崩溃状态恢复的或者刚启动的server还会从磁盘快照中恢复数据和会话信息,zk会记录事务日志并定期进行快照,方便在恢复时进行状态恢复。

5.  Zookeeper选主流程(fast paxos模式)

fast paxos流程是在选举过程中,某Server首先向所有Server提议自己要成为leader,当其它Server收到提议以后,解决epoch zxid的冲突,并接受对方的提议,然后向对方发送接受提议完成的消息,重复这个流程,最后一定能选举出Leader

6.  Zookeeper的同步流程

选完Leader以后,zk就进入状态同步过程。 

1. Leader
等待server连接; 

2 .Follower
连接leader,将最大的zxid发送给leader 

3 .Leader
根据followerzxid确定同步点; 

4 .
完成同步后通知follower 已经成为uptodate状态; 

5 .Follower
收到uptodate消息后,又可以重新接受client的请求进行服务了。

7.  Zookeeper工作流程

 

   1.ClientFollwer发出一个写的请求

    2.Follwer把请求发送给Leader

    3.Leader接收到以后开始发起投票并通知Follwer进行投票

    4.Follwer把投票结果发送给Leader

   5.Leader将结果汇总后如果需要写入,则开始写入同时把写入操作通知给Leader,然后commit;

   6.Follwer把请求结果返回给Client

 

 

8.  Follower的主要功能

• 1. Leader发送请求(PING消息、REQUEST消息、ACK消息、REVALIDATE消息);
• 2 .
接收Leader消息并进行处理;
• 3 .
接收Client的请求,如果为写请求,发送给Leader进行投票;
• 4 .
返回Client结果。

9.zookeeper客户端的作用

 1 ZooKeeper服务端进行通信,包括:连接,发送消息,接受消息。

  2 发送心跳信息,保持与ZooKeeper服务端的有效连接与Session的有效性。

     3 错误处理,如果客户端当前连接的ZooKeeper服务端失效,自动切换到另一台有    效的ZooKeeper服务端。

  4 管理Watcher监听器,处理异常调用和Watcher

 

 

 

 

 

分享到:
评论

相关推荐

    雅马哈机械手视觉补偿系统的Socket通信与坐标转换实现详解

    内容概要:本文详细介绍了雅马哈机械手在锁螺丝过程中与视觉系统的协同工作流程,重点讲解了Socket通信的实现方法、坐标转换的具体步骤以及动态路径规划的技术细节。首先,文章展示了如何通过TCP/IP协议建立机械手与相机之间的稳定通信,确保数据传输的可靠性和实时性。接着,深入探讨了从像素坐标到机械臂笛卡尔坐标的转换过程,强调了标定矩阵的重要性和正确处理字节序的问题。此外,还讨论了托盘动态路径规划的实现,如螺旋式搜索算法的应用及其带来的效率提升。最后,文章分享了一些实际应用中的经验和教训,如处理粘包问题、网络延迟、异常处理机制等。 适合人群:从事工业自动化领域的工程师和技术人员,尤其是对机械手与视觉系统集成感兴趣的读者。 使用场景及目标:适用于需要深入了解机械手与视觉系统协作机制的场合,帮助工程师更好地理解和优化工业生产线上的自动化设备。目标是提高生产效率和产品质量,减少因技术问题导致的生产停滞。 其他说明:文中提供了多个代码示例,涵盖Python、C++和C#等多种编程语言,便于不同背景的读者参考和实践。同时,作者结合自身经验,给出了许多实用的调试技巧和注意事项,有助于读者规避常见错误并快速解决问题。

    LabVIEW与西门子S7-200 PLC基于PPI协议的通讯实现及调试技巧

    内容概要:本文详细介绍了如何利用LabVIEW与西门子S7-200 PLC通过PPI协议进行通讯的方法和技术要点。主要内容涵盖硬件准备、通讯参数配置、PPI协议命令格式、命令发送与接收、数据解析以及常见问题的调试方法。文中强调了硬件选择、波特率设置、命令帧结构、CRC校验、超时处理等方面的具体操作步骤,并提供了多个实用技巧,如地址扫描、批量读取优化、字节序处理等。 适合人群:从事工业自动化系统集成、LabVIEW编程、PLC通讯开发的技术人员。 使用场景及目标:适用于需要将LabVIEW与西门子S7-200 PLC进行通讯的工程项目,帮助技术人员快速掌握PPI协议的应用,提高通讯稳定性和效率。 其他说明:文章不仅提供了详细的理论指导,还分享了许多实践经验,有助于解决实际应用中的各类问题。

    计算机二级考试资源合集

    计算机二级考试资源合集:高效备考,轻松通关! 本合集涵盖计算机二级考试核心内容,包括软件/硬件知识、编程、数据库、网络技术等,提供理论资料与实战资源(如PHP示例、网页文件、配置数据等),助你系统复习、强化实操。适合考生快速提升技能,顺利通过考试!

    【嵌入式系统】基于STM32的宠物饮水机C++源代码:实现循环过滤与水质清洁功能

    内容概要:本文档提供了基于STM32的宠物饮水机的C++源代码,实现了循环过滤和保持水质清洁的功能。代码包括硬件初始化、水位检测、温度监测、紫外线杀菌以及OLED显示等功能模块。通过水位传感器检测水位并控制水泵启停,使用DS18B20温度传感器监测水温并在OLED屏幕上显示,每小时自动启动紫外线灯进行杀菌5分钟。此外,详细解释了水位传感器的工作原理及其在代码中的实现,重点介绍了浮球式传感器的结构和工作过程。 适合人群:对嵌入式系统开发有一定了解,特别是熟悉STM32平台和C++编程的工程师或爱好者。 使用场景及目标:①学习STM32平台下的硬件初始化和外设驱动编程;②掌握水位传感器、温度传感器及紫外线杀菌功能的设计与实现;③理解浮球式水位传感器的工作原理及其在实际项目中的应用。 阅读建议:此资源不仅提供了完整的源代码,还详细解释了每个功能模块的实现细节,适合在实际项目中参考和学习。建议读者结合STM32开发板进行实践操作,深入理解各个功能模块的工作机制,并根据具体需求进行功能扩展和优化。

    Gerber-语音模块

    语音模块的打印文件,直接使用。

    ### NA200H 可编程控制器硬件手册概述

    内容概要:本文档是傲拓科技股份有限公司发布的NA200H可编程控制器(PLC)硬件手册,旨在详细介绍NA200H系列PLC的硬件特性、安装、拆卸与接线原则。NA200H系列PLC是一款小型一体化PLC,具有集成以太网接口,适用于恶劣运行环境,具备良好的扩展性能和低廉的价格。手册涵盖了NA200H PLC的硬件组成(包括CPU模块和各种扩展模块)、工作方式、编程软件介绍、快速应用指南以及详细的安装、拆卸与接线原则。此外,手册还提供了CPU模块和各类I/O扩展模块的技术参数、端子定义与接线说明,并介绍了多种通讯模块的功能和特性。最后,附录部分列出了订货参数和扩展模块的功率消耗清单。 适合人群:具备一定电气知识的操作人员和技术人员,特别是从事自动化控制系统设计、安装和维护的工程师。 使用场景及目标:①帮助用户了解NA200H PLC的硬件结构和工作原理;②指导用户正确安装、配置和维护NA200H PLC;③协助用户选择合适的扩展模块以满足特定的应用需求;④提供详细的接线和通讯配置指导,确保系统稳定运行。 阅读建议:本手册内容详尽,建议读者在使用产品前仔细阅读并理解相关内容,尤其是安装、拆卸和接线部分,以确保系统的安全和稳定运行。同时,建议结合实际应用场景,灵活运用手册中的信息,进行合理的系统设计和配置。

    社交电商卡盟租号商城陪玩建站代刷电脑手机端官网源码

    电脑手机端全新UI界面优化更新 支持PC+wap端自动识别跳转 代码工整易于阅读,方便二次修改 全站幻灯片后台自定义更换 大部分可见数据后台可自行修改配置 栏目结构层次清晰,非常利于搜索引擎优化 服务器环境:PHP>=5.3,支持最新的PHP7 系统默认采用Sqlite数据库,放入PHP(5.3+)环境即可直接使用, 系统独家支持七牛云对接,无论你是否启用七牛云,请把轮播图,栏目大图,定制标签内的部分图片重新上传可直接保存图 片,重新上传一下,否则不会图片可能会不显示(因为那些图片在我们的七牛云内) 授权码生成:https://www.pbootcms.com/freesn/ 默认采用sqlite数据库,不需要做导入和配置操作 为了网站各个页面正常运行,请不要修改URL规则 统计代码、商桥代码、各种客服代码,均可放置在后台统计位置,全站生效。 浏览器标签logo在根目录favicon.ico,ico格式百度一下,可以生成 后台地址:您的域名/admin.php 账号:admin密码:123456789

    甲壳虫adb助手安全下载.apk

    甲壳虫adb助手安全下载.apk

    蓝桥杯省赛考点整合,模块总结

    内容概要:本文档《1_蓝桥杯省赛考点整合.pdf》详细介绍了蓝桥杯省赛中常见的硬件模块及其编程实现方法。主要包括Led模块、Key模块、Seg模块、ds1302、ds18b20、PCF8591、EEPROM、超声波模块、串口通信、NE555定时器以及蜂鸣器继电器的底层代码和具体应用实例。每个模块都涵盖了代码示例、功能解释及具体的省赛题目应用场景。例如Led模块展示了如何根据模式显示Led、Led闪烁和PWM亮度调整;Key模块讲解了模式切换、参数设置和按键长按短按等功能;Seg模块则侧重于正常数据显示和闪烁效果。

    Matlab图像拼接GUI:基于Harris角点、SIFT匹配、RANSAC优化的五模块实现

    内容概要:本文详细介绍了基于Matlab的图像拼接GUI系统的实现过程,涵盖了五个主要模块:系统管理、角点提取(Harris角点)、特征匹配(SIFT匹配)、匹配优化(RANSAC)和图像拼接(单映变换)。系统管理模块负责初始化环境和参数设置;角点提取模块使用Harris角点算法识别图像的关键点;特征匹配模块通过SIFT算法寻找匹配点对;匹配优化模块采用RANSAC算法去除误匹配点;最终图像拼接模块利用单映变换完成图像融合。文中还提供了大量代码示例和参数调优技巧,如高斯滤波的sigma值选择、SIFT匹配阈值设定、RANSAC迭代次数和像素容差调整等。 适合人群:对图像处理感兴趣的初学者和有一定编程基础的研究人员。 使用场景及目标:适用于学习和研究图像拼接技术,尤其是希望通过Matlab实现图像处理算法的人群。目标是掌握图像拼接的基本原理和技术实现,能够独立构建类似的图像处理系统。 其他说明:文中提供的代码仅供学习参考,实际应用中建议进一步优化和改进。同时,文中提及了一些实用技巧,如内存管理和性能优化,有助于提高系统的稳定性和效率。

    西门子S7-200 Smart PLC在30吨双级反渗透水处理系统的应用与优化

    内容概要:本文详细介绍了基于西门子S7-200 Smart PLC的30吨双级反渗透水处理系统的设计与实现。主要内容涵盖了一键制水、加药控制、触摸屏组态、程序结构优化等方面的技术细节。文中不仅展示了具体的PLC梯形图代码片段,还分享了许多现场调试的经验和技巧,如定时器防抖、中断优先处理、PID闭环控制的应用等。此外,文章还提到了一些实用的功能设计,如无人值守模式的安全机制、长按按钮触发高级设置等。 适合人群:从事水处理自动化系统设计、维护的工程师和技术人员,尤其是熟悉西门子PLC编程的从业者。 使用场景及目标:适用于需要稳定产水的工业应用场景,帮助工程师理解和掌握双级反渗透系统的控制逻辑,提高系统的可靠性和效率。同时,也为新手提供了宝贵的调试经验和注意事项。 其他说明:文章强调了程序结构的模块化设计,便于后期维护和参数调整。建议读者结合提供的工程文件进行仿真练习,以便更好地理解系统的工作原理。

    LabVIEW多路温度采集系统的Modbus通讯与高级特性应用

    内容概要:本文详细介绍了基于LabVIEW 2018版开发的多路温度采集系统,涵盖了系统架构设计、Modbus通讯实现、FGV(功能性全局变量)应用、队列管理和引用控制等多个高级知识点。系统采用了一主两从的串口连接方式,其中一个从机负责温度采集,另一个从机负责开关控制。文中提供了具体的代码示例,如串口配置、Modbus主站配置、数据读取、FGV创建与使用、队列操作等,展示了如何通过这些技术实现高效的数据传输和处理。 适用人群:适用于有一定LabVIEW基础的研发人员和技术爱好者,尤其是希望深入理解LabVIEW高级特性和Modbus通讯机制的人群。 使用场景及目标:①掌握LabVIEW中Modbus通讯的具体实现方法;②学会使用FGV实现跨VI的数据共享;③理解队列在多线程数据处理中的应用;④熟悉引用控制在动态界面更新中的作用。通过这些技术的应用,可以提高项目的开发效率和系统的稳定性。 其他说明:本文不仅提供了详细的代码示例,还分享了许多实践经验,如如何避免内存泄漏、如何处理异常情况等。此外,作者还强调了系统架构的设计思路,如分层设计、生产者-消费者模式等,这些都是实际项目开发中非常重要的考虑因素。

    RAG-N算法,滤波器加法器优化代码

    RAG-N算法,滤波器加法器优化代码

    软考软件设计师高频考点精析

    《软考软件设计师高频考点精析》精准提炼考试核心内容,涵盖编程语言、数据结构、操作系统、数据库、软件工程等必考领域。结合历年真题与实战技巧,助你快速掌握重点,高效备考。一册在手,轻松攻克软考难关!

    LabVIEW与CAN通讯上位机集成:基于周立功库文件的实现方法及应用

    内容概要:本文详细介绍了如何利用LabVIEW和周立功库文件构建一个能够进行基本CAN通讯的上位机系统。主要内容涵盖前期准备工作,包括安装LabVIEW软件和下载相关库文件;创建LabVIEW项目,调用库文件实现CAN设备初始化、数据发送与接收等功能的具体步骤;以及一些常见的注意事项和避坑指南。此外,还提供了进阶玩法,如封装成子VI、优化接收处理逻辑等。 适合人群:适用于初次接触LabVIEW和CAN通讯的技术爱好者,尤其是希望快速掌握CAN通讯上位机开发的初学者。 使用场景及目标:本教程旨在帮助用户建立一个简易的CAN通讯平台,以便于后续深入研究或实际项目开发。通过动手实践,读者将学会如何配置CAN设备、编写数据传输代码,并理解CAN通讯的基本原理。 其他说明:文中附带了详细的代码示例和实用技巧,有助于提高学习效率。同时强调了正确配置结构体成员顺序、管理设备句柄、匹配波特率等关键点,以确保系统的稳定性。

    永磁同步电机矢量控制C代码实现及其S-function仿真与实际应用

    内容概要:本文详细介绍了永磁同步电机(PMSM)矢量控制的C代码实现,涵盖从理论到实践的全过程。首先解释了矢量控制的基本原理,即通过坐标变换将三相电流解耦为励磁电流和转矩电流,以便独立控制电机的转矩和磁通。接着介绍了S-function模式仿真的优势,强调它可以灵活嵌入自定义代码并与其他Simulink模块协同工作。文中提供了关键的C代码示例,包括电机参数和状态变量的初始化、Clark变换和Park变换的具体实现、PI控制器的设计以及SVPWM生成算法。此外,还讨论了代码移植到实际工程项目中的注意事项,如硬件资源对接、参数调整和优化技巧。 适合人群:从事电机控制系统开发的技术人员,尤其是有一定C语言编程基础并对永磁同步电机矢量控制感兴趣的工程师。 使用场景及目标:适用于希望深入了解永磁同步电机矢量控制原理并在实际项目中应用相关技术的研发人员。主要目标是帮助读者掌握从仿真到实际应用的完整流程,提高电机控制系统的开发效率和稳定性。 其他说明:文中不仅提供了详细的代码示例,还分享了许多来自实际项目的宝贵经验和技术细节,如定点运算优化、锁相环(PLL)实现中的常见问题及解决方案、PI控制器的抗积分饱和处理等。这些内容对于理解和解决实际开发中的难题非常有帮助。

    流变学在材料科学中的应用:聚合物流变学仿真.zip

    流变学在材料科学中的应用:聚合物流变学仿真.zip

    LabVIEW与三菱FX PLC编程口协议通讯详解及应用

    内容概要:本文详细介绍了如何使用LabVIEW与三菱FX系列PLC进行编程口协议通讯。首先解释了协议的基本结构,包括起始符、结束符、ASCII字符指令以及校验码的计算方式。接着展示了具体的LabVIEW代码实现,涵盖了串口配置、命令帧构造、数据解析等关键步骤。文中还分享了许多实用技巧和常见错误的解决方案,如正确设置串口参数、处理特殊字符、优化读取速度等。此外,作者提供了完整的工程源码,并强调了在实际应用中需要注意的问题,如通信间隔控制和浮点数处理。 适合人群:从事工业自动化领域的工程师和技术人员,特别是熟悉LabVIEW和三菱PLC的用户。 使用场景及目标:适用于需要通过编程口与三菱FX系列PLC进行通讯的应用场景,如读取寄存器数据、监控设备状态等。目标是帮助读者掌握LabVIEW与三菱PLC通讯的具体实现方法,提高工作效率。 其他说明:文中提到的所有代码和技巧均经过实际验证,确保可行性和可靠性。建议读者在实践中结合自己的具体需求进行调整和优化。

    蓝桥杯Python之自动生成数据库表字典的markdown文本3.zip

    蓝桥杯python 蓝桥杯Python之自动生成数据库表字典的markdown文本3.zip

Global site tag (gtag.js) - Google Analytics