• zookeeper学习及安装


    HBase提示已创建表,但是list查询时,却显示表不存在。

    https://blog.csdn.net/liu16659/article/details/80216085

     zookeeper图形化

    https://blog.csdn.net/riju4713/article/details/82860936

     zookeeper的api使用

    https://www.cnblogs.com/xinde123/p/8406433.html

    acl认证

    https://blog.csdn.net/weixin_40861707/article/details/80403213

    http://archive.apache.org/dist/zookeeper/

    这里下载3.4.9版本

    启动zookeeper后,要启动

    mr-jobhistory-daemon.sh start historyserver

    安装地址

    https://www.cnblogs.com/biehongli/p/7650570.html

    https://blog.csdn.net/zhengshidao/article/details/75128380?tdsourcetag=s_pcqq_aiomsg

    步骤即

    把压缩包放入Linux环境  /home/hadoop/

    解压3.4.9.tar.gz

    tar -zxvf zookeeper-3.4.9.tar.gz -C /home/hadoop/hadoop_home

    然后配置环境变量

    export ZOOKEEPER_HOME=/home/hadoop/hadoop_home zookeeper-3.4.9 

    export PATH=$ZOOKEEPER_HOME/bin:$PATH

    然后进入文件下面的conf/文件夹下

    cp zoo_sample.cfg zoo.cfg

    vim zoo.cfg

    tickTime=2000 心跳间隔
    initLimit=10 初始容忍的心跳数
    syncLimit=5 等待最大容忍的心跳数
    dataDir=/home/hadoop/hadoop_home zookeeper-3.4.9/conf/data 本地保存数据的目录,原来tmp存放的临时数据,修改为自己的目录;
    clientPort=2181 客户端默认端口号

    如果有需要,我感觉加上日志很有必要,如果出错了,还有地方可以去查找:

    dataLogDir=/home/hadoop/hadoop_home zookeeper-3.4.9/conf/log

    末尾添加节点的IP和端口信息:

    server.1=master:2888:3888
    server.2=node1:2888:3888
    server.3=node2:2888:3888

    server的意思是服务机, 这里一共有三台。后面对应的是机器名(写在/etc/hosts当中了)和端口的名字

    上述两个文件位置要自己创建即

    mkdir /home/hadoop/hadoop_home zookeeper-3.4.9/conf/data

    mkdir /home/hadoop/hadoop_home zookeeper-3.4.9/conf/log

    然后在data目录创建一个文件myid,里面写一个1,如下所示:

    vi myid

    1

    在这里进行相应修改即可,位置和自己node,master匹配

    同时把~/.profile 文件夹也scp远程传送过去,然后

    source  ~/.profile 

    然后分别将node1和node2的myid修改为2和3

    配置完毕,尝试运行

    zkServer.sh start
    1
    收到回复:

    ZooKeeper JMX enabled by default
    Using config: /usr/local/zookeeper/bin/../conf/zoo.cfg
    Starting zookeeper ... STARTED

    三台都要运行

    jps可以查看

    zkServer.sh status

    得到反馈:

    ZooKeeper JMX enabled by default
    Using config: /usr/local/zookeeper/bin/../conf/zoo.cfg
    Mode: follower
    即可

    有时候会遇到坑:

    ZooKeeper JMX enabled by default
    Using config: /usr/local/zookeeper/bin/../conf/zoo.cfg
    Error contacting service. It is probably not running.
    节点没有启动成功,查看zookeeper.out

    zookeeper知识

     

    2.2 配置参数解读
    解读zoo.cfg 文件中参数含义
    1)tickTime:通信心跳数,Zookeeper服务器心跳时间,单位毫秒
    Zookeeper使用的基本时间,服务器之间或客户端与服务器之间维持心跳的时间间隔,
    也就是每个tickTime时间就会发送一个心跳,时间单位为毫秒。
    它用于心跳机制,并且设置最小的session超时时间为两倍心跳时间。(session的最小超
    时时间是2*tickTime)
    2)initLimit:LF初始通信时限
    集群中的follower跟随者服务器(F)与leader领导者服务器(L)之间初始连接时能容忍的最
    多心跳数(tickTime的数量),用它来限定集群中的Zookeeper服务器连接到Leader的时限。
    投票选举新leader的初始化时间
    Follower在启动过程中,会从Leader同步所有最新数据,然后确定自己能够对外服务的
    起始状态。
    Leader允许F在initLimit时间内完成这个工作。
    3)syncLimit:LF 同步通信时限
    集群中Leader与Follower之间的最大响应时间单位,假如响应超过syncLimit * tickTime,
    Leader认为Follwer死掉,从服务器列表中删除Follwer。
    在运行过程中,Leader负责与ZK集群中所有机器进行通信,例如通过一些心跳检测机
    制,来检测机器的存活状态。
    如果L发出心跳包在syncLimit之后,还没有从F那收到响应,那么就认为这个F已经不在
    线了。
    4)dataDir:数据文件目录+数据持久化路径
    保存内存数据库快照信息的位置,如果没有其他说明,更新的事务日志也保存到数据库。
    5)clientPort:客户端连接端口
    监听客户端连接的端口

    3.5 stat 结构体
    1)czxid- 引起这个 znode 创建的 zxid,创建节点的事务的 zxid(ZooKeeper Transaction Id)
    每次修改 ZooKeeper 状态都会收到一个 zxid 形式的时间戳,也就是 ZooKeeper 事务 ID。
    事务 ID 是 ZooKeeper 中所有修改总的次序。每个修改都有唯一的 zxid,如果 zxid1 小
    于 zxid2,那么 zxid1 在 zxid2 之前发生。
    2)ctime - znode 被创建的毫秒数(从 1970 年开始)
    3)mzxid - znode 最后更新的 zxid
    4)mtime - znode 最后修改的毫秒数(从 1970 年开始)
    5)pZxid-znode 最后更新的子节点 zxid
    6)cversion - znode 子节点变化号,znode 子节点修改次数
    7)dataversion - znode 数据变化号
    8)aclVersion - znode 访问控制列表的变化号
    9)ephemeralOwner- 如果是临时节点,这个是 znode 拥有者的 session id。如果不是临时节
    点则是 0。
    10)dataLength- znode 的数据长度
    11)numChildren - znode 子节点数量

    查看log4j文档

    4.3.2 创建 ZooKeeper 客户端

    private static String connectString = "master:2181,node1:2181,node2:2181";
    private static int sessionTimeout = 2000;
    private ZooKeeper zkClient = null;
    @Before
    public void init() throws Exception {
    zkClient = new ZooKeeper(connectString, sessionTimeout, new Watcher() {
    @Override
    public void process(WatchedEvent event) {
    // 收到事件通知后的回调函数(用户的业务逻辑)
    System.out.println(event.getType() + "--" + event.getPath());
    // 再次启动监听
    try {
    zkClient.getChildren("/", true);
    } catch (Exception e) {
    e.printStackTrace();
    }
    }
    });
    }
    4.3.3 创建子节点
    // 创建子节点
    @Test
    public void create() throws Exception {
    // 数据的增删改查
    // 参数 1:要创建的节点的路径; 参数 2:节点数据 ; 参数 3:节点权限 ;
    参数 4:节点的类型
    String nodeCreated = zkClient.create("/eclipse", "hello
    zk".getBytes(), Ids.OPEN_ACL_UNSAFE,CreateMode.PERSISTENT);
    }
    4.3.4 获取子节点
    // 获取子节点
    @Test
    public void getChildren() throws Exception {
    List<String> children = zkClient.getChildren("/", true);
    for (String child : children) {
    System.out.println(child);
    }
    // 延时阻塞
    Thread.sleep(Long.MAX_VALUE);
    }
    4.3.5 判断 znode 是否存在
    // 判断 znode 是否存在
    @Test
    public void exist() throws Exception {
    Stat stat = zkClient.exists("/eclipse", false);
    System.out.println(stat == null ? "not exist" : "exist");
    }

    4.3.6 监听服务器节点动态上下线案例
    1)需求:某分布式系统中,主节点可以有多台,可以动态上下线,任意一台客户端都能实
    时感知到主节点服务器的上下线
    2)需求分析

    3)具体实现:
    (0)现在集群上创建/servers 节点
    [zk: localhost:2181(CONNECTED) 10] create /servers "servers"
    Created /servers
    (1)服务器端代码
    package com.yjsj.zkcase;
    import java.io.IOException;
    import org.apache.zookeeper.CreateMode;
    import org.apache.zookeeper.WatchedEvent;
    import org.apache.zookeeper.Watcher;
    import org.apache.zookeeper.ZooKeeper;
    import org.apache.zookeeper.ZooDefs.Ids;
    public class DistributeServer {
      private static String connectString = "master:2181,node1:2181,node2:2181";
      private static int sessionTimeout = 2000;
      private ZooKeeper zk = null;
      private String parentNode = "/servers";
      // 创建到 zk 的客户端连接
      public void getConnect() throws IOException{
        zk = new ZooKeeper(connectString, sessionTimeout, new Watcher() {
          @Override
          public void process(WatchedEvent event) {
            // 收到事件通知后的回调函数(用户的业务逻辑)
            System.out.println(event.getType() + "--" + event.getPath());
            // 再次启动监听
            try {
              zk.getChildren("/", true);
            } catch (Exception e) {
              e.printStackTrace();
            }
          }
        });
      }
      // 注册服务器
      public void registServer(String hostname) throws Exception{
        String create = zk.create(parentNode + "/server", hostname.getBytes(),  //创建的是带序列号的临时节点
        Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL_SEQUENTIAL);
        System.out.println(hostname +" is noline "+ create);
      }
      // 业务功能
      public void business(String hostname) throws Exception{
        System.out.println(hostname+" is working ...");
        Thread.sleep(Long.MAX_VALUE);
      }
      public static void main(String[] args) throws Exception {
        // 获取 zk 连接
        DistributeServer server = new DistributeServer();
        server.getConnect();
        // 利用 zk 连接注册服务器信息
        server.registServer(args[0]);//server01
        // 启动业务功能
        server.business(args[0]);
      }
    }
    (2)客户端代码
    package com.yjsj.zkcase;
    import java.io.IOException;
    import java.util.ArrayList;
    import java.util.List;
    import org.apache.zookeeper.WatchedEvent;
    import org.apache.zookeeper.Watcher;
    import org.apache.zookeeper.ZooKeeper;
    public class DistributeClient {
      private static String connectString = "master:2181,node1:2181,node2:2181";
      private static int sessionTimeout = 2000;
      private ZooKeeper zk = null;
      private String parentNode = "/servers";
      private volatile ArrayList<String> serversList = new ArrayList<>();
      // 创建到 zk 的客户端连接
      public void getConnect() throws IOException {
        zk = new ZooKeeper(connectString, sessionTimeout, new Watcher() {
          @Override
          public void process(WatchedEvent event) {
            // 再次启动监听
            try {
              getServerList();
            } catch (Exception e) {
              e.printStackTrace();
            }
          }
        });
      }
    //
      public void getServerList() throws Exception {
        // 获取服务器子节点信息,并且对父节点进行监听
        List<String> children = zk.getChildren(parentNode, true);
        ArrayList<String> servers = new ArrayList<>();
        for (String child : children) {
          byte[] data = zk.getData(parentNode + "/" + child, false, null);
          servers.add(new String(data));
        }
        // 把 servers 赋值给成员 serverList,已提供给各业务线程使用
        serversList = servers;
        System.out.println(serversList);
      }
      // 业务功能
      public void business() throws Exception {
        System.out.println("client is working ...");
      }
      public static void main(String[] args) throws Exception {
      // 获取 zk 连接
      DistributeClient client = new DistributeClient();
      client.getConnect();
      // 获取 servers 的子节点信息,从中获取服务器信息列表
      client.getServerList();
      // 业务进程启动
      client.business();
      }
    }

    一致性协议

    https://www.cnblogs.com/stateis0/p/9062133.html

  • 相关阅读:
    <span>和<div>标签的隐藏和显示切换
    重启svn
    Mac下配置apache
    iOS时间显示今天昨天
    关于UIPageViewController那些事
    关于plist文件的那些事
    Xcode调试LLDB
    Reveal安装
    静态初始化器
    Static简介
  • 原文地址:https://www.cnblogs.com/pursue339/p/10519294.html
Copyright © 2020-2023  润新知