ZooKeeper系列(1):安装搭建ZooKeeper环境
ZooKeeper系列文章:https://www.cnblogs.com/f-ck-need-u/p/7576137.html#zk
ZooKeeper有三种安装模式:单机安装(standalone)、伪集群模式、集群模式:
- standalone模式:只在一台机器上安装ZooKeeper,并只启动一个ZooKeeper实例。
- 伪集群:在一台机器上开启多个ZooKeeper实例来模拟集群。通过加载不同配置文件,分配不同数据目录来实现这种模式。因为在同一机器上运行,所以机器宕机,整个ZooKeeper就挂了。基本上不会布置这样的ZooKeeper集群。
- 集群模式:在至少3台机器上安装ZooKeeper构成集群,只要故障节点数量在一定范围内就能保证ZooKeeper服务的可用性。
真正布置的基本上都是集群模式,standalone偶尔用来做些测试,它有单点故障,伪集群模式也有单点故障。
集群模式并非一定至少3台机器,但用2台机器比1台机器更危险,因为随便故障一台都无法满足"大多数"的要求,都会阻塞整个ZooKeeper服务。而2台机器的故障几率是1台机器的2倍。所以,也建议采用奇数台机器来部署ZooKeeper。
ZooKeeper下载:https://mirrors.tuna.tsinghua.edu.cn/apache/zookeeper/stable/
我下载的是3.4.12版本。
1.安装jdk
ZooKeeper运行在java环境下,所以需要先安装jdk,且要求版本高于1.6。
jdk下载:http://www.oracle.com/technetwork/java/javase/downloads/index.html
以rpm包的为例。
yum localinstall -y jdk-8u131-linux-x64.rpm
rpm包的安装路径为/usr/java。
[root@s1 ~]# ls -l /usr/java/
total 4
lrwxrwxrwx 1 root root 16 Jun 26 22:53 default -> /usr/java/latest
drwxr-xr-x 9 root root 4096 Jun 26 22:53 jdk1.8.0_131
lrwxrwxrwx 1 root root 22 Jun 26 22:53 latest -> /usr/java/jdk1.8.0_131
通过这种软链接方式,以后有新版jdk要安装,直接改latest的链接对象即可。
然后再设置JAVA_HOME环境变量并导出java程序所在目录的PATH环境变量。
echo 'JAVA_HOME=/usr/java/latest' > /etc/profile.d/jdk.sh
echo 'PATH=$JAVA_HOME/bin:$PATH' >> /etc/profile.d/jdk.sh
chmod +x /etc/profile.d/jdk.sh
source /etc/profile.d/jdk.sh
2.StandAlone模式
standalone模式是在单机上安装ZooKeeper。
先解压zookeeper-3.4.12.tar.gz。
tar xf zookeeper-3.4.12.tar.gz
再把它移到/usr/local/下方便管理。
mv zookeeper-3.4.12 /usr/local/zookeeper
在ZooKeeper的bin目录下提供了几个Windows和Linux下的脚本:
[root@s2 zookeeper]# cd /usr/local/zookeeper
[root@s2 zookeeper]# ls bin
README.txt zkCleanup.sh zkCli.cmd zkCli.sh zkEnv.cmd zkEnv.sh zkServer.cmd zkServer.sh
- zkServer:用于启动、停止ZooKeeper,且能查看ZooKeeper状态。
zkServer.sh {start|start-foreground|stop|restart|status|upgrade|print-cmd}
- zkEnv:设置ZooKeeper启动、关闭时的环境变量。在其余的每个脚本中都引用了这个脚本。
- zkCleanup:清除ZooKeeper的事务日志和快照。
- zkCli:ZooKeeper的一个命令行客户端。
设置ZooKeeper的环境变量,这不是必须的,只是为了方便操作上面的几个脚本。
echo 'ZOOKEEPER_HOME=/usr/local/zookeeper' >/etc/profile.d/zk.sh
echo 'PATH=$ZOOKEEPER_HOME/bin:$PATH' >> /etc/profile.d/zk.sh
chmod +x /etc/profile.d/zk.sh
source /etc/profile.d/zk.sh
把windows下的脚本删除:
rm -rf /usr/local/zookeeper/bin/{*.cmd,README.txt}
为了启动ZooKeeper,先提供一个配置文件。默认配置文件的路径为$ZOOKEEPER_HOME下的conf目录。在这个目录下,有几个文件:
[root@s2 zookeeper]# ls conf
configuration.xsl log4j.properties zoo_sample.cfg
configuration.xsl
:无视它。log4f.properties
:是ZooKeeper的日志配置文件。zoo_sample.cfg
:是ZooKeeper的示例配置文件。
zkServer.sh默认的配置文件名为zoo.cfg
。所以,在conf目录下创建一个zoo.cfg。写入几个保证ZooKeeper能正常运行的配置项:
tickTime=2000
dataDir=/usr/local/zookeeper/data1
clientPort=2181
其中:
tickTime
:ZooKeeper中很多配置项(如心跳时间、连接超时时间等)都要用到的时间单位,这里配置为2000毫秒,即2秒。dataDir
:ZooKeeper实例的数据目录。clientPort
:ZooKeeper向外提供服务的端口。
然后用zkServer.sh来启动ZooKeeper。
[root@s2 zk]# zkServer.sh start
ZooKeeper JMX enabled by default
Using config: /usr/local/zookeeper/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED
也可以手动指定启动时读取的配置文件:
[root@s2 zk]# zkServer.sh start /usr/local/zookeeper/conf/zoo.cfg
查看ZooKeeper的运行状态:
[root@s2 zk]# zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /usr/local/zookeeper/bin/../conf/zoo.cfg
Mode: standalone
可以看到运行模式是"standalone"。
ZooKeeper启动后,就可以向外提供ZooKeeper服务了。这里用ZooKeeper提供的命令行客户端去连接一下ZooKeeper做个简单的测试。
连接ZooKeeper实例:
zkCli.sh -server localhost:2181
连接过程中会输出一大堆信息。当连接成功后,将进入ZooKeeper的交互式模式:
WatchedEvent state:SyncConnected type:None path:null
[zk: localhost:2181(CONNECTED) 0] # 在这里输入ZooKeeper允许的命令
例如,创建一个znode:
[zk: localhost:2181(CONNECTED) 0] create /zk_test mydata1
Created /zk_test
[zk: localhost:2181(CONNECTED) 1] ls /
[zookeeper, zk_test]
[zk: localhost:2181(CONNECTED) 2] quit
3.配置伪集群模式
ZooKeeper的伪集群模式是在一个服务器上运行多个ZooKeeper实例来模拟ZooKeeper集群。伪集群模式下,每个实例的配置文件不同、数据目录不同、端口不同。一般来说,ZooKeeper集群至少需要3个服务器节点。
这里,我配置3个实例的ZooKeeper伪集群,它们的数据目录分别为$ZOOKEEPER_HOME
下的data1、data2和data3。因为稍后要向这些目录中写myid文件,所以先创建这3个目录:
mkdir /usr/local/zookeeper/data{1,2,3}
先提供3个实例的配置文件,分别为$ZOOKEEPER_HOME/conf/{zoo1.cfg,zoo2.cfg,zoo3.cfg}
。
以下是zoo1.cfg内容,各配置项稍后解释。
tickTime=2000
dataDir=/usr/local/zookeeper/data1
clientPort=2181
initLimit=5
syncLimit=2
server.1=localhost:2887:3887
server.2=localhost:2888:3888
server.3=localhost:2889:3889
以下是zoo2.cfg内容,各配置项稍后解释。
tickTime=2000
dataDir=/usr/local/zookeeper/data2
clientPort=2182
initLimit=5
syncLimit=2
server.1=localhost:2887:3887
server.2=localhost:2888:3888
server.3=localhost:2889:3889
以下是zoo3.cfg内容,各配置项稍后解释。
tickTime=2000
dataDir=/usr/local/zookeeper/data3
clientPort=2183
initLimit=5
syncLimit=2
server.1=localhost:2887:3887
server.2=localhost:2888:3888
server.3=localhost:2889:3889
上面的配置项中:
initLimit
:当非leader节点(即follower和observer)启动时,需要先从leader那里复制数据,以保证所有ZooKeeper节点数据都是同步的。这个选项设置非leader节点从启动到完成同步的超时时长,它以tickTime为时间单位,所以上面的超时时长为5*2=10
秒。一般来说,ZooKeeper保存的都是协调数据,数据量并不大,所以多数时候可以忽略这个参数,如果待同步数据真的很大,可以考虑增加这个超时时间。
syncLimit
:follower和leader之间数据延迟的最大时间长度。例如,有个节点的更新操作缓慢,它的数据已经严重落后于leader,ZooKeeper就会将它从ZooKeeper集群中踢出去。ZooKeeper使用时间来度量follower和leader之间数据的延迟,这个选项的值依赖于tickTime,例如tickTime=2000,syncLimit=2
表示follower比leader延迟了4秒。server.X=[hostname]:port_A:port_B
:该选项用来指定ZooKeeper集群中的服务器节点。其中:- X:整数。是ZooKeeper中服务器的一个简单标识。这个数值需要和dataDir下的myid文件内容一致。在启动ZooKeeper集群中的每个实例时,需要读取数据目录中的myid文件,并将该文件中的数值和配置文件中的server.X做匹配,匹配到哪个就表示是哪个ZooKeeper服务器节点。
- hostname:ZooKeeper服务器节点的地址。
- port_A:这是第一个端口,用于Follower和Leader之间的数据同步和其它通信。
- port_B:这是第二个端口,用于Leader选举过程中投票通信。
所以,分别在每个实例的dataDir下创建对应的myid文件。
echo 1 >/usr/local/zookeeper/data1/myid
echo 2 >/usr/local/zookeeper/data2/myid
echo 3 >/usr/local/zookeeper/data3/myid
然后启动这3个ZooKeeper实例。
zkServer.sh start /usr/local/zookeeper/conf/zoo1.cfg
zkServer.sh start /usr/local/zookeeper/conf/zoo2.cfg
zkServer.sh start /usr/local/zookeeper/conf/zoo3.cfg
查看当前java进程列表:
[root@s1 zk]# jps -l
5473 org.apache.zookeeper.server.quorum.QuorumPeerMain
5395 org.apache.zookeeper.server.quorum.QuorumPeerMain
5427 org.apache.zookeeper.server.quorum.QuorumPeerMain
5524 sun.tools.jps.Jps
查看这3个实例之间的关系:zoo2.cfg被选为leader,其它是follower。
[root@s1 zk]# zkServer.sh status /usr/local/zookeeper/conf/zoo3.cfg
ZooKeeper JMX enabled by default
Using config: /usr/local/zookeeper/conf/zoo3.cfg
Mode: follower
[root@s1 zk]# zkServer.sh status /usr/local/zookeeper/conf/zoo1.cfg
ZooKeeper JMX enabled by default
Using config: /usr/local/zookeeper/conf/zoo1.cfg
Mode: follower
[root@s1 zk]# zkServer.sh status /usr/local/zookeeper/conf/zoo2.cfg
ZooKeeper JMX enabled by default
Using config: /usr/local/zookeeper/conf/zoo2.cfg
Mode: leader
可以用ZooKeeper提供的命令行客户端工具来测试,写入其中一个实例的数据,其它实例也能收到。
[root@s1 zk]# zkCli.sh -server localhost:2181 create /my_znode hello
......省略.........
WatchedEvent state:SyncConnected type:None path:null
Created /my_znode
[root@s1 zk]# zkCli.sh -server localhost:2182 ls /
......省略........
WatchedEvent state:SyncConnected type:None path:null
[my_znode, zookeeper]
4.配置ZooKeeper集群
以3节点的集群为例:192.168.100.21、192.168.100.22、192.168.100.23。因为前面配置单机ZooKeeper和伪集群ZooKeeper已经解释过所有步骤和配置项的意义,所以这里就直接给步骤。
假设已经在3个节点上都安装好了jdk(这是前提),并下载好了ZooKeeper。
先解压zookeeper-3.4.12.tar.gz。
# 3个节点都执行
tar xf zookeeper-3.4.12.tar.gz
mv zookeeper-3.4.12 /usr/local/zookeeper
添加ZooKeeper环境变量,非必须过程,但建议。
# 在3节点上都执行
echo 'ZOOKEEPER_HOME=/usr/local/zookeeper' >/etc/profile.d/zk.sh
echo 'PATH=$ZOOKEEPER_HOME/bin:$PATH' >> /etc/profile.d/zk.sh
chmod +x /etc/profile.d/zk.sh
source /etc/profile.d/zk.sh
提供配置文件。以下是3个节点上的配置文件:
[root@s1 zk]# cat /usr/local/zookeeper/conf/zoo.cfg
tickTime=2000
dataDir=/usr/local/zookeeper/data
clientPort=2181
initLimit=5
syncLimit=2
server.1=192.168.100.21:2888:3888
server.2=192.168.100.22:2888:3888
server.3=192.168.100.23:2888:3888
在三个节点上都创建好数据目录,并写入myid文件。
# 3个节点上都执行:
mkdir /usr/local/zookeeper/data
# 192.168.100.21上执行
echo 1 >/usr/local/zookeeper/data/myid
# 192.168.100.22上执行
echo 2 >/usr/local/zookeeper/data/myid
# 192.168.100.23上执行
echo 3 >/usr/local/zookeeper/data/myid
启动这3个ZooKeeper实例。
# 3个节点都执行:
zkServer.sh start
然后在3个节点上都验证一下是否正确启动ZooKeeper。
# 节点1上执行:
[root@s1 zk]# zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /usr/local/zookeeper/bin/../conf/zoo.cfg
Mode: follower
# 节点2上执行:
[root@s2 zk]# zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /usr/local/zookeeper/bin/../conf/zoo.cfg
Mode: follower
# 节点3上执行:
[root@s3 zk]# zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /usr/local/zookeeper/bin/../conf/zoo.cfg
Mode: leader
如果某个服务器实例出现了错误,请zkServer.sh stop
关闭ZooKeeper实例,然后jps
命令查看下是否还有ZooKeeper实例在运行,如果有,kill掉。然后再启动ZooKeeper。另外,建议在第一次启动ZooKeeper之前,先将dataDir/version-2目录删除(如果已存在,因为可能是以前的实例因为各种原因而留下来的)。
最后测试下,某节点上创建一个znode,其它节点是否也同步了该节点。
# 在192.168.100.21上创建一个znode:
[root@s2 zk]# zkCli.sh -server 192.168.100.21:2181 create /test_znode "hello world"
Connecting to 192.168.100.21:2181
.........省略..........
Created /test_znode
# 在192.168.100.22上获取这个znode
[root@s2 zk]# zkCli.sh -server 192.168.100.22:2181 get /test_znode
Connecting to 192.168.100.22:2181
.........省略..........
hello world
cZxid = 0x100000002
ctime = Wed Jun 27 08:14:38 CST 2018
mZxid = 0x100000002
mtime = Wed Jun 27 08:14:38 CST 2018
pZxid = 0x100000002
cversion = 0
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 11
numChildren = 0
# 在192.168.100.23上获取这个znode
[root@s2 zk]# zkCli.sh -server 192.168.100.23:2181 ls /
Connecting to 192.168.100.23:2181
.........省略..........
[zookeeper, test_znode]
ZooKeeper系列(1):安装搭建ZooKeeper环境的更多相关文章
- Zookeeper 系列(三)Zookeeper API
Zookeeper 系列(三)Zookeeper API 本节首先介绍 Zookeeper 的 Shell 命令,再对 Java 操作 Zookeeper 的三种方式进行讲解,本节先介绍 Zookee ...
- ZooKeeper 系列(二)—— Zookeeper单机环境和集群环境搭建
一.单机环境搭建 1.1 下载 1.2 解压 1.3 配置环境变量 1.4 修改配置 1.5 启动 1. ...
- ZooKeeper系列(二)—— Zookeeper 单机环境和集群环境搭建
一.单机环境搭建 1.1 下载 下载对应版本 Zookeeper,这里我下载的版本 3.4.14.官方下载地址:https://archive.apache.org/dist/zookeeper/ # ...
- CentOS安装搭建zookeeper
原文连接:https://www.cnblogs.com/rwxwsblog/p/5806075.html zookeeper集群搭建(三台) 注意关闭机器防火墙! 配置ip别名:编辑文件 # /e ...
- ZooKeeper系列(5):管理分布式环境中的数据
引言 本节本来是要介绍ZooKeeper的实现原理,但是ZooKeeper的原理比较复杂,它涉及到了paxos算法.Zab协议.通信协议等相关知 识,理解起来比较抽象所以还需要借助一些应用场景,来帮我 ...
- win7下安装搭建PHP环境
由于最近新找的工作要求php,所以在电脑上安装搭建了PHP环境.主要参考了这篇文章http://www.leapsoul.cn/?p=695(之前第一次搭建时由于版本问题没有弄好) 1.先装apach ...
- Docker 快速安装&搭建 Mysql 环境
欢迎关注个人微信公众号: 小哈学Java, 文末分享阿里 P8 高级架构师吐血总结的 <Java 核心知识整理&面试.pdf>资源链接!! 个人网站: https://www.ex ...
- Docker 快速安装&搭建 MongDB 环境
欢迎关注个人微信公众号: 小哈学Java, 文末分享阿里 P8 高级架构师吐血总结的 <Java 核心知识整理&面试.pdf>资源链接!! 个人网站: https://www.ex ...
- zookeeper系列(八)zookeeper客户端的底层详解
作者:leesf 掌控之中,才会成功:掌控之外,注定失败.出处:http://www.cnblogs.com/leesf456/p/6098255.html 尊重原创,共同学习进步: 一.前言 ...
随机推荐
- 登陆页、注册页、会员中心页logo图的替换
关闭 PHP在线开发笔记 目录视图 摘要视图 订阅 异步赠书:9月重磅新书升级,本本经典 程序员9月书讯 每周荐书:ES6.虚 ...
- POJ1964-City Game
给你N×M大的矩阵,里面分别有字符‘F'和’R',要找到一个最大的只有‘F'的矩阵,不能包含有’R‘.N,M<=1000. 一开始的思路是单调栈来求最大矩形面积,因为没看清题目不能包含’R'字符 ...
- 2018年2月19日我的java学习(——)
在学完了类和对象的时候,开始对面向对象的思想有了一点认识,不过也不是完全的理解了. 就现在的学习状态来说,是非常的不错的,但是在学习的内容来说,我学的好像只是跟随这 站长的思路而已,也许是经验不足吧. ...
- HDFS基本架构及概念介绍
简单介绍 l 设计思想 分而治之:将大文件.大批量文件,分布式存放在大量服务器上,以便于采取分而治之的方式对海量数据进行运算分析: l 在大数据系统中作用: 为各类分布式运算框架(如:mapred ...
- spring 排除指定的类或者包扫描
<!-- 排除Controller注解的扫描 --> <context:component-scan base-package="exampleBean"> ...
- 关于Nginx设置端口号,在Asp.net 获取不到的,解决办法
不知道你有没有遇到过这样的问题,网站访客多起来后,心里很是高兴,加上了Nginx反向代理,出问题了 原来是这么写的: Request.Url.ToString() 输出是这样的: http://www ...
- winform复制文件到指定目录
执行步骤 弹出选择对话框:var openFileDialog = new OpenFileDialog(); 设置选择内容,如所有图片:openFileDialog.Filter="图像文 ...
- FFmpeg命令行工具学习(四):FFmpeg 采集设备
在使用 FFmpeg 作为编码器时,可以使用FFmpeg采集本地的音视频采集设备的数据,然后进行编码.封装.传输等操作. 例如,我们可以采集摄像头的图像作为视频,采集麦克风的数据作为音频,然后对采集的 ...
- Maven 项目打包出现错误 Failed to execute goal org.apache.maven.plugins:maven-resources-plugin
今天碰到一个奇怪的问题,就是我在eclipse中使用maven命令:clean package 命令打完包之后,通过FlashFXP将jar包上传到Linux服务器后,由于其他原因,我想要修改下程序重 ...
- 排除Transformation Errors
当运行session时,会产生大量的Transformation Errors,这些Error会导致性能变慢 1 Transformation Errors导致性能降低的原因 当有大量记录有Trans ...