zookeeper源码
❶ 如何在windows环境下编译生成php的zookeeper扩展dll
1、创建编译目录“C:\php_sdk”
2、解压php-sdk-binary-tools-20110915.zip里面的文件到php_sdk目录下
3、在开始菜单找到并打开Windows SDK CMD Shell (注意一定是SDK的shell , 不是DOS操作的cmd窗口),然后执行
[plain] view plain
setenv /x86 /xp /release //这一句一定要执行成功,要不怎么都不会编译成功
cd php_sdk
bin\phpsdk_setvars.bat
bin\phpsdk_buildtree.bat phpdev
执行后,目录下会生成phpdev文件夹
4、进入C:\php_sdk\phpdev\vc9\x86\,把deps-5.3-vc9-x86.7z解压到该目录下,覆盖deps文件夹。(php sdk)
5、把php源代码也解压到x86目录下。
6、把runkit压缩包内容解压到php解压后源码下的ext目录下,并把文件夹名runkit-master改为runkit
7、在x86目录下创建obj文件夹,用于保存编译时生成的文件
8、执行以下命令,用于创建php编译配置
[plain] view plain
cd phpdev\vc9\x86\php5.3-201308211030
buildconf
configure --help >..\configure_help.txt
configure --disable-all --enable-cli --enable-runkit=shared --enable-object-out-dir=..\obj
注:配置中的--enable-runkit=shared意思是 memcache 以 dll 形式生成,否则就和php集成在一起了。
❷ 什么是Zookeeper
ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,是Hadoop和Hbase的重要组件。它是一个为分布式应用提供一致性服务的软件,提供的功能包括:配置维护、域名服务、分布式同步、组服务等。
ZooKeeper的目标就是封装好复杂易出错的关键服务,将简单易用的接口和性能高效、功能稳定的系统提供给用户。
ZooKeeper包含一个简单的原语集,[1] 提供Java和C的接口。
ZooKeeper代码版本中,提供了分布式独享锁、选举、队列的接口,代码在zookeeper-3.4.3\src\recipes。其中分布锁和队列有Java和C两个版本,选举只有Java版本。(概述图片来源:[2] )
外文名
ZooKeeper
类 别
分布式系统的可靠协调系统
所 属
Hadoop的正式子项目
特 点
高效,可靠
❸ 如何使用Maven构建《hadoop权威指南3》随书的源码包
《hadoop:the definitive guide 3th》中的例子默认提供了一种编译和构建jar包方法——maven,如果没有maven你会发现编译测试随书的源码会非常的麻烦(至少在命令行下),当然你也可以使用eclipse导入随书的源码再自己一个个的添加依赖性jar包(恐怕也不太容易)。不过还好有非常好的开源的软件项目管理工具来帮助我们做这些无关于程序本身设计与架构的琐碎的工作,那就是maven!
如果你对maven还不太了解,可以参看这里。
《hadoop:the definitive guide 3th》的源码包可以从github中下载到,如下图所示:
下面我们就可以切换到本书的源文件包的根目录下使用maven来构建本书的jar包了:
% mvn package -DskipTests -Dhadoop.version=1.0.4
执行过这条命令后就是很长时间的等待,maven会到他的中央仓库和apache的仓库中下载所需要的jar包和pom.xml文件(这个过程可能要持续大约一个小时,要确保你的电脑已经连上网络,下载完成后在~/.m2/repository文件夹中——也即本地仓库——可以看到已经下载下来的jar包和pom文件),然后再逐个构建根目录下pom.xml中配置的moles,等所有的工作做完就可以看到已经打包的各个jar包,从而可以很方便的在命令行使用hadoop命令测试书中的代码了。
❹ zk源码阅读37:ZooKeeperServer源码分析
前面针对server启动到选举leader进行了一个小结,现在进入leader和follower的启动交互过程,需要先讲ZooKeeperServer,
在之前源码阅读的25节里面带过了一部分,这里详细讲解ZooKeeperServer的源码
继承关系如下
本节主要讲解内容如下
在源码阅读第24节讲解了,这里不赘述
是SessionTracker的内部接口
如下图
除去log,jmx相关部分,源码如下
ChangeRecord是ZooKeeperServer的内部类,衫亩下面会介绍
ServerStats,ZooKeeperServerListener都在25节的源码介绍过
这个类或升森并没有调用,不用管
定义异常
这个数据结构为了促进PrepRequestProcessor以及FinalRequestProcessor的信息共享,讲到调用链的时候再讲。
其中,StatPersisted在源码阅读7中讲DataNode的时候讲过了
描述当前server所处的状态
这里列举处两个底层调用的构造函数
启动涉及到db的数据加载,这里也有集群和单机两种,调用顺序为
主要是集群的时候,server选完了leader,由leader才能调用数据加载loadData
下面按照单机版startdata函数展开
初始化zkDb完成数据加载
恢复session和数据,单机版启动或者集群版leader选举之后调用lead方法时,会调用该方法。
主要完成设置zxid以及把无效的session给kill掉的工作
这里注意,为什么需要干这件事情,在下面思考中会说
里面调用了setZxid(不展开)以及killSession函数
清除db中临时会话记录,会话跟踪器也清除记录
入口是ZooKeeperServer#startup,zkServer都是在上述加载了db的数据之后,调用startup来完成启动
启动的入口函数
调用了createSessionTracker等函数,介绍如下
createSessionTracker 完成会话跟踪器的创建
这里是默认的单机版实现,在集群版不同的角色有不同的实现,主要是参数sid不会传1,而是配置中的sid
startSessionTracker 启动会话跟踪器
设置笑薯服务器运行状态,对于ERROR和SHUTDOWN的state,进行对应的操作
在 源码阅读25:服务器异常报警,关闭机制 讲过,这里不赘述
安装请求处理链路,是PrepRequestProcessor -> SyncRequestProcessor -> FinalRequestProcessor顺序
具体在后面请求处理链路再讲
两个函数getServerId和expire
processConnectRequest用于处理client的连接请求,不展开
值得注意的地方是重连的调用
展开如下
重连的核心函数
验证sessionId和传递来的密码的正确性
根据sessionId生成密码
在会话跟踪器SessionTracker中判断会话是否还有小
完成会话初始化,根据参数valid代表认证通过与否,用来判断server是接收连接请求,还是发出closeConn的请求,不展开,重要部分如下
除去的get,set,jmx,shutdown相关函数,剩下重要函数如下
部分函数列举如下
获取下一个server的zxid,调用方需要确保控制并发顺序
上面ZooKeeperServer#expire调用了close函数,介绍如下
该函数用于提交一个 关闭某个sessionId 的请求
这里有两个函数
之前在源码21节 会话管理中讲解了会话清除,在sessionTracker的记录是马上清除的,而DateTree中临时会话的清除是通过调用链一步步来的,也就是说两个步骤不是同步的,所以如果中间服务器状态改变了,会出现不一致的情况
requestsInProcess代表正在处理的请求个数
就是说发出请求时,requestsInProcess+1,最后完成请求时,requestsInProcess-1.涉及到请求处理链。
ZooKeeperServer#checkPasswd调用
ZooKeeperServer#generatePasswd
就是sessionId要和sessionId^superSecret生成的第一个随机数相匹配即可
密码不是client端设置的,是根据sessionId生成的
ZooKeeperServer#processConnectRequest 里面调用reopenSession中
在上面已经讲了,核心就是
这里还没有深入看,先存疑
比如思考中提到的loadData为什么会出现数据不一致,属于某种异常情况的处理
为什么不放到另外一个类里面去