《新思潮:NoSQL與DPDK、RDMA等會擦出什么樣的火花?》要點:
本文介紹了新思潮:NoSQL與DPDK、RDMA等會擦出什么樣的火花?,希望對您有用。如果有疑問,可以聯(lián)系我們。
編者按:NoSQL發(fā)展到今天雖然在技術(shù)和生態(tài)上已經(jīng)非常成熟,但是并沒有停止演化,尤其是在一切都容器化、微服務(wù)化的大配景下,很多NoSQL產(chǎn)品也在擁抱Docker,在硬件和系統(tǒng)技術(shù)棧上,新技術(shù)也是層出不窮,如用戶態(tài)TCP/IP協(xié)議棧、DPDK、RDMA等,這些技術(shù)和NoSQL結(jié)合之后會擦出哪些火花呢?本文就容器化的典型例子AeroSpike和技術(shù)全面領(lǐng)先的ScyllaDB做大概介紹.
在新技術(shù)層出不窮的配景下,NoSQL也在努力求變,今年大會有幾個新的演變方向,分別是:
容器化:將NoSQL產(chǎn)品與Docker相結(jié)合,然后收獲容器的諸多益處如運維簡單、開發(fā)更加規(guī)范、封裝和隔離更為徹底,其中的主要難點是容器更適合stateless的服務(wù),而NoSQL是帶數(shù)據(jù)的,如何做到stateless是個很大的挑戰(zhàn),而且NoSQL對時延的要求很高,容器帶來的損耗也是必要考慮的一個問題.
軟硬一體優(yōu)化:將 網(wǎng)卡->CPU->TCP/IP->工作線程->文件系統(tǒng)->IO存儲 這一整條鏈路的每個環(huán)節(jié)都做極致的優(yōu)化,該優(yōu)化的大配景是NoSQL每次操作都是500us-1ms級別,但是用于業(yè)務(wù)數(shù)據(jù)處理的時間可能只有10us左右,整個鏈路的成本已經(jīng)遠遠超過了數(shù)據(jù)處理的成本,所以下一步的優(yōu)化的方向只能從鏈路著手,在網(wǎng)卡層面利用RDMA技術(shù),在CPU層面采用多核+線程親和性+NUMA等特性,在TCP/IP層面采用DPDK+用戶態(tài)協(xié)議棧技術(shù),在工作線程層面采用shared nothing的無鎖架構(gòu),在文件系統(tǒng)層面采用一些比較新的文件系統(tǒng)如XFS,有的NoSQL產(chǎn)品甚至bypass了文件系統(tǒng),直接操作設(shè)備,存儲方面采用NVME或者SSD.
云化:本身不再持有很重的IDC資產(chǎn),直接根據(jù)客戶需求在云上靈活部署和彈性伸縮,輕資產(chǎn)的模式讓本身專注于技術(shù)和業(yè)務(wù)創(chuàng)新.
NewSQL化:開始關(guān)注ACID、CAP,不斷向傳統(tǒng)數(shù)據(jù)庫的特性靠攏,與傳統(tǒng)數(shù)據(jù)庫之間的共同點也會越來越多,究竟大家面臨的分布式問題都是一致的.
AeroSpike作為高性能的NoSQL服務(wù),已經(jīng)有近3年的歷史.NoSQL領(lǐng)域產(chǎn)品眾多、濫觴成河,AeroSpike絕對算其中一朵奇葩,在很久之前就進行了很多前沿性的探索,比如在存儲上采用混合架構(gòu),采用RAM+SSD的架構(gòu),其中索引存儲在RAM中,數(shù)據(jù)存儲在SSD中,并且是直接拜訪SSD,bypass了文件系統(tǒng),然后又針對多核處理器的體系架構(gòu)特點做了優(yōu)化,因此能帶來性能的極致優(yōu)化,聲稱比友商高出10倍以上(當然我沒有親測過:-),而且在很久之前AeroSpike就實現(xiàn)了集群的分片、自動負載均衡、多數(shù)據(jù)中心同步等高級功能,這是目前很多NoSQL產(chǎn)品還在努力struggle的特性.
AeroSpike容器化遇到的挑戰(zhàn)有:
1,數(shù)據(jù)冗余:要求至少大于1個副本,容器允許隨時失效2,數(shù)據(jù)庫集群的自治與服務(wù)發(fā)現(xiàn):允許容器節(jié)點隨時加入和退出
3,數(shù)據(jù)庫自我修復(fù):允許容器節(jié)點隨時加入和退出
4,應(yīng)用層感知數(shù)據(jù)庫集群:必要有個服務(wù)發(fā)現(xiàn)機制
5,對原有架構(gòu)挑戰(zhàn):原來基于物理機的架構(gòu)都需要調(diào)整,不止是簡單的換個皮罷了,從復(fù)雜度、可維護性、持久化、一致性、可擴展性、成本、性能等維度都面臨著新的挑戰(zhàn);原有的部署和運維架構(gòu)也受到?jīng)_擊;原有的很多優(yōu)化方法也受到容器的挑戰(zhàn);
6,哲學(xué)層面:容器是被設(shè)計來用于辦理封裝、隔離、部署問題的,數(shù)據(jù)庫是被設(shè)計用于持久化、可擴展、自治自修復(fù)的,這兩種設(shè)計如何match到一起也是個挑戰(zhàn)
針對上述挑戰(zhàn),AeroSpike的解法是:
1,數(shù)據(jù)冗余:數(shù)據(jù)是多副本的,而且副本數(shù)量可以配置
2,集群自治與服務(wù)發(fā)現(xiàn):集群所有節(jié)點share nothing,都是對等的,采用Docker Swarm方案
3,數(shù)據(jù)庫自我修復(fù)和負載均衡:采用hash分片,而且設(shè)計了RIPEMD-160算法來保證高效的分片
4,應(yīng)用層感知數(shù)據(jù)庫集群:采用Smart Client來做集群的自動感知
5,對原有架構(gòu)挑戰(zhàn):主要是對數(shù)據(jù)如何存放的挑戰(zhàn),數(shù)據(jù)和容器放在一起雖然也能保證隨時加入和退出,但是不如把數(shù)據(jù)徹底剝離到宿主機或者云上的共享存儲如EBS中更優(yōu)雅,而且更近一步是否可以剝離出單獨的一種容器叫做Data Container,只用來管理數(shù)據(jù),策略可以做得更復(fù)雜,比如在銷毀的時候可以做一部分業(yè)務(wù)邏輯在里面.還有一個更大的挑戰(zhàn)是性能問題,在本次介紹中主講人并沒有給出徹底的辦理方案,應(yīng)該是還在優(yōu)化中
6,哲學(xué)層面:總結(jié)一下還是數(shù)據(jù)庫去適應(yīng)容器的特點,把數(shù)據(jù)庫做成了一個無狀態(tài)、可隨時加入退出、能夠做到自組織自發(fā)現(xiàn)自修復(fù)的系統(tǒng),使數(shù)據(jù)庫表示起來也像個“容器”
最后AeroSpike列出了容器化帶來的收益,好比:開發(fā)和生產(chǎn)環(huán)境能更統(tǒng)一,運維更加簡單,scale up和scale down做起來比之前更容易一些,等等.
接下來ScyllaDB的CTO分享了ScyllaDB在極致性能優(yōu)化上的實踐和經(jīng)驗總結(jié),ScyllaDB是一個兼容Cassandra協(xié)議的分布式NoSQL數(shù)據(jù)庫,在相同的硬件條件下能比原始版本的Cassandra性能提升10倍左右,使用C++14編寫,純異步,整個編程框架是Seastar,可以理解ScyllaDB是在Seastar框架基礎(chǔ)上的Cassandra協(xié)議實現(xiàn).
ScyllaDB設(shè)計理念/High levels是:
1,更有效率:相同時間內(nèi)干更多的事情
2,釋放整機能力:榨干整機每個部件的能力
3,更可控:控制何時何處使用計算能力
面臨的問題是:
1,太多的微操作:盡量讓協(xié)同本錢變得更低
2,太多通信行為:本機內(nèi)、與其他機器、與disk通信
而且在計算機的最底層便是一個異步的架構(gòu),如Intel CPU的流水和指令執(zhí)行過程便是一個異步過程,在有了上述抽象之后ScyllaDB的設(shè)計架構(gòu)為:
1,每個CPU Core都有一個綁定的線程,可以做到永遠不會阻塞
2,網(wǎng)絡(luò)操作是異步的
3,文件I/O是異步的
4,每個核上都是異步的
在傳統(tǒng)的架構(gòu)中,系統(tǒng)中有多個線程,每個線程都有自己的堆棧和上下文,線程切換造成的開銷和CPU cacheline的污染非常嚴重,在微操作頻繁的NoSQL數(shù)據(jù)庫中,這部分切換帶來的開銷其實是非常大的,Seastar框架是每個core一個native thread,然后每個thread中用Task和Promise來抽象工作任務(wù),Task是一個c++ lambda表達式,promise是用來保留計算結(jié)果的指針.
在做性能優(yōu)化時有一個基本的公式是:
Concurrency = Throughput*Latency
這么看起來不大好理解,但是變形之后就比擬好理解了,如:
Throughput = Concurrency/Latency 所以當追求吞吐量時,在必定延遲下需要并發(fā)盡量大
Latency = Concurrency/Throughput 所以當追求延遲時,在必定的吞吐下需要并發(fā)度盡量低
為了壓榨機器的性能,我們一般要求機器的每個資源能夠有很好的并行性
在做資源調(diào)度時,Seastar拋棄了操作系統(tǒng)的各種調(diào)度器,改由本身全面接管,比如當做I/O時,Seastar禁用了Linux的I/O調(diào)度器,在Seastar看來系統(tǒng)調(diào)度器只能看到產(chǎn)生I/O的線程的優(yōu)先級,無法看到整體的優(yōu)先級,而且系統(tǒng)調(diào)度器會有很多額外的reorder和merge操作,而且Seastar的I/O調(diào)度器還能感知到一個最佳的并行度,當并行度增加但是吞吐并不同比增加時沒有必要再增加并發(fā).對于文件的緩存直接復(fù)用Linux的page cache,因為做得已經(jīng)足夠好.下圖是ScyllaDB中的調(diào)度模型:
Seastar對內(nèi)存分配也做了很多優(yōu)化,主體思想就是將必要的內(nèi)存提前分配出來,盡量不要走到系統(tǒng)的malloc/free,為了降低碎片也做了很多分配策略.
最終提到了對于RDMA+DPDK+User Space TCP/IP的使用,這也是一個很大課題,以后另開文章詳細剖解,主講人認為目前還不夠成熟,最好不要用于生產(chǎn)環(huán)境,另外ScyllaDB還從query編譯優(yōu)化(將查詢直接編譯成代碼)等角度做了優(yōu)化.
從上述這兩個例子中我們大概勾勒出一個未來的NoSQL產(chǎn)品大體是這個樣子的:
1,集群化,多副本,每個副本可以隨時失效,可彈性伸縮,節(jié)點可以隨時加入和退出
2,可以與容器完美結(jié)合,降低開發(fā)、部署、運維本錢
3,將在內(nèi)核態(tài)的計算完全轉(zhuǎn)移到用戶態(tài)并做極致優(yōu)化,如對傳統(tǒng)線程的lambda抽象、自主可控的調(diào)度器、bypass文件系統(tǒng)直接操作裸設(shè)備、使用用戶態(tài)協(xié)議棧來大幅削減網(wǎng)絡(luò)鏈路本錢等
4,在功能上逐步向傳統(tǒng)數(shù)據(jù)庫看齊,如支持事務(wù)、支持ACID等特性,催生出NewSQL
5,能夠便利云化以觸達客戶
這個世界變化太快,一不小心就會被狠狠擯棄,是每一個碼農(nóng)的幸運也是不幸,痛并快樂著,引用主講人的最后一句話“While having a lot of fun”.
歡迎參與《新思潮:NoSQL與DPDK、RDMA等會擦出什么樣的火花?》討論,分享您的想法,維易PHP學(xué)院為您提供專業(yè)教程。
轉(zhuǎn)載請注明本頁網(wǎng)址:
http://www.snjht.com/jiaocheng/9587.html