背景:

随着互联网技术的发展,企业对计算机系统的计算,存储能力要求越来越高,各大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

【Zookeeper】01 概述 & 基础部署的更多相关文章

  1. 054 01 Android 零基础入门 01 Java基础语法 06 Java一维数组 01 数组概述

    054 01 Android 零基础入门 01 Java基础语法 06 Java一维数组 01 数组概述 本文知识点:数组概述 为什么要学习数组? 实际问题: 比如我们要对学生的成绩进行排序,一个班级 ...

  2. 039 01 Android 零基础入门 01 Java基础语法 05 Java流程控制之循环结构 01 循环结构概述

    039 01 Android 零基础入门 01 Java基础语法 05 Java流程控制之循环结构 01 循环结构概述 本文知识点:循环结构概述 循环结构主要内容 while 循环 do-whiile ...

  3. 034 01 Android 零基础入门 01 Java基础语法 04 Java流程控制之选择结构 01 流程控制概述

    034 01 Android 零基础入门 01 Java基础语法 04 Java流程控制之选择结构 01 流程控制概述 本文知识点:Java中的流程控制相关概念的认识 三大流程控制语句结构的简介 顺序 ...

  4. Zookeeper详解(01) -概述

    Zookeeper详解(01) -概述 概念 Zookeeper是一个开源的分布式的,为分布式应用提供协调服务的Apache项目. Zookeeper从设计模式角度来理解,是一个基于观察者模式设计的分 ...

  5. (转)ZooKeeper 笔记(1) 安装部署及hello world

    ZooKeeper 笔记(1) 安装部署及hello world   先给一堆学习文档,方便以后查看 官网文档地址大全: OverView(概述) http://zookeeper.apache.or ...

  6. kafka详解(01) - 概述

    kafka详解(01) - 概述 定义:Kafka是一个分布式的基于发布/订阅模式的消息队列(Message Queue),主要应用于大数据实时处理领域. 消息队列 MQ传统应用场景之异步处理 使用消 ...

  7. 01: tornado基础篇

    目录:Tornado其他篇 01: tornado基础篇 02: tornado进阶篇 03: 自定义异步非阻塞tornado框架 04: 打开tornado源码剖析处理过程 目录: 1.1 Torn ...

  8. Zookeeper介绍及安装部署

    本节内容: Zookeeper介绍 Zookeeper特点 Zookeeper应用场景 用到了Zookeeper的一些系统 Zookeeper集群安装部署 一.Zookeeper介绍 是一个针对大型分 ...

  9. zookeeper与kafka安装部署及java环境搭建(发布订阅模式)

    1. ZooKeeper安装部署 本文在一台机器上模拟3个zk server的集群安装. 1.1. 创建目录.解压 cd /usr/ #创建项目目录 mkdir zookeeper cd zookee ...

  10. Kubernetes K8S之kube-prometheus概述与部署

    Kubernetes K8S之kube-prometheus概述与部署 主机配置规划 服务器名称(hostname) 系统版本 配置 内网IP 外网IP(模拟) k8s-master CentOS7. ...

随机推荐

  1. ztree.js 禁止点击事件和鼠标禁用

    先看样式 var _t = this; var setting = { view: { fontCss: { color: "#5E5F61" }, showIcon: true, ...

  2. react 利用高阶组件给页面加上动画

    利用高阶组件给页面加上动画 并不想让所有的路由都有动画效果,只是想对指定的页面有路由切换效果,可以利用高阶组件来完成. # 定义高阶组件 import React, { Component } fro ...

  3. LeetCode 295. Find Median from Data Stream数据流的中位数 (C++/Java)

    题目: Median is the middle value in an ordered integer list. If the size of the list is even, there is ...

  4. Math Record

    T1.P3327 知识点:莫比乌斯反演,数论分块 我们知道 \(d(ij) = \sum_{x | i}\sum_{y | j}[\gcd(x,y) == 1]\). 所以我们就要求 \(\sum^n ...

  5. Java扫描文件目录大小及递归扫描

    #Java扫描文件目录大小及递归扫描 package com.example.core.mydemo; import org.apache.commons.io.FileUtils; import j ...

  6. 3年Java阿里跳字节的面试心得总结

    中厂->阿里->字节,成都->杭州->成都 系列文章目录和关于我 0.前言 笔者在不足两年经验的时候从成都一家金融科技中厂跳槽到杭州阿里淘天集团,又于今年5月份从杭州淘天跳槽到 ...

  7. 阅读mmdetection3d框架的源码探索其构建dataset的流程

    在查看一些基于mmdetection3d构建的代码的时候,一开始会摸不着头脑,它的dataset到底是怎么构造的? 接下来就直接下载mmdetection3d这个仓库,然后去分析里面的代码. 可以看到 ...

  8. uniapp 使用z-paging 分页组件 写在头部插槽内的单选按钮无法点击

    这个问题是因为组件层级太低 <z-paging ref="paging" v-model="dataList" @query="queryLis ...

  9. openfly:基于nginx的4层代理管理平台

    简介 作者:京城郭少 基于nginx的4层代理管理平台 支持的功能: 被动健康检查 白名单 include导入文件 哈希 backup冗余互备 weight权重 注释 ...... 部署openfly ...

  10. 05-Python函数

    函数定义与调用 函数由以下几个部分组成: 函数名 函数参数 函数体 返回值 定义一个函数: def showMyName(name): #定义函数 print(name) showMyName(&qu ...