kafka的简单学习

1 篇文章 0 订阅

源于蚂蚁课堂的学习,点击这里查看(老余很给力)   

kafka优点 

高吞吐量

1.使用顺序写方式实现数据存储
Kafka是采用不断的将数据追加到文件中,该特性利用了磁盘的顺序读写性能比传统的磁盘读写可以减少寻地址浪费的时间;
2.能够支持生产者与消费者(批量发送和批量消费) 减少io操作
可以将消息投递到缓存区中,在以定时或者/缓存大小方式将数据写入到MQ服务器中,
这样可以减少IO的网络操作,但是这种方式也存在很大缺陷数据可能会丢失。
3.数据零拷贝
4.实现数据的分区 
根据Partition实现对我们的数据的分区
5.数据的压缩  会对我们的数据实现压缩,减少网络的传输

kafka的核心组件

Broker 

Kafka节点,一个Kafka节点就是一个broker,多个broker可以组成一个Kafka集群

 Topic

消息存放的目录即主题,例如page view日志、click日志等都可以以topic的形式存在,Kafka集群能够同时负责多个topic的分发

Massage

Kafka中最基本的传递对象

Partition 

Topic物理上的分组,一个Topic可以分为多个Partition,每个Partition是一个有序的队列

Segment 

Partition物理上由多个Segment组成,每个Segment存着Message信息

Producer 

生产者,生产Message发送到Topic

Consumer

消费者,订阅Topic并消费Message, Consumer作为一个线程来消费

Consumer Group 

消费者组,一个Consumer Group包含多个Consumer

Offset

偏移量,理解为消息Partition中的索引即可

集群环境搭建 

Zookeeper集群环境
在zk的配置文件zoo_sample.cfg中新增
server.0=192.168.212.174:2888:3888
server.1=192.168.212.175:2888:3888
server.2=192.168.212.176:2888:3888
修改配置
dataDir=/usr/kafka/zookeeper/data(注意同时在zookeeper创建data目录)



每台zk服务器节点,创建服务器标识
创建文件夹: mkdir data
创建文件myid并填写内容为0: vi
myid (内容为服务器标识 : 0)


关闭每台服务器节点防火墙,systemctl stop firewalld.service
启动Zookeeper


kafka集群
tar -zxvf kafka_2.11-1.0.0.tgz
mv kafka_2.12-0.11.0.0 kafka
vi ./kafka/config/server.properties
broker.id=0
listeners=PLAINTEXT://192.168.131.130:9092
zookeeper.connect=192.168.212.164:2181,192.168.212.167:2181,192.168.212.168:2181

其他两台只需要修改server.properties中的broker.id分别为 1 ,2

集群环境测试

1、开启3台虚拟机的zookeeper程序 
/usr/local/zookeeper/bin/zkServer.sh start 
开启成功后查看zookeeper集群的状态 
/usr/local/zookeeper/bin/zkServer.sh status 
出现Mode:follower或是Mode:leader则代表成功 
2、在后台开启3台虚拟机的kafka程序(cd /usr/local/kafka) 
./bin/kafka-server-start.sh -daemon config/server.properties 
3、在其中一台虚拟机(192.168.131.130)创建topic 
/usr/local/kafka/bin/kafka-topics.sh --create –zookeeper 192.168.212.131:2181 –replication-factor 3 –partitions 1 –topic my-replicated-topic 
// 查看创建的topic信息 
/usr/local/kafka/bin/kafka-topics.sh –describe –zookeeper 192.168.212.132:2181 –topic my-replicated-topic 

如何保证消息顺序

消息顺序消费产生原因 

不同行为的消息在消费时,多个消费者消费能力不同,导致后面的消息先于前面的消息消费
不同行为的消息投放至不同的broker中,一个消费者获取消息时顺序可能被打乱

注意:只有不同行为才会有可能导致消息顺序消费问题,相同行为谁先谁后理论上无意义。

例如:insert update delete 三条消息进行消费,在消费者能力不同的情况下,可能出现消费者1消费insert
    消费者2消费update,消费者2消费完成后手动ack,消费者1还未消费完,此时消息又推送至消费者2消费,
    理论上insert消费完成后才会运行update和delete,所以出现问题
    
    再有,消费者获取消息时顺序可能打乱,先消费了update,后消费insert。

解决方法

解决思路在于,消费者消费同一个broker的消息时,可以保证其顺序。
所以,我们可以使用策略将想要维护顺序的消息,尽量使其落在同一个broker中即可。

故消息投递时采用消息key的方式计算hash取模broker,使其相同key落在同一个broker中,消费者进行消费。
这里消费者必须是一个,多个消费者无法解决顺序问题。

但一个消费者其吞吐量惨淡,故采用缓存的设计优化,即消费者批量获取消息,然后将消费使用相同方式计算key落在内存队列中。
每个内存队列对应唯一的线程处理消息。此方式会出现数据丢失

还有就是分组,将消费者分成一个组,多个消费者对应多个broker,kafka会使其合理分配,即一个消费者只消费一个broker的消息

欢迎大家和帝都的雁积极互动,头脑交流会比个人埋头苦学更有效!共勉!

公众号:帝都的雁

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值