大家好,我是 kafka, 可能很多人都听说过我,知道我是 2011 年出生在 LinkedIn 的, 从那会儿到现在我的功能越发强大了。作为一个优秀而又完整的平台,你可以在我上面冗余地存储巨大的数据量,我有一个具有高吞吐量 (数百万 / 秒) 的消息总线,你可以在这上面对经过我的数据进行实时流处理。
如果你认为我就只有上面的这些特点的话,那么你真的是太肤浅了。
上面虽然说的很好,但是并未触及到我的核心,这里我给你几个关键字:分布式,水平可扩展,容错,提交日志。
上面这些抽象的词语,我会一一解释它们的含义,并告诉你们我是如何工作的。
内心独白: 本来我是想要以第一人称来写这篇文章的,但是我发现我只能写出上面的了,再多的我就憋不出来了,于是我决定不要为难自己,还是用用第三人称写吧 (写作的功底仍然需要锻炼)
分布式
分布式系统由多个运行的计算机系统组成,所有这些计算机在一个集群中一起工作,对终端用户来讲只是一个单一节点。
kafka也是分布式的,因为它在不同的节点(又被称为broker)上存储,接受以及发送消息,这样做的好处是具有很高的可扩展性和容错性。
水平可扩展性
在这之前,先看看什么是垂直可扩展,比如你有一个传统的数据库服务器,它开始过度负载,解决这个问题的办法就是给服务器加配置(cpu,内存,SSD),这就叫做垂直扩展。但是这种方式存在两个巨大的劣势
- 硬件存在限制,不可能无限的添加机器配置
- 它需要停机时间,通常这是很多公司无法容忍的
水平可扩展就是通过添加更多的机器来解决同样的问题,添加新机器不需要停机,而且集群中也不会对机器的数量有任何的限制。问题在于并非所有系统都支持水平可伸缩性,因为它们不是设计用于集群中(集群中工作更加复杂)。
容错性
非分布式系统中容易最致命的问题就是单点失败,如果你唯一的服务器挂掉了,那么我相信你会很崩溃。
而分布式系统的设计方式就是可以以配置的方式来容许失败。在5个节点的kafka集群中,你仍然可以继续工作即使其中两个节点挂掉了。
需要注意的是,容错与性能直接相关,你的系统容错程度越高,性能就越差。
提交日志(commit log)
提交日志(也被称为预写日志或者事物日志)是仅支持附加的持久有序数据结构,你无法修改或者删除记录,它从左往右读并且保证日志的顺序。
是不是觉得kafka的数据结构如此简单?
是的,从很多方面来讲,这个数据结构就是kafka的核心。这个数据结构的记录是有序的,而有序的数据可以确保我们的处理流程。这两个在分布式系统中都是及其重要的问题。
kafka实际上将所有消息存储到磁盘并在数据结构中对它们进行排序,以便利用顺序磁盘读取。
- 读取和写入都是常量时间O(1)(当确定了record id),与磁盘上其他结构的O(log N)操作相比是一个巨大的优势,因为每个磁盘搜索都很耗时。
- 读取和写入不会相互影响