kafka消息队列1-介绍与集群搭建(环境使用docker的centos7,zookeeper集群使用kafka自带的)

一、概述

Kafka 是一个分布式的基于发布/订阅模式的消息队列。
Kafka 的数据单元称为消息,消息可以理解为数据库里的一个“数据行”或一条“记录”。

1. 主题和分区

Kaflca 的消息通过主题(topic)进行分类。
主题可以被分为若干个分区(Partition),一个分区就是一个提交日志。

2. 生产者和消费者

  • 生产者
    生产者创建消息。
    在默认情况下把消息均衡地分布到主题的所有分区上,也可以指定发送消息到某个分区。
  • 消费者
    消费者读取消息。
    可以订阅读取一个或者多个主题,按照消息生成的顺序读取。

3. 消息队列的好处

  • 解偶:生产者和消费者两个服务可以运行在不同的服务器上,支持各自的修改和扩展。
  • 可恢复性:在消费者出现异常的时候,已经发送给kafka的数据可以在系统恢复后继续被处理。
  • 缓冲:可以解决生产者和消费者的处理速度不一致的情况。
  • 异步通信:生产者可以先把消息发送给kafka的队列中,消费者可以按照自己的情况进行数据消费处理。不一定非要立即处理。

二、单机版

1.启动自带的zookeeper

# 以守护进程的形式启动zookeeper
./bin/zookeeper-server-start.sh -daemon config/zookeeper.properties

2.启动kafka服务

# 以守护进程的形式启动kafka
./bin/kafka-server-start.sh -daemon config/server.properties
> jps
# zookeeper进程
4647 QuorumPeerMain
# kafka进程
4968 Kafka
4969 Jps

三、集群搭建

0. 环境和版本说明

集群使用3个节点
服务器版本:使用centos7.7的docker版
Java环境:jdk_1.8.0_261
kafka版本:kafka_2.12-2.4.1
zookeeper:kafka自带的3.5.7版本

1.kafka配置文件说明

# 全局唯一编号,必须为每个代理设置一个惟一的整数。
broker.id=0

# 服务器用于从网络接收请求并向网络发送响应的线程数
num.network.threads=3

# 服务器用于处理请求的线程数,其中可能包括磁盘I/O
num.io.threads=8

# 发送数据的缓存区大小
socket.send.buffer.bytes=102400

# 接受数据的缓存区大小
socket.receive.buffer.bytes=102400

# The maximum size of a request that the socket server will accept (protection against OOM)
socket.request.max.bytes=104857600

# 用于存储日志文件,可以用逗号隔开配置多个目录
# 这里所说的日志文件,其实是kafka保存数据的地方,
# 因为kafka是把消息以日志的形式追加保存到本地磁盘的,所以这里叫日志文件
log.dirs=/tmp/kafka-logs

# 每个主题的默认日志分区数。
num.partitions=1

# 每个数据目录在启动时用于日志恢复和关闭时用于刷新的线程数。
num.recovery.threads.per.data.dir=1

# 对于组元数据内部主题“剩余的consumer_offsets”和“剩余的transaction_state”,推荐大于1的复制因子,以确保可用性,如3。
offsets.topic.replication.factor=1
transaction.state.log.replication.factor=1
transaction.state.log.min.isr=1

# 消息会立即写入文件系统,但默认情况下我们只使用fsync()进行同步
# 可以使用以下配置控制数据到磁盘的刷新。
# 说明:
# 1。持久性:如果不使用复制,未刷新的数据可能会丢失。
# 2。延迟:当刷新发生时,非常大的刷新间隔可能会导致延迟峰值,因为有大量数据需要刷新。
# 3。吞吐量:刷新操作通常是最昂贵的操作,较小的刷新间隔可能导致过度查找。
# 在强制将数据刷新到磁盘之前要接受的消息数
#log.flush.interval.messages=10000
# 在我们强制刷新之前,一条消息可以在日志中停留的最大时间
#log.flush.interval.ms=1000

# 日志数据保存的时间,默认为7天
log.retention.hours=168

# 基于文件大小的日志保留策略。
#log.retention.bytes=1073741824

# 日志文件片段的大小,当达到这个大小时,将创建一个新的日志文件。默认为1G
log.segment.bytes=1073741824

# 检查是否可以根据保留策略删除日志文件的时间间隔
log.retention.check.interval.ms=300000

# zookeeper配置,如果是集群使用逗号隔开
zookeeper.connect=localhost:2181

# 连接到zookeeper的超时时间单位为ms
zookeeper.connection.timeout.ms=6000

# 当有新成员加入消费组时,再平衡的的时间。在生产环境中,默认值3秒更合适
group.initial.rebalance.delay.ms=0

2.搭建zookeeper集群

使用kafka自带的zookeeper

2.1 修改配置文件

三个节点都是相同的配置

# 配置数据存放目录
dataDir=/admin/apps/zkdata/data
dataLogDir=/admin/apps/zkdata/log
# 配置服务端口等
clientPort=2181
tickTime=2000
initLimit=10
syncLimit=5
# 配置集群信息
# 这里kafka01、kafka02、kafka03是docker的容器名称,
# 因为使用了自定义网络,可以使用容器名称来相互通信,所以这里没有写ip地址
server.0=kafka01:2888:3888
server.1=kafka02:2888:3888
server.2=kafka03:2888:3888
2.2 写myid文件

配置文件中配置了数据存放目录/admin/apps/zkdata/data
需要在该路径下创建一个myid的文件,写入ID编号
方法有很多,这里写个通用的:

> mkdir -p /admin/apps/zkdata/data
> cd /admin/apps/zkdata/data
> touch myid
> echo echo "服务编号" >> myid

当前三个zookeeper节点的服务编号分别为0、1、2。

2.3 启动三个节点
# 以守护进程的形式启动zookeeper
./bin/zookeeper-server-start.sh -daemon config/zookeeper.properties

3.配置kafka集群的配置文件

只需要修改3个地方,其他的都使用默认配置即可:

#为每个节点设置一个唯一的标示id,依次使用0、1、2即可
broker.id=0
# 配置用于存储日志文件的路径(即数据保存的路径)
log.dirs=/admin/apps/kafka_data
# 配置zookeeper集群
zookeeper.connect=kafka01:2181,kafka02:2181,kafka03:2181

4. 启动kafka的三个节点

./kafka-server-start.sh -daemon ../config/server.properties

5. 测试一下

5.1 创建主题

参数说明:
kafka-topics.sh:主题相关的操作
–zookeeper:zookeeper集群地址,可以只连其中一个也行
–create:表示要创建主题
–replication-factor:分区的副本数
–partitions:主题的分区数据
–topic:主题的名称

./kafka-topics.sh --zookeeper kafka01:2181,kafka02:2181,kafka03:2181 --create --replication-factor 3 --partitions 1 --topic test_mete_data

或者:
–bootstrap-server:Kafka集群连接地址

./kafka-topics.sh --bootstrap-server kafka01:9092,kafka02:9092,kafka03:9092 --create --replication-factor 3 --partitions 1 --topic test_mete_data
5.2 查看主题

–zookeeper:zookeeper集群地址

./kafka-topics.sh --zookeeper kafka01:2181 --list

或者:
–bootstrap-server:Kafka集群地址

./kafka-topics.sh --bootstrap-server kafka01:9092,kafka02:9092,kafka03:9092 --list
5.3 发送消息(数据)到指定的主题

参数说明:
kafka-console-producer.sh:生产者相关操作
–broker-list:kafka集群地址(只写其中一个也行)
–topic:指定要发送到哪个主题
然后就可以输入消息发送了,这里随便写了几条数据

[root@6029b019bb22 bin]# ./kafka-console-producer.sh --broker-list kafka01:9092,kafka02:9092,kafka03:9092 --topic test_mete_data
>test01
>test02666
>7777
>
5.4 消费指定主题的消息(数据)

参数说明:
kafka-console-consumer.sh:消费者相关操作
–bootstrap-server:kafka集群地址(只写其中一个地址也是可以的)
–from-beginning:从有效的起始位移位置开始消费
–topic:指定要消费哪个主题

./kafka-console-consumer.sh --bootstrap-server kafka01:9092,kafka02:9092,kafka03:9092 --from-beginning --topic test_mete_data
test01
test02666
7777

5.5 删除主题
./kafka-topics.sh --zookeeper kafka01:2181,kafka02:2181,kafka03:2181 --delete --topic test_mete_data

或者:

./kafka-topics.sh --bootstrap-server kafka01:9092,kafka02:9092,kafka03:9092 --delete --topic test_mete_data
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值