<strike id="zl9n9"></strike>

    <form id="zl9n9"><nobr id="zl9n9"></nobr></form>

                中國數據存儲服務平臺

                有消息隊列的地方,就有英特爾傲騰持久內存

                當消息隊列遭遇英特爾傲騰持久內存會碰撞出怎樣的火花?傲騰持久內存會對消息隊列應用帶來哪些革命性的變化。在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)。

                未經允許不得轉載:存儲在線 » 有消息隊列的地方,就有英特爾傲騰持久內存
                分享到: 更多 (0)
                好紧紧的小嫩嫩,50i岁熟妇大白屁股真爽,女教师 裕美の放课后前篇
                <strike id="zl9n9"></strike>

                  <form id="zl9n9"><nobr id="zl9n9"></nobr></form>