一、部分理论
kafka:分布式的基于发布/订阅模式的消息队列,主要应用于大数据实时处理领域
topics:主题,生产者生产主题信息提供给消费者消费
producer:生产者,生产消息到主题
consumer:消费者,自己从主题拉取消息。 分区数一定要大于消费者数量
partitions:kafka分区是为了做负载均衡。 一个主题的分区数只能给一个消费者,如果消费者数量大于主题的分区数就会有消费者消费不到数据
replication:副本数是为了高可用
kafka controller:类似zookeeper选leader(Isr),和zookeeper数据交流。
ack:0 不管反馈值,1 只管leader反馈值 ,-1 leader及所有ISR里面的follower都同步数据后才反馈值
Isr:(In-Sync Replica set)是一个副本的列表,里面存储的都是能跟leader 数据一致的副本,为下次选择出新leader做的排序,follower 主动拉取leader 的数据
HW:(high water) 所有消息队列中最小的位置
LEO:(log end offset) 每个消息队列中最大位置
roundRobin:多个分区对应多个消费者时如何对应分配,轮询方式分配,面向组
range:多个分区对应多个消费者时如何对应分配,按一定范围分配。 kafak默认此方式,面向主题
二、安装与配置
1.官网下载bin包
2.sftp上传到linux,tar -xzvf kafka_2.13-2.7.0.tgz 解压
3.创建目录
mkdir /root/kafka_2.13-2.7.0/logs
4.修改配置文件
vim /root/kafka_2.13-2.7.0/config/server.properties
broker.id=101 #每台机器都要修改此文件,建议给每台机器的ip地址
log.dirs=/root/kafka_2.13-2.7.0/logs #日志目录修改
zookeeper.connect=master:2181,s1:2181,s2:2181 #zookeeper集群地址
5.分发到其它机器
scp -r /root/kafka_2.13-2.7.0 root@192.168.100.102:/root/
scp -r /root/kafka_2.13-2.7.0 root@192.168.100.103:/root/
6.修改s1,s2机器得 server.properties
vi /root/kafka_2.13-2.7.0/config/server.properties
broker.id=102 #每台机器都要修改此文件,建议给每台机器的ip地址
7.启动kafka服务,只能每个节点单独启动。 启动前先启动zookeeper; zkServer.sh start
/root/kafka_2.13-2.7.0/bin/kafka-server-start.sh /root/kafka_2.13-2.7.0/config/server.properties #此进程为阻塞进程
/root/kafka_2.13-2.7.0/bin/kafka-server-start.sh -daemon /root/kafka_2.13-2.7.0/config/server.properties #此进程可在后台执行
/root/kafka_2.13-2.7.0/bin/kafka-server-stop.sh /root/kafka_2.13-2.7.0/config/server.properties #停止kafka进程
创建主题
/root/kafka_2.13-2.7.0/bin/kafka-topics.sh --list --zookeeper master:2181
/root/kafka_2.13-2.7.0/bin/kafka-topics.sh --create --zookeeper master:2181 --topic first --partitions 4 --replication-factor 3
/root/kafka_2.13-2.7.0/bin/kafka-topics.sh --delete --zookeeper master:2181 --topic first
/root/kafka_2.13-2.7.0/bin/kafka-topics.sh --describe --topic first --zookeeper master:2181
Topic: second PartitionCount: 4 ReplicationFactor: 3 Configs:
Topic: second Partition: 0 Leader: 103 Replicas: 103,102,101 Isr: 103,102,101
Topic: second Partition: 1 Leader: 101 Replicas: 101,103,102 Isr: 101,103,102
Topic: second Partition: 2 Leader: 102 Replicas: 102,101,103 Isr: 102,101,103
Topic: second Partition: 3 Leader: 103 Replicas: 103,101,102 Isr: 103,101,102
开启生产者
/root/kafka_2.13-2.7.0/bin/kafka-console-producer.sh --topic first --broker-list master:9092
开启消费者
/root/kafka_2.13-2.7.0/bin/kafka-console-consumer.sh --topic first --bootstrap-server master:9092
/root/kafka_2.13-2.7.0/bin/kafka-console-consumer.sh --topic first --bootstrap-server master:9092 --from-beginning #从最早开始消费,最早7天内
vim /root/kafka_2.13-2.7.0/config/consumer.properties #修改group.id=mygroup 可以改组名。如果group.id不改,生产者发送的消息,在同一个组里面的消费者只能一个(轮询机制)接收到。
不同组将都接收到生产者发送的消息
/root/kafka_2.13-2.7.0/bin/kafka-console-consumer.sh --topic first --bootstrap-server master:9092 --consumer.config /root/kafka_2.13-2.7.0/config/consumer.properties #修改配置文件consumer.properties后可以按照新模式启动
三、高级理论
-rw-r--r--. 1 root root 0 1月 19 17:34 00000000000000000000.index #存放消息队列的索引<第几条消息,消息偏移量>
-rw-r--r--. 1 root root 0 1月 19 16:35 00000000000000000000.log #存放具体信息,当文件大小达到(log.segment.bytes=1073741824 默认1G)设置大小,将产生一个新文件
kafka可以自定义 生产者,消费者,和拦截器。 都需要在java中开发。
四、kafka-eagle安装与配置,具体百度 。 其实还有三种监控工具 Kafka Web Conslole、Kafka Manager、KafkaOffsetMonitor 。但eagle应该是最好使用的
五、kafka对接flume测试案例。 flume安装配置具体参考flume学习笔记
vim /root/flume-1.9.0/job/kafka.conf
# Name the components on this agent
a1.sources = r1
a1.channels = c1
a1.sinks = k1
# Describe/configure the source
a1.sources.r1.type = netcat
a1.sources.r1.bind = localhost #可以是本机也可以是其它机器
a1.sources.r1.port = 44444
# Describe the channel
a1.channels.c1.type = memory
a1.channels.c1.capacity = 1000
a1.channels.c1.transactionCapacity = 100
# Describe the sink
a1.sinks.k1.type = org.apache.flume.sink.kafka.KafkaSink
a1.sinks.k1.kafka.topic = first
a1.sinks.k1.kafka.bootstrap.servers = master:9092,s1:9092,s2:9092
a1.sinks.k1.kafka.flumeBatchSize = 20
a1.sinks.k1.kafka.producer.acks = 1
a1.sinks.k1.kafka.producer.linger.ms = 1
# Bind the source and sink to the channel
a1.sources.r1.channels = c1
a1.sinks.k1.channel = c1