kafka系列教程4(服务器端实践)

来源:互联网 发布:淘宝的在线客服在哪里 编辑:程序博客网 时间:2024/06/06 03:17

Rec: FuRenjie


服务器端使用
1.下载kafka-0.8,有两种包,源码包和二进制包,如果是源码包,则需要先编译成对应二进制包:
> tar xzf kafka-<VERSION>.tgz
> cd kafka-<VERSION>
> ./sbt update
> ./sbt package
> ./sbt assembly-package-dependency

2.[可选]kafka依赖zookeeper,故需要启动zookeeper。kafka提供了一个自带的zookeeper服务器,可通过以下方法快速启动zookeeper
bin/zookeeper-server-start.sh config/zookeeper.properties

3.启动kafka服务器
./kafka-server-start.sh ../config/server.properties

4.创建一个只有一个分区和一个复本的topic
./kafka-create-topic.sh --zookeeper localhost:2181 --replica 1 --partition 1 --topic test
注:此时zookeeper目录中会多出以下节点:[controller, brokers, controller_epoch]

//查看该topic是否已创建:
./kafka-list-topic.sh --zookeeper localhost:2181
注:你可以配置:当一个消息发送到一个不存在的topic时自动创建topic。

5.发送消息:
./kafka-console-producer.sh --broker-list localhost:9092 --topic test
在随后的命令行中输入要发送的内容,回车

6.启动消费者
./kafka-console-consumer.sh --zookeeper localhost:2181 --topic test --from-beginning


kafka集群

增加节点以便在集群中使用kafka:
a:[可选]若单机模拟集群环境,在启动新的节点时需要复制一个新的server.proporties配置文件,修改一下参数:kroker.id=1,port=9093,log.dir=/tmp/kafka-logs-2。然后在启动时需要指定jmx端口为其他值如:JMX_PORT=9997 ./kafka-server-start.sh ../config/server2.properties &
b:在集群中创建有2个复本的topic:kafka-create-topic.sh --zookeeper localhost:2181 --replica 2 --partition 1 --topic my-replicated-topic
c:查看topics:kafka-list-topic.sh --zookeeper localhost:2181(对输出解释:leader表示给定的分区中哪个节点是leader。replicas表示哪些节点是保存了分区日志的,不管该节点是否活着。isr:表示in-sync用于指示当前活着的节点是否已追上leader)

可以用pkill -9 -f server.properties(为保险起见先pgrep -f server.properties确定是那些进程)测试一下一个节点挂掉后如何容错


服务管理

首选leader:
kafka有个首选leader概念,比如一个topic的复本分别位于1,5,9,则1就是那个首选的leader,因为1是在复本列表的第一个位置。这个在某些情况下很有用。当一个broker挂掉,则重启后该broker的所有复本都将变成follower。follower意味着客户端将不会在该borker上有任何的读写。这对整个集群来讲显然不是均衡的。故你可以在启动后运行一下该命名:
bin/kafka-preferred-replica-election.sh --zookeeper zk_host:port/chroot
为了每次在重启后运行该命令的繁琐操作,可以进行如下配置:auto.leader.rebalance.enable=true

集群复制:
用于将一个集群的数据复制到另一个集群中,通常用于复制到不同的数据中心。注意它相当于是个生产者消费者的整合,两套系统可以完全独立,故offset,分区,复本等可以不同。指定了topic后,系统会将原topic中的内容复制到与该名称相同的新的topic中。
bin/kafka-run-class.sh kafka.tools.MirrorMaker
       --consumer.config consumer-1.properties --consumer.config consumer-2.properties 
       --producer.config producer.properties --whitelist my-topic
相关描述:
--whitelist用于指定topics,支持正则表达式。如复制所有topic可以用--whitelist '*'。复制A和B两个topic可以用--whitelist 'A|B'。为了避免ssh的|误用,可以用","来代替"|"
--blacklist表示要排除的topic,格式同上

查看消费者位置:
bin/kafka-run-class.sh kafka.tools.ConsumerOffsetChecker --zkconnect localhost:2181 --group test

集群的扩展:
添加节点很容易,直接将一个独立指定的id的节点启动起来即可。不过这样除非有新的topic创建或手动的移动分区过去,已存在的topic都不会自动在新的节点分配分区。

不过这个迁移过程是自动的,新添加的节点会作为follower然后复制指定分区的所有消息,一旦消息复制完,则该复本加入到in-sync列表,同时其中一个存在的复本将被删除。

分区分配工具可以按3种独立的模式运行
--generate:指定topic列表和broker列表,该工具重新分配所有分区到指定的broker中。该模式仅用来提供一个方便的分区重分配方式。
--execute:该模式用于执行重分配。重分配计划由用户通过--reassignment-json-file指定。也可以通过--generate自动指定。
--verify:该模式验证提供的分区重分配的状态,状态可以是“success,completed,failed,in progress”

方法:
1.首先指定要处理的topic:
> cat topics-to-move.json
{"topics": [{"topic": "foo1"},
            {"topic": "foo2"}],
 "version":1
}

2.生成迁移任务:
bin/kafka-reassign-partitions.sh --zookeeper localhost:2181 --topics-to-move-json-file topics-to-move.json --broker-list "5,6" --generate
这时会产生将foo1,foo2的复本挪到5,6两个节点上的任务,并输出当前分区列表和提议的分区列表。注意,此时任务还未开始。你需要保存当前分区列表用于回滚。保存提议的分区列表(如放到expand-cluster-reassignment.json文件中)用于执行。

3.执行任务:
bin/kafka-reassign-partitions.sh --zookeeper localhost:2181 --reassignment-json-file expand-cluster-reassignment.json --execute

4.查看是否执行完成:
bin/kafka-reassign-partitions.sh --zookeeper localhost:2181 --reassignment-json-file expand-cluster-reassignment.json --verify

集群的收减:
0.8.1版本以前没有专门的收减工具,需要用户手动通过复本重分配工具来手动将要去掉的broker中的分区复本迁移到其他地方。计划0.8.2版本后会有专门的收缩工具

增加复本:
和分区复本迁移类似,只要指定更多的节点即可

服务器端节点配置
server.properties配置:

broker.id 每个kafka节点都有一个唯一的id,id是一个非负整数,作为broker名称或唯一标示。消费者通过该标示来确定是哪个broker
log.dirs:指定消息持久化位置在哪里,多个目录用逗号分隔
port:客户端连接的端口,默认9092
zookeeper.connect:连接zookeeper服务器地址。如:hostname1:port1,hostname2:port2,hostname3:port3/chroot/path(/chroot/path可选,是指定根目录,需要手动创建,同时client也需要指定该根目录)
zookeeper.session.timeout.ms:zookeeper的session超时时间(默认6000ms),用于检测leader或follow是否挂掉。在主或从挂掉后只有超过该指定时间其他节点才能发现,才能确认新的主,client才能继续工作。
socket.request.max.bytes:server可接受的最大请求的大小
num.io.threads:服务器用来执行请求的线程数
queued.max.requests:可用于缓存的最大数,该缓存用于减缓请求的消息到开始执行这段时间。当缓存数大于该值时将阻塞新的请求
log.retention.hours:指定日志持久化最小时间,默认7天
log.retention.bytes:指定持久化日志数据量最大多少(注意是针对分区而非topic)。默认-1表不限。超出最大限制则删除对应的日志片段。
log.retention.bytes.per.topic:同log.retention.bytes,但是按topic粒度进行配置,未配置将使用前者配置执行。格式如topic1:value1,topic2:value2
log.retention.hours.per.topic:同log.retention.hour,但是按topic粒度进行配置,未配置将使用前者配置执行。格式如topic1:value1,topic2:value2
log.cleanup.interval.mins:指定日志每隔多久检查看是否可以被删除,默认1分钟
log.segment.bytes:控制日志每个片段大小,超出该大小则追加到一个新的日志片段。默认1g
log.segment.bytes.per.topic:同log.segment.bytes,但是按topic粒度进行配置,未配置将使用前者配置执行。格式如topic1:value1,topic2:value2
log.roll.hours:强制kafka追加消息到新的日志片段,如果超出指定的时间。默认7天
log.roll.hours.per.topic:同log.roll.hours,但是按topic粒度进行配置,未配置将使用前者配置执行。格式如topic1:value1,topic2:value2
log.index.size.max.bytes:指定index日志大小,默认10m,注意它会预先分配空间,故无论有没有消息该文件都是10m。
log.flush.interval.messages:指定消息到多少时flush到磁盘,默认10000
log.flush.interval.ms:指定消息最大隔多久flush到磁盘,默认3000ms
log.flush.interval.ms.per.topic同log.flush.interval.ms,但是按topic粒度进行配置,未配置将使用前者配置执行。格式如topic1:value1,topic2:value2
log.flush.scheduler.interval.ms多久flusher扫描一次从而判断是否符合flush条件进行flush(默认3000ms)
auto.create.topics.enable:当操作不存在的topic时,是否自动创建topic,默认true
num.partitions:如果自动创建topic,则分区数是多少,默认1
default.replication.factor 指定默认的复本数
replica.lag.time.max.ms 如果follower没有发送fetch request超过该指定时间(默认10000ms),则leader将该follower作为挂掉处理并移除ISR
replica.lag.max.messages如果复本落后leader消息条数超过该指定条数(默认4000),则把该follower当dead处理
replica.fetch.wait.max.ms当leader没有消息的时候,复本(follower)将间隔最大该指定时间(默认500ms)从leader取一次数据
更多配置可以参见KafkaConfig类
`

0 0