kafka概要设计
Kafka核心功能
即:高性能的消息发送与高性能的消息消费
下载安装包后即可启动Kafka服务器,但是此前需要首先启动Zookeeper服务器,Zookeeper是为Kafka提供协调服务的工具,Kafka内置提供了一个Zookeeper服务器以及一组相关的管理脚本,直接使用该内置Zookeeper即可。
Kafka吞吐量/延时分析
吞吐量:某种处理能力的最大值,对于Kafka而言,吞吐量指的是每秒能够处理的消息数或者每秒能够处理的字节数。(高吞吐)
延时:衡量发出某个操作与接收到操作响应之间的时间间隔,对于Kafka而言,延时表示客户端发起请求与服务器处理请求并发送响应给客户端之间的时间间隔。(低延时)
Kafka生产端如何做到高吞吐低延时:Kafka写入操作快,得益于它对磁盘的使用方法不同,虽然Kafka会持久化所有数据到磁盘,但本质上每次写入操作其实都是把数据写入到操作系统的页缓存(page cache)中,然后由操作系统自行决定什么时候把页缓存中的数据写回磁盘上。这样设计具有3个优势:
1.操作系统页缓存是在内存中分配的,所以消息写入的速度非常快
2.Kafka不必直接与底层的文件系统打交道。所有繁琐的I/O操作都交由操作系统来处理
3.Kafka写入操作采用追加写入(append)的方式,避免了磁盘随机写操作,注意磁盘随机读写的吞吐量的确很慢,但是磁盘顺序读写的吞吐量很快,甚至接近内存的随机I/O
Kafka消费端如何做到高吞吐低延时:Kafka读取消息时首先会从操作系统的页缓存中读取,如果命中便把消息经页缓存直接发送到网络的Socket上。该过程利用Linux平台的sendfile系统调用做到,即所谓的零拷贝(Zero Copy)技术。(附:传统的Linux操作系统中的I/O接口会将同一份数据进行多次拷贝,数据传输过程中还涉及内核态与用户态的上下文切换,CPU开销巨大,限制了操作系统高效数据传输的能力)Kafka的消息消费机制使用的就是sendfile——严格来说是通过Java的FileChannel.transferTo方法实现。
Kafka高吞吐低延时总结:
- 大量使用操作系统页缓存,内存操作速度快且命中率高
- Kafka不直接参与物理I/O操作,而是交由最擅长此事的操作系统来完成
- 采用追加写入方式,摒弃了缓慢的磁盘随机读/写操作
- 使用以sendfile为代表的零拷贝技术加强网络间的数据传输速率
Kafka消息持久化
Kafka由操作系统自行决定什么时候把页缓存中的数据写回磁盘上。Kafka依赖操作系统的flush“刷盘”功能实现消息真正写入物理磁盘,而默认的刷盘间隔是5s,通常情况下,该间隔太短,适当增加例如2min可以大程度上提升操作系统物理写入操作的性能。此外持久化到磁盘上的好处如下:
- 解耦消息发送与消息消费
- 实现灵活的消息处理:如重置消费位点等
此外,传统持久化方式是优先使用内存,内存不足后再一次性写入磁盘,Kafka相反,当操作系统决定将页缓存中的数据写入到磁盘上时,会优先写入到磁盘(文件系统的持久化日志),减少了Kafka程序对内存的消耗,将内存主要供于页缓存使用
Kafka负载均衡和故障转移
Kafka实现负载均衡(load balancing)实际上是通过智能化的分区领导者选举(partition leader election)来实现,可以在集群的所有机器上以均等的机会分散各个partition的leader,从而实现整体上的负载均衡,默认情况下Kafka的每台服务器都有均等的机会为Kafka的客户提供服务,可以把负载分散到所有集群中的机器上。
Kafka实现故障转移(fail-over)主要是利用会话机制来实现
所谓故障转移是指当服务器意外终止时,整个集群可以快速地检测到该失效(failure),并立即将该服务器上的应用或服务自动转移到其他服务器上。故障转移通常以“心跳”、“会话”的机制来实现,即只要主服务器与备份服务器之间的心跳无法维持或主服务器注册到服务中心的会话超时过期了,那么就认为主服务器已无法正常运行,集群会自动启动某个备份服务器来替代主服务器的工作。
每台Kafka服务器启动后会以会话的形式把自己注册到Zookeeper服务器上,一旦该服务器出现问题,与Zookeeper的会话便不能维持从而超时失效,此时Kafka集群会选举出另一台服务器来完全代替这台服务器继续提供服务。
Kafka伸缩性
伸缩性表示向分布式系统中增加额外的计算资源(cpu、内存、存储或带宽)时吞吐量提升的能力。
阻碍线性扩容的一个关键因素就是状态的保存。不管哪类分布式系统,集群中的每台服务器一定会维护许多内部状态。如果由服务器自己来保存这些状态信息,则必须要处理一致性问题。相反如果服务器是无状态的,状态的保存和管理交给专门的协调服务来做(如Zookeeper),那么整个集群的服务器之间就无需繁重的状态共享,这极大的降低了复杂度。如果需要扩容集群节点,只需要简单地启动新的节点机器进行自动负载均衡就可以。
Kafka采用了上述思想,每台Kafka服务器上的状态统一交给Zookeeper保管,扩展Kafka服务器也只需要一步:启动新的Kafka服务器。Ps:在Kafka服务器上并不是所有状态都不保存,它只保存了很轻量级的内部状态,因此在整个集群建维护状态一致性的代价很低。
注意:在Kafka演进过程中,经由Kafka下游数据处理平台做的事情Kafka自己也可以做,即Kafka Streams,流式处理组件。
kafka概要设计的更多相关文章
- Kafka实战分析(一)- 设计、部署规划及其调优
1. Kafka概要设计 kafka在设计之初就需要考虑以下4个方面的问题: 吞吐量/延时 消息持久化 负载均衡和故障转移 伸缩性 1.1 吞吐量/延时 对于任何一个消息引擎而言,吞吐量都是至关重要的 ...
- 《Apache Kafka 实战》读书笔记-认识Apache Kafka
<Apache Kafka 实战>读书笔记-认识Apache Kafka 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.kafka概要设计 kafka在设计初衷就是 ...
- Kafka 0.10 SocketServer源代码分析
1概要设计 Kafka SocketServer是基于Java NIO来开发的,采用了Reactor的模式,其中包含了1个Acceptor负责接受客户端请求,N个Processor负责读写数据,M个H ...
- kafka知识点详解
第一部分:kafka概述 一.定义(消息引擎系统) 一句话概括kafka的核心功能就是:高性能的消息发送与高性能的消息消费. kafka刚推出的时候是以消息引擎的身份出现的,它具有强大的消息传输效率和 ...
- Spark踩坑记——Spark Streaming+Kafka
[TOC] 前言 在WeTest舆情项目中,需要对每天千万级的游戏评论信息进行词频统计,在生产者一端,我们将数据按照每天的拉取时间存入了Kafka当中,而在消费者一端,我们利用了spark strea ...
- 消息队列 Kafka 的基本知识及 .NET Core 客户端
前言 最新项目中要用到消息队列来做消息的传输,之所以选着 Kafka 是因为要配合其他 java 项目中,所以就对 Kafka 了解了一下,也算是做个笔记吧. 本篇不谈论 Kafka 和其他的一些消息 ...
- kafka学习笔记:知识点整理
一.为什么需要消息系统 1.解耦: 允许你独立的扩展或修改两边的处理过程,只要确保它们遵守同样的接口约束. 2.冗余: 消息队列把数据进行持久化直到它们已经被完全处理,通过这一方式规避了数据丢失风险. ...
- .net windows Kafka 安装与使用入门(入门笔记)
完整解决方案请参考: Setting Up and Running Apache Kafka on Windows OS 在环境搭建过程中遇到两个问题,在这里先列出来,以方便查询: 1. \Jav ...
- kafka配置与使用实例
kafka作为消息队列,在与netty.多线程配合使用时,可以达到高效的消息队列
随机推荐
- php能力自测
最近整理些PHP方面的问题,PHPer可自测自身的功底如何! 查看更多问题 php运行模式 php有几种主要的运行模式?分别使用在那些场景下? gi与fastcgi有什么不同?他们的优缺点有哪些? 如 ...
- 十分钟理解Actor模式
Actor模式是一种并发模型,与另一种模型共享内存完全相反,Actor模型share nothing.所有的线程(或进程)通过消息传递的方式进行合作,这些线程(或进程)称为Actor.共享内存更适合单 ...
- (一)JNI基本概念
1. 基本概念: 首先,注意:C和C++在调用JNI时候方法是不一样的 注意看下面两个的区别: C++ #include <jni.h> #include <string> e ...
- [转]Web Api系列教程第2季(OData篇)(二)——使用Web Api创建只读的OData服务
本文转自:http://www.cnblogs.com/fzrain/p/3923727.html 前言 很久没更新了,之前有很多事情,所以拖了很久,非常抱歉.好了,废话不多说,下面开始正题.本篇仍然 ...
- ExtJs定时消息提示框,类似于QQ右下角提示,ExtJs如何定时向后台发出两个请求并刷新数据实例
原文出自:https://blog.csdn.net/seesun2012 思路: 1.加载页面,加载Ext.TaskManager.start()方法: 2.执行定时器方法: 3.获取地址向后台发送 ...
- JavaScript es6 class类的理解。
本着互联网的分享精神,在本篇文章我将会把我对JavaScript es6 class类的理解分享给大家. JavaScript 类主要是 JavaScript 现有的基于原型的继承的语法糖. 类语法 ...
- 封装简单的API——微信小程序
前几天自己琢磨微信小程序的基本开发,里边用到的技术包括WebAPI,也就是方法的封装. 当然也可以用ASP.NET MVC WCF来写接口.更简单应该就是 WinForm 简单易部署. 这里用的是 2 ...
- [linux] C语言Linux系统编程进程基本概念
1.如果说文件是unix系统最重要的抽象概念,那么进程仅次于文件.进程是执行中的目标代码:活动的.生存的.运行的程序. 除了目标代码进程还包含数据.资源.状态以及虚拟化的计算机. 2.进程体系: 每一 ...
- 网络安全之——DNS欺骗实验
---------------发个帖证明一下存在感,希望各位大牛们,别喷我!!谢谢-------------- DNS(域名系统)的作用是把网络地址(域名,以一个字符串的形式) ...
- GString惰性求值
当对一个GString实例求值时,如果其中包含一个变量,该变量的值会被简单地打印到一个Writer,通常是一个StringWriter.然而,如果GString中包含的是一个闭包,而非变量,该闭包就会 ...