kafka是基于磁盘存储的,但是与数据库落盘的方式是不同的,kafka是流式存储,数据在磁盘上也是顺序写入,节约了磁盘寻道的时间,因此写入速度还是很快的,官方统计,kafka的磁盘写入速要比随机写入内存的速度还快。
虽然kafka的存储是基于磁盘,但是并不意味着我们在选机器的时候只看重磁盘大小就可以了。kafka数据写入磁盘的过程利用了操作系统的page cache缓存,使用的是操作系统的内存。因此kafka需要大的磁盘空间和大的内存空间。
在开发的时候我们要注意,数据写入kafka的时候尽量不要自己创建缓存,直接调用kafka的api即可。
因为我们开发的时候使用的是JVM进程内存,这样做会导致同样一份数据在进程内存和操作系统内存各存一份,浪费了机器的内存空间。当然如果JVM内缓存的数据并不是用来落盘的就不需要考虑这个问题。
JVM缓存和操作系统page cache比较:
- JVM一般对象的形式存储数据,k-v属于散列的方式存储,占的内存空间通常比数据本身要大很多;而page cache是面向纯二进制流数据,数据更紧凑,节约内存。
- JVM的存储容易出现GC:操作系统的page cache不存在GC问题。
由于kafka的数据写入依赖操作系统的page cache,page cache是操作系统维护的,cache内容到一定量才会刷入到磁盘。因此这里有个隐患就是突然宕机可能会导致数据丢失。
kafka给我们提供了2种方式帮我们强制写入磁盘,一个是配置一定量就写入磁盘,另一个是配置达到一定时间间隔就写入磁盘。通常我们不需要修改这2个值。
另外,kafka本身是一个集群,单台机器宕机其实不会导致数据丢失。
网友评论