啰里吧嗦kafka
1.kafka是什么
kafka官网: http://kafka.apache.org/
kafka是一种高吞吐量的分布式发布订阅消息系统,用它可以在不同系统中间传递分发消息
2.zookeeper是什么
zookeeper是快速、高可用、容错、分布式的协调服务,kafka使用zookeeper用于管理和协调代理,每个kafka代理通过zookeeper协调其他kafka代理
3.kafka和 zookeeper的下载和配置
下载地址:
http://kafka.apache.org/downloads.html
点击Scala 2.11 - kafka_2.11-2.1.1.tgz (asc, sha512) (带src是源代码)
然后点击http://mirrors.shu.edu.cn/apache/kafka/2.1.1/kafka_2.11-2.1.1.tgz
下载完成后解压,放到一个合适的目录下,我放在E:\Kafka\kafka_2.11-2.1.1
1.找到config目录下的server.properties,
设置log.dirs地址,我设置成log.dirs=E:\Kafka\kafka_2.11-2.1.1\kafka-logs
zookeeper.connect=localhost:2181是默认的, 端口和你zookeeper设置的端口保持一致就行
http://zookeeper.apache.org/releases.html#download
点击Active releases may be downloaded from Apache mirrors:Download
进入https://www.apache.org/dyn/closer.cgi/zookeeper/后点击http://mirror.bit.edu.cn/apache/zookeeper/
下载完成后解压,我放在E:\Kafka\zookeeper-3.4.13
1.一般配置文件都在conf目录下,找到zookeeper的conf目录下的zoo_sample.cfg
将其重新命名为zoo.cfg,
修改dataDir地址为自己合适的dataDir=E:\\Kafka\\zookeeper-3.4.13\\tmp
2.类似配置java环境变量一样,设置ZOOKEEPER_HOME, 然后在path中配置%ZOOKEEPER_HOME%\bin
这样在任意目录下通过cmd命令:zkServer, windows系统就能找到对应目录下bin目录下的zkServer.cmd命令并执行
4.windows环境下的kafka配置和使用
在kafka的解压目录下,例如E:\Kafka\kafka_2.11-2.1.1
按住shift在当前目录下进入cmd命令窗口
启动kafka, 命令窗口别关
.\bin\windows\kafka-server-start.bat .\config\server.properties 另开一个命令窗口, 创建一个名为test的topic
.\bin\windows\kafka-topics.bat --create --zookeeper localhost:2181 --replication-factor 1 --partitions 1 --topic test 查看主题
.\bin\windows\kafka-topics.bat --list --zookeeper localhost:2181 创建生产者
.\bin\windows\kafka-console-producer.bat --broker-list localhost:9092 --topic test
执行完后可随便输入一个字符串 创建消费者
.\bin\windows\kafka-console-consumer.bat --bootstrap-server localhost:9092 --topic test --from-beginning
执行完命令后会发现 命令行出现了刚才生产的字符串 查看topic详情
.\bin\windows\kafka-topics.bat --describe --zookeeper 127.0.0.1:2181 --topic test 在生产者消费者模式下, 按ctrl+c 退出
启动kafka时出现各种问题和解决, 第一个出现的是错误: 找不到或无法加载主类
这是由于我的java环境由jre换成了jdk,找到kafka_2.12-1.0.0\bin\windows\kafka-run-class.bat
文件,将set COMMAND=%JAVA% %KAFKA_HEAP_OPTS% %KAFKA_JVM_PERFORMANCE_OPTS% %KAFKA_JMX_OPTS% %KAFKA_LOG4J_OPTS% -cp "%CLASSPATH%" %KAFKA_OPTS% %
%CLASSPATH%前后加上双引号
第二个报错是java version52.0, 通过cmd , java -version命令发现安装版本是1.8, 但是环境变量配置的路径jdk是1.7的,版本不一致, 修改环境变量java_home路径解决
5.kafka节点之间如何复制备份的
备份机制是干啥的: 备份机制保证了kafka集群中的节点挂掉后而不影响整个集群的工作
生产者向topic中发送数据,消费者消费该topic对应的数据,为了提高吞吐量,生产者会将该topic对应的数据分别发送到多个partition,每个partition都有一定数量的副本作为备份,以提高kafka的高可用性
p0-leader副本 ------- p0-follower副本
|
----------------------------------------------P0-follower副本
生产者和消费者都只在leader副本上写读数据,三个leader副本平均分配在三个broker上,其他follower副本都只做备份,以防leader宕机,follower副本升级成为leader副本
三个broker之间是有一定的策略进行数据的读写的,follower副本会隔指定的时间去leader副本上读取最新消息,包括元数据和日志消息
所以kafka节点复制备份其实就是复制分区里的leader副本,当生产者发布消息到topic的某个分区时,消息首先被传递到leader副本,然后leader通知follower有新消息过来,follower去leader中拉取消息,一旦有足够的副本收到消息,leader就会提交这个消息,消费者就能消费到这个消息了。
leader负责维护和跟踪同步副本列表中所有follower滞后状态,消息提交之后才被成功复制到所有的同步副本,消息复制延迟受最慢的follower限制,
5.1 follower副本发生故障
如果某个follower落后太多或宕机,leader会把他从isr中剔除出去。那么该副本对应的分区也就称之为同步失效分区,即under-replicated分区,follower重启后会去leader上恢复最新的HW并将日志截断到HW,并继续从leader中获取HW以后的消息,一旦完全赶上leader,副本将被重新加入到ISR队列中,系统将重新回到fully replicated(全量同步)模式。
5.2 leader副本发生故障
leader发生故障,其他follower会争相竞争做leader,最终只有一个follower竞争成功升级成为leader,故障leader重启后成为follower去新leader同步消息 (使用Zookeeper实现leader选举。如果leader失败,controller会从ISR选出一个新的leader
)
注 :broker概念
已发布的消息保存在一组服务器中,称之为Kafka集群。集群中的每一个服务器都是一个代理(Broker). 消费者可以订阅一个或多个主题(topic),并从Broker拉数据,从而消费这些已发布的消息。
ISR:in-sync replicas
kafka维护的一个副本维护队列,ISR的副本保持和leader的同步,当然leader本身也在ISR中。初始状态所有的副本都处于ISR中,当一个消息发送给leader的时候,leader会等待ISR中所有的副本告诉它已经接收了这个消息,如果一个副本失败了,那么它会被移除ISR。下一条消息来的时候,leader就会将消息发送给当前的ISR中节点了
HW: high watermark
是指ISR中所有节点都已经复制完的消息的offset。也是消费者所能获取到的消息的最大offset
LEO:LogEndOffset,表示每个分区log的最后一条消息的offset
6. kafka消息是否会丢失?为什么?
消息是否会丢失从两个角度来看
6.1消息发送
kafka消息的发送方式分同步(sync)、异步(async)两种方式
生产者如果异步发送,会造成消息丢失,发送的过程中kafka会先把消息缓存起来。然后批量发送。 若批量发送之前client宕机会造成消息丢失。生产者不丢失消息需要同步发送
kafka服务器默认异步刷盘,先刷到系统页缓存,然后再刷新到日志文件。页缓存的数据可能会丢失。解决可以同步的方式刷盘,但是这样效率很低,比rabbitmq低。
配置ack=all , min.insync.replas > 1 是可以保证页缓存数据不丢失
关闭自动提交?
unclean.leader.election.enable 默认是false 可靠性优先, 不在ISR里的follower不能够参与选举,此时无法进行新的选举,此时整个分区处于不可用状态
6.2消息消费
使用高级接口High-level API,可能存在一个问题就是当消息消费者从集群中把消息取出来、并提交了新的消息offset值后,还没来得及消费就挂掉了,那么下次再消费时之前没消费成功的消息就消失了
简单来说,
producer.type属性进行配置同步异步
request.required.acks属性来确认消息的生产,-1---表示Leader和Follower都接收成功时确认;
同步模式下,确认机制设置为-1,即让消息写入Leader和Follower之后再确认消息发送成功
7. kafka最合理的配置是什么?
8.kafka的leader选举机制是什么?
Kafka将每个Topic进行分区Patition,以提高消息的并行处理,同时为保证高可用性,每个分区都有一定数量的副本 Replica,这样当部分服务器不可用时副本所在服务器就可以接替上来,保证系统可用性。在Leader上负责读写,Follower负责数据的同步。当一个Leader发生故障如何从Follower中选择新Leader呢?
Kafka在Zookeeper上针对每个Topic都维护了一个ISR(in-sync replica---已同步的副本)的集合,集合的增减Kafka都会更新该记录。如果某分区的Leader不可用,Kafka就从ISR集合中选择一个副本作为新的Leader。这样就可以容忍的失败数比较高,假如某Topic有N+1个副本,则可以容忍N个服务器不可用。
如果ISR中副本都不可用,有两种处理方法:
(1)等待ISR集合中副本复活后选择一个可用的副本;
(2)选择集群中其他可用副本;
9. kafka对硬件的配置有什么要求?
磁盘吞吐量 磁盘容量 内存 网络 CPU
10. kafka的消息保证有几种方式?
At most once—Messages may be lost but are never redelivered. 最多一次 --- 消息可能丢失,但绝不会重发。 At least once—Messages are never lost but may be redelivered. 至少一次 --- 消息绝不会丢失,但有可能重新发送。 Exactly once—this is what people actually want, each message is delivered once and only once. 正好一次 --- 这是人们真正想要的,每个消息传递一次且仅一次。
啰里吧嗦kafka的更多相关文章
- 啰里吧嗦CountDownLatch
java.util.concurrent Class CountDownLatch 目录 CountDownLatch 是什么 CountDownLatch是一个同步工具类,它允许一个或多个线程一直等 ...
- 啰里吧嗦jvm
一.为什么要了解jvm 有次做项目的时候,程序run起来的时候,总是报OutOfMemoryError,有老司机教我们用jconsole.exe看内存溢出问题 就是这货启动jconsole后,发现一个 ...
- 啰里吧嗦redis
1.redis是什么 redis官网地址 Redis is an open source (BSD licensed), in-memory data structure store, used as ...
- 啰里吧嗦式讲解java静态代理动态代理模式
一.为啥写这个 文章写的比较啰嗦,有些东西可以不看,因为想看懂框架, 想了解SSH或者SSM框架的设计原理和设计思路, 又去重新看了一遍反射和注解, 然后看别人的博客说想要看懂框架得先看懂设计模式,于 ...
- 一步步学习操作系统(1)——参照ucos,在STM32上实现一个简单的多任务(“啰里啰嗦版”)
该篇为“啰里啰嗦版”,另有相应的“精简版”供参考 “不到长城非好汉:不做OS,枉为程序员” OS之于程序员,如同梵蒂冈之于天主教徒,那永远都是块神圣的领土.若今生不能亲历之,实乃憾事! 但是,圣域不是 ...
- 啰哩吧嗦式讲解在windows 家庭版安装docker
1.docker是什么,为什么要使用docker Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中, 然后发布到任何流行的 Linux 机器上,也可以实 ...
- IDDD 实现领域驱动设计-理解领域和子域
上一篇:<IDDD 实现领域驱动设计-一个简单业务用例的回顾和理解> 在<实现领域驱动设计>第二章的前半部分内容中,提到领域和子域的概念,并且作者把这两者又进行了细致的区分,其 ...
- Css 动画的回调
在做项目中经常会遇到使用动画的情况.以前的情况是用js写动画,利用setTimeout函数或者window.requestAnimationFrame()实现目标元素的动画效果.虽然后者解决了刷新频率 ...
- 浅谈独立使用NDK编译库文件(Android)
阅读前准备 这是一篇相对入门的文章.文中会涉及到少许NDK的知识,但个人认为对初学者来说都相对比较实用,因为都是在平时项目中遇到的(目前自己也是初学者).一些其他高深的技术不再本文探讨范围之内(因为我 ...
随机推荐
- java程序中获取kerberos登陆hadoop
本文由作者周梁伟授权网易云社区发布. 一般我们在使用kbs登陆hadoop服务时都直接在shell中调用kinit命令来获取凭证,这种方式简单直接,只要获取一次凭证之后都可以在该会话过程中重复访问.但 ...
- kubernetes1.9管中窥豹-CRD概念、使用场景及实例
欢迎访问网易云社区,了解更多网易技术产品运营经验. 前言 默认读者有kubernetes基础概念的背景知识,因此基础概念例如有状态.pod.Replica Sets.Deployments.state ...
- Reddit CEO亲自诠释内容审核的无奈
本文由 网易云发布. 导语:继数据泄露危机之后,Facebook将会雇用数千名新员工来负责新的验证系统,这个系统将首先在美国广告客户中生效,并将在未来几个月内涵盖其他国家.与此同时,如何让自己的社区 ...
- jxl库介绍
jxl是个韩国人开发的java中操作excel的库(棒子国思密达) 相对于另一个java excel库poi来说,jxl具有小巧和使用简单等优点. File uploadedFile = new Fi ...
- “全栈2019”Java多线程第二十章:同步方法产生死锁的例子
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多 ...
- LOJ#3086. 「GXOI / GZOI2019」逼死强迫症(矩阵快速幂)
题面 传送门 题解 先考虑全都放\(1\times 2\)的方块的方案,设防\(i\)列的方案数为\(g_i\),容易推出\(g_i=g_{i-1}+g_{i-2}\),边界条件为\(g_0=g_1= ...
- 前端入门CSS(3)
day60 不透明度 opacity()\ opacity (不透明度) 1. 取值0~1 2. 和rgba()的区别: ...
- 【zookeeper】Apache curator的使用及zk分布式锁实现
上篇,本篇主要讲Apache开源的curator的使用,有了curator,利用Java对zookeeper的操作变得极度便捷. 其实在学之前我也有个疑虑,我为啥要学curator,撇开涨薪这些外在的 ...
- centos6.5 yum安装lamp
准备篇: 1.清空防火墙 iptables -F 或者关闭防火墙 /etc/init.d/iptables stop,如果要防火墙开机不要启动 chkconfig iptables off 2.关闭S ...
- 搜集C++实现的线程池
现在很多语言都内置了线程池实现,但C++中却没有.本文列举一些C++实现的线程池工具. Boost.Threadpool 项目首页:http://threadpool.sourceforge.net ...