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