ZooKeeper环境搭建(单机/集群)(转)

前提:html

配置文件主要是在$ZOOKEEPER_HOME/conf/zoo.cfg,刚解压时为zoo_sample.cfg,重命名zoo.cfg便可。linux

配置文件经常使用项参考:http://www.cnblogs.com/EasonJim/p/7483880.html数据库

ZooKeeper基于Java开发,因此在运行前须要安装JDK。服务器

环境搭建:session

1、ZooKeeper的搭建方式

ZooKeeper安装方式有三种,单机模式集群模式以及伪集群模式并发

  • 单机模式:ZooKeeper只运行在一台服务器上,适合测试环境;
  • 伪集群模式:就是在一台物理机上运行多个ZooKeeper 实例;
  • 集群模式:ZooKeeper运行于一个集群上,适合生产环境,这个计算机集群被称为一个“集合体”(ensemble)

ZooKeeper经过复制来实现高可用性,只要集合体中半数以上的机器处于可用状态,它就可以保证服务继续。为何必定要超过半数呢?这跟ZooKeeper的复制策略有关:ZooKeeper确保对ZNode树的每个修改都会被复制到集合体中超过半数的机器上。ssh

1.一、ZooKeeper的单机模式搭建

下载ZooKeeper:http://www.cnblogs.com/EasonJim/p/7481710.html分布式

解压oop

tar -zxvf ZooKeeper-3.4.9.tar.gz 

移动到文件夹:性能

sudo mv ZooKeeper-3.4.9 /usr/local/zk 

配置文件:在conf目录下删除zoo_sample.cfg文件,建立一个配置文件zoo.cfg。

只关注如下几项

tickTime=2000
dataDir=/usr/local/zk/data
dataLogDir=/usr/local/zk/logs        
clientPort=2181

注意:以上路径的文件夹须要手动建立,且要赋予权限,而且不能放在/tmp文件夹。

建立文件夹:

#建立
sudo mkdir -p /usr/local/zk/data sudo mkdir -p /usr/local/zk/logs
#设置权限
sudo chmod -R 777 /usr/local/data
sudo chmod -R 777 /usr/local/logs 

配置环境变量:为了从此操做方便,咱们须要对ZooKeeper的环境变量进行配置,方法以下在/etc/profile文件中加入以下内容:

export ZOOKEEPER_HOME=/usr/local/zk
export PATH=.:$HADOOP_HOME/bin:$ZOOKEEPER_HOME/bin:$JAVA_HOME/bin:$PATH

启动ZooKeeper的Server:zkServer.sh start;关闭ZooKeeper的Server:zkServer.sh stop

1.二、ZooKeeper的伪集群模式搭建

ZooKeeper不但能够在单机上运行单机模式ZooKeeper,并且能够在单机模拟集群模式 ZooKeeper的运行,也就是将不一样节点运行在同一台机器。咱们知道伪分布模式下Hadoop的操做和分布式模式下有着很大的不一样,可是在集群为分布式模式下对ZooKeeper的操做却和集群模式下没有本质的区别。显然,集群伪分布式模式为咱们体验ZooKeeper和作一些尝试性的实验提供了很大的便利。好比,咱们在实验的时候,能够先使用少许数据在集群伪分布模式下进行测试。当测试可行的时候,再将数据移植到集群模式进行真实的数据实验。这样不 但保证了它的可行性,同时大大提升了实验的效率。这种搭建方式,比较简便,成本比较低,适合测试和学习,若是你的手头机器不足,就能够在一台机器上部署了 3个Server。

1.2.一、注意事项

在一台机器上部署了3个Server,须要注意的是在集群为分布式模式下咱们使用的每一个配置文档模拟一台机器,也就是说单台机器及上运行多个ZooKeeper实例。可是,必须保证每一个配置文档的各个端口号不能冲突,除了clientPort不一样以外,dataDir也不一样。另外,还要在dataDir所对应的目录中建立myid文件来指定对应的ZooKeeper服务器实例。

  • clientPort端口:若是在1台机器上部署多个Server,那么每台机器都要不一样的clientPort,好比Server1是2181,Server2是2182,Server3是2183
  • dataDir和dataLogDir:dataDir和dataLogDir也须要区分下,将数据文件和日志文件分开存放,同时每一个Server的这两变量所对应的路径都是不一样的
  • server.X和myid: server.X这个数字就是对应,data/myid中的数字。在3个Server的myid文件中分别写入了0,1,2,那么每一个Server中的zoo.cfg都配server.0,server.2,server.3就好了。由于在同一台机器上,后面连着的2个端口,3个Server都不要同样,不然端口冲突。

下面是我所配置的集群伪分布模式,分别经过zoo1.cfg、zoo2.cfg、zoo3.cfg来模拟由三台机器的ZooKeeper集群

1.2.1.一、此时须要在/usr/local/zk/conf文件夹下建立三个文件zoo1.cfg、zoo2.cfg、zoo3.cfg

代码清单zoo1.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.
dataDir=/usr/local/zk/data_1

# the port at which the clients will connect
clientPort=2181

#the location of the log file
dataLogDir=/usr/local/zk/logs_1

server.0=localhost:2287:3387
server.1=localhost:2288:3388
server.2=localhost:2289:3389

代码清单zoo2.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.
dataDir=/usr/local/zk/data_2

# the port at which the clients will connect
clientPort=2182

#the location of the log file
dataLogDir=/usr/local/zk/logs_2

server.0=localhost:2287:3387
server.1=localhost:2288:3388
server.2=localhost:2289:3389

代码清单zoo3.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.
dataDir=/usr/local/zk/data_3

# the port at which the clients will connect
clientPort=2183

#the location of the log file
dataLogDir=/usr/local/zk/logs_3

server.0=localhost:2287:3387
server.1=localhost:2288:3388
server.2=localhost:2289:3389

1.2.1.二、在/usr/local/zk建立三个data_{1/2/3}、logs_{1/2/3}

#建立
sudo mkdir -p
/usr/local/zk/data_1 sudo mkdir -p /usr/local/zk/data_2 sudo mkdir -p /usr/local/zk/data_3 sudo mkdir -p /usr/local/zk/logs_1 sudo mkdir -p /usr/local/zk/logs_2 sudo mkdir -p /usr/local/zk/logs_3
#设置权限
sudo chmod -R 777 /usr/local/data_1
sudo chmod -R 777 /usr/local/data_2
sudo chmod -R 777 /usr/local/data_3
sudo chmod -R 777 /usr/local/logs_1
sudo chmod -R 777 /usr/local/logs_2
sudo chmod -R 777 /usr/local/logs_3

1.2.1.三、分别在data_{1/2/3}文件夹下建立myid文件,并写入0/1/2

echo "0">/usr/local/data_1/myid
echo "1">/usr/local/data_2/myid
echo "2">/usr/local/data_3/myid

1.2.二、启动

在集群为分布式下,咱们只有一台机器,按时要运行三个ZooKeeper实例。此时,若是在使用单机模式的启动命令是行不通的。此时,只要经过下面三条命令就能运行前面所配置的ZooKeeper服务。以下所示:

zkServer.sh start zoo1.cfg
zkServer.sh start zoo2.cfg
zkServer.sh start zoo3.cfg

启动过程,以下图所示:

启动结果,以下图所示:

在运行完第一条指令以后,会出现一些错误异常,产生异常信息的缘由是因为ZooKeeper服务的每一个实例都拥有全局配置信息,他们在启动的时候会随时随地的进行Leader选举操做。此时,第一个启动的ZooKeeper须要和另外两个ZooKeeper实例进行通讯。可是,另外两个ZooKeeper实例尚未启动起来,所以就产生了这的异样信息。咱们直接将其忽略便可,待把图中“2号”和“3号”ZooKeeper实例启动起来以后,相应的异常信息天然会消失。此时,能够经过下面三条命令,来查询。

 zkServer.sh status zoo1.cfg
 zkServer.sh status zoo2.cfg
 zkServer.sh status zoo3.cfg

ZooKeeper服务的运行状态,以下图所示:

提示:若是以上配置复杂,那么能够直接拷贝三个ZooKeeper的运行目录分别命令为ZooKeeper_1/ZooKeeper_2/ZooKeeper_3

1.三、ZooKeeper的集群模式搭建

为了得到可靠地ZooKeeper服务,用户应该在一个机群上部署ZooKeeper。只要机群上大多数的ZooKeeper服务启动了,那么总的ZooKeeper服务将是可用的。集群的配置方式,和前两种相似,一样须要进行环境变量的配置。在每台机器上conf/zoo.cfg配置文件的参数设置相同

1.3.一、建立myid

在dataDir(/usr/local/zk/data)目录建立myid文件

Server0机器的内容为:0

Server1机器的内容为:1

Server2机器的内容为:2

echo "0">/usr/local/data/myid
echo "1">/usr/local/data/myid
echo "2">/usr/local/data/myid

1.3.二、编写配置文件

在conf目录下删除zoo_sample.cfg文件,建立一个配置文件zoo.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.
dataDir=/usr/local/zk/data

# the port at which the clients will connect
clientPort=2183

#the location of the log file
dataLogDir=/usr/local/zk/log

server.0=hadoop:2288:3388
server.1=hadoop0:2288:3388
server.2=hadoop1:2288:3388

说明:hadoop为host指向的名称,固然也能够直接使用IP。

1.3.三、启动

分别在3台机器上启动ZooKeeper的Server:zkServer.sh start;

2、ZooKeeper的配置

ZooKeeper的功能特性是经过ZooKeeper配置文件来进行控制管理的(zoo.cfg),这样的设计其实有其自身的缘由,经过前面对ZooKeeper的配置能够看出,在对ZooKeeper集群进行配置的时候,它的配置文档是彻底相同的。集群伪分布模式中,有少部分是不一样的。这样的配置方式使得在部署ZooKeeper服务的时候很是方便。若是服务器使用不一样的配置文件,必须确保不一样配置文件中的服务器列表相匹配。

在设置ZooKeeper配置文档时候,某些参数是可选的,某些是必须的。这些必须参数就构成了ZooKeeper配置文档的最低配置要求。另外,若要对ZooKeeper进行更详细的配置,能够参考下面的内容。

2.1 基本配置

下面是在最低配置要求中必须配置的参数:

①、client:监听客户端链接的端口。

②、tickTime:基本事件单元,这个时间是做为ZooKeeper服务器之间或客户端与服务器之间维持心跳的时间间隔,每隔tickTime时间就会发送一个心跳;最小 的session过时时间为2倍tickTime   

③、dataDir:存储内存中数据库快照的位置,若是不设置参数,更新食物的日志将被存储到默认位置。

应该谨慎的选择日志存放的位置,使用专用的日志存储设备可以大大提升系统的性能,若是将日志存储在比较繁忙的存储设备上,那么将会很大程度上影响系统性能。

2.二、高级配置

下面是高级配置参数中可选配置参数,用户可使用下面的参数来更好的规定ZooKeeper的行为:

①、dataLogdDir

这个操做让管理机器把事务日志写入“dataLogDir”所指定的目录中,而不是“dataDir”所指定的目录。这将容许使用一个专用的日志设备,帮助咱们避免日志和快照的竞争。配置以下:

# the directory where the snapshot is stored
dataDir=/usr/local/zk/data  

②、maxClientCnxns

这个操做将限制链接到ZooKeeper的客户端数量,并限制并发链接的数量,经过IP来区分不一样的客户端。此配置选项能够阻止某些类别的Dos攻击。将他设置为零或忽略不进行设置将会取消对并发链接的限制。

例如,此时咱们将maxClientCnxns的值设为1,以下所示:

# set maxClientCnxns
maxClientCnxns=1

启动ZooKeeper以后,首先用一个客户端链接到ZooKeeper服务器上。以后若是有第二个客户端尝试对ZooKeeper进行链接,或者有某些隐式的对客户端的链接操做,将会触发ZooKeeper的上述配置。

③、minSessionTimeoutmaxSessionTimeout

即最小的会话超时和最大的会话超时时间。在默认状况下,minSession=2*tickTime;maxSession=20*tickTime。

2.3 集群配置

①、initLimit

此配置表示,容许follower(相对于Leaderer言的“客户端”)链接并同步到Leader的初始化链接时间,以tickTime为单位。当初始化链接时间超过该值,则表示链接失败。

②、syncLimit

此配置项表示Leader与Follower之间发送消息时,请求和应答时间长度。若是Follower在设置时间内不能与Leader通讯,那么此Follower将会被丢弃。

③、server.A=B:C:D

A:其中A是一个数字,表示这个是服务器的编号;

B:是这个服务器的IP地址;

C:Leader选举的端口;

D:ZooKeeper服务器之间的通讯端口。

④、myidzoo.cfg

除了修改zoo.cfg配置文件,集群模式下还要配置一个文件myid,这个文件在dataDir目录下,这个文件里面就有一个数据就是A的值,ZooKeeper启动时会读取这个文件,拿到里面的数据与zoo.cfg里面的配置信息比较从而判断究竟是那个Server。

3、搭建ZooKeeper服务器集群(搭建实例)

说明:如下命令要注意权限,非root用户下要加sudo

搭建要求:

一、ZK服务器集群规模不小于3个节点,推荐2*N+1。

二、要求各服务器之间系统时间要保持一致。

3.一、安装配置ZK

①、使用WinScp将Zk传输到Hadoop主机上的/usr/local,我用的版本是ZooKeeper-3.4.5.tar.gz。

②、在hadoop的/usr/local目录下,解压缩zk....tar.gz,设置环境变量

解压缩:在/usr/local目录下,执行命令:tar -zxvf ZooKeeper-3.4.5.tar.gz,以下图所示:

重命名:解压后将文件夹,重命名为zk,执行命令: mv ZooKeeper-3.4.5 zk,以下图所示:

设置环境变量:执行命令: vi /etc/profile ,添加 :export ZOOKEEPER_HOME=/usr/local/zk,如图2.3所示的内容。执行命令:source /etc/profile 以下图所示:

2.二、修改ZK配置文件

①、重命名:将/usr/local/zk/conf目录下zoo_sample.cfg,重命名为zoo.cfg,执行命令:mv zoo_sample.cfg zoo.cfg。如以下图所示:

②、查看:在/usr/local/zk/conf目录下,修改文件vi zoo.cfg,文件内容以下图所示。在该文件中dataDir表示文件存放目录,它的默认设置为/tmp/ZooKeeper这是一个临时存放目录,每次重启后会丢失,在这咱们本身设一个目录,/usr/local/zk/data。

③、建立文件夹:mkdir /usr/local/zk/data

④、建立myid:在data目录下,建立文件myid,值为0;vi myid ;内容为0。

⑤、编辑:编辑该文件,执行vi zoo.cfg ,修改dataDir=/usr/local/zk/data。

新增

server.0=hadoop:2888:3888
server.1=hadoop0:2888:3888
server.2=hadoop1:2888:3888

tickTime :这个时间是做为ZooKeeper服务器之间或客户端与服务器之间维持心跳的时间间隔,也就是每一个tickTime 时间就会发送一个心跳;

dataDir:顾名思义就是ZooKeeper保存数据的目录,默认状况下,ZooKeeper将写数据的日志文件也保存在这个目录里;

clientPort:这个端口就是客户端链接ZooKeeper服务器的端口,ZooKeeper会监听这个端口,接受客户端的访问请求。

当这些配置项配置好后,就能够启动ZooKeeper了,启动后使用命令echo ruok | nc localhost 2181检查ZooKeeper是否已经在服务。

2.三、配置其余节点

①、把haooop主机的zk目录和/etc/profile目录,复制到hadoop0和hadoop1中。执行命令:

scp -r /usr/local/zk/ hadoop0:/usr/local/
scp -r /usr/local/zk/ hadoop1:/usr/local/
scp /etc/profile hadoop0:/etc/
scp /etc/profile hadoop1:/etc/

ssh hadoop0
suorce /etc/profile
vi /usr/local/zk/data/myid
exit

ssh hadoop1
suorce /etc/profile
vi /usr/local/zk/data/myid
exit

②、把hadoop1中相应的myid的值改成1,把hadoop2中相应的myid的值改成2。   

4、启动检验

一、启动,在三个节点上分别执行命令zkServer.sh start

hadoop节点

hadoop0节点

hadoop1节点

二、检验,在三个节点上分别执行命令zkServer.sh status,从下面的图中咱们会发现hadoop和hadoop1为Follower,hadoop0为Leader。

hadoop节点

hadoop0节点

hadoop1节点

 

参考:

http://www.cnblogs.com/sunddenly/p/4018459.html(以上内容大部分转自此篇文章)

http://www.cnblogs.com/qizhelongdeyang/p/6901560.html

http://blog.csdn.net/lemon_tree12138/article/details/51445689

http://blog.sina.com.cn/s/blog_790c59140102w5h1.html

http://blog.csdn.net/shirdrn/article/details/7183503/

http://blog.csdn.net/yinkgh/article/details/52301063

http://www.cnblogs.com/linuxprobe/p/5851699.html

http://www.linuxidc.com/Linux/2015-02/114230.htm

http://www.cnblogs.com/huangxincheng/p/5654170.html

http://www.linuxidc.com/Linux/2013-04/83562.htm

http://www.cnblogs.com/z-sm/p/5691752.html

http://nileader.blog.51cto.com/1381108/795230

http://data.qq.com/article?id=2863

http://blog.csdn.net/tanyujing/article/details/8504481

http://blog.csdn.net/poechant/article/details/6633923

相关文章
相关标签/搜索