Kafka介绍
官网
http://kafka.apache.org
官方文档
https://kafka.apachecn.org/documentation.html#api
客户端下载地址
https://cwiki.apache.org/confluence/display/KAFKA/Clients
kafka是一个多分区、多副本并且基于zookeeper协调的分布式消息系统。目前Kafka已经定位为一个分布式流处理平台,它以高吞吐、可持续化、可水平扩展、支持流处理等多种特性而被广泛应用。
1.kafka特性
特性
- 高吞吐量、低延迟:每秒可以处理几十万条消息,延迟最低只有几毫秒,每个主题可以分多个分区,消费组对分区进行消费操作。
- 可扩展:kafka集群支持热扩展。
- 持续性、可靠性:消息被持久化到本地磁盘,并且支持数据备份防止数据丢失。
- 容错性:允许集群中节点失败(若副本数量为n,则允许n-1个节点失败)。
- 高并发:支持数个客户端同时读写。
使用场景
- 日志收集:通过收集各种服务log,通过kafka以统一接口服务方式开放给各种consumer,如Hadoop、Hbase、Solr等。
- 消息系统:解耦和生产者和消费者、缓存消息等。
- 用户活动跟踪:用来记录web用户或者app用户的各种活动,如浏览网页、搜索、点击等活动,这些活动信息被各个服务器发布到kafka的topic中,然后订阅者通过订阅这些topic来做实时的监控分析,或者装载到Hadoop、数据仓库中做离线分析和挖掘。
- 运营指标:用来记录运营监控数据。包括收集各个分布式应用的数据,生产各种操作的集中反馈,比如报警和报告。
- 流处理:比如spark streaming和storm。
2. 概念详解
- Kafka作为一个集群,运行在一台或者多台服务器上.
- Kafka 通过 topic 对存储的流数据进行分类。
- 每条记录中包含一个key,一个value和一个timestamp(时间戳)。
Kafka有四个核心的API:
- The Producer API 允许一个应用程序发布一串流式的数据到一个或者多个Kafka topic。
- The Consumer API 允许一个应用程序订阅一个或多个 topic ,并且对发布给他们的流式数据进行处理。
- The Streams API 允许一个应用程序作为一个流处理器,消费一个或者多个topic产生的输入流,然后生产一个输出流到一个或多个topic中去,在输入输出流中进行有效的转换。
- The Connector API 允许构建并运行可重用的生产者或者消费者,将Kafka topics连接到已存在的应用程序或者数据系统。比如,连接到一个关系型数据库,捕捉表(table)的所有变更内容。
Topics和日志
Topic 就是数据主题,是数据记录发布的地方,可以用来区分业务系统。Kafka中的Topics总是多订阅者模式,一个topic可以拥有一个或者多个消费者来订阅它的数据。
每个分区都是有序且顺序不可变的记录集,并且不断地追加到结构化的commit log文件。分区中的每一个记录都会分配一个id号来表示顺序,我们称之为offset,offset用来唯一的标识分区中每一条记录。
Kafka 集群保留所有发布的记录—无论他们是否已被消费—并通过一个可配置的参数——保留期限来控制. 举个例子, 如果保留策略设置为2天,一条记录发布后两天内,可以随时被消费,两天过后这条记录会被抛弃并释放磁盘空间。Kafka的性能和数据大小无关,所以长时间存储数据没有什么问题.
分布式
日志的分区partition (分布)在Kafka集群的服务器上。每个服务器在处理数据和请求时,共享这些分区。每一个分区都会在已配置的服务器上进行备份,确保容错性.
每个分区都有一台 server 作为 “leader”,零台或者多台server作为 follwers 。leader server 处理一切对 partition (分区)的读写请求,而follwers只需被动的同步leader上的数据。当leader宕机了,followers 中的一台服务器会自动成为新的 leader。每台 server 都会成为某些分区的 leader 和某些分区的 follower,因此集群的负载是平衡的。
消费者
每个消费者组都会有一个独一无二的消费者组id来标记自己。每一个消费者group可能有一个或者多个消费者,对于当前消费组来说,topic中每条数据只要被消费组内任何一个消费者消费一次,那么这条数据就可以认定被当前消费组消费成功。
一个kafka主题会有多个分区,分配partition需要保证每个分区都有消费者消费,topic的每个分区只能分配给某个消费组下的一个消费者,这样的话也能保证每个partition的顺序消费,如果分区数目比较多那么一个消费者会被分配到多个分区,如果分区数目比较少,但是消费者数目比较多,某些消费者就会处于空闲状态
消费者可以从broker中读取数据。消费者可以消费多个topic中的数据。
broker
Kafka 集群包含一个或多个服务器,服务器节点称为broker。
partition
topic中的数据分割为一个或多个partition。
Follower与Leader
kafka每个分区都有一个单独的leader,0个或多个follower。
Follower跟随Leader,所有写请求都通过Leader路由,数据变更会广播给所有Follower,Follower与Leader保持数据同步。如果Leader失效,则从Follower中选举出一个新的Leader。当Follower与Leader挂掉、卡住或者同步太慢,leader会把这个follower从“in sync replicas”(ISR)列表中删除,重新创建一个Follower。
kafka单机安装
1.Java环境
tar axf jdk-14.0.2_linux-x64_bin.tar.gz -C /usr/local/
ln -sn /usr/local/jdk-14.0.2 /usr/local/java
cd /usr/local/java/
bin/jlink --module-path jmods --add-modules java.desktop --output jre
# 配置环境变量 EOF加\防变量解析
cat >>/etc/profile <<\EOF
# java
export JAVA_HOME=/usr/local/java
export JRE_HOME=/usr/local/java/jre
export CLASSPATH=.:$JAVA_HOME/lib/:$JRE_HOME/lib
export PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$PATH
EOF
2.zookeeper安装
下载
https://www.apache.org/dyn/closer.lua/zookeeper/
tar -axf apache-zookeeper-3.6.1-bin.tar.gz -C /opt/
ln -sn /opt/apache-zookeeper-3.6.1-bin /opt/zookeeper
cd /opt/zookeeper/conf/
cp zoo_sample.cfg zoo.cfg
mkdir -p /data/zookeeper
配置文件
# 服务器心跳时间,毫秒为单位
tickTime=2000
# 集群中的follower服务器(F)与leader服务器(L)之间初始连接时能容忍的最多心跳数
initLimit=5
# 集群中的follower服务器与leader服务器之间请求和应答之间能容忍的最多心跳数
syncLimit=2
# 数据目录
dataDir=/data/zookeeper
# 对外服务端口
clientPort=2181
启动
/opt/zookeeper/bin/zkServer.sh start
ps axu |grep zookeeper
jps -l
3.kafka安装
下载
https://www.apache.org/dyn/closer.cgi?path=/kafka/2.6.0/kafka_2.13-2.6.0.tgz
tar axf kafka_2.13-2.6.0.tgz -C /opt
ln -sn /opt/kafka_2.13-2.6.0/ /opt/kafka
mkdir -p /data/kafka
配置文件
broker.id=0 # 必须为每个代理设置一个唯一的整数
num.network.threads=8 # 服务器用于从网络接收请求并向网络发送响应的线程数
num.io.threads=16 # 服务器用于处理请求的线程数,可能包括磁盘I / O.
socket.send.buffer.bytes=102400 # 套接字服务器使用的发送缓冲区
socket.receive.buffer.bytes=102400 # 套接字服务器使用的接收缓冲区
socket.request.max.bytes=104857600 # 套接字服务器将接受的请求的最大大小(防止OOM)
log.dirs=/data/kafka/log
num.partitions=1 # 建议broker少的话,默认就几个broker 就设置成几个分区
num.recovery.threads.per.data.dir=1 # 在启动时用于日志恢复和在关闭时刷新的每个数据目录的线程数。
对于数据目录位于RAID阵列中的安装,建议增加此值。
offsets.topic.replication.factor=1
offsets.topic.replication.factor=1
transaction.state.log.replication.factor=1
transaction.state.log.min.isr=1
//以上3个推荐#组元数据内部主题“__consumer_offsets”和“__transaction_state”的复制因子对于除开发测试之外的任何其他内容,建议使用大于1的值以确保可用性,例如3。
#log.flush.interval.messages=10000 # 强制刷新数据到磁盘之前要接受的消息数
#log.flush.interval.ms=1000 # 强制刷新之前消息可以在日志中停留的最长时间
log.retention.hours=24 # 默认消息的最大持久化时间,168小时,7天
#log.retention.bytes = 1073741824 # 日志的基于大小的保留策略
log.segment.bytes=1073741824 # 这个参数是:因为kafka的消息是以追加的形式落地到文件,当超过这个值的时候,kafka会新起一个文件
log.retention.check.interval.ms=300000 # 每隔300000毫秒去检查上面配置的log失效时间
zookeeper.connect=10.0.0.2:2181,10.0.0.3:2181,10.0.0.4:2181 # 设置zookeeper的连接端口
zookeeper.connection.timeout.ms=60000 # 设置zookeeper的连接超时时间
group.initial.rebalance.delay.ms=3 # 指定GroupCoordinator将延迟初始消费者重新平衡的时间毫秒
必要配置
broker.id=0
log.dirs=/data/kafka/log
advertised.listeners=PLAINTEXT://10.0.0.2:9092 # 让注册到ZK上是IP,而不是主机名,10版后本
zookeeper.connect=10.0.0.2:2181
启动
nohup /opt/kafka/bin/kafka-server-start.sh /opt/kafka/config/server.properties &
jps -l
4.kafka测试消息生产与消费
创建一个主题
cd /opt/kafka
bin/kafka-topics.sh \
--zookeeper localhost:2181 \
--create \
--topic test1 \
--partitions 2 \
--replication-factor 1
bin/kafka-topics.sh --zookeeper localhost:2181 --list # 展示主题
bin/kafka-topics.sh --zookeeper localhost:2181 --describe --topic test1 # 查看主题详情
--topic 指定所创建主题名称
--partitions 指定分区个数
--replication-factor 指定分区副本因子
启动消费端接受消息,生产端接受消息
bin/kafka-console-consumer.sh --bootstrap-server 10.0.0.2:9092 --topic test1
bin/kafka-console-producer.sh --broker-list 10.0.0.2:9092 --topic test1
# 输入消息,类似nc
zookeeper-kafka集群
zookeep概述
- zookeeper是开源分布式的,为分布式应用提供协调服务的apache项目
- 一个领导者leader,多个跟随着follower组成的集群
- 全局一致性:每个server保持一份相同的数据副本,client无论连接哪个server,数据都是一致的
- 更新请求顺序进行,来自同一client的更新情求按其发送顺序依次进行
- 数据原子性,一次数据跟新要么所有server全部成功,要么全部失败
- 实时性,在一定时间范围内,client能读到最新数据
- 在 ZooKeeper 中,“节点"分为两类,机器节点,第二类则是指数据模型中的数据单元,我们称之为数据节点ZNode
zookeeper集群
server | ip |
---|---|
zk-server1 | 10.0.0.2 |
zk-server2 | 10.0.0.3 |
zk-server3 | 10.0.0.4 |
修改配置文件
cat >>/opt/zookeeper/conf/zoo.cfg<<\EOF
server.1=10.0.0.2:2888:3888
server.2=10.0.0.3:2888:3888
server.3=10.0.0.4:2888:3888
EOF
**配置myid **
echo 1 > /data/zookeeper/myid # 在zk-server1配置
echo 2 > /data/zookeeper/myid # 在zk-server2配置
echo 3 > /data/zookeeper/myid # 在zk-server3配置
启动集群
/opt/zookeeper/bin/zkServer.sh start
/opt/zookeeper/bin/zkServer.sh status # 查看当前状态Mode: leader Mode: follower
kafak集群
server | ip |
---|---|
ka-server1 | 10.0.0.2 |
ka-server2 | 10.0.0.3 |
ka-server3 | 10.0.0.4 |
broker.id=0 # ka-server1配0 ka-server2配1 ka-server1配3
log.dirs=/data/kafka/log
advertised.listeners=PLAINTEXT://10.0.0.2:9092 # 根据节点配置
zookeeper.connect=10.0.0.2:2181,10.0.0.3:2181,10.0.0.4:2181
启动
nohup /opt/kafka/bin/kafka-server-start.sh /opt/kafka/config/server.properties &
jps -l