Kafka权威指南
上QQ阅读APP看书,第一时间看更新

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保持一致。完成这些步骤后,就可以启动服务器,让它们彼此间进行通信了。