您的位置:首页 > 运维架构 > Linux

(防坑笔记)Zookeeper的三种安装方式(linux)(java调用)

2018-01-02 14:32 495 查看

zk选举有种简单的理解方式,当zk启动时候,假如有5个节点,当第一个zk节点启动的时候,它会比较一下自己的id是否大于总节点数的一半(1<5/2),不大于,所以它不是master,同理第二个启动的时候(2<5/2),所以它也不是,第三个启动的时候(3>5/2),所以第三个就是master了,后边的节点都不是了。当master挂了以后,也按此法选举

Zookeeper详解

zookeeper原理性详解

一、单机模式

  获取地址 : http://mirrors.hust.edu.cn/apache/zookeeper/zookeeper-3.4.11/zookeeper-3.4.11.tar.gz 解压到,这边解压复制到到  /usr 目录下
   wget http://mirrors.hust.edu.cn/apache/zookeeper/zookeeper-3.4.11/zookeeper-3.4.11.tar.gz
tar -zxvf  zookeeper-3.4.11.tar.gz

在/tmp/linge/zptm下创建了data目录及data日志目录用于存放数据

mkdir /tmp/linge/zptm/data
mkdir /tmp/linge/zptm/dataLog

进入zookeeper目录下的conf目录,复制zoo_sample.cfg为zoo.cfg,并将内容修改如下
tickTime=2000
initLimit=10
syncLimit=5
dataDir=/tmp/linge/zptm/data
dataLogDir=/tmp/linge/zptm/dataLog
clientPort=2181
autopurge.snapRetainCount=500
autopurge.purgeInterval=24
#tickTime:Zookeeper 服务器之间或客户端与服务器之间心跳的时间间隔。
#dataDir:Zookeeper 保存数据的目录,默认情况下,Zookeeper 将写数据的日志文件也保存在这个目录里。
#clientPort:Zookeeper 服务器监听端口,用来接受客户端的访问请求。 
配置完以后,就可以启动zookeeper服务了,进入Zookeeper/bin目录,运行下面的命令来启动Zookeeper服务
./zkServer.sh start
JMX enabled by default
Using config: /opt/zookeeper/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED
启动后可以使用下面的命令查看服务
$ ./zkServer.sh status
JMX enabled by default
Using config: /opt/zookeeper/bin/../conf/zoo.cfg
Mode: standalone

在Zookeeper服务器启动以后,就可以使用Zookeeper的客户端来连接并测试了。
$ ./zkCli.sh

$ ./zkCli.sh -server 127.0.0.1:2181

二、伪集群模式

创建伪集群文件夹

mkdir /usr/zookeeperGroup
在此主文件夹下建三个文件夹,并分别子啊文件夹下解压一个zookeeper压缩包,创建data、dataLog、logs文件夹
mkdir service1
mkdir service2
mkdir service3
我解压后的文件夹名字分别为zookeeper1、zookeeper2、zookeeper3
进入解压后的文件夹
vim zookeeper1/conf/zoo_sample.cfg我这边linux的ip地址是192.168.88.129,故我修改为
# The number of milliseconds of each tick
tickTime=2000
# The number of ticks that the initial
# synchronization phase can take
initLimit=10
# The number of ticks that can pass between
# sending a request and getting an acknowledgement
syncLimit=5
# the directory where the snapshot is stored.
# do not use /tmp for storage, /tmp here is just
# example sakes.
dataDir=/usr/zookeeperGroup/server1/data
dataLogDir=/usr/zookeeperGroup/server1/dataLog
# the port at which the clients will connect,此处如果被占用可以改成其他端口
clientPort=2181
# the maximum number of client connections.
# increase this if you need to handle more clients
#maxClientCnxns=60
#
# Be sure to read the maintenance section of the
# administrator guide before turning on autopurge.
#
# http://zookeeper.apache.org/doc/current/zookeeperAdmin.html#sc_maintenance #
# The number of snapshots to retain in dataDir
#autopurge.snapRetainCount=3
# Purge task interval in hours
# Set to "0" to disable auto purge feature
#autopurge.purgeInterval=1
server.1=192.168.88.129:2888:3888
server.2=192.168.88.129:2889:3889
server.3=192.168.88.129:2890:3890

然后退回上一个目录,进入data目录,创建一个myid的文件,里面写入一个数字,比如我这个是server1,那么就写一个1,server2对应myid文件就写入2,server3对应myid文件就写个3

需要注意的是①   clientPort这个端口如果你是在1台机器上部署多个server,那么每台机器都要不同的clientPort,比如我server1是3181(2181这个端口好像被占用了),server2是2182,server3是2183,dataDir和dataLogDir也需要区分下。
②   server.X 这个数字就是对应 data/myid中的数字。你在3个server的myid文件中分别写入了1,2,3,那么每个server中的zoo.cfg都配server.1,server.2,server.3就OK了。因为在同一台机器上,后面连着的2个端口3个server都不要一样,否则端口冲突,其中第一个端口用来集群成员的信息交换,第二个端口是在leader挂掉时专门用来进行选举leader所用。

最后分别进入每一个zookeeper/bin目录下启动服务,启动完后观看状态 

.zkServer.sh status //会有follwer 和leader之一
进入任意一个服务器的zookeeper/bin目录下,启动一个客户端,接入服务。
例如zookeeper1

./zkCli.sh –server 192.168.88.129:2181

三、集群模式

将伪集群上的文件部署到不同的linux上即可

四、示例代码

所需jar包,官方下载,然后需要自己额外下载一个slf4的Jar包,否则报classnofoundException

package Demo;

import java.io.IOException;

import org.apache.zookeeper.CreateMode;
import org.apache.zookeeper.KeeperException;
import org.apache.zookeeper.WatchedEvent;
import org.apache.zookeeper.Watcher;
import org.apache.zookeeper.ZooDefs.Ids;
import org.apache.zookeeper.ZooKeeper;

public class MyZookeeper {

//回话超时时间,设置为与系统默认时间一致
private static final int SESSION_TIMEOUT = 30000;
//创建ZooKeeper实例
ZooKeeper zk;
//创建Watcher实例
Watcher wh = new Watcher() {

@Override
public void process(WatchedEvent event) {
System.out.println(event.toString());
}
};

//初始化ZooKeeper实例
private void createZKInstance() throws IOException {
zk = new ZooKeeper("192.168.88.129:2181,192.168.88.129:2182,192.168.88.129:2183",MyZookeeper.SESSION_TIMEOUT,this.wh);
}

private void ZKOperations() throws KeeperException, InterruptedException {
System.out.println("\n1. 创建 ZooKeeper 节点 (znode : zoo2, 数据: myData2 ,权限: OPEN_ACL_UNSAFE ,节点类型: Persistent");
zk.create("/zoo2", "myData2".getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
4000

System.out.println("\n2.查看是否创建成功:");
System.out.println(new String(zk.getData("/zoo2", false, null)));
System.out.println("\n3.修改节点数据");
zk.setData("/zoo2", "toto".getBytes(), -1);
System.out.println("\n4.查看是否修改成功:");
System.out.println(new String(zk.getData("/zoo2", false, null)));
System.out.println("\n5.删除节点");
zk.delete("/zoo2", -1);
System.out.println("\n6.查看节点是否被删除:");
System.out.println("节点状态:[" + zk.exists("/zoo2", false) + "]");
}

private void ZKClose() throws InterruptedException {
zk.close();
}

public static void main(String[] args) throws KeeperException, InterruptedException, IOException {
MyZookeeper dm = new MyZookeeper();
dm.createZKInstance();
dm.ZKOperations();
dm.ZKClose();
}
}


通解:
读写机制

Zookeeper是一个由多个server组成的集群
一个leader,多个follower
每个server保存一份数据副本
全局数据一致
分布式读写
更新请求转发,由leader实施
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  zookeeper