说一下zookeeper
zookeeper是分布式协调服务
其中配置有
zoo.cfg
datadir=
cd /etc/profile ----->
server.1=bin02:2888:3888
server.2=bin03:2888:3888
server.3=bin04:2888:3888
其中2888端口提供zookeeper对外通信,
3888端口:当leader挂掉之后,重新选择leader的时候提供对外通信;
切记 :关闭防火墙!!!!!
角色:
leader 领导者,发起一个请求,并且开始投票
follower 是跟从者,响应leader的请求并发起投票
observer 监视leader 并将leader的状态告诉follower
有:–》选举机制、原子广播和zab协议、监听机制
如下:
1:一个外部客户端写入请求,将请求传给follower
2:follower将请求转发给leader
3:leader将请求发到各个follower,进行投票
4:follower将自己的想法返回给leader
原则 (少数服从多数)过半原则:节点数最好是单数;
3+4是原子广播
zab协议:
广播模式-------已经选举出来的leader,开始对外提供服务------------原子广播
恢复模式----还没有leader(这个情况可能是集群刚启动或者是leader挂掉了新的还没有起来)
-------looking 观望
-------following----跟从但是有想法
-----leading 继承人(准备被继承)leader
observing--------observer
监听机制
follower 查看leader的状态。然后将状态信息进行更新和发送
zookeeper的文件节点----------znode
启动客户端: zkCli.sh -server 192.168.35.125:2181
上手操作:
[zk: 192.168.35.125:2181(CONNECTED) 21] ls /
[name, zookeeper, name20000000002, name10000000001]
[zk: 192.168.35.125:2181(CONNECTED) 22] rmr /name
[zk: 192.168.35.125:2181(CONNECTED) 23] ls /
[zookeeper, name20000000002, name10000000001]
[zk: 192.168.35.125:2181(CONNECTED) 19] set /name buzhiushi123
cZxid = 0x200000004
ctime = Tue Jun 18 01:45:41 CST 2019
mZxid = 0x200000008
mtime = Tue Jun 18 01:51:03 CST 2019
pZxid = 0x200000004
cversion = 0
dataVersion = 1
aclVersion = 0
ephemeralOwner = 0x16b66d95ad00001
dataLength = 12
numChildren = 0
[zk: 192.168.35.125:2181(CONNECTED) 20] get /name
buzhiushi123
cZxid = 0x200000004
ctime = Tue Jun 18 01:45:41 CST 2019
mZxid = 0x200000008
mtime = Tue Jun 18 01:51:03 CST 2019
pZxid = 0x200000004
cversion = 0
dataVersion = 1
aclVersion = 0
ephemeralOwner = 0x16b66d95ad00001
dataLength = 12
numChildren = 0
[zk: 192.168.35.125:2181(CONNECTED) 2] create -e /name "123"
Created /name
[zk: 192.168.35.125:2181(CONNECTED) 3] ls /
[name, zookeeper]
[zk: 192.168.35.125:2181(CONNECTED) 4] create -s /name1 xiaopengyou
Created /name10000000001
[zk: 192.168.35.125:2181(CONNECTED) 5] create -s /name2 xiaojiejie
Created /name20000000002
[zk: 192.168.35.125:2181(CONNECTED) 6] ls /
[name, zookeeper, name20000000002, name10000000001]
在eclipse中使用zookeeper
public class TestZ {
public static void main(String[] args) throws Exception {
ZooKeeper zooKeeper = new ZooKeeper("192.168.35.125", 1000, null);
//创建主节点
//String create = zooKeeper.create("/name", "dididididi".getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
//创建子节点
/*String create = zooKeeper.create("/name/sex", "didididadada".getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
System.out.println(create);*/
//获取节点内容
/*byte[] data = zooKeeper.getData("/name", true, null);
String string = new String(data);
System.out.println(string);//dididididi
*/ //删除节点
//zooKeeper.delete("/name/sex", -1);
//设置节点内容
//zooKeeper.setData("/name", "2222222222".getBytes(), zooKeeper.exists("/name", true).getAversion());
byte[] data = zooKeeper.getData("/name", true, null);
String string = new String(data);
System.out.println(string);
}
}
public class TestWatcher implements Watcher{
private static final int SESSION_TIMEOUT=1000;
private ZooKeeper zk=null;
/**
* @throws Exception
* @throws Exception
*
*/
public static void main(String[] args) throws Exception {
ZooKeeper zooKeeper = new ZooKeeper("192.168.35.125", 1000, null);
byte[] data = zooKeeper.getData("/learning", new TestWatcher(), null);
System.out.println(new String(data));
Thread.sleep(Long.MAX_VALUE);
}
@Override
public void process(WatchedEvent event) {
System.out.println(event.getPath());
}
}