起因:在实际项目开发过程中,需要使用RabbitMQ来实现消息队列的功能,在运用过之后,也去学一学kafka,了解一下他们之间的差别,吃一吃架构方面的相关内容,提升自己。
1. kafka安装部署
安装的前置条件:JDK、zookeeper
# 由于kafka的服务协调是基于zookeeper实现的,所以要先下载安装zookeeper
wget https://archive.apache.org/dist/zookeeper/zookeeper-3.5.7/apache-zookeeper-3.5.7-bin.tar.gz
# 解压在conf里修改zoo_sample.cfg为zoo.cfg进行修改
# 提前把data和logs文件创建好
dataDir=/usr/local/zookeeper-cluster/zookeeper1/data
dataLogDir=/usr/local/zookeeper-cluster/zookeeper1/logs
clientPort=2181 # 每个机器的端口不能一样
# 增加通信内容三台机器一样:server.服务编号=服务地址:LF通信端口:选举端口
server.1=127.0.0.1:2881:3881
server.2=127.0.0.1:2882:3882
server.3=127.0.0.1:2883:3883
# 在三台机器的data目录dataDir=/usr/local/zookeeper-cluster/zookeeper1/data
# 创建文件myid,分别写入1/2/3
data里创建文件myid,三台分别写入值1、2、3
# 创建的sh文件统一启动zookeeper,zookeeper-start.sh
/usr/local/zookeeper-cluster/zookeeper1/bin/zkServer.sh start
/usr/local/zookeeper-cluster/zookeeper2/bin/zkServer.sh start
/usr/local/zookeeper-cluster/zookeeper3/bin/zkServer.sh start
# 批处理文件授权
chmod 777 zookeeper-start.sh
# 启动zookeeper集群
./zookeeper-start.sh
安装kafka并进行基础配置
# 下载kafka
wget http://mirror.bit.edu.cn/apache/kafka/2.4.0/kafka_2.13-2.4.0.tgz
# 解压后进入config目录,修改server.properties
# kafka的broker编号,必须是一个整数,服务编号,在集群中不能一样
broker.id=11
# topic允许删除的,如果你设置成false,删除topic对kafka是无效的,默认就是true
delete.topic.enable=true
port=9092
# 处理网络请求的线程数量
num.network.threads=3
# 磁盘IO的线程数量
num.io.threads=8
# 发送socket的缓冲区大小
socket.send.buffer.bytes=102400
# 接收socket的缓冲区大小
socket.receive.buffer.bytes=102400
# 请求socket的缓冲区大小
socket.request.max.bytes=104857600
# 是保存消息日志的文件目录,data目录要提前创建好
log.dirs=/usr/local/kafka/data
# topic在创建时默认多少个分区
num.partitions=1
# 我们的消息数据默认保存时间长度,单位是小时
log.retention.hours=168
# 一个log文件的大小,这里默认是1G,如果超过1G就再创建一个新文件
log.segment.bytes=1073741824
# zookeeper的集群地址
zookeeper.connect=127.0.0.1:2181,127.0.0.1:2182,127.0.0.1:2183
启动和关闭服务
# 启动服务命令
/usr/local/kafka/bin/kafka-server-start.sh -daemon /usr/local/kafka/config/server.properties
# 关闭服务命令
/usr/local/kafka/bin/kafka-server-stop.sh /usr/local/kafka/config/server.properties
单机已经启动了,集群只需要我们和单机一样将新的kafka加入到同一个zookeeper里即可,但broker.id需要和其他机器不一样
2. kafka内部命令使用
# 0.查看topics命令帮助
kafka-topics.sh --help
# 1.查看当前服务器中所有的topic
kafka-topics.sh --zookeeper 127.0.0.1:2181 --list
# 2.创建topic
kafka-topics.sh --zookeeper 127.0.0.1:2181 --create --partitions 3 --replication-factor 1 --topic topicfirst
# Error while executing topic command : Replication factor: 2 larger than available brokers: 1.
--topic # topic名称
--partitions # 定义分区数,partition的命名规则<topicName-partiton序号>
--replication-factor # 副本数量,1代表就是当前主分区没有副本,2代表每个主分区有一个副本分区
# 3.删除topic
# Note: This will have no impact if delete.topic.enable is not set to true.
kafka-topics.sh --zookeeper 127.0.0.1:2181 --delete --topic topicfirst
# 4.查看topic的详情
kafka-topics.sh --zookeeper 127.0.0.1:2181 --describe --topic topicfirst
# 5.修改topic分区数
kafka-topics.sh --zookeeper 127.0.0.1:2181 -alter --topic topicfirst --partitions 5
发送和接收消息
# 发送消息
kafka-console-producer.sh --topic topicfirst --broker-list 127.0.0.1:9092
# 接收消息
# --from-beginning 如果加收了会从topic头来接收消息
kafka-console-consumer.sh --topic topicfirst --from-beginning --bootstrap-server 127.0.0.1:9092
3. kafka内部文件存储结构
在kafka的v0.9版本前,是通过zookeeper来保存我们的消费offset数据的,但zookeeper的读写操作会影响kafka性能,所以在新版本就把消费的offset数据保存到本地的data目录里,这个data目录是你自己指定的
__consumer_offsets-0 __consumer_offsets-22 __consumer_offsets-36 __consumer_offsets-5
__consumer_offsets-1 __consumer_offsets-23 __consumer_offsets-37 __consumer_offsets-6
__consumer_offsets-10 __consumer_offsets-24 __consumer_offsets-38 __consumer_offsets-7
__consumer_offsets-11 __consumer_offsets-25 __consumer_offsets-39 __consumer_offsets-8
__consumer_offsets-12 __consumer_offsets-26 __consumer_offsets-4 __consumer_offsets-9
发送的消息数据到底是存放在哪个文件里的?
00000000000000000000.index # 保存的消息的顺序编号
00000000000000000000.log # 实际保存消息数据的
由于生产者生产数据的时候是会不断将数据追加到log文件的末尾,为了防止文件过大,数据定位的效率低下,kafka采用了分片和索引机制,将每个partition分为了多个segment,每个segment对应了两个文件index文件和log文件,这些文件都在一个文件夹下
-
log文件是具体保存数据的,如果文件超过大小就会生成第二个,文件命名是这样的
-
0000000000000000000.log 这里的0就是文件的offset的起点
-
0000000000000013938.log 这里的13938就是上个文集end_offset+1
-
-
index文件是具体存放消息索引信息的,如果consumer刚消费时跨了两个log文件,就需要index支持定位了,log和index是成对出现的
不要以为每天把功能完成了就行了,这种思想是要不得的,互勉~!
网友评论