2-3安装zoekeeper

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 服务器监听端口,用来接受客户端的访问请求。 

补充: 

  记得配  etc/profile


配置完以后,就可以启动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);
       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();
    }
}


通解:

读写机制

l Zookeeper是一个由多个server组成的集群

l 一个leader,多个follower

l 每个server保存一份数据副本

l 全局数据一致

l 分布式读写

l 更新请求转发,由leader实施
 

猜你喜欢

转载自blog.csdn.net/xiaoxiaoniaoQ/article/details/83959273
2-3
今日推荐