2.1 要事先行
在使用Kafka之前需要先做一些事情,接下来介绍怎样做。
2.1.1 选择操作系统
Kafka是使用Java开发的应用程序,所以它可以运行在Windows、MacOS和Linux等多种操作系统上。本章将着重介绍如何在Linux上安装和使用Kafka,因为把Kafka安装在Linux系统上是最为常见的。即使只是把Kafka作为一般性用途,仍然推荐使用Linux系统。关于如何在Windows和MacOS上安装Kafka,请参考附录A。
2.1.2 安装Java
在安装Zookeeper和Kafka之前,需要先安装Java环境。这里推荐安装Java 8,可以使用系统自带的安装包,也可以直接从java.com网站下载。虽然运行Zookeeper和Kafka只需要Java运行时版本,但也可以安装完整的JDK,以备不时之需。假设JDK 8 update 51已经安装在/usr/java/jdk1.8.0 51目录下,其他软件的安装都是基于这个前提进行的。
2.1.3 安装Zookeeper
Kafka使用Zookeeper保存集群的元数据信息和消费者信息。Kafka发行版自带了Zookeeper,可以直接从脚本启动,不过安装一个完整版的Zookeeper也并不费劲。
图2-1:Kafka和Zookeeper
Zookeeper的3.4.6稳定版已经在Kafka上做过全面测试,可以从apache.org下载该版本的Zookeeper:http://bit.ly/2sDWSgJ。
1.单机服务
下面的例子演示了如何使用基本的配置安装Zookeeper,安装目录为/usr/local/zookeeper,数据目录为/var/lib/zookeeper。
# tar -zxf zookeeper-3.4.6.tar.gz # mv zookeeper-3.4.6 /usr/local/zookeeper # mkdir -p /var/lib/zookeeper # cat > /usr/local/zookeeper/conf/zoo.cfg << EOF > tickTime=2000 > dataDir=/var/lib/zookeeper > clientPort=2181 > EOF # export JAVA HOME=/usr/java/jdk1.8.0 51 # /usr/local/zookeeper/bin/zkServer.sh start JMX enabled by default Using config: /usr/local/zookeeper/bin/../conf/zoo.cfg Starting zookeeper ... STARTED #
现在可以连到Zookeeper端口上,通过发送四字命令srvr来验证Zookeeper是否安装正确。
# telnet localhost 2181 Trying ::1... Connected to localhost. Escape character is '^]'. srvr Zookeeper version: 3.4.6-1569965, built on 02/20/2014 09:09 GMT Latency min/avg/max: 0/0/0 Received: 1 Sent: 0
Connections: 1 Outstanding: 0 Zxid: 0x0 Mode: standalone Node count: 4 Connection closed by foreign host. #
2. Zookeeper群组(Ensemble)
Zookeeper集群被称为群组。Zookeeper使用的是一致性协议,所以建议每个群组里应该包含奇数个节点(比如3个、5个等),因为只有当群组里的大多数节点(也就是法定人数)处于可用状态,Zookeeper才能处理外部的请求。也就是说,如果你有一个包含3个节点的群组,那么它允许一个节点失效。如果群组包含5个节点,那么它允许2个节点失效。
群组节点个数的选择
假设有一个包含5个节点的群组,如果要对群组做一些包括更换节点在内的配置更改,需要依次重启每一个节点。如果你的群组无法容忍多个节点失效,那么在进行群组维护时就会存在风险。不过,也不建议一个群组包含超过7个节点,因为Zookeeper使用了一致性协议,节点过多会降低整个群组的性能。
群组需要有一些公共配置,上面列出了所有服务器的清单,并且每个服务器还要在数据目录中创建一个myid文件,用于指明自己的ID。如果群组里服务器的机器名是zoo1. example.com、zoo2.example.com、zoo3.example.com,那么配置文件可能是这样的:
tickTime=2000 dataDir=/var/lib/zookeeper clientPort=2181 initLimit=20 syncLimit=5 server.1=zoo1.example.com:2888:3888 server.2=zoo2.example.com:2888:3888 server.3=zoo3.example.com:2888:3888
在这个配置中,initLimit表示用于在从节点与主节点之间建立初始化连接的时间上限,syncLimit表示允许从节点与主节点处于不同步状态的时间上限。这两个值都是tickTime的倍数,所以initLimit是20*2000ms,也就是40s。配置里还列出了群组中所有服务器的地址。服务器地址遵循server.X=hostname:peerPort:leaderPort格式,各个参数说明如下:X
服务器的ID,它必须是一个整数,不过不一定要从0开始,也不要求是连续的;
hostname
服务器的机器名或IP地址;
peerPort
用于节点间通信的TCP端口;
leaderPort
用于首领选举的TCP端口。
客户端只需要通过clientPort就能连接到群组,而群组节点间的通信则需要同时用到这3个端口(peerPort、leaderPort、clientPort)。
除了公共的配置文件外,每个服务器都必须在data Dir目录中创建一个叫作myid的文件,文件里要包含服务器ID,这个ID要与配置文件里配置的ID保持一致。完成这些步骤后,就可以启动服务器,让它们彼此间进行通信了。