zoukankan      html  css  js  c++  java
  • 【Zookeeper】01 概述 & 基础部署

    背景:

    随着互联网技术的发展,企业对计算机系统的计算,存储能力要求越来越高,各大IT企业都在追求高并发,海量存储的极致,

    在这样的背景下,单纯依靠少量高性能单机来完成计算机,云计算的任务已经无法满足需求,企业的IT架构逐渐由集中式往分布式过渡。

    所谓的分布式是指:把一个计算任务分解成若干个计算单元,并分派到不同的计算机中去执行,最终汇总计算结果的过程。

    什么是Zookeeper?

    Zookeeper是源代码开放的分布式协调服务,是一个高性能的分布式数据一致性的解决方案,

    它将那些复杂的,容易出错的分布式一致性服务封装起来。

    用户可以通过调用Zookeeper提供的接口来解决一些分布式应用中的实际问题。

    应用场景

    (1)数据发布/订阅

    数据的发布与订阅,顾名思义就是一方把数据发布出来,另一方通过某种手段获取。

    通常数据发布与订阅有两种模式:推模式和拉模式,

      推模式一般是服务器主动往客户端推送信息,

      拉模式是客户端主动去服务端请求目标数据(通常采用定时轮询的方式)

    Zookeeper采用两种方式互相结合:发布者将数据发布到Zookeeper集群节点上,

    订阅者通过一定的方法告诉Zookeeper服务器,自己对哪个节点的数据感兴趣,

    那么在服务端数据发生变化时,就会通知客户端去获取这些信息。

    (2)负载均衡

    首先在服务端启动的时候,把自己在zookeeper服务器上注册成一个临时节点。

    zookeeper拥有两种形式的节点,一种是临时节点,一种是永久节点。

    这两种节点后面的会有较为详细的介绍。

    注册成临时节点后,再服务端出问题时,节点会自动的从zookeeper上删除,如此zookeeper服务器上的列表就是最新的可用的列表。

    客户端在需要访问服务器的时候首先会去Zookeeper获得所有可用的服务端的连接信息。

    客户端通过一定的策略(如随机)选择一个与之建立连接。

    当客户端发现连接不可用时,会再次从zookeeper上获取可用的服务端连接,并同时删除之前获取的连接列表。

    (3)命名服务

    提供名称的服务。如一般使用较多的有两种id,一种是数据库自增长id,一种是UUID,

    两种id都有局限,自增长id仅适合在单表单库中使用,uuid适合在分布式系统中使用但由于id没有规律难以理解。

    而ZK提供了一定的接口可以用来获取一个顺序增长的,可以在集群环境下使用的id。

    (4)分布式协调,通知,心跳服务

    在分布式服务系统中,我们常常需要知道哪个服务是可用的,哪个服务是不可用的,

    传统的方式是通过ping主机来实现的,ping得200的结果说明说明该服务是OK的。

    而在使用 zookeeper时,可以将所有的服务都注册成一个临时节点,我们判断一个服务是否可用,

    只需要判断这个节点是否在zookeeper集群中存在就可以了,不需要直接去连接和ping服务所在主机,减少系统的复杂度和对服务主机的压力。

    优势

    (1)源代码开放

    (2)高性能,易用稳定,该优势已在众多分布式系统中得到验证

    (3)有着广泛的应用,并且与众多大数据相关技术能实现良好的融合开发。


    下载 & 安装:

    https://apache.org/dist/zookeeper/stable
    http://mirror.bit.edu.cn/apache/zookeeper/stable/

    Linux操作系统环境下最佳。但是注意,需要Java运行环境的支持

    [root@VM-0-7-centos bin]# java -version
    openjdk version "1.8.0_252"
    OpenJDK Runtime Environment (build 1.8.0_252-b09)
    OpenJDK 64-Bit Server VM (build 25.252-b09, mixed mode)

    解压Zookeeper压缩包

    tar -zxvf apache-zookeeper-3.5.8-bin.tar.gz

    赋值解药的包目录到usr | local | 下面,重命名zookeeper

    cp -r apache-zookeeper-3.5.8-bin /usr/local/zookeeper

    zookeeper的目录结构:

    [root@VM-0-7-centos zookeeper]# ll
    total 40
    drwxr-xr-x 2 root root  4096 Aug  6 20:26 bin
    drwxr-xr-x 2 root root  4096 Aug  6 20:26 conf
    drwxr-xr-x 5 root root  4096 Aug  6 20:26 docs
    drwxr-xr-x 2 root root  4096 Aug  6 20:26 lib
    -rw-r--r-- 1 root root 11358 Aug  6 20:26 LICENSE.txt
    -rw-r--r-- 1 root root   432 Aug  6 20:26 NOTICE.txt
    -rw-r--r-- 1 root root  1560 Aug  6 20:26 README.md
    -rw-r--r-- 1 root root  1347 Aug  6 20:26 README_packaging.txt

    我们需要对zookeeper进行一定的配置才能启动使用。

    查看conf配置目录:

    [root@VM-0-7-centos zookeeper]# ll conf
    total 12
    -rw-r--r-- 1 root root  535 Aug  6 20:26 configuration.xsl
    -rw-r--r-- 1 root root 2712 Aug  6 20:26 log4j.properties
    -rw-r--r-- 1 root root  922 Aug  6 20:26 zoo_sample.cfg

    我们备份这个样板配置文件,复制一份并且更改配置:

    cp -r zoo_sample.cfg zoo.cfg

    我觉得默认的配置挺好的,算了就不改动了

    # 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=/tmp/zookeeper
    # 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

    zookeeper的运行程序在bin目录下:

    [root@VM-0-7-centos bin]# ll
    total 56
    -rwxr-xr-x 1 root root  232 Aug  6 20:26 README.txt
    -rwxr-xr-x 1 root root 2067 Aug  6 20:26 zkCleanup.sh
    -rwxr-xr-x 1 root root 1158 Aug  6 20:26 zkCli.cmd
    -rwxr-xr-x 1 root root 1621 Aug  6 20:26 zkCli.sh
    -rwxr-xr-x 1 root root 1766 Aug  6 20:26 zkEnv.cmd
    -rwxr-xr-x 1 root root 3690 Aug  6 20:26 zkEnv.sh
    -rwxr-xr-x 1 root root 1286 Aug  6 20:26 zkServer.cmd
    -rwxr-xr-x 1 root root 4573 Aug  6 20:26 zkServer-initialize.sh
    -rwxr-xr-x 1 root root 9386 Aug  6 20:26 zkServer.sh
    -rwxr-xr-x 1 root root  996 Aug  6 20:26 zkTxnLogToolkit.cmd
    -rwxr-xr-x 1 root root 1385 Aug  6 20:26 zkTxnLogToolkit.sh

    一些Zookeeper程序的介绍:

    zkCleanup.sh 
    清理zookeeper历史数据,包括事务日志和快照
    
    zkCli.sh
    zookeeper的简单客户端
    
    zkEnv.sh
    zookeeper的环境设置
    
    zkServer.sh
    zookeeper的服务器启动,停止和重启

    启动zookeeper

    ./zkServer.sh start

    显示:

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

    关闭zookeeper:

    ./zkServer.sh stop

    显示:

    /usr/bin/java
    ZooKeeper JMX enabled by default
    Using config: /usr/local/zookeeper/bin/../conf/zoo.cfg
    Stopping zookeeper ... ./zkServer.sh: line 213: kill: (19512) - No such process
    STOPPED

    查看zookeeper运行状态:

    ./zkServer.sh status

    显示:

    /usr/bin/java
    ZooKeeper JMX enabled by default
    Using config: /usr/local/zookeeper/bin/../conf/zoo.cfg
    Client port found: 2181. Client address: localhost.
    Error contacting service. It is probably not running.

    发现并没有启动成功

    回退到上一级目录,进入logs,在日志中应该会反应出什么问题。

    查看日志输出:

    [root@VM-0-7-centos zookeeper]# cd logs
    
    [root@VM-0-7-centos logs]# ll
    total 12
    -rw-r--r-- 1 root root 9007 Aug  7 08:52 zookeeper-root-server-VM-0-7-centos.out
    
    [root@VM-0-7-centos logs]# cat zookeeper-root-server-VM-0-7-centos.out

    最后面发现输出的异常信息:

    org.apache.zookeeper.server.admin.AdminServer$AdminServerException: Problem starting AdminServer on address 0.0.0.0, port 8080 and command URL /commands
        at org.apache.zookeeper.server.admin.JettyAdminServer.start(JettyAdminServer.java:107)
        at org.apache.zookeeper.server.ZooKeeperServerMain.runFromConfig(ZooKeeperServerMain.java:138)
        at org.apache.zookeeper.server.ZooKeeperServerMain.initializeAndRun(ZooKeeperServerMain.java:106)
        at org.apache.zookeeper.server.ZooKeeperServerMain.main(ZooKeeperServerMain.java:64)
        at org.apache.zookeeper.server.quorum.QuorumPeerMain.initializeAndRun(QuorumPeerMain.java:128)
        at org.apache.zookeeper.server.quorum.QuorumPeerMain.main(QuorumPeerMain.java:82)
    Caused by: java.io.IOException: Failed to bind to /0.0.0.0:8080
        at org.eclipse.jetty.server.ServerConnector.openAcceptChannel(ServerConnector.java:346)
        at org.eclipse.jetty.server.ServerConnector.open(ServerConnector.java:307)
        at org.eclipse.jetty.server.AbstractNetworkConnector.doStart(AbstractNetworkConnector.java:80)
        at org.eclipse.jetty.server.ServerConnector.doStart(ServerConnector.java:231)
        at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:72)
        at org.eclipse.jetty.server.Server.doStart(Server.java:385)
        at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:72)
        at org.apache.zookeeper.server.admin.JettyAdminServer.start(JettyAdminServer.java:103)
        ... 5 more
    Caused by: java.net.BindException: Address already in use
        at sun.nio.ch.Net.bind0(Native Method)
        at sun.nio.ch.Net.bind(Net.java:433)
        at sun.nio.ch.Net.bind(Net.java:425)
        at sun.nio.ch.ServerSocketChannelImpl.bind(ServerSocketChannelImpl.java:220)
        at sun.nio.ch.ServerSocketAdaptor.bind(ServerSocketAdaptor.java:85)
        at org.eclipse.jetty.server.ServerConnector.openAcceptChannel(ServerConnector.java:342)
        ... 12 more
    Unable to start AdminServer, exiting abnormally

    应该是我部署的项目占用的8080端口导致的,原来Zookeeper需要使用8080端口

    [root@VM-0-7-centos ~]# ll
    total 50452
    drwxr-xr-x 6 root root     4096 Aug  6 20:25 apache-zookeeper-3.5.8-bin
    -rw-r--r-- 1 root root  9394700 May 11 18:10 apache-zookeeper-3.5.8-bin.tar.gz
    -rw------- 1 root root   225749 Aug  7 06:58 nohup.out
    -rw-r--r-- 1 root root 42029492 Aug  6 14:37 warehouse-management-system-0.0.1-SNAPSHOT.jar
    [root@VM
    -0-7-centos ~]# netstat -nlp|grep 8080 tcp6 0 0 :::8080 :::* LISTEN 9711/java

    直接终止进程:

    再次检查端口占用,就发现不再有任何程序了

    [root@VM-0-7-centos ~]# kill 9711
    [root@VM-0-7-centos ~]# netstat  -nlp|grep 8080
    [root@VM-0-7-centos ~]# 

    再次启动Zookeeper

    [root@VM-0-7-centos bin]# ./zkServer.sh start
    /usr/bin/java
    ZooKeeper JMX enabled by default
    Using config: /usr/local/zookeeper/bin/../conf/zoo.cfg
    Starting zookeeper ... STARTED
    [root@VM-0-7-centos bin]# ./zkServer.sh status
    /usr/bin/java
    ZooKeeper JMX enabled by default
    Using config: /usr/local/zookeeper/bin/../conf/zoo.cfg
    Client port found: 2181. Client address: localhost.
    Mode: standalone

    当前的模式是单机状态

    报错异常问题查看参考自:

    https://blog.csdn.net/qq_26230421/article/details/80700912
  • 相关阅读:
    jquery的全选,全不选,反选
    jquery中的on方法绑定动态元素
    IIS服务器不能下载.apk文件的解决方略
    14:堆和堆排序
    虚拟内存
    leetcode28:实现strStr()
    leetcode387:字符串中的第一个唯一字符
    leetcode344:反转字符串
    leetcode198:打家劫舍
    leetcode64:最小路径和
  • 原文地址:https://www.cnblogs.com/mindzone/p/13448716.html
Copyright © 2011-2022 走看看