标签:
1、ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,是Hadoop和Hbase的重要组件。它是一个为分布式应用提供一致性服务的软件,提供的功能包括:配置维护、域名服务、分布式同步、组服务等。
2、ZooKeeper的目标就是封装好复杂易出错的关键服务,将简单易用的接口和性能高效、功能稳定的系统提供给用户。
3、ZooKeeper包含一个简单的原语集,提供Java和C的接口。
4、ZooKeeper代码版本中,提供了分布式独享锁、选举、队列的接口,代码在zookeeper-3.4.3\src\recipes。其中分布锁和队列有Java和C两个版本,选举只有Java版本。
1、选举Leader。
2、同步数据。
3、选举Leader过程中算法有很多,但要达到的选举标准是一致的。
4、Leader要具有最高的zxid。
5、集群中大多数的机器得到响应并follow选出的Leader。
官网:https://zookeeper.apache.org/
大家可以去官网下载自己需要的版本,例如我需要安装的是3.4.6版本:
Zookeeper的运行需要Java环境,所以需要首先安装JDK,JDK的安装可以参考:
http://blog.csdn.net/u011204847/article/details/51002072
把下载的压缩包拷贝到想要安装的目录,然后解压:
[root@master01 software]# tar -xzf zookeeper-3.4.6.tar.gz
解压之后文件目录:
加入环境变量:
vi /etc/profile
export ZOOKEEPER_HOME=/usr/local/software/zookeeper-3.4.6 export PATH=.:$PATH:$ZOOKEEPER_HOME/bin
使环境变量生效:
source /etc/profile
在zookeeper目录下创建目录data:
[root@master01 software]# cd zookeeper-3.4.6 [root@master01 zookeeper-3.4.6]# mkdir data
然后到zookeeper / conf 目录下,修改zoo_sample.cfg名称为zoo.cfg
然后修改配置文件zoo.cfg:
vi zoo.cfg //单机只需要修改dataDir为之前创建的data目录即可
配置好后就可以启动了:
切换到Zookeeper的bin目录下,然后
./zkServer.sh start //开启Zookeeper
其他命令:
./zkServer.sh stop //关闭Zookeeper ./zkServer.sh status //查看Zookeeper状态 ./zkCli.sh //打开Zookeeper客户端
这里我使用三台主机进行Zookeeper的分布式配置。
1、首先,我们在之前配置的单机基础上继续修改配置文件:
2、在之前的配置文件末尾添加如下内容:
server.0=master01:2888:3888 //master01为你的主机名,前面的0代表的是给这台主机配的ID server.1=slave01:2888:3888 //同理slave01也是主机名,可以使用IP server.2=slave02:2888:3888
3、然后在我们之前建立的data文件中使用命令:
echo 0 myid //在data目录建立myid文件,并写入0(与上面的配置中server.0中的0对应)
4、将这台主机配置好的Zookeeper整个目录都拷贝到另外两台主机的相同路径下,并在那两台上修改myid为1和2。
5、修改另外两台主机/etc/profile文件,使得它们的Zookeeper环境配置和第一台主机一样
6、在每台主机上面开启Zookeeper后,查看状态
开启三台主机中Zookeeper后,查看状态会发现有一个leader以及两个follower,此时我们的Zookeeper分布式环境以及搭建好了
注意:
1、上面我可以使用类似 ssh slave01命令直接登录到slave01和slave02主机是因为我在三台主机之间做了免密码登录。
2、在配置文件和命令中可以直接使用主机名是因为我做了IP和主机名的映射。
3、我们可以在登录到另一台主机后,直接使用zkServer.sh脚本是因为我们之前配置了Zookeeper环境并使之生效。
在安装好Zookeeper分布式环境后,一般情况下需要登录到每台主机上面去启动Zookeeper,比较繁琐,所以我们可以写一个shell脚本来启动和关闭这个Zookeeper集群。
在写脚本之前我们需要先解决一个问题,如果我们直接使用脚本操作去启动另外的主机上面Zookeeper,会发现启动不成功。这涉及到登录shell和非登录shell的问题。关于Shell脚本和登录/非登录shell可以参考:http://blog.csdn.net/u011204847/article/details/51184883
这里我直接写解决方法:
方法一:
修改Zookeeper / bin 目录下的zkEnv.sh,在图示位置或者文件开头添加你的JDK路径。
方法二:把profile的配置信息echo到.bashrc中 echo ‘source /etc/profile‘ >> ~/.bashrc
方法三:脚本代码中添加”source /etc/profile;”,例如:ssh $i "source /etc/profile;/usr/local/software/zookeeper-3.4.6/bin/zkServer.sh start"
Shell启动脚本示例:
#!/bin/bash for i in master01 slave01 slave02 do ssh $i "/usr/local/software/zookeeper-3.4.6/bin/zkServer.sh start" done
脚本执行示例:
Shell停止脚本示例:
#!/bin/bash for i in master01 slave01 slave02 do ssh $i "/usr/local/software/zookeeper-3.4.6/bin/zkServer.sh stop" done
脚本执行示例:
Pom依赖:
<dependency> <groupId>org.apache.curator</groupId> <artifactId>curator-framework</artifactId> <version>2.8.0</version> </dependency>
代码示例:
@Test //测试类:测试Zookeeper连接 public void test13() throws Exception{ //指定zookeeper集群的地址 String connectString = "192.168.33.130:2181,192.168.33.131:2181,192.168.33.132:2181"; //1000 :代表是重试时间间隔 3:表示是重试次数 ExponentialBackoffRetry retryPolicy = new ExponentialBackoffRetry(1000, 3); //使用curator创建一个zk链接 CuratorFramework client = CuratorFrameworkFactory.newClient(connectString, retryPolicy); //启动连接 client.start(); InetAddress localHost = InetAddress.getLocalHost(); String ip = localHost.getHostAddress(); client.create() .creatingParentsIfNeeded() //如果父节点不存在,这创建 .withMode(CreateMode.EPHEMERAL) //创建节点类型为临时节点 .withACL(Ids.OPEN_ACL_UNSAFE) .forPath("/Spider/"+ip); }
打印结果:
注意:
由于建立的是临时节点,所以默认40秒后,这个值会消失。临时节点的这个特性可以用于监控一些程序的运行状态。
标签:
原文地址:http://blog.csdn.net/u011204847/article/details/51327371