本文版权归博客园和作者吴双本人共同所有 转载和爬虫请注明原文地址
www.cnblogs.com/tdws

一.写在前面

ZK是一个高效的分布式协调服务,高可用的分布式管理协调框架。
朋友推荐一本书《从paxos到zookeeper》,对我帮助的确很大。 

二.集群配置和踩坑

java安装和环境变量配置可以参考  

1 wget https://mirrors.tuna.tsinghua.edu.cn/apache/zookeeper/zookeeper-3.4.10/zookeeper-3.4.10.tar.gz   下载
2  
3 tar -zxvf zookeeper-3.4.10.tar.gz   解压
4  
5 mv zookeeper-3.4.10 /usr/local  剪切
6  
7 mv zookeeper-3.4.10/ zookeeper 重命名

下面修改配置文件命名

1 cd /usr/local/zookeeper/conf
2 mv zoo_sample.cfg zoo.cfg

配置一共没几行 。指定配置中的 
dataDir

dataDir=/usr/local/zookeeper/data

自行mkdir创建data文件夹。

在配置文件末尾 配置集群
我是单台机器伪集群 三个节点

1 server.1=your_ip:20881:30881
2 server.2=your_ip:20882:30882
3 server.3=your_ip:20883:30883

在data文件夹中创建文件myid
来做一个标识

乐百家官方网站,nano myid 在文件中填写0
并且保存。需要注意的是刚才我们的zookeeper文件夹是不使用的,仅作为我们copy新节点的原本。

接下来复制三份zk

1 cp -r zookeeper/ zookeeper1
2 cp -r zookeeper/ zookeeper2
3 cp -r zookeeper/ zookeeper3

 

乐百家官方网站 1

分别修改三台节点 其datadir
将路径指定到自己节点之下

分别修改其端口号和myid,是各个zoo.conf
配置的其中port 设置分别为2181 2182 2183

各个myid内容分别为1 2 3

下面 去三个zk bin目录下 执行zkServer.sh
start

乐百家官方网站 2

 

第一次 出错

Error contacting service. It is probably
not running.

哎 检查好几个小时ZK配置文件
试了十几种方法,
结果之前JAVA_HOME不小心配置错了,我是yum安装的jdk。

 

第二次 出错与解决

后来又出一次错误 是我stop zk所有节点之后
再次启动起不来 首先 jps命令 然后看到进程id和QuorumPeerMain

把Quorumpeermain的进程kill -9杀死

 

第三次
我丢雷楼某! 这个真是困扰了

如果使用阿里云ECS
专有网络+弹性公网IP

一般不能直接在ECS实例的程序例绑定和使用弹性公网IP地址。因为这个公网IP地址在ECS之外。所以我开了所有的端口,根本没有用,最后使用0.0.0.0解决问题。

1 server.1=0.0.0.0:20881:30881
2 server.2=0.0.0.0:20882:30882
3 server.3=0.0.0.0:20883:30883

乐百家官方网站 3

乐百家官方网站 4

三.应用和小结

学习ZK一段时间,原生API比较难以使用,一般使用zkClient(dubbo依赖于此)和curator框架来操作ZK比较容易。 其典型应用场景包括以下几点:

1.数据发布与订阅

   
ZK在dubbo中作为注册中心的角色,服务方和调用方都在这里注册。举例来说明,我发布了一个dubbo
service,消费者webapp引用这个服务

 <dubbo:service interface="com.s2s.service.ItemService" ref="itemServiceImpl"/>   发布的服务

 <dubbo:reference interface="com.s2s.service.ItemService" id="itemService"/>     引用服务(将使用RPC调用)

  接下来去服务器上查看数据节点,

乐百家官方网站 5

可以看到根目录上有dubbo节点,dubbo下有com.s2s.service.ItemService,
其节点下又有consumers和providers等。

乐百家官方网站 6乐百家官方网站 7

服务提供者启动时向/dubbo/com.s2s.service.ItemService/providers目录下写入URL

服务消费者启动时订阅/dubbo/com.s2s.service.ItemService/providers目录下的URL。
并且向/dubbo/com.s2s.service.ItemService/consumers目录下写入自己的URL 

监控中心启动时订阅/dubbo/com.s2s.service.ItemService/目录下的所有提供者和消费者URL。

所以dubbo监控中心,查看到消费者和服务提供者

乐百家官方网站 8

乐百家官方网站 9

2.负载均衡

3.命名服务

4.分布式通知和协调

5.集群管理与Master选举

6.分布式锁

    有很多人用它做分布式锁
但是做法比较底层。临时节点是在一次会话内有效,保证了出现异常时,锁能得以释放。比如client1
做分布式操作 那他创建一个临时节点 然后去做一些其他数据操作 做完操作后,
再去把临时节点移除。这时c2才能去操作。如果有10个客户端
要操作同一个数据,但是这个数据,有多个复制的版本
在不同的DB当中(当然值是一致)。

这个时候 分布式锁的作用就是同步操作。客户端1 操作 这条数据,
那就去zk立即 就create个节点 代表占用了这条数据,这时候客户端2
并发操作这条数据 先去zk上get一下这个节点,get到的话
可以等待一下,等客户端1 释放掉后,去再次create一下占领数据。

7.分布式队列

本文主要是安装配置,分布式理论的学习还是比较好,接下来将会继续分享实践中的收获。