本篇文章介绍Kafka集群的搭建,主要包括JDK环境配置、Zookeeper集群搭建、Kafka集群搭建这三个步骤,我相信绝大部分人都对JDK环境搭建已经非常熟悉了,所以本章不再啰嗦。

1 Zookeeper简介

ZooKeeper is a centralized service for maintaining configuration information, naming, providing distributed synchronization, and providing group services.

如上,官网是这样描述Zookeeper的,Zookeeper是用于维护配置信息,命名信息,分布式同步,和提供组服务的集中式服务。虽然概念上是这样说,但是它实际上是一个什么东西呢?

其实Zookeeper本质上等于(文件系统+监听机制)

1.1 文件系统

ZooKeeper维护了一个类似文件系统的数据结构,如下图1-1所示,每个子目录项节点称为znode,和文件系统类似,我们可以自由增加、删除znode,不同的是,每个znode是可以存储数据的,比如znode->app2可以存储随意指定的数据,比如value2。

zookeeper和kafka伪分布式安装部署 kafka zookeeper集群_kafka


图1-1

Zookeeper有四种类型的znode

  1. PERSISTENT-持久化目录节点
    客户端与zookeeper断开连接后,该节点依旧存在。比如/app1/p_1是客户端C1连接上Zookeeper Server后创建的持久化目录节点,那么C1断开连接后该节点依然在Server端存在。
  2. PERSISTENT_SEQUENTIAL-持久化顺序编号目录节点
    客户端与zookeeper断开连接后,该节点依旧存在,只是Zookeeper给该节点名称进行顺序编号。
  3. EPHEMERAL-临时目录节点
    客户端与zookeeper断开连接后,该节点被删除。比如/app1/p_1是客户端C1连接上Zookeeper Server后创建的临时目录节点,那么C1断开连接后该节点会被删除。
  4. EPHEMERAL_SEQUENTIAL-临时顺序编号目录节点
    客户端与zookeeper断开连接后,该节点被删除,只是Zookeeper给该节点名称进行顺序编号。
1.2 监听机制

客户端可以注册监听它关心的目录节点,当目录节点发生变化(数据改变、被删除、子目录节点增加删除)时,zookeeper会通知客户端。

2 Zookeeper集群搭建
2.1 集群基本结构

zookeeper和kafka伪分布式安装部署 kafka zookeeper集群_kafka_02


图2-1

本章单机搭建一个具有三个节点的Zookeeper集群,Zookeeper集群中有一个为Leader节点,负责读写请求,其他的节点都为Follower请求,连接到Follower客户端的读写请求都会转发到Leader来处理。

2.2 搭建步骤

Tips:本篇文章环境为阿里云Ubuntu服务器,基于单机安装,base package :/usr/local/software

  1. 首先到官网下载Zookeeper包 http://www.apache.org/dyn/closer.cgi/zookeeper/
wget https://mirrors.bfsu.edu.cn/apache/zookeeper/zookeeper-3.6.2/apache-zookeeper-3.6.2-bin.tar.gz
  1. 解压zookeeper包
tar -zxf apache-zookeeper-3.6.2-bin.tar.gz
  1. 需改文件夹名称(个人喜好)
mv apache-zookeeper-3.6.2-bin zk1
  1. 配置zookeeper到环境变量中
export ZOOKEEPER_HOME=/usr/local/software/zk1
PATH=$PATH:$ZOOKEEPER_HOME/bin
export PATH
  1. 将conf目录下的zoo_sample.cfg复制并为zoo.cfg
cd zk1/conf/
cp zoo_sample.cfg zoo.cfg
  1. 修改zoo.cfg文件内容
initLimit=10
syncLimit=5
dataDir=/usr/local/software/zk1/data
clientPort=2181
server.1=127.0.0.1:2888:3888
server.2=127.0.0.1:4888:5888
server.3=127.0.0.1:6888:7888
tickTime
心跳基本时间单位,毫秒级,这个时间是作为Zookeeper服务器之间或客户端与服务器之间维持心跳的时间间隔,每隔tickTime时间就会发送一个心跳,最小的session过期时间为2倍tickTime。
initLimit
tickTime的个数,表示在leader选举结束后,followers与leader同步需要的时间,如果followers比较多或者说leader的数据灰常多时,同步时间相应可能会增加,那么这个值也需要相应增加。当然,这个值也是follower和observer在开始同步leader的数据时的最大等待时间(setSoTimeout)
syncLimit
tickTime的个数,这时间容易和上面的时间混淆,它也表示follower和observer与leader交互时的最大等待时间,只不过是在与leader同步完毕之后,进入正常请求转发或ping等消息交互时的超时时间。
dataDir
内存数据库快照存放地址,如果没有指定事务日志存放地址(dataLogDir),默认也是存放在这个路径下,建议两个地址分开存放到不同的设备上。
clientPort
配置ZK监听客户端连接的端口
server.{zookeeper节点id}={服务器ip地址}:{Leader选举的端口}:{Zookeeper之间通信的端口}
  1. 创建data文件夹
cd /usr/local/software/zk1
mkdir data
  1. 在data文件夹下创建myid文件,并且在文件中写入当前zookeeper的id
cd data
touch myid
echo 1 > myid
  1. 复制zk1文件夹到zk2、zk3,分别修改对应的clientPort和dataDir,myid文件内容
    zk2
    clientPort -> 2182
    dataDir -> /usr/local/software/zk2/data
    myid -> 2
    zk3
    clientPort -> 2183
    dataDir -> /usr/local/software/zk3/data
    myid -> 3
  2. 分别到对应zookeeper文件夹启动zookeeper, 全部启动成功后集群搭建完成
cd zk1
./bin/zkServer.sh start
输出如下
/usr/bin/java
ZooKeeper JMX enabled by default
Using config: /usr/local/software/zk1/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED

./bin/zkServer.sh status
输出如下
/usr/bin/java
ZooKeeper JMX enabled by default
Using config: /usr/local/software/zk1/bin/../conf/zoo.cfg
Client port found: 2181. Client address: localhost. Client SSL: false.
Mode: follower

其余两个也类似方式启动, 解析一下什么一定要到对应目录下找到脚本启动,那是因为zookeeper的启动脚本指定了log等文件的位置在当前目录(命令执行的目录),因此为了不引起混乱,分别定位到对应的文件夹调用该文件夹下bin目录的命令启动是一个比较好的选择,启动后就可以使用环境变量中配置的zookeeper脚本来连接你期望的那台服务器。包括下文kafka的启动也是类似。

2.3 基本命令

zkCli.sh -server localhost:2181 连接zookeeper服务器

接下来分享几个常用基本命令

  1. create : 创建一个节点(默认创建持久化节点)
创建持久化节点
[zk: localhost:2181(CONNECTED) 20] create /app1
Created /app
[zk: localhost:2181(CONNECTED) 21] ls /app1
[]
创建临时节点
[zk: localhost:2181(CONNECTED) 22] create -e /app2
Created /app2
[zk: localhost:2181(CONNECTED) 23] ls /app2
[]
创建持久化有序节点
[zk: localhost:2181(CONNECTED) 33] create /s
Created /s
[zk: localhost:2181(CONNECTED) 34] create -s /s/permanent
Created /s/permanent0000000000
[zk: localhost:2181(CONNECTED) 35] create -s /s/permanent
Created /s/permanent0000000001
[zk: localhost:2181(CONNECTED) 36] create -s /s/permanent
Created /s/permanent0000000002
[zk: localhost:2181(CONNECTED) 36] ls /s/permanent
Node does not exist: /s/permanent
[zk: localhost:2181(CONNECTED) 37] ls /s
[permanent0000000000, permanent0000000001, permanent0000000002]
创建临时有序节点
[zk: localhost:2181(CONNECTED) 39] create /t
Created /t
[zk: localhost:2181(CONNECTED) 40] create -es /t/tmp
Created /t/tmp0000000000
[zk: localhost:2181(CONNECTED) 41] create -es /t/tmp
Created /t/tmp0000000001
[zk: localhost:2181(CONNECTED) 42] create -es /t/tmp
Created /t/tmp0000000002
[zk: localhost:2181(CONNECTED) 43] ls /t
[tmp0000000000, tmp0000000001, tmp0000000002]
  1. delete : 删除一个节点
[zk: localhost:2181(CONNECTED) 46] delete /app2
  1. get data : 获取一个节点的内容
[zk: localhost:2181(CONNECTED) 51] get /s
null
  1. set data : 往一个节点写入内容
[zk: localhost:2181(CONNECTED) 52] set /s "value"
[zk: localhost:2181(CONNECTED) 53] get /s
value
  1. ls: 列出节点的所有子节点
3 Kafka集群搭建
  1. 下载Kafka (http://kafka.apache.org/downloads)
wget https://mirrors.bfsu.edu.cn/apache/kafka/2.7.0/kafka_2.12-2.7.0.tgz
  1. 解压
tar -xvf kafka_2.12-2.7.0.tgz
  1. 改名(个人喜好)
mv kafka_2.12-2.7.0 kafka1
  1. 修改conf目录下server.properties配置文件,主要要修改的配置项如下
broker.id=0
port=9092
listeners=PLAINTEXT://{服务器ip地址}:9092
log.dirs=/usr/local/software/kafka1/
zookeeper.connect=127.0.0.1:2181,127.0.0.1:2182,127.0.0.1:2183

broker.id: Kafka 服务器id

listeners: 监听的地址和端口

log.dirs: log.dirs的地址

zookeeper.connect:zookeeper集群地址

  1. 把kafka1配置到环境变量中
export ZOOKEEPER_HOME=/usr/local/software/zk1
export KAFKA_HOME=/usr/local/software/kafka1
PATH=$PATH:$ZOOKEEPER1_HOME/bin:$KAFKA_HOME/bin:
export PATH
  1. 复制kafka1文件夹到kafka2、kafka3,分别修改对应的broker.id和log.dirs
    kafka2
    broker.id-> 1
    port:9093
    log.dirs-> /usr/local/software/kafka2/data
    kafka3
    broker.id-> 1
    port:9094
    log.dirs-> /usr/local/software/kafka3/data
  2. 修改kafka启动内存,由于kafka启动的时候申请的内存最少为1GB,因此,如果基于单机安装的话,需要修改相应目录下bin文件夹下的kafka-server-start.sh 脚本, 把下列的jvm参数修改成你期望的内存值
if [ "x$KAFKA_HEAP_OPTS" = "x" ]; then
    export KAFKA_HEAP_OPTS="-Xmx500M -Xms200M"
fi
  1. 启动kafka
cd kafka1
./bin/kafka-server-start.sh -daemon config/server.properties

其他两个kafka的启动方式类似。日志位于当前文件夹下的logs文件夹下,查看server.out可以查看日志

  1. 查看zookeeper /brokers/ids 节点下三个kafka已经成功注册
[zk: localhost:2181(CONNECTED) 2] ls /brokers/ids
[0, 1, 2]

至此,Kafka单机集群环境已经安装完成,但是要注意的是,生产环境一般会将zookeeper和kafka集群中的各个server分别部署到不同机器,这里只是为了演示整个安装过程,下一篇将介绍一些kafka的基本命令,还有对应zookeeper存储的配置信息