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

ZooKeeper

Getting Started

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

ZooKeeper 客户端

$ 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

ZooKeeper 集群

  • 集群成员的配置:

编辑 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 可视化

ZooKeeper 可视化,主要推荐两个开源:

zkui 安装使用体验

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集群,暂时不能管理多个集群。

zooinspector 安装使用体验


Kafka

Kafka 安装使用体验

  • 修改配置
$ 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.nameport来配置侦听端口。但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上的注册结构:

在zkui中查看kafka结构.png

Kafka 可视化

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 的meta信息.png

  • 利用kafka-manager 管理kafka集群

  • 添加Kafka集群

kafka-manager 可以管理多个 kafka 集群,只需要在页面上 “Cluster -> Add Cluster -> 表单中填写Kafka集群对应的ZK地址”。

添加监控集群.png

  • 查看Brokers

Brokers.png

Kafka 客户端

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流量之类的都会被读取)。

JMX metrics.png

那为什么 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 脚本。

kafkacat

项目地址: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是谁。

参考资料

⚠️ **GitHub.com Fallback** ⚠️