本文版权归博客园和作者吴双本人共同所有 转载和爬虫请注明原文地址 www.cnblogs.com/tdws
一.写在前面
ZK是一个高效的分布式协调服务,高可用的分布式管理协调框架。 朋友推荐一本书《从paxos到zookeeper》,对我帮助的确很大。
二.集群配置和踩坑
java安装和环境变量配置可以参考 http://www.cnblogs.com/tdws/p/4096300.html
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
分别修改三台节点 其datadir 将路径指定到自己节点之下
分别修改其端口号和myid,是各个zoo.conf 配置的其中port 设置分别为2181 2182 2183
各个myid内容分别为1 2 3
下面 去三个zk bin目录下 执行zkServer.sh start
第一次 出错
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
三.应用和小结
学习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调用)
接下来去服务器上查看数据节点,
可以看到根目录上有dubbo节点,dubbo下有com.s2s.service.ItemService, 其节点下又有consumers和providers等。
服务提供者启动时向/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监控中心,查看到消费者和服务提供者
2.负载均衡
3.命名服务
4.分布式通知和协调
5.集群管理与Master选举
比如SolrCloud管理。管理集群配置,监控集群状态,选举分片leader
6.分布式锁
有很多人用它做分布式锁 但是做法比较底层。临时节点是在一次会话内有效,保证了出现异常时,锁能得以释放。比如client1 做分布式操作 那他创建一个临时节点 然后去做一些其他数据操作 做完操作后, 再去把临时节点移除。这时c2才能去操作。如果有10个客户端 要操作同一个数据,但是这个数据,有多个复制的版本 在不同的DB当中(当然值是一致)。
这个时候 分布式锁的作用就是同步操作。客户端1 操作 这条数据, 那就去zk立即 就create个节点 代表占用了这条数据,这时候客户端2 并发操作这条数据 先去zk上get一下这个节点,get到的话 可以等待一下,等客户端1 释放掉后,去再次create一下占领数据。
7.分布式队列
本文主要是安装配置,分布式理论的学习还是比较好,接下来将会继续分享实践中的收获。