当消息队列遭遇英特尔傲腾持久内存会碰撞出怎样的火花?傲腾持久内存会对消息队列应用带来哪些革命性的变化。在2022存储峰会分布式存储论坛上,英特尔公司傲腾产品事业部云软件架构师胡风华进行了详细解读。
消息队列管中窥豹
消息队列队列是什么呢?
根据维基百科的定义,消息队列是一个软件组件,通常应用进程兼通信,或者在同一个进程中线程间通信,它是一个用于通信的中间件,一个典型的消息队列包括发送者、消息代理、接受者。
消息的发送者通过网络或者本地通信设施向消息代理发送消息,消息代理带有数据缓冲,在收到消息后将数据放入数据缓冲区,消息的接受者在消息代理读取消息后进行处理。消息队列早在上个世纪八十年代就已经出现了,但是应用范围相对较窄,随着互联网时代的到来,特别是大数据和云计算的普及后,消息队列也得到了迅猛的发展,优秀的产品如雨后春笋般不断的涌现,如开源的Kafka、阿里巴巴主导的开源项目RocketMQ,以及MabbitMQ,以及近年来发展非常迅猛的后起之秀Pulsar。
消息队列用在哪些领域呢?这里我们列出了消息队列一些典型的应用。
首先消息队列可以应用在事务处理,也就是交易方面,如银行存取款、转帐等等;在证券行业,如股票、期货交易;在线支付方面,如我们经常使用的支付宝、微信支付等。
其次,消息队列可以应用在大数据分析领域,最常见的就是像日志分析、商业智能、知识图谱等,消息队列都扮演了一个非常重要的角色。
第三是人工智能,消息队列应用包括深度学习训练与推理、个性化商品和内容推荐,银行反欺诈、反洗钱系统等。
第四是物联网,也就是IoT领域,无人驾驶、自动驾驶、工业互联网、智慧城市等应用大量应用消息队列。
消息队列有几个特点:首先消息队列是异步通信模式,天然适合处理生产和消费速度不一样的场景,而这种场景目前越来越普遍。其次消息队列能够实现系统解耦,可将生产者、消费者隔离开来,互不影响。此外,消息队列带有存储数据缓冲区,能起到消峰填谷的作用,这在互联网应用中非常常见。最后,消息队列可以实现数据的流水线功能,通过将多个消息队列联结在一起,可以实现数据的流水化处理功能。
这些特点也带来了很多好处,如系统可扩展性,因系统是解耦的,生产者、消息代理和消费者都可以根据实际的负载情况进行独立的扩缩容,非常灵活。如今,消息队列都使用分布式的架构,可用性非常高,提高了系统的可用性,可以确保用户SLA需求。消息队列的量非常有弹性,可从TB级一直扩展到PB级,甚至更多,能够轻松应对大数据量场景。
走近英特尔傲腾持久内存
英特尔傲腾持久内存的出现,在DRAM和SSD两层之间引入了新的层次,能消灭二者之间性能鸿沟,英特尔傲腾持久内存技术是一项革命性的技术,它使用与NAND SSD完全不同的存储介质,有接近DRAM的性能,并能够提供更大容量密度,因此单位价格更加低廉。利用傲腾技术,英特尔开发了两个产品系列:英特尔傲腾持久内存和英特尔的傲腾SSD。
傲腾持久内存采用DDR物理接口,提供大容量可持久化的内存;傲腾SSD采用NVMe标准接口,提供块数据访问接口,是一个高速存储产品。这两个产品系列在内存存储金字塔中间组成两个新的层次。
在此主要讨论傲腾持久内存,Persistent Memory,简称PMem,它有如下特点。首先DRAM能够实现数据持久化,在应用或系统崩溃后,Pmem中的数据并不会丢失,这与DRAM不一样。其次,因为它是内存,数据不需要再重新加载就可以运行,可以实现就地更新,写入到PMem数据直接持久化,不需从DRAM写回到存储介质的开销。再次,SSD、HDD只能按照扇区、或者块来寻址,而PMem能够实现按照字节进行寻址,大大提高了读写的效率。最后,PMem有非常高性能,无论延迟、带宽都比SSD快很多,其延迟在200ns~300ns之间,带宽高达78GB/S。
自从2019年英特尔正式推出第一代傲腾持久内存产品之后,它就迅速成为了各个应用关注的焦点,经过三年的打磨,目前傲腾持久内存已经在很多领域获得成功,帮助全球数千家客户提升现有系统的性能,降低系统的TCO。
目前英特尔傲腾持久内存应用的主要领域包括内存数据库,这包括非常流行的Redis内存数据库以及相关变种,英特尔也基于Redis开发了自己的专门针对傲腾持久内存的一个版本,它的名字叫In-Memory DB,它是一个开源的项目。
另外一个领域是NoSQL的数据库,傲腾持久内存已经应用在RocksDB等数据库上面,经含大量针对PMem的改进,同时英特尔也在开发自己的KV数据库引擎——KVDK,完全针对PMem重新设计,也在去年秋天开源。傲腾持久内存也已经应用在一些存储的领域,包括Ceph以及OpenCAS缓存,用来加速存储的性能。
在人工智能领域,傲腾持久内存也没有缺席,它在防金融欺诈,在内容推荐等很多应用中间,已经获得了令人瞩目的成绩。另外在大数据和数据分析领域,傲腾持久内存在Spark、ClickHouse等等也都有很多的应用,在云计算方面,云计算的巨头已经推出了配备PMem的虚拟机产品,并且将PMem应用在容器环境,比如说Kubernetes等等。
英特尔傲腾持久内存版图高速增长
傲腾持久内存的版图仍然在持续高速的增长,前面我们已经介绍了消息队列和傲腾持久内存,那么如何将二者结合呢?
第一个例子是Pafka,Pafka是Kafka的变种,针对PMem进行了改造,目的是提高性能,降低成本。Kafka是一个支持数据持久化的高效率的分布式消息队列,最初Kafka是LinkedIn开发的,后来Linkedin将它捐献给了Apache基金会,它有如下的特点,因此得到了广泛的应用。Kafka是高度可扩展的,它可以通过增加Broker提高吞吐率,它也提供永久的数据存储,不需要担心消息会丢失,同时Kafka这种分布式的设计保证了系统高可用能力。
我们来进一步了解Kafka的架构,Kafka主要由生产者、消息代理、Broker和消费者组成。生产者是消息的源头,它将消息发送给消息代理,消费者是消息的接收和处理者,他从消息代理处获取消息,消息代理处于核心地位,通常多个消息代理服务器会组成一个集群,实现系统的可扩展能力以及系统的高可用性,消息按照Topic进行组织,一个Topic可以创建多个分区,通过多个分区,生产者可以实现并行的写入,然后对消费者来说,可以实现并行的消费,因此通过多分区的方式可以提高系统的吞吐率。
另一方面,一个Topic可以有多个副本,从而实现数据的容错,可以提高系统的可用性,副本有Leader和Replica两种角色,生产者和消费者总是使用Leader来发送和获取消息,消息代理通过Zookeeper来实现对Broker和Topic的管理,消息通过本地磁盘进行保存持久化。Kafka基于发布和订阅这种模式,消费者可以通过Producer来发布他的消息,然后消费者通过在Broker上进行订阅,消息通知,从而去读取相应的消息。
从架构上来看,通过增加消息代理的数目,Kafka就能够支持更大规模的消息存储以及消息的访问。消息需要进行持久化,数据存储的介质性能对系统性能有很大的影响,早期的Kafka一般使用普通的SSD来存储消息,因此系统的吞吐率较低,延迟比较高,后来随着NVMe SSD的普及,很多用户开始使用NVMe SSD来提升系统吞吐率和性能,但是仍然无法满足快速增长的业务对于高吞吐率和低延迟的需求。
为了进一步提升系统的性能,Pafka应运而生,Pafka是一个Kafka的分支,它是PMem和Kafka的结合,它将傲腾持久内存与Kafka结合,从而实现更高的吞吐率和更低的延迟。Pafka中也引入了MixChannel的组件,它将PMem和SSD、HDD结合起来,一部分的数据保存在高速的PMem中,另外一部分数据保存在低速的SSD、HDD中,既能发挥PMem高性能的优势,又能够利用SSD和HDD大容量低成本的特点。
MixChannel本身是实现一个数据分层的方案,数据通过MixChannel写入的时候,它首先判断是否PMem已经写满了,如果PMem没有写满,上面还有剩余的空间可以写,那么数据的Segment会被写入到PMem上,但是如果PMem已经没有可用空间了,那么数据将会被写入到SDD或者HDD,通常数据被消费后会被删除,那么这里关键就是如何有效的去利用PMem的空间,如果在PMem写满前,其中的消息都已经被消费了,那么PMem就能腾出空间容纳新的消息,但是如果在接近写满时,PMem真正的消息还没有被消费,那么后台的Migration的进程会将这些消息迁移到低速的HDD或者SSD上,给PMem来腾出空间,保证系统的整体性能。目前,Pafka已经开源,欢迎大家下载使用。
另外一个针对英特尔傲腾持久内存进行优化的消息队列是Pulsar。
Pulsar是一个新型的云原生消息平台,由于其出现的比较晚,因此具有后发的优势,早在2012年雅虎为了解决HDFS原数据可扩展性问题专门开发了一个服务,它被称为云消息服务,经过多年的发展,在雅虎内部已经应用日趋成熟,在2016年雅虎正式开源了Pulsar,在2017年雅虎将Pulsar捐献给Apache基金会,成为了Apache旗下的一个项目,在2018年,Pulsar成为Apache旗下顶级的一个项目,在2019年围绕Pulsar项目诞生了StreamNative公司,该公司也获得了种子轮的投资,同年它帮助腾讯在它的支付平台上大规模的应用Pulsar。
那么为什么Pulsar能够迅速的崛起呢?和Kafka和其他消息队列一样,Pulsar也有生产者、消息代理Broker和消费者这样一些角色,但是与Kafka不同的是,它的数据的存储与计算是完全分离的,计算的部分主要是Broker消息代理来完成,而存储的部分是由一个单独的组件叫做Bookkeeper来完成,这样也是Pulsar被称为云原生消息平台的一个原因,因为Broker是完全无状态的,可以非常好的适用云无状态的环境,通过这种存算分离的架构将二者解耦,Broker本身构成一个相对比较松散的集群,而Bookkeeper组成了另外一个集群负责数据的存储。Broker和Bookkeeper都可以独立的扩容和缩容,因此具有极好的扩展的能力。
Pulsar具有非常好的性能,特别是在应对Topic数量非常庞大的场景,更加凸显它的优势,这与它内部的存储架构是分不开的。在Bookie内部,消息的读和写进行了解耦,首先消息会被追加到A层日志中,这些日志以Groupcommit形式被写入到日志盘再写入到内存,就返回给生产者了。而数据最终持久化是在后台进行的,他们这些数据会被写入到Ledger的SDD、HDD上面,从消息的写入可以看出,系统的写性能上下取决于日志盘写入的性能,如果日志盘的写入性能高,那么系统的性能就能做得很过,如果支持盘的性能比较低,那它的系统的性能就会比较低。
如何在Pulsar中应用傲腾持久内存呢?
Pulsar社区与英特尔一起合作,开发了专门针对PMem的存储插件PMemPlugin,这个插件应用了傲腾持久内存,通过内存映射,也就是Mmap的方式直接将数据写入到底层的介质,消除了内核和用户空间的数据的拷贝,同时也消除了在内核和用户空间进行上下文切换所带来的开销。它能充分发挥傲腾持久内存的这种性能的潜力。
PMemPlugin在底部使用了PMemDK,也就是持续内存开发套件,提供的PMem库存来访问傲腾持久内存的介质,在此之上有一层Java的接口RLPL,在RLPL之上构建了一个Pmem Channel的类,这个类实现了一个Channel的接口,再往上是一个ChannelProvider的接口层,通过这种非侵入的方式实现了对PMem的支持,用户只需要通过进行简单的配置,就可以利用PMem来提高系统的性能,目前PMemPlugin我们还要进行性能测试,初步的这些性能数据表明,PMem对性能的提升有非常大的帮助,特别是在高吞吐率的情况下面能提供极好的低延迟的保证,这个项目的代码目前已经基本完成,正在做最后的测试以及Bugfix的工作,预计在很快就能正式发布,希望大家持续关注。
小结
如今消息队列应用越来越广泛,已经成为重要的IT基础设施,它的性能也获得了越来越多的关注,傲腾持久内存为消息队列带来了全新的机会,通过两个案例:Kafka、Pulsar,可以看到傲腾持久内存大大提升了消息队列的系统性能,并能够降低系统的整体拥有成本(TCO)。