zoukankan      html  css  js  c++  java
  • 分布式调度——zookeeper

    分布式调度——zookeeper

    一、为什么需要zookeeper

    • 大部分分布式应用需要一个主控、协调器或控制器来管理物理分子的子进程(如资源、任务分配等)
    • 大部分应用需要开发私有的协调程序,缺乏一个通用的机制
    • 协调程序的反复编写浪费,且难以形成通用、伸缩性好的协调器
    • 协调服务

    二、zookeeper简介

    1、zookeeper是什么

    • zookeeper是Google的Chubby一个开源的实现,是开源的分布式协调服务
    • 它包含一个简单的原语集,分布式应用程序可以基于它实现同步服务,配置维护和命名服务等
    • zookeeper是一个高性能的分布式数据一致性解决方案,它将那些复杂的,容易出错的分布式一致性服务封装起来,构成一个高效可靠的原语集,并提供一系列简单易用的接口给用户使用
    • 它的架构图:

    2、zookeeper能帮我们做什么

    • 分布式系统协调:多个节点一起完成一个动作
      • 集群管理
      • 选主
      • 分布式
    • 负载均衡,一般不使用它

    3、zookeeper的数据模型

    • 层次化的目录结构,命名符合常规文件系统规范
    • 每个节点在zookeeper中叫做znode,并且其有一个唯一的路径标识
    • znode中的数据可以有多个版本,比如某一个路径下存有多个数据版本,那么查询这个路径下的数据就需要带上版本
    • 节点不支持部分读写,而是一次性完整读写

    4、zookeeper的下载地址

    三、zookeeper基本概念

    1、集群角色

    2、zookeeper节点类型

    • persistent:persistent节点不和特定的session绑定,不会随着创建该节点的session的结束而消失,而是一直存在,除非该节点被显式删除
    • ephemeral:ephemeral节点是临时性的,如果创建该节点的session结束了,该节点就会被自动删除,ephemeral节点不能拥有子节点,虽然ephemeral节点与创建它的session绑定,但只要该节点没有被删除,其他session就可以读写该节点中关联的数据,使用-e参数指定创建ephemeral节点
    • sequence:严格的说,sequence并非节点类型中的一种,sequence节点既可以是ephemeral的,也可以是persistent的,创建sequence节点时,zookeeper server会在指定的节点名称后加上一个数字序列,该数字序列是递增的,因此可以多次创建相同的sequence节点,而得到不同的节点,使用-s参数指定创建sequence节点

    3、版本

    • Version:当前Znode的版本
    • Cversion:当前Znode的子节点的版本
    • Aversion:当前Znode的ACL(访问控制)版本

    4、watcher

    • 作用于Znode节点
    • watcher设置后,一旦触发一次就会失效,如果需要一直监听,就需要再次注册
    • 多种事件通知:数据更新,子节点状态等
    • watcher会监控目录节点的数据变化以及子目录的变化,一旦发送改变,则通知所有设置在这个目录节点的watcher,从而做出相应的反应

    5、zookeeper节点和配置常识

    • zookeeper提高了创建、修改、删除节点的功能,如果父节点没有创建,子节点会创建失败。如果父节点还有子节点,父节点不可以删除
    • zookeeper和客户端之间以socket形式进行双向通讯,客户端可以主动调用服务器,服务器也可以主动向客户端推送事件
    • zookeeper的事件有传递机制,子节点的增删改触发的事件会向上层依次传播,所有的父节点都可以收到子节点的数据变更事件,所以层次太深、子节点太多会给服务器的事件系统带来压力,节点分配要做好周密的规划
    • zookeeper的读性能随着节点数量的提示能不断增加,但是写性能会随着节点数量的增加而降低,所以节点的数量不宜太多,一般配置成3个或者5个就可以了

    四、zookeeper的安装

    1、单机版

    环境准备:1台机器,1个zk

    • 首先,验证本机是否有JDK环境

      [root@node01 ~]# java -version
      java version "1.8.0_102"
      Java(TM) SE Runtime Environment (build 1.8.0_102-b14)
      Java HotSpot(TM) 64-Bit Server VM (build 25.102-b14, mixed mode)
      
    • 如果没有java环境,请参考https://www.cnblogs.com/ghh520/p/13239027.html进行安装

    • 下载zookeeper安装包,链接: https://pan.baidu.com/s/12TrG2eaEhAyVHTGJM2BFJQ 密码: aaoo

    • 移植到/usr/local目录下,进行解压

      [root@node01 local]# tar -zxvf zookeeper-3.4.9.tar.gz
      
    • 在zookeeper-3.4.9目录下创建data文件夹,用户存放日志数据

      [root@node01 local]# cd zookeeper-3.4.9/
      [root@node01 zookeeper-3.4.9]# mkdir data
      
    • 将配置文件复制

      [root@node01 zookeeper-3.4.9]# cd conf/
      [root@node01 conf]# cp zoo_sample.cfg zoo.cfg
      [root@node01 conf]# ll
      总用量 16
      -rw-rw-r-- 1 1001 1001  535 8月  23 2016 configuration.xsl
      -rw-rw-r-- 1 1001 1001 2161 8月  23 2016 log4j.properties
      -rw-r--r-- 1 root root  940 4月  23 19:48 zoo.cfg
      -rw-rw-r-- 1 1001 1001  922 8月  23 2016 zoo_sample.cfg
      
    • 修改数据目录为自己建的目录

      [root@node01 conf]# vi zoo.cfg
      
      dataDir=/usr/local/zookeeper-3.4.9/data/
      
    • 启动和查看状态

      [root@node01 zookeeper-3.4.9]# cd bin/
      [root@node01 bin]# ./zkServer.sh start
      ZooKeeper JMX enabled by default
      Using config: /usr/local/zookeeper-3.4.9/bin/../conf/zoo.cfg
      Starting zookeeper ... STARTED
      [root@node01 bin]# ./zkServer.sh status
      ZooKeeper JMX enabled by default
      Using config: /usr/local/zookeeper-3.4.9/bin/../conf/zoo.cfg
      Mode: standalone
      
    • 关闭zk

      [root@node01 bin]# ./zkServer.sh stop
      ZooKeeper JMX enabled by default
      Using config: /usr/local/zookeeper-3.4.9/bin/../conf/zoo.cfg
      Stopping zookeeper ... STOPPED
      

    2、伪分布式

    环境准备:1台机器,3个zk

    • 先看一下,没有zookeeper在运行

      [root@node01 bin]# ps aux|grep zoo
      root       2602  0.0  0.0 112828   972 pts/0    S+   11:54   0:00 grep --color=auto zoo
      
    • 将单机的,复制3份

      [root@node01 local]# cp -R zookeeper-3.4.9/ zookeeper01
      [root@node01 local]# cp -R zookeeper-3.4.9/ zookeeper02
      [root@node01 local]# cp -R zookeeper-3.4.9/ zookeeper03
      
    • 3个zk分别写一个id

      [root@node01 local]# echo 1 >> zookeeper01/data/myid
      [root@node01 local]# echo 2 >> zookeeper02/data/myid
      [root@node01 local]# echo 3 >> zookeeper03/data/myid
      
    • 分别修改3个配置文件zookeeper01、zookeeper02、zookeeper03,下面以zookeeper01举例修改:

      [root@node01 conf]# pwd
      /usr/local/zookeeper01/conf
      [root@node01 conf]# vi zoo.cfg
      
    • 3个机器的端口和路径修改,端口要不同,3台分别为2181,2182,2183

      文件里修改ClientPort 2181
      
    • 3台尾部都加上如下,注意修改IP

      文件里末尾加上:
      server.1=192.168.190.130:2881:3881
      server.2=192.168.190.130:2882:3882
      server.3=192.168.190.130:2883:3883
      
    • 其余两台按照上面同样进行修改,3台配置完成之后,去启动

    • 第一台启动,此时会报错,报错属于正常

    • 第二台启动,角色选举正常

    • 第三台启动,角色是跟随者

    • 此时,再次查看第一台的状态是跟随者

    • 可以将3台都分别关闭了

    3、完全分布式

    环境准备:3台机器,3个zk

    • 首先,关闭防火墙

      [root@node01 conf]# systemctl status firewalld.service
      ● firewalld.service - firewalld - dynamic firewall daemon
         Loaded: loaded (/usr/lib/systemd/system/firewalld.service; disabled; vendor preset: enabled)
         Active: inactive (dead)
      
    • 关闭selinux

      [root@node01 conf]# vi /etc/selinux/config
      
    • 3台主机都起个主机名,分别为node01、node02、node03,其余两台也进行配置

      [root@node01 conf]# vi /etc/hostname 
      node01
      
    • 配置映射,互相认识一下,加入一下内容,修改为自己的IP,其余两台同样进行配置

      [root@node01 conf]# vi /etc/hosts
      127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
      ::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
      192.30.253.113 github.com
      151.101.185.194 github.global.ssl.fastly.net
      172.16.45.131 node01
      
      172.16.45.132 node02
      
      172.16.45.133 node03
      
    • 3台修改完都重启一下

      [root@node01 conf]# reboot
      
    • 还可以配置个SSH免密登录

      • 第一台机器,生成密钥,一路回车

        [root@node01 conf]# ssh-keygen -t rsa
        
      • 在第一台机器中,把密钥传送给3台机器

        [root@node01 conf]# ssh-copy-id node01
        [root@node01 conf]# ssh-copy-id node02
        [root@node01 conf]# ssh-copy-id node03
        
    • 开始做完全分布式:

      • 如果做了前面的伪分布式,请先删除那3分单机的,再重新复制3分单机的

      • 给3台分别写入id

      • 3台修改路径,不需要修改clientPort

      • 3台文件最后都加上一下内容

        server.1=node01:2888:3888
        server.2=node02:2888:3888
        server.3=node03:2888:3888
        
      • 第一台机器,将配好的另外2个zk,传给另外2台机器

        scp -r /usr/local/zookeeper02/ root@node02:/usr/local/zookeeper02
        scp -r /usr/local/zookeeper03/ root@node03:/usr/local/zookeeper03
        
      • 3台分别启动和查看状态,1主2从

    五、zookeeper详解

    1、解压后目录结构

    2、配置文件

    3、运行脚本

    直接运行zkCli.sh是连接自己的客户端,也可以连接其他机器客户端,如下:

    [root@node01 bin]# ./zkCli.sh -server node03:2181
    

    4、命令行操作

    • help

    • ls path [watch]

    • create [-s] [-e] path data acl

    • get path [watch]

    • set path data [version]

    • delete path [version]

    • stat path [watch]

    • setAcl path

    • 例如:

      可以创建目录,写内容

      可以监听到目录的变化

  • 相关阅读:
    JVM内存参数详解以及配置调优
    Sublime Text 3安装AngularJS插件
    GraphicsMagick安装&make命令使用
    清明节太原两日游
    Java异常处理机制 try-catch-finally
    成都一日游
    降低PNG图片存储大小方法、图片压缩方法
    Windows 10下mysql 64位 安装(mysql-5.7.11-winx64安装)
    解决-Dmaven.multiModuleProjectDirectory system property is not set. Check $M2_HOME environment variabl
    centos 7下Hadoop 2.7.2 伪分布式安装
  • 原文地址:https://www.cnblogs.com/ghh520/p/13246001.html
Copyright © 2011-2022 走看看