我们的目标是在一台机器上部署三个zookeeper的server,并在此基础上部署三个zookeeper的server。
1.zookeeper的部署
zookeeper的部署采用伪集群模式,即在一台电脑上部署多个server。
1.1.建立文件夹,存放项目
在你喜欢的位置(我的目录为D:\WorkSpace)建立一个名为zookeeper的文件夹,并在该文件夹下建立三个目录,分别名为server1,server2和server3。完成之后如下图所示:
1.2.下载zookeeper
下载地址:http://apache.fayea.com/zookeeper/。或者直接去zookeeper官网自己找对应的版本也是一样的。
1.3.解压文件并创建一些目录
将下载好的压缩包解压到server1目录下,并在server1目录下建三个文件夹,分别名为data,dataLog和logs。完成之后应该是这样的。
注意:压缩包解压的时候直接选【解压到当前文件夹】即可。所以上图中的zookeeper-3.4.10文件夹打开之后应该是这样的:
1.4.在server1/data目录下,创建一个叫做myid的文件。
注意,这个文件不需要任何扩展名,所以显示的形式如下图所示:
如果你看到的myid文件不是这样的,说明你的扩展名没有去除。在windows系统下,文件扩展名默认是被隐藏的。在【查看】选项卡里勾选【文件扩展名】,你就能看到被隐藏的扩展名了。
1.5.打开myid文件,在里面添加对应的id
因为我们目前配置的是server1,所以添加id为1,然后关闭即可。
这里打开myid文件使用的编辑器是notepad++,如果没有安装的话,可以下载一个安装一下。下载地址:https://notepad-plus-plus.org/。
1.6.修改配置文件
在server1/zookeeper-3.4.10/conf目录下,新建zoo.cfg文件,加入内容如下:
|
|
注意,dataDir和dataLogDir中的D:/WorkSpace目录需要改成你自己的目录。
这里对zoo.cfg中的内容进行简要地说明:
tickTime为客户端与服务器之间或服务器互相之间的心跳间隔,以ms为单位。
initLimit为leader与follower进行初始连接时最多能够容忍的心跳数。
syncLimit为follower与leader请求和应答之间最多能容忍的心跳数。
dataDir为数据文件目录。
dataLogDir为日志文件目录。
clientPort为客户端连接服务器的端口,zookeeper监听此接口接收客户端访问请求。
最后三行为集群中每个服务器的ip和端口号。前一个端口为leader和follower通信端口,后一个端口为选举新leader时所用的端口。一般来说,在多台电脑的情况下,每台服务器上的端口配置是一样的。不过我们现在使用同一台电脑配置三个server,为了避免冲突,只能把它们改成不一样。
1.7.复制server1中的内容到server2和server3中,并修改相应配置
将server1中的内容分别复制到server2和server3中,并修改/data/myid文件和/zookeeper-3.4.10/conf/zoo.cfg文件。
myid文件只需要将其中的内容改成服务器的序号即可。
zoo.cfg文件需要修改dataDir,dataLogDir和clientPort。修改后的三个文件如下:
server1:
|
|
server2:
|
|
server3:
|
|
1.8.启动服务器
分别进入三个server的/zookeeper-3.4.10/bin目录下,运行:zkServer start 。结果如下图所示:
第一个server启动的时候会报错,这是由于它想要和其他两个server进行通信,而另外两个server还没有搭建起来。不用理会这个错误,继续打开新的cmd窗口,启动其他server就好。注意,原来的窗口不要关!所有server都启动了之后,显示如下:
如果报Invalid arguments, exiting abnormally 的异常的话,只需要在 zkServer start 命令中去掉start,即输入zkServer即可。
1.9.连接客户端
进入任意一个zookeeper-3.4.10目录下,用以下命令启动客户端:zkCli –server 127.0.0.1:2181
,显示如下结果:
输入help,显示可以执行的指令。
做到这一步,zookeeper集群的搭建就完成了。接下来我们要在此基础上搭建kafka的集群。
2.kafka的部署
kafka在设计的时候就依赖于zookeeper,对于kafka而言,zookeeper相当于它的文件系统。每个节点的信息都保存在zookeeper对应的路径下。
(1)Broker注册:Broker在zookeeper中保存为一个临时节点,节点的路径是/brokers/ids/[brokerid],每个节点会保存对应broker的IP以及端口等信息。
(2)Topic注册:在kafka中,一个topic会被分成多个区并被分到多个broker上,分区的信息以及broker的分布情况都保存在zookeeper中,根节点路径为/brokers/topics,每个topic都会在topics下建立独立的子节点,每个topic节点下都会包含分区以及broker的对应信息。
(3)消费者与分区的对应关系:对于每个消费者分组,kafka都会为其分配一个全局唯一的Group ID,分组内的所有消费者会共享该ID,kafka还会为每个消费者分配一个consumer ID,通常采用hostname:uuid的形式。在kafka的设计中规定,对于topic的每个分区,最多只能被一个消费者进行消费,也就是消费者与分区的关系是一对多的关系。消费者与分区的关系被存储在zookeeper中节点的路径为 /consumers/[group_id]/owners/[topic]/[broker_id-partition_id],该节点的内容就是消费者的Consumer ID。
(4)消费者负载均衡:消费者服务启动时,会创建一个属于消费者节点的临时节点,节点的路径为 /consumers/[group_id]/ids/[consumer_id],该节点的内容是该消费者订阅的Topic信息。每个消费者会对/consumers/[group_id]/ids节点注册Watcher监听器,一旦消费者的数量增加或减少就会触发消费者的负载均衡。消费者还会对/brokers/ids/[brokerid]节点进行监听,如果发现服务器的Broker服务器列表发生变化,也会进行消费者的负载均衡。
(5)消费者的offset:在kafka的消费者API分为两种(1)High Level API:由zookeeper维护消费者的offset (2) Low Level API:自己的代码实现对offset的维护。由于自己维护offset往往比较复杂,所以多数情况下都是使用High Level的API offset在zookeeper中的节点路径为/consumers/[group_id]/offsets/[topic]/[broker_id-part_id],该节点的值就是对应的offset。
看到这里,你就会明白kafka和zookeeper之间的关系了。我们现在就是要在已经配置好的zookeeper集群上配置kafka集群。
2.1.建立对应目录
还是找到你喜欢的那个目录(我的是D:\WorkSpace),建立一个叫做kafka的文件夹,里面建立三个子目录,分别叫做:kafka1,kafka2和kafka3。完成之后应该是这个样子:
2.2.下载kafka并解压到每个文件夹
kafka下载地址:
https://www.apache.org/dyn/closer.cgi?path=/kafka/0.10.2.1/kafka_2.12-0.10.2.1.tgz
下载之后是一个压缩包,还是直接解压到kafka1,kafka2和kafka3这三个文件夹就行。解压完后,在 kafka1,kafka2和kafka3目录下分别添加一个kafkaLog目录。最后的结果应该是这个样子的:
2.3.修改配置文件:
分别打开kafka1,kafka2和kafka3三个目录中的kafka_2.12-0.10.2.1/config路径下的consumer.properties文件,将里面的内容改成:
|
|
再打开这三个目录下的server.properties文件,按照下面内容进行修改:
kafka1:
|
|
kafka2:
|
|
kafka3:
|
|
2.4.启动kafka服务器
进入D:/WorkSpace/kafka/kafka1/目录下,输入
.\bin\windows\kafka-server-start.bat .\config\server.properties 命令,注意不要漏掉命令中的“.”。得到的结果如下图所示:
同样地,进入另外两个kafka2 和 kafka3目录下,把另外两个kafka服务器也启动起来。
如果你最后得到的结果是这样的,那么恭喜你,zookeeper和kafka集群已经搭建完成了。
参考链接:
(1)在单机上实现ZooKeeper伪机群/伪集群部署 :
http://blog.csdn.net/poechant/article/details/6633923
(2)一台机器上安装zookeeper和kafka集群:
http://blog.csdn.net/u013244038/article/details/53938997