一、集群安装
1. Zookeeper概念简介:
Zookeeper是一个分布式协调服务;就是为用户的分布式应用程序提供协调服务
A、zookeeper是为别的分布式程序服务的
B、Zookeeper本身就是一个分布式程序(只要有半数以上节点存活,zk就能正常服务)
C、Zookeeper所提供的服务涵盖:主从协调、服务器节点动态上下线、统一配置管理、分布式共享锁、统一名称服务……
D、虽然说可以提供各种服务,但是zookeeper在底层其实只提供了两个功能:
管理(存储,读取)用户程序提交的数据;
并为用户程序提供数据节点监听服务;
Zookeeper常用应用场景:
服务器状态的动态感知
配置文件管理
分布式共享锁
Zookeeper集群的角色: Leader 和 follower (Observer)
只要集群中有半数以上节点存活,集群就能提供服务
2. zookeeper集群机制
半数机制:集群中半数以上机器存活,集群可用。
zookeeper适合装在奇数台机器上!!!
3. 安装
3.1 机器部署
安装到3台虚拟机(mini1 mini2 mini3)上
安装好JDK
3.2 上传
上传用SFTP命令Alt+p。
3.3 解压
mkdir /root/apps
tar -zxvf /root/apps/zookeeper-3.4.5.tar.gz(解压)
3.4 修改配置文件
1、拷贝改名或直接改名
cp zoo_sample.cfg zoo.cfg
2、vi zoo.cfg
3、添加内容:
修改数据目录:dataDir=/root/zkdata
配置节点:
server.1=mini1:2888:3888 (主机名, 心跳端口、数据端口)
server.2=mini2:2888:3888
server.3=mini3:2888:3888
4、在data文件夹下新建myid文件,并写入标志每一台机器在集群的节点名称
[root@mini1 ~]# mkdir zkdata
[root@mini1 ~]# echo 1 > zkdata/myid
[root@mini2 ~]# mkdir zkdata
[root@mini2 ~]# echo 2 > zkdata/myid
[root@mini3 ~]# mkdir zkdata
[root@mini3 ~]# echo 3 > zkdata/myid
5、将集群下发到其他机器上
scp -r /root/apps/zookeeper-3.4.5 mini2:/root/apps/
scp -r /root/apps/zookeeper-3.4.5 mini3:/root/apps/
3.1.9. 启动(每台机器)
./zkServer.sh start(后面提供了通过shell脚本批量启动集群中的所有节点)
3.1.10. 查看集群状态
1、 jps(查看进程)
2、 zkServer.sh status(查看集群状态,主从信息)
二、命令行客户端使用
列举几个简单的命令
1、启动命令行客户端:[root@mini1 bin]# ./zkCli.sh
2、输入“help”可查看可使用的命令
[zk: localhost:2181(CONNECTED) 1] help ZooKeeper -server host:port cmd args connect host:port get path [watch] ls path [watch] set path data [version] rmr path delquota [-n|-b] path quit printwatches on|off create [-s] [-e] path data acl stat path [watch] close ls2 path [watch] history listquota path setAcl path acl getAcl path sync path redo cmdno addauth scheme auth delete path [version] setquota -n|-b val path [zk: localhost:2181(CONNECTED) 2] |
3、查看根节点:
[zk: localhost:2181(CONNECTED) 0] ls /
[app1, zookeeper, eclipse]
4、在第三台机器连接到第二台机器:
[zk: localhost:2181(CONNECTED) 1] connect mini2:2181
5、创建节点
[zk: mini1:2181(CONNECTED) 5] create /app1 "app1 data parent"
Created /app1
6、修改节点内容
[zk: mini2:2181(CONNECTED) 5] set /app1 444 cZxid = 0x100000006 ctime = Wed Oct 31 04:21:50 CST 2018 mZxid = 0x100000010 mtime = Wed Oct 31 04:37:34 CST 2018 pZxid = 0x100000007 cversion = 1 dataVersion = 3 aclVersion = 0 ephemeralOwner = 0x0 dataLength = 3 numChildren = 1 |
三、Zookeeper的JavaAPI使用
public class SimpleZkClient {
private static final String conn = "mini1:2181,mini2:2181,mini3:2181";
private static final Integer sessionTimeOut = 2000;
ZooKeeper zkClient = null;
@Before
public void init() throws Exception {
zkClient = new ZooKeeper(conn, sessionTimeOut, new Watcher() {
@Override
public void process(WatchedEvent event) {
System.out.println(event.getType());
}
});
}
@Test
public void testCreate() throws Exception {
String newCli = zkClient.create("/eclipse", "hello".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
}
@Test
public void getChildren() throws Exception {
List<String> children = zkClient.getChildren("/", true);
for (String string : children){
System.out.println(string);
}
Thread.sleep(Long.MAX_VALUE);
}
}