以下的例子我只启动了一个shb01,没有加入139
主题Topic的一般操作(增删改查),通过脚本kafka-topics.sh来执行
创建
[root@shb01 bin]# kafka-topics.sh --create--topic hello --zookeeper shb01:2181 --partition 2 --replication-factor 1
Created topic "hello".
--partition 2表示分区
--replication-factor 1表示副本因子,之前说过broker无主副之分但是partition有主副之分,所以此参数的值不能大于broker数就是kafka服务节点数,我的例子中只有一个shb01节点所以如果指定2会报错的。
查询
[root@shb01 bin]# kafka-topics.sh --list--zookeeper shb01:2181
hello
也可以指定topic
[root@shb01 bin]# kafka-topics.sh --list --zookeepershb01:2181 --topic hello
查询指定topic详细信息
[root@shb01 bin]# kafka-topics.sh--describe --zookeeper shb01:2181 --topic hello
Topic:hello PartitionCount:2 ReplicationFactor:1 Configs:
Topic: hello Partition: 0 Leader: 0 Replicas: 0 Isr: 0
Topic: hello Partition: 1 Leader: 0 Replicas: 0 Isr: 0
我只有一个broker,id为0
Leader: 0,Partition的leader所在broker的id
Replicas: 0,Partition的副本的brokerlist
Isr: 0,表示可用的broker的id
查询topic详细信息
[root@shb01 bin]# kafka-topics.sh--describe --zookeeper shb01:2181
修改,只能增加partition数量不能减少
[root@shb01 bin]# kafka-topics.sh --alter --zookeeper shb01:2181 --topic hello --partition 3
[root@shb01 bin]# kafka-topics.sh--describe --zookeeper shb01:2181--topic hello
Topic:hello PartitionCount:3 ReplicationFactor:1 Configs:
Topic: hello Partition: 0 Leader: 0 Replicas: 0 Isr: 0
Topic: hello Partition: 1 Leader: 0 Replicas: 0 Isr: 0
Topic: hello Partition: 2 Leader: 0 Replicas: 0 Isr: 0
删除
[root@shb01 bin]# kafka-topics.sh --delete--zookeeper shb01:2181 --topic hello
删除只是标记删除,此topic仍然可用,需要修改server.properties文件中的参数
delete.topic.enable=true开启删除然后重启kafka,此参数在文件中默认是没有的需要手动加入
生产者,消费者
Kafka自带的生产者和消费者只是用来测试
生产者
[root@shb01 bin]# kafka-console-producer.sh--broker-list shb01:9092 --topic topic_shb01
--broker-list表示broker地址,多个地址用逗号分开
--topic 表示向那个主题生产消息
消费者
[root@shb01 bin]# kafka-console-consumer.sh--topic topic_shb01 --zookeeper shb01:2181,192.168.79.139:2181 --from-beginning
--topic表示消费那个主题
topic\whitelist\blacklist:
1、 具体的单个topic
[root@shb01 bin]# kafka-console-consumer.sh--topic topic_shb01 --zookeeper shb01:2181,192.168.79.139:2181 --from-beginning
2、多个白名单topic字符串[逗号隔开]。
--topic t1,t2表示只消费t1,t2主题
[root@shb01bin]# kafka-console-consumer.sh --whitelist t1,t2 --zookeepershb01:2181,192.168.79.139:2181 --from-beginning
3、多个黑名单topic字符串[逗号隔开]。
--topic t1,t2表示除过t1,t2主题之外消费所有主题
[root@shb01bin]# kafka-console-consumer.sh --blacklist t1,t2 --zookeepershb01:2181,192.168.79.139:2181 --from-beginning
--zookeeper表示kafka集群的zk地址
--from-beginning表示从前开始,就是启动消费者之前生产的消息也可以消费
最后被标记删除的主题也可以消费
文件参数配置
broker,server.propertie
1.生产者生产发送消息,broker缓存数据达到一定阀值或一定时间后就会flush到磁盘中这样可以减少IO调用。在config目录下的server.properties中有两个参数用于控制flush
# The number of messages to accept beforeforcing a flush of data to disk
#log.flush.interval.messages=10000
# The maximum amount of time a message cansit in a log before we force a flush
#log.flush.interval.ms=1000
2.kafka数据被消费后会依然存在于磁盘中,消费者配合zookeeper读取数据,通常数据会保存168小时,可以在server.properties中通过参数进行控制
# The minimum age of a log file to beeligible for deletion
log.retention.hours=168
#log.retention.bytes=1073741824
第一个是168小时,第二个参数是按照大小超过则删除
log.retention.check.interval.ms=300000
这个是扫描的间隔时间,满足上面两个条件(貌似是二选一)则执行删除
生产者,producer.properties
1.Producer可以指定将消息发送给具体的partition.在配置文件中通过partitioner.class指定自定义分区器。包含包名类名
partitioner.class= kafka.ProducerTest
2.通过producer.type=sync参数控制生产者使用异步或同步方式发送数据。
异步或者同步发送
同步是指:发送方发出数据后,等接收方发回响应以后才发下一个数据的通讯方式。
异步是指:发送方发出数据后,不等接收方发回响应,接着发送下个数据的通讯方式。
3.生产者采用异步方式可以提高发送效率,先将数据缓存在磁盘然后一次性发送出去。
有两个参数来控制什么时候发送消息,一个按照时间间隔另一个按照数据大小
# maximum time, in milliseconds, forbuffering data on the producer queue
#queue.buffering.max.ms=
# the maximum size of the blocking queuefor buffering on the producer
#queue.buffering.max.messages=
消费者,consumer.properties
Kafka中每个消费者都属于一个group且都已一个组id
消费数据
组内:一个消费者可以消费多个partition,但是一个topic下的partition只能被一个group中的一个消费者消费。下图中group2中有4个消费者但是topic2种只有3个分区此时c4处于空闲状态。此时可以增减topic2的分区数来增加消费能力。
组间:每个消费组之间消费同一份数据互不影响。
业务复杂增加topic,数据量大增加分区。分区越多意味着consumer的消费能力越强。
Message是通信的基本单位存储于topic的分区中,parttion在存储层面表现为一个append.log文件,新的message会直接追加到文件尾部,每条消息在文件中的位置称为offset(偏移量)这个信息存储在zookeeper中,所以消费者在读取message时需要zk配合。Message有类型大小偏移量3个属性,其中offset相当于message在分区中的id
下面是一个查看offset的命令,这个例子我在资料中找的,没有实际操作过
bin/kafka-run-class.shkafka.tools.ConsumerOffsetChecker --zookeeper zkserver1:2181,zkserver2:2181--group consumer_demo_11
kafka不能指定offset进行消费
kafka集群容错
kafka集群中一个broker挂了后zk会选择让别的broker提供服务,当有broker被修复后zk会有一个自动的均衡策略让此broker再次成为topic中partition的leader
topic:hello partition:0 leader:0
topic:hello partition:1 leader:2
topic:hello partition:2 leader:1
此参数指定自动均衡策略,300秒后kafka执行均衡操作
Auto.leader.rebalance.enable=true
leader.imbalance.check.interval.seconds 默认值:300。
也可以手动执行
bin/kafka-preferred-replica-election.sh--zookeeper zkserver1:2181,zkserver2:2181