kafka学习(二)-zookeeper集群搭建
zookeeper概念
ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,它包含一个简单的原语集,分布式应用程序可以基于它实现同步服务,配置维护和命名 服务等。Zookeeper是hadoop的一个子项目,其发展历程无需赘述。在分布式应用中,由于工程师不能很好地使用锁机制,以及基于消息的协调机制 不适合在某些应用中使用,因此需要有一种可靠的、可扩展的、分布式的、可配置的协调机制来统一系统的状态。Zookeeper的目的就在于此。
1.角色
Zookeeper中的角色主要有以下三类,如下表所示:
系统模型如图所示:
2.设计目的
- 1.最终一致性:client不论连接到哪个Server,展示给它都是同一个视图,这是zookeeper最重要的性能。
- 2 .可靠性:具有简单、健壮、良好的性能,如果消息m被到一台服务器接受,那么它将被所有的服务器接受。
- 3 .实时性:Zookeeper保证客户端将在一个时间间隔范围内获得服务器的更新信息,或者服务器失效的信息。但由于网络延时等原因,Zookeeper不能保证两个客户端能同时得到刚更新的数据,如果需要最新数据,应该在读数据之前调用sync()接口。
- 4 .等待无关(wait-free):慢的或者失效的client不得干预快速的client的请求,使得每个client都能有效的等待。
- 5.原子性:更新只能成功或者失败,没有中间状态。
- 6 .顺序性:包括全局有序和偏序两种:全局有序是指如果在一台服务器上消息a在消息b前发布,则在所有Server上消息a都将在消息b前被发布;偏序是指如果一个消息b在消息a后被同一个发送者发布,a必将排在b前面。
zookeeper集群搭建
下面简单的介绍一下zookeeper的集群搭建,单个zookeeper的安装更简单,下面以集群搭建为例子。
我们设置并部署有三个节点的 ZooKeeper 集合体,必须在每个节点上遵循下面的步骤来启动 ZooKeeper 服务器。
1.环境准备
- 测试服务器(2n+1)奇数台
192.168.181.128 centos6.4
192.168.181.129 centos6.4
192.168.181.130 centos6.4
- 下载zookeeper安装包
http://mirrors.cnnic.cn/apache/zookeeper/zookeeper-3.4.8/
- 修改hosts文件
192.168.181.128 test1
192.168.181.129 test2
192.168.181.130 test3
- 安装jdk,解压安装文件,检查防火墙
2.设计安装目录
- 安装目录:/home/rtmap
- Datadir:/data/zookeeper
- 存放快照:/data/zookeeper/zkdata
- 存在事务:/data/zookeeper/zkdatalog
- 存在日志:/data/zookeeper/logs
3.修改配置文件
#进入conf目录 /home/rtmap/zookeeper-3.4.8/conf #查看 [root@192.168.181.1128]$ ll -rw-rw-r--. 1 1000 1000 535 Feb 20 2014 configuration.xsl -rw-rw-r--. 1 1000 1000 2161 Feb 20 2014 log4j.properties -rw-rw-r--. 1 1000 1000 922 Feb 20 2014 zoo_sample.cfg
#zoo_sample.cfg 这个文件是官方给我们的zookeeper的样板文件,给他复制一份命名为zoo.cfg,zoo.cfg是官方指定的文件命名规则。
tickTime=2000 initLimit=10 syncLimit=5 dataDir=/data/zookeeper/zkdata dataLogDir=/data/zookeeper/zkdatalog clientPort=2181 #服务端口号 server.1=192.168.181.128:2888:3888 server.2=192.168.181.129:2888:3888 server.3=192.168.181.130:2888:3888 #server.1 这个1是服务器的标识也可以是其他的数字, 表示这个是第几号服务器,用来标识服务器,这个标识要写到快照目录下面myid文件里 #192.168.181.128为集群里的IP地址,第一个端口是master和slave之间的通信端口,默认是2888,第二个端口是leader选举的端口,集群刚启动的时候选举或者leader挂掉之后进行新的选举的端口默认是3888
配置文件解释:
#tickTime: 这个时间是作为 Zookeeper 服务器之间或客户端与服务器之间维持心跳的时间间隔,也就是每个 tickTime 时间就会发送一个心跳。 #initLimit: 这个配置项是用来配置 Zookeeper 接受客户端(这里所说的客户端不是用户连接 Zookeeper 服务器的客户端,而是 Zookeeper 服务器集群中连接到 Leader 的 Follower 服务器)初始化连接时最长能忍受多少个心跳时间间隔数。当已经超过 5个心跳的时间(也就是 tickTime)长度后 Zookeeper 服务器还没有收到客户端的返回信息,那么表明这个客户端连接失败。总的时间长度就是 5*2000=10 秒 #syncLimit: 这个配置项标识 Leader 与Follower 之间发送消息,请求和应答时间长度,最长不能超过多少个 tickTime 的时间长度,总的时间长度就是5*2000=10秒 #dataDir: 快照日志的存储路径 #dataLogDir: 事物日志的存储路径,如果不配置这个那么事物日志会默认存储到dataDir制定的目录,这样会严重影响zk的性能,当zk吞吐量较大的时候,产生的事物日志、快照日志太多 #clientPort: 这个端口就是客户端连接 Zookeeper 服务器的端口,Zookeeper 会监听这个端口,接受客户端的访问请求。修改他的端口改大点
在dataDir目录/data/zookeeper/下写一个myid文件,命令如下:
#server1 echo "1" > /data/zookeeper/zkdata/myid #server2 echo "2" > /data/zookeeper/zkdata/myid #server3 echo "3" > /data/zookeeper/zkdata/myid
注意:这个id是zookeeper的主机标示,每个主机id不同第二台是2 第三台是3,分别和上面的zoo.cfg文件的server.1,server.2,server.3对应。
4.修改日志
如果不做修改,默认zookeeper的日志输出信息都打印到了zookeeper.out文件中,这样输出路径和大小没法控制,因为日志文件没有轮转。所以需要修改日志输出方式。具体操作如下:
1、修改$ZOOKEEPER_HOME/bin目录下的zkEnv.sh文件,ZOO_LOG_DIR指定想要输出到哪个目录,ZOO_LOG4J_PROP,指定INFO,ROLLINGFILE的日志APPENDER.
2、修改$ZOOKEEPER_HOME/conf/log4j.properties文件的:zookeeper.root.logger的值 与前一个文件的ZOO_LOG4J_PROP 保持一致,该日志配置是以日志文件大小轮转的,如果想要按照天轮转,可以修改为DaliyRollingFileAppender.
5.启动服务并查看
- 启动服务
#进入到Zookeeper的bin目录下 cd /opt/zookeeper/zookeeper-3.4.6/bin #启动服务(3台都需要操作) ./zkServer.sh start
注意:如果你启动台就去查看日志的话,可能会报错,不用管,那是因为没有链接上另外两个的3888端口。
- 检查服务状态
#检查服务器状态 ./zkServer.sh status JMX enabled by default Using config: /opt/zookeeper/zookeeper-3.4.6/bin/../conf/zoo.cfg #配置文件 Mode: follower #他是否为领导
注意:zk集群一般只有一个leader,多个follower,主一般是相应客户端的读写请求,而从主同步数据,当主挂掉之后就会从follower里投票选举一个leader出来。
参考文档:http://www.cnblogs.com/luotianshuai/p/5206662.html