一、解压 tar -zxvf zookeeper-3.4.5.tar.gz ; 打包 tar -czvf *.tar.gz dirnamejava
二、修改conf中zoo_sample.cfg名字为zoo.cfgnode
三、启动zookeeper服务端zkServer.shgit
1)服务端经常使用命令github
2) ./zkServer.sh start出现错误:算法
oms@10-10-248-10:/data/zookeeper-3.3.6/bin$ ./zkServer.sh start
JMX enabled by default
Using config: /data/zookeeper-3.3.6/bin/../conf/zoo.cfg
Starting zookeeper ... ./zkServer.sh: 103: ./zkServer.sh: cannot create /tmp/zookeeper/zookeeper_server.pid: Directory nonexistent
FAILED TO WRITE PID数据库
解决方法:以上的启动过程发生了一个错误,说是没法建立/tmp/zookeeper/zookeeper_server.pid,zookeeper启动后,该文件中保存进程id,咱们能够手动建立该目录。apache
在zookeeper目录下输入命令 mkdir -p tmp/zookeeper api
若是要建立目录A并建立目录A的子目录B,没有用-p的状况下是mkdir 2次 若是用-p 能够直接建立2个目录 mkdir -p 目录A/子目录B就能够
四、启动zookeeper服务端zkServer.sh服务器
1)客户端经常使用命令网络
2)建立节点操做而后删除
ls /查看当前zk中的内容
create /workers "" 空字符串不但愿在这个节点保存数据
delete /workders
ls /
quit
五、会话的状态及状态的转换
六、zookeeper单机集群配置
解压Zookeeper的安装包到/opt目录下,这里用三个目录来表明三个Zookeeper实例,分别是/opt/zookeeper1,/opt/zookeeper2和/opt/zookeeper3.
1). 首先编辑每一个Zookeeper目录下的conf/zoo.cfg文件。三个配置配置文件的内容分别以下
其中有几点须要注意
* dataDir: 三个Zookeeper实例的dataDir目录要区别开,这里分别指定到各个Zookeeper实例目录下的data目录。
* clientPort: 定义Zookeeper客户端链接Zookeeper服务端时使用的端口,这里由于是在一台机器上作的集群,因此三个实例的端口要区分开。服务的监听端口。
* server.: 定义Zookeeper集群的各个实例的的ip和端口,这里由于是在一台机器上作的集群,因此IP都定义的是127.0.0.1,可是后面的端口要区分开。
initLimit:多少个心跳时间内,容许其余server链接并初始化数据,若是ZooKeeper管理的数据较大,则应相应增大这个值
dataDir:用于存放内存数据库快照的文件夹,同时用于集群的myid文件也存在这个文件夹里(注意:一个配置文件只能包含一个dataDir字样,即便它被注释掉了。)
dataLogDir:用于单独设置transaction log的目录,transaction log分离能够避免和普通log还有快照的竞争
syncLimit:多少个tickTime内,容许follower同步,若是follower落后太多,则会被丢弃。
2).建立data目录和实例id文件
这里要注意须要在每一个Zookeeper的dataDir目录下建立myid文件,内容是记录各个Zookeeper的实例ID。
3) 启动Zookeeper服务
分别进入各个Zookeeper的bin目录,而后运行“./zkServer.sh start”来启动一个Zookeeper服务。
4) 客户端链接
随便进入一个Zookeeper的bin目录,而后运行下面的命令来分别链接Zookeeper服务。
在其中的一个client上建立一个znode节点
而后在别的client上查看新建立zonde节点
5)查看Zookeeper状态
启动Zookeeper以后,因为Zookeeper本身会有一套leader的选举算法,因此此时若是想知道那个Zookeeper是leader能够在各个Zookeeper的bin目录运行“./zkServer.sh status”命令来查看。
若是是Leader
若是不是Leader
此时能够把leader的那个节点停了,而后再看查看其它两个Zookeeper实例,此时剩下的两个Zookeeper实例就会再选举出一个leader。
6)主从模式例子实现
1)create -e /master "master1.example.com.2223" -e标识临时节点
2)stat命令能够获得一个zode节点的属性,并容许咱们在已经存在的zode节点上设置监视点,经过在路径后面设置参数true来添加监视点;state /master true
当节点崩溃时显示:WatchedEvent state:SyncConnected type:NodeDeleted path /master
3)从节点,任务,分配
主节点会监视/works,/task节点的数据变化 :ls /works true; ls /task true经过true参数,能够设置对应zode的子节点变化的监视点
从节点要通知主节点,告知从节点能够执行任务,能够在从节点经过建立/works的子节点进行通知
从节点建立一个 /assign/work1.example.com来接受任务分配,并经过参数true的ls命令来监视这个节点的变化
4)客户端:向系统提交任务
create -s /task/task - "cmd"
Create /tasks/task-00000000000
因为主节点监听了/task,会检查这个新的任务,获取可用的从节点,将任务分配给从节点
create /assign/worker1.example.com/task-0000000000
从节点会收到通知,确认该任务是不是分配给本身的,一旦从节点完成任务的执行,它就会在/tasks中添加一个状态zode
create /tasks/task-00000000/status "done"
客户端接到一个通知 get /tasks/task-0000000000 status
./zkCli.sh -timeout(心跳时间毫秒) 0 -r(只读) -server ip(服务ip):port(端口)
如: ./zkCli.sh -timeout 5000 -server 127.0.0.1:2181
1)create /mykey dsfsdf
2)get /mykey
zookeeper对节点数据的修改都认为是一次事务,每次事务都需分配个事务id,
cZxid:该节点建立时的事务id
ctime:该节点建立的时间
mZxid:该节点最后一次更新的事务id
mtime:该节点修改时间
pZxid:该节点的子节点列表修改的事务id(添加子节点,删除子节点,不包括修改子节点的内容)
cversion:子节点的版本号
dataVersion:数据版本号
aclVersion:权限版本号
ephemeralOwner :建立该临时节点的事务id,若是为持久节点,则默认为0x0
dataLength:节点存放数据的长度
numChildren:子节点的个数
3)ls2 /mykey
4)stat /mykey 查看节点的状态信息
5)create [-s](顺序节点) [-e] (临时节点)path data acl
顺序节点如截图,能够用于分布式的主键生成器
6)quit退出客户端
7)set path value 修改节点的数值,版本号dataversion增长
8)delete删除指定节点(只能删除没有字节点的节点) rmr命令递归删除
9 )setquota -n|-b val path 设置节点的配额(子节点的数量或者数据的长度)
超出配额只会在日志里有警告信息,不会抛出异常
10)列出节点的配额 listquota path
-1表示没有限制
11)删除节点的配额 delquota [-n|-b] path
12)history 显示对应的编号和命令
redo cmdno 从新执行命令编码
13)acl权限控制
ACL aclIp = new ACL(Perms.READ,new Id("ip","192.168.1.105")); ACL aclDigest = new ACL(Perms.READ|Perms.WRITE,new Id("digest",DigestAuthenticationProvider.generateDigest("jike:123456"))); ArrayList<ACL> acls = new ArrayList<ACL>(); acls.add(aclDigest); acls.add(aclIp); //zookeeper.addAuthInfo("digest", "jike:123456".getBytes()); String path = zookeeper.create("/node_4", "123".getBytes(), acls, CreateMode.PERSISTENT); System.out.println("return path:"+path);
若是不是192.168.1.105链接服务,获取节点信息失败,由于没有权限
因此要注册权限信息 addauth digest jeke:123456
建立一个有权限的节点
(源码下载: https://github.com/apache/zookeeper)
(idea导入zookeeper:http://www.tuicool.com/articles/vE7bIf)
应用命名服务
顾名思义,就是提供名称的服务,例如数据库表格ID,通常用得比较多的有两种ID,一种是自动增加的ID,一种是UUID(9291d71a-0354-4d8e-acd8-64f7393c64ae),两种ID各自都有缺陷,自动增加的ID局限在单库单表中使用,不能在分布式中使用,UUID能够在分布式中使用可是因为ID没有规律难于理解,咱们能够借用ZK来生成一个顺序增加的,能够在集群环境下使用的,命名易于理解的ID
一、zookeeper的api围绕zookeeper句柄而构建,这个句柄表明与zookeeper之间的一个会话。若是与一个服务器的会话断开,这个会话就会迁移到另外一台zookeeper服务器上。
二、建立句柄的构造函数
Zookeeper( String connectString, int sessionTimeout, Watcher watcher)
connectString:主机名字和端口
sessionTimeout:通常设置超时时间为5到10秒,即:5000到10000
Watcher:客户端使用Watcher接口来监控与zookeeper之间的会话的健康情况
三、程序结束后,默认是到了超时时间,服务器才会结束会话。须要调用Zookeeper.close()方法会销毁Zookeeper对象实例所表示的会话。这是使会话当即消失的方式
注意:请不要试着本身去管理客户端的链接,客户端会监控与服务之间的链接,不只会告诉咱们链接发生的问题,还会主动尝试从新创建链接。
四、获取管理权(因为没太读懂,略):在群兽选举的算法中,全部潜在的主节点进程尝试建立/master节点,但只有一个成功,这个成功的进程成为主节点
咱们将会在程序中添加
String serverId=Integer.toHexString(random.nexInt());
void runForMaster(){
zk.create("/master",serverId.getBytes(),OPEN_ACL_UNSAFE,CreateMode.EPHEMERAL);
}
建立会产生两种异常,KeeperException(ConnectionLossException)和InterruptedException,当处理ConnectionLossException异常时,咱们须要找出那个进程建立的/master节点,若是进程是本身的,就开始成为群首角色。咱们经过getData方法来处理
byte[] getData(String path,bool watch,Stat stat)
五、异步获取管理权
create方法的异步调用,调用返回前不会等待create命令完成,因此无需关心异常
void create(String path,List<ACL> acl,CreateMode createMode,AsyncCallback.StringCallback cb,Object ctx)
比同步的方法多了2个参数:提供回调方法的对象,用户指定上下文信息
回调函数实现只有一个方法的StirngCallback接口:
void processResult(int rc,String path,Object ctx,String name)
rc:返回调用的结构,返回ok或者异常对应的编码
path:路径
ctx:上下文
name:节点名称
六、注册从节点
master节点对应的服务器宕机,或者zk与服务器之间的网络不稳定,都会致使主节点被删除,从而发生master选举,优化的策略是判断最近一次的master是本身吗,优先让最近一次的master争选为master,防止资源的迁移致使系统的开销
第六章、运行zookeeper
一、基本配置参数
clientPort:客户端所链接的服务器所监听的TCP端口
tickTime:心跳时间,单位为毫秒
leaderServer:配置yes或者no,指示群首服务器是否为客户端提供服务
二、日志
1)事务日志
事务日志指zookeeper系统在正常运行过程当中,针对全部的更新操做,在返回客户端“更新成功”的响应前,zookeeper会保证已经将本次更新操做的事务日志已经写到磁盘上,只有这样,整个更新操做才会生效。在datalog/目录下存在一个文件夹version-2,该文件夹中保存着事物日志文件,日志文件的命名规则为log.**,文件大小为64MB,**表示写入该日志的第一个事务的ID,十六进制表示。
2)快照日志
zookeeper的数据在内存中是以树形结构进行存储的,而快照就是每隔一段时间就会把整个DataTree的数据序列化后存储在磁盘中,这就是zookeeper的快照文件。zookeeper快照日志的存储路径一样能够在zoo.cfg中查看,如上文截图所示。访问dataDir路径能够看到version-2文件夹,zookeeper快照文件的命名规则为snapshot.**,其中**表示zookeeper触发快照的那个瞬间,提交的最后一个事务的ID。
3)log4j日志
zk采用slf4j库(java简易日志门面)做为日志的抽象层,默认使用log4j进行实际的日志记录功能,conf目录下的log4j.properties,bin目录下的zookeeper.out输出
三、