java高并发之Zookeeper

Zookeeper

zookeeper是开源的分布式的协调服务框架,是apache Hadoop的子件,适用于绝大部分分布式集群的管理。
分布式的业务操作会引发如下几个关键问题:
死锁:至少有一个线程占用的资源,但是不占用cpu。
活锁:所有线程都没有把持资源,但是线程却是不断地调用占用CPU。
需要引入一个管理节点。
为了防止入口的单点问题,需要引入管理节点的集群。
需要在管理阶段中选举出一个主节点。
需要确定一套选举算法。
主节点和从节点之间要保证数据的一致。

Zookeeper的单机版安装

zookeeper可以安装在linux下,也可以安装在Windows中,但是官网声明了在Windows中zookeeper不保证稳定性。
1.关闭Linux的防火墙
临时关闭:service iptables stop
永久关闭:chkconfig iptables off
2.下载安装jdk,zookeeper一般要求jdk为1.6以上
3.下载zookeeper安装包tar
4.解压安装包:tar -zxvf zookeeper-x.x.x.tar.gz
5.进入zookeeper的安装目录的conf目录:cd zookeeper-x.x.x/conf
6.将zoo_sample.cfg复制为zoo.cfg:cp zoo_sample.cfg zoo.cfg
7.zookeeper在启动的时候会自动加载zoo.cfg,从里面读取配置信息,需要修改zoo.cfg,将其中的dataDir指定为你要存放的数据路径,要求此路径是存在的,没有需要创建目录。
8.进入zookeeper-x.x.x/bin目录,启动服务端: sh zkServer.sh start
9.启动客户端:sh zkCli.sh
注意:
zookeeper返回started不代表启动成功,可以通过jps或者是sh zkServer.sh status来查看是否启动成功。如果使用的是jps,查看是否有quorumPeerMain。如果使用的是status命令,查看是否有Mode:standalone.
当zookeeper启动之后,在bin目录下会出现zookeeper.out文件,记录zookeeper的启动过程的日志文件。

zookeeper的特点

1.本身是一个树状结构:Znode树。
2.每一个节点称之为znode节点。
3.根节点是/
4.zookeeper的所有操作都必须以根节点为基准进行计算
5.每一个znode节点都必须存储数据
6.任意一个持久节点都可以有子节点
7.任意一个系欸但那的路径都是唯一的
8.znode树是维系在内存中:目的是为了快速查询
9.zookeeper不适合存储海量数据:
维系在内存中,如果存储大量数据会耗费内存。
不是一个存储框架而是一个服务协调框架
10.zookeeper会为每一次事务(除了读取以为的所有操作都是事务)分配一个全局的事务id:Zxid

zookeeper的命令

1.create /node1 “hello zookeeper” 在根节点下创建子节点node1并赋值为hello zookeeper
2.set /node1 “hi” 将node1的数据更新为 hi
3.get /node1 获取node1的数据
4.ls / 查看根节点下的所有子节点
5.delete /node1 删除子节点node1,要求node1节点中没有子节点
6.rmr /node1 删除node1及其子节点
7.quit退出
8.create -e /node1 " 表示在根目录下创建临时节点node1
9.create -s /node1 " 表示在根目录下创建持久顺序节点 node100000000X
10.create -e -s node1 " 表示在根目录下创建临时顺序节点 node100000000X

zookeeper的节点类型

1.持久节点
2.临时节点:在客户端退出之后就自动删除
3.持久顺序节点
4.临时顺序节点

zookeeper的节点信息

1.cZxid 全局分配的创建的事务id
创建这个节点是zookeeper的第n个操作,定义好之后就不变了
2.ctime 创建时间
3.mZxid 修改的事务id
记录自己本身修改
4.mtime 修改时间
5.pZxid 表示子节点的变化的事务id
记录直接子节点的创建或者删除
6.cversion 记录子节点变化次数
7.dataVersion 数据版本
记录当前节点的数据的变化次数
8.aclVersion acl版本
记录当前节点的acl变化次数
9.ephemeralOwner
如果当前节点不是临时节点,那么这个属性的值为0;如果是临时节点,那么这个属性的值记录的是当前临时节点的session id。
10.dataLength 数据长度
实际上是字节个数
11.numChildren 子节点个数

zookeeper的api操作(java实现)

连接操作

	@Test
	public void  connect() throws IOException, InterruptedException{
   
		CountDownLatch cdl = new CountDownLatch(1);
		// connectString - 连接地址+端口号
		// sessionTimeout - 会话超时时间 - 表示连接超时时间,单位默认为毫秒
		// watcher - 监控者 - 监控连接状态
		// Zookeeper本身是一个非阻塞式连接
		ZooKeeper zk = new ZooKeeper("127.0.0.1:2181", 5000, new Watcher() {
   
			
			// 监控连接状态
			public void process(WatchedEvent event) {
   
				
				if(event.getState() == KeeperState.SyncConnected){
   
					System.out.println("连接成功~~~");
				}<
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值