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. SQL 常用脚本,非常适用

    一.基础 1.说明:创建数据库 CREATE DATABASE database-name 2.说明:删除数据库 drop database dbname 3.说明:备份sql server --- ...

  2. Bootboxjs快速制作Bootstrap的弹出框效果

    Bootboxjs是一个简单的js库,简单快捷帮你制作一个Bootstrap的弹出框效果. 一.简介 bootbox.js是一个小的JavaScript库,它帮助您在使用bootstrap框架的时候快 ...

  3. TP2.1 加载扩展配置文件参数

    维护老项目真的恶心!!!!!!!!! TP3.2好像有这样一个配置参数,可以设置有那些扩展配置文件,系统会自动加载. 方法一: 'LOAD_EXT_CONFIG' => 'user,db',// ...

  4. Mysql中的分页处理

    先来说一下Mysql中limit的语法: --语法: SELECT * FROM table LIMIT [offset,] rows | rows OFFSET offset --举例: selec ...

  5. golang学习之slice基本操作

    slice的增删改查: //删除 func remove(slice []interface{}, i int) []interface{} { // copy(slice[i:], slice[i+ ...

  6. javascript window.opener的用法分析

    window.opener 返回的是创建当前窗口的那个窗口的引用 window.opener 的用法 window.opener 返回的是创建当前窗口的那个窗口的引用,比如点击了a.htm上的一个链接 ...

  7. 二、spark SQL交互scala操作示例

    一.安装spark spark SQL是spark的一个功能模块,所以我们事先要安装配置spark,参考: https://www.cnblogs.com/lay2017/p/10006935.htm ...

  8. MongoTemplate基本操作

    本文基于spring boot项目,快速构建项目请参考:https://www.cnblogs.com/lay2017/p/8836273.html 添加mongo依赖 <dependency& ...

  9. OutOfMemoryError(内存溢出)解决办法

    第一种OutOfMemoryError: PermGen space 发生这种问题的原意是程序中使用了大量的jar或class,使java虚拟机装载类的空间不够,与Permanent Generati ...

  10. stringstream快速实现String和int之间的转换

    需要包含头文件”sstream” #include <iostream> #include <string> #include <sstream> using na ...