【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

 

posted @ 2020-08-06 20:44  emdzz  阅读(476)  评论(0编辑  收藏  举报