6

有消息队列的地方,就有英特尔傲腾持久内存

 2 years ago
source link: http://www.dostor.com/p/79799.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

有消息队列的地方,就有英特尔傲腾持久内存-存储在线

当前位置:存储在线 > 新闻 > 正文

当消息队列遭遇英特尔傲腾持久内存会碰撞出怎样的火花?傲腾持久内存会对消息队列应用带来哪些革命性的变化。在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)。


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK