zookeeper and kafka cluster - downgoon/hello-world GitHub Wiki
版本要求:
- kafka_2.11-0.9.0.1.tgz
- zookeeper-3.4.6.tar.gz
download from tsinghua mirror:
$ wget https://mirrors.tuna.tsinghua.edu.cn/apache/zookeeper/zookeeper-3.4.6/zookeeper-3.4.6.tar.gz && tar zxvf zookeeper-3.4.6.tar.gz && cd zookeeper-3.4.6
$ wget https://mirrors.tuna.tsinghua.edu.cn/apache/kafka/0.9.0.1/kafka_2.11-0.9.0.1.tgz
http://zookeeper.apache.org/doc/r3.4.6/zookeeperStarted.html
- 快速演示
快速演示只需要一条语句:
$ bin/zkServer.sh start
此时默认端口是2181,ZK客户端连接该端口。ZK的信息存储会保存在/tmp/zookeeper
下。千万注意: 这里只是为了快速演示,用/tmp 目录,正式生产用途,数据切勿存放到/tmp,不然数据会时不时被操作系统清除。
Usage:
$ bin/zkServer.sh --help
JMX enabled by default
Using config: /var/wd/zookeeper-3.4.6/bin/../conf/zoo.cfg
Usage: bin/zkServer.sh {start|start-foreground|stop|restart|status|upgrade|print-cmd}
- 配置文件
修改 文件 conf/zoo.cfg
:
dataDir=/tmp/zookeeper # 不妨修改为 /opt/data/zookeeper
clientPort=2181 # 不妨修改为 10081
$ bin/zkCli.sh -server 127.0.0.1:10081
$ help
ZooKeeper -server host:port cmd args
stat path [watch]
set path data [version]
ls path [watch]
delquota [-n|-b] path
ls2 path [watch]
setAcl path acl
setquota -n|-b val path
history
redo cmdno
printwatches on|off
delete path [version]
sync path
listquota path
rmr path
get path [watch]
create [-s] [-e] path data acl
addauth scheme auth
quit
getAcl path
close
connect host:port
$ ls /
$ create /zk_test my_data
$ get /zk_test
my_data
- 集群成员的配置:
编辑 conf/zoo.cfg 文件:
tickTime=2000
initLimit=10
syncLimit=5
dataDir=/var/wd/data/zookeeper
clientPort=10081
server.1=10.213.42.230:2888:3888
server.2=10.213.42.234:2888:3888
server.3=10.213.44.188:2888:3888
假设集群成员有3台机器,则按上面格式列好,每个成员机器都一样的配置。然后在各个成员机器的dataDir
目录下放一个myid
文件:
在 10.213.42.230 机器:
echo "1" > /var/wd/data/zookeeper/myid
在 10.213.42.234 机器:
echo "2" > /var/wd/data/zookeeper/myid
在 10.213.44.188 机器:
echo "3" > /var/wd/data/zookeeper/myid
最后逐个启动 bin/zkServer.sh start
。
解释下刚才的3个server列表配置:
第一个端口是master和slave之间的通信端口,默认是2888,第二个端口是leader选举的端口,集群刚启动的时候选举或者leader挂掉之后进行新的选举的端口默认是3888
ZooKeeper 可视化,主要推荐两个开源:
- ZKUI: Web形式的,地址: https://github.com/DeemOpen/zkui
- zooinspector: 桌面客户端,地址: https://github.com/zzhang5/zooinspector
zkui 的原理很简单:通过配置文件,告知 zookeeper 集群的地址,zkui 会去该集群获取信息,并以 HTTP 页面形式展示出来,同时可以通过HTTP页面来修改ZK的数据。
$ git clone https://github.com/DeemOpen/zkui
$ mvn clean package
$ cp config.cfg target/ && cd target
$ nohup java -jar zkui-2.0-SNAPSHOT-jar-with-dependencies.jar &
- 配置文件 修改配置文件: config.cfg
serverPort=10090 # HTTP 页面端口
zkServer=localhost:10081 # zk 集群的地址
- 登陆访问
浏览器访问: http://10.213.42.230:10090
账号 | 密码 | 权限 |
---|---|---|
admin | manager | 管理员 |
appconfig | appconfig | 只读权限 |
管理员账号密码,可在 config.cfg中修改。
- ZKUI不足
zkui 一个进程只能管理一个ZK集群,暂时不能管理多个集群。
- 修改配置
$ vi config/server.properties
broker.id=0
listeners=PLAINTEXT://0.0.0.0:10062 # 务必用真实IP
log.dirs=/opt/data/kafka # 可以指定多个目录,存储Kafka数据
zookeeper.connect=10.213.42.230:10081/kafka # 这里没用根目录
重要提示
务必填写具体IP: 上述“PLAINTEXT://0.0.0.0:10062”的务必填写具体IP地址。尽管0.0.0.0可以代表机器的所有网卡,但是当搭建一个集群的时候,这个地址在其他成员那往往解析不了。
ZK集群下的路径: 如果ZK是集群,同时Kafka不挂靠根目录,应该是
zookeeper.connect=10.213.42.230:10081,10.213.42.234:10081,10.213.44.188:10081/kafka
配置。
为什么有两个地方可以配置侦听端口呢 ? 在0.8版本及其以前版本,用
host.name
和port
来配置侦听端口。但0.9版本后,引入了listeners=PLAINTEXT://:10062
,它除了包含 host, port 还包含协议,协议有plaintext,trace,ssl
。 所以,在0.9版本,推荐使用listeners
配置项;继续保留port
配置项只是用来兼容0.8版本。
注意:其他实例,应修改:broker.id=1
。
- 启动服务
以后台形式启动,指定 -daemon
参数:
$ ./bin/kafka-server-start.sh -daemon config/server.properties
- 查看ZK结构
用ZKUI查看Kafka在ZK上的注册结构:
kafka 可视化官方最推荐的是 kafka-manager
:
kafka-manager
是 yahoo 团队,用Scale语言(JVM语言)开发的,源代码管理用的是 SBT (Simple Build Tool 类似JAVA领域的Maven)。
项目地址:https://github.com/yahoo/kafka-manager
- 源码编译
git clone https://github.com/yahoo/kafka-manager.git
cd kafka-manager
sbt clean dist # 如果不设国内镜像,会很慢。或者用阿里云美国节点编译。
-
kafka-manager 几点注意:
-
Scale语言开发,运行在JVM上,但版本要求 JDK 8
-
支持 Kafka 0.8 / 0.9,尚未支持 0.10 版本(时间17年2月)。
-
编译管理使用sbt工具,国内镜像很少,可以选择阿里云美国节点编译。
-
预编译好的包:kafka-manager-1.3.2.1.zip@百度网盘 或 kafka-manager-1.3.2.1.zip@CSDN
-
配置运行
最小修改配置只有ZK的地址:
$ vim kafka-manager-1.3.0.4/conf/application.conf
# 以下ZK地址并非Kafka依赖的ZK地址,而是kafka-manager存储meta信息的ZK地址
kafka-manager.zkhosts="10.213.42.230:10081"
特别注意
这里的
kafka-manager.zkhosts
并不是Kafka集群对应的ZK地址,而是kafka-manager
这个Web程序自己的状态也是用ZK存储的。实际上,kafka-manager
可以管理多个Kafka集群,只要在页面上“Add Cluster”,然后把集群的ZK填写进去。
zkhosts
只能写ZK主机,不能指定具体路径。比如kafka-manager.zkhosts="10.213.42.230:10081/kafman"
是错误的,只能kafka-manager.zkhosts="10.213.42.230:10081"
。它会在根路径下,生成kafka-manager
子路径。
- 启动Kafka-manager
指定监听端口为:10086
$ nohup bin/kafka-manager -Dconfig.file=conf/application.conf -Dhttp.port=10086 &
- 用ZKUI查看kafka-manager的meta信息
kafka-manager 本身的 meta 信息,存放在指定ZK的 /kafka-manager 路径下:
-
利用kafka-manager 管理kafka集群
-
添加Kafka集群
kafka-manager
可以管理多个 kafka 集群,只需要在页面上 “Cluster -> Add Cluster -> 表单中填写Kafka集群对应的ZK地址”。
- 查看Brokers
Kafka 客户端主要做4大类的事情:
- Topic 管理:增删改查Topic。其中修改Topic主要包括修改partition和replica等。这个可以用
kafka-manager
来管理。 - Message收发:向一个或多个Topic进行Pub/Sub操作。这个可以用
kafkacat
来做。 - 集群meta: 查看集群的meta信息,比如有几个brokers,topic与broker之间的分配关系。
- 消费监控: 每个Topic的各个ConsumerGroup的消费进度。这个可以用
kafka-manager
或者KafkaOffsetMonitor
来查看。
kafka官方命令行,给定ZK地址,还是broker地址呢?
-
Topic管理类:给定ZK地址。
-
Message收发类:老版本(0.7)给定ZK地址,新版本(0.10.1)给定Broker地址,中间版本收发不一样。
-
管道符输入
官方客户端现在也支持管道符(以前kafkacat命令行支持):比如我们希望把nginx的access_log推送到kafka(一条命令就基本替代了Flume),可以:
$ tail -n 0 -f /var/log/nginx/access.log | bin/kafka-console-producer.sh --broker-list localhost:9092,localhost:9093,localhost:9094 --sync --topic nginxlog
- 启用JMX
kafka启动的时候,只要设置了 JMX_PORT=XXX;
环境变量,就会启用JMX。启动JMX的好处是:kafka内部使用了metrics实现了很多统计,启用JMX后,就可以用JMX客户端连接到kafka,获取统计数据(比如kafka-manager就会读取kafka的JMX数据,IO流量之类的都会被读取)。
那为什么 Kafka 不把 JMX_PORT 配置到 conf/server.properties 文件里面呢? 这是因为 Kafka 的客户端也支持 JMX的,所以Kafka 把 JMX是否启用的判断逻辑在基础脚本 kafka-run-class.sh
(几乎所有其他脚本,比如 kafka-server-start.sh
都依赖这个脚本)里面。
# JMX port to use
if [ $JMX_PORT ]; then
KAFKA_JMX_OPTS="$KAFKA_JMX_OPTS -Dcom.sun.management.jmxremote.port=$JMX_PORT "
fi
所以习惯这么写:
$ cat start-with-jmx.sh
export JMX_PORT=9999; bin/kafka-server-start.sh -daemon conf/server.properties
当然也可以把 export JMX_PORT=9999
语句加入 kafka-server-start.sh
脚本。
项目地址:https://github.com/edenhill/kafkacat
on Mac
$ brew install kafkacat
on Debian
$ apt-get install kafkacat
但是centos之类的,需要源代码编译,比较繁琐( yum install kafkacat
尚未发布)。
- kafkacat 三大功能
Usage: kafkacat <options> [file1 file2 .. | topic1 topic2 ..]]
-C | -P | -L Mode: Consume, Produce or metadata List
- 查看brokers和topics
$ kafkacat -L -b 10.213.42.230:10062
Metadata for all topics (from broker -1: 10.213.42.230:10062/bootstrap):
2 brokers:
broker 0 at CDCS-213042230.wdds.com:10062
broker 1 at CDCS-213042234.wdds.com:10062
2 topics:
topic "logs" with 3 partitions:
partition 2, leader 0, replicas: 0,1, isrs: 0,1
partition 1, leader 1, replicas: 1,0, isrs: 1,0
partition 0, leader 0, replicas: 0,1, isrs: 0,1
topic "newuser" with 1 partitions:
partition 0, leader 1, replicas: 1, isrs: 1
查看系统有多少个brokers,多少个topics,每个topic有多少个partition,每个partition对应的leader是谁,replica是谁。