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高吞吐低延时总结:

  1. 大量使用操作系统页缓存,内存操作速度快且命中率高
  2. Kafka不直接参与物理I/O操作,而是交由最擅长此事的操作系统来完成
  3. 采用追加写入方式,摒弃了缓慢的磁盘随机读/写操作
  4. 使用以sendfile为代表的零拷贝技术加强网络间的数据传输速率

Kafka消息持久化

Kafka由操作系统自行决定什么时候把页缓存中的数据写回磁盘上。Kafka依赖操作系统的flush“刷盘”功能实现消息真正写入物理磁盘,而默认的刷盘间隔是5s,通常情况下,该间隔太短,适当增加例如2min可以大程度上提升操作系统物理写入操作的性能。此外持久化到磁盘上的好处如下:

  1. 解耦消息发送与消息消费
  2. 实现灵活的消息处理:如重置消费位点等

此外,传统持久化方式是优先使用内存,内存不足后再一次性写入磁盘,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概要设计的更多相关文章

  1. Kafka实战分析(一)- 设计、部署规划及其调优

    1. Kafka概要设计 kafka在设计之初就需要考虑以下4个方面的问题: 吞吐量/延时 消息持久化 负载均衡和故障转移 伸缩性 1.1 吞吐量/延时 对于任何一个消息引擎而言,吞吐量都是至关重要的 ...

  2. 《Apache Kafka 实战》读书笔记-认识Apache Kafka

    <Apache Kafka 实战>读书笔记-认识Apache Kafka 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.kafka概要设计 kafka在设计初衷就是 ...

  3. Kafka 0.10 SocketServer源代码分析

    1概要设计 Kafka SocketServer是基于Java NIO来开发的,采用了Reactor的模式,其中包含了1个Acceptor负责接受客户端请求,N个Processor负责读写数据,M个H ...

  4. kafka知识点详解

    第一部分:kafka概述 一.定义(消息引擎系统) 一句话概括kafka的核心功能就是:高性能的消息发送与高性能的消息消费. kafka刚推出的时候是以消息引擎的身份出现的,它具有强大的消息传输效率和 ...

  5. Spark踩坑记——Spark Streaming+Kafka

    [TOC] 前言 在WeTest舆情项目中,需要对每天千万级的游戏评论信息进行词频统计,在生产者一端,我们将数据按照每天的拉取时间存入了Kafka当中,而在消费者一端,我们利用了spark strea ...

  6. 消息队列 Kafka 的基本知识及 .NET Core 客户端

    前言 最新项目中要用到消息队列来做消息的传输,之所以选着 Kafka 是因为要配合其他 java 项目中,所以就对 Kafka 了解了一下,也算是做个笔记吧. 本篇不谈论 Kafka 和其他的一些消息 ...

  7. kafka学习笔记:知识点整理

    一.为什么需要消息系统 1.解耦: 允许你独立的扩展或修改两边的处理过程,只要确保它们遵守同样的接口约束. 2.冗余: 消息队列把数据进行持久化直到它们已经被完全处理,通过这一方式规避了数据丢失风险. ...

  8. .net windows Kafka 安装与使用入门(入门笔记)

    完整解决方案请参考: Setting Up and Running Apache Kafka on Windows OS   在环境搭建过程中遇到两个问题,在这里先列出来,以方便查询: 1. \Jav ...

  9. kafka配置与使用实例

    kafka作为消息队列,在与netty.多线程配合使用时,可以达到高效的消息队列

随机推荐

  1. 数据库SQLITE3初识

    数据库DataBase,我们都没有接触过数据库,那么数据库是什么? 它是一个有结构的.集成的.可共享的统一管理的数据集合! 所谓有结构的,指的是数据是按一定的模型组织起来的. 简单的说,拿个箱子,用隔 ...

  2. PHP OOP面向对象部分方法归总(代码实例子)

    <?php//对象名存在栈内存中,数据存在堆内存中class leyangjun{    var $name;  //定义变量    var $age;    var $sex;         ...

  3. python36异步任务 获取ip地址的地理位置

    # encoding: utf-8 import asyncio import requests import functools url = "http://ip.zxinc.org/ap ...

  4. easyform表单校验插件改版源码

    改动特性: 1.支持回调,可用于ajax提交 2.提示框样式修改,原版太丑,修改成bootstrap的popover  样式 原版还存在缺陷:被校验的表单元素设置不灵活,还得加上id.name 什么的 ...

  5. JavaScript ES6 Symbol.hasInstance的理解。

    Symbol.hasInstance 本案例是结合阮一峰老师的ECMAScript 6 入门丛书进一步的详细介绍,和对Symbol.hasInstance的理解.本着互联网的精神,分享给大家. 对象的 ...

  6. c#尽量使用条件属性(Conditional Attribute)

    至此我们应该对Attribute属性大体了解了.下面来看看条件属性(Conditional Attribute)到底是怎么回事. 1 [Conditional("DEBUG")]  ...

  7. Visual studio 2013打开报异常"Exception has been thrown by the target of an invocation"

    最近遇到一个问题,打开VS2013和SQL Server2014都会出报错,错误信息如下: 以前都是好好的,重启了机子也不行,能打开两个VS,再打开第三个VS还是会报错,百度无果,还是在google上 ...

  8. MyEclipse去除网上复制下来的代码带有的行号(使用正则表达式)

    一.正则表达式去除代码行号 作为开发人员,我们经常从网上复制一些代码,有些时候复制的代码前面是带有行号,如: MyEclipse本身自带有查找替换功能,并且支持正则表达式替换,使用正则替换就可以很容易 ...

  9. Canvas学习:globalCompositeOperation详解

    在默认情况之下,如果在Canvas之中将某个物体(源)绘制在另一个物体(目标)之上,那么浏览器就会简单地把源特体的图像叠放在目标物体图像上面. 简单点讲,在Canvas中,把图像源和目标图像,通过Ca ...

  10. 浏览器根对象window之history

    1. history(H5) Window.history保存用户在一个会话期间的网站访问记录,用户每次访问一个新的URL即创建一个新的历史记录. 1.1 length 返回浏览器历史列表中的 URL ...