1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

        內(nèi)存數(shù)據(jù)庫及技術(shù)選型

        共 4431字,需瀏覽 9分鐘

         ·

        2021-09-07 10:49

        作者 | Kirito的技術(shù)分享

        來源 | https://mp.weixin.qq.com/s/DYd30AhC0D72uQ-4qgvjiQ

        依靠內(nèi)存來存儲數(shù)據(jù)的數(shù)據(jù)庫管理系統(tǒng),也稱為內(nèi)存數(shù)據(jù)庫,成為了解決高并發(fā)、低時延數(shù)據(jù)管理需求的技術(shù)路線。近年來,隨著動態(tài)隨機存儲器(DRAM)容量的上升和單位價格的下降,使大量數(shù)據(jù)在內(nèi)存中的存儲和處理成為可能,Redis、Memcached等內(nèi)存數(shù)據(jù)庫管理軟件逐漸成熟,應(yīng)用范圍越來越廣。

        未來幾年,隨著非易失性存儲器件(NVM)逐步投入商用,新硬件將會給內(nèi)存數(shù)據(jù)庫帶來更大的發(fā)展機遇。

        本白皮書闡述了內(nèi)存數(shù)據(jù)庫的概念,梳理了內(nèi)存數(shù)據(jù)庫的發(fā)展歷史和核心屬性,分析了在電商、直播和電信行業(yè)的典型應(yīng)用場景,并對主流的內(nèi)存數(shù)據(jù)庫進行了介紹和對比,從技術(shù)和管理兩個角度提出了產(chǎn)品選型和硬件選型建議,并總結(jié)了內(nèi)存數(shù)據(jù)庫的發(fā)展趨勢:

        內(nèi)存數(shù)據(jù)庫又稱主存數(shù)據(jù)庫(In-memory或main memory database),是一種主要依靠內(nèi)存來存儲數(shù)據(jù)的數(shù)據(jù)庫管理系統(tǒng)。

        在數(shù)據(jù)庫技術(shù)中,有一類內(nèi)存優(yōu)化技術(shù),是在傳統(tǒng)的磁盤數(shù)據(jù)庫中,增加內(nèi)存緩沖池,也就是常說的共享內(nèi)存技術(shù),其主要目的是最小化磁盤訪問。

        如果您正在學(xué)習(xí)Spring Boot,推薦一個連載多年還在繼續(xù)更新的免費教程:http://blog.didispace.com/spring-boot-learning-2x/

        而內(nèi)存數(shù)據(jù)庫技術(shù),幾乎把整個數(shù)據(jù)庫放進了內(nèi)存中,相較于傳統(tǒng)數(shù)據(jù)庫使用的磁盤讀寫機制,內(nèi)存具備更極致的讀寫速度,性能會比傳統(tǒng)的磁盤數(shù)據(jù)庫有數(shù)量級的提升。因此內(nèi)存數(shù)據(jù)庫通常被用于對性能要求較高的場景中。

        1.內(nèi)存技術(shù)的成熟

        內(nèi)存器件的容量密度在快速上升。最早期的內(nèi)存和今天常見的內(nèi)存條不同,是直接焊接在主板上的內(nèi)存芯片,容量普遍在64KB以下。

        • 1982年之后,隨著80286芯片的推出,開始出現(xiàn)30線(Pin)256KB的SIMM內(nèi)存條,被認為是內(nèi)存領(lǐng)域的開山鼻祖;
        • 在80年代末,386和486時代的PC向16位發(fā)展,出現(xiàn)了72線的SIMM內(nèi)存,單條容量可達512KB-2MB;90年代初,EDODRAM開始盛行,單條容量在4MB-16MB;
        • 在1995年,計算機系統(tǒng)進入圖形界面時代,內(nèi)存技術(shù)也發(fā)生了重要變革,支持64位的SDRAM成為一代經(jīng)典,在性能上有極大提升,容量也達到了64MB;
        • 隨后的十幾年,內(nèi)存容量開始穩(wěn)定地遵循摩爾定律翻倍,持續(xù)到2019年,DDR3內(nèi)存的容量已經(jīng)可以達到16GB。
        • 如果您正在學(xué)習(xí)Spring Boot,推薦一個連載多年還在繼續(xù)更新的免費教程:http://blog.didispace.com/spring-boot-learning-2x/

        內(nèi)存器件的單位價格也在逐年快速下降。從1970年代至今,內(nèi)存每兆字節(jié)的價格下降了近9個數(shù)量級,根據(jù)2019年最新的統(tǒng)計數(shù)據(jù),平均花費3-5美元就可以購買到1GB的內(nèi)存。內(nèi)存容量的持續(xù)上漲以及價格的下降,使大量數(shù)據(jù)在內(nèi)存中進行存儲和操作成為可能。

        2.內(nèi)存技術(shù)的瓶頸與突破

        過去幾十年,計算機系統(tǒng)的存儲體系結(jié)構(gòu)被設(shè)計成如圖2的金字塔形模型。這樣的存儲結(jié)構(gòu)利用局部性原理盡量將熱數(shù)據(jù)存儲在靠近CPU的地方。在傳統(tǒng)模式中,內(nèi)存數(shù)據(jù)庫的所有數(shù)據(jù)都保存在DRAM介質(zhì)中。

        雖然DRAM的價格已經(jīng)大幅下降,但在海量數(shù)據(jù)存儲的需求下,內(nèi)存的成本依然是很大的問題;另外由于DRAM屬于易失性介質(zhì),掉電后所有數(shù)據(jù)都會丟失,需要額外考慮數(shù)據(jù)持久化的方案,會極大的限制內(nèi)存數(shù)據(jù)庫的性能和使用場景。

        針對DRAM現(xiàn)存的一些硬件瓶頸,業(yè)界已經(jīng)研發(fā)出了持久型內(nèi)存(PM,Persistent Memory),學(xué)術(shù)名為存儲級內(nèi)存(SCM,Storage ClassMemory),和DRAM一樣,都是安裝在機器主板的內(nèi)存槽接口中。

        參考圖2,DDRDRAM及以上的易失性存儲CPU可以通過load/store指令直接訪問,而NANDSSD及以下的非易失性存儲CPU無法直接訪問,需要先加載到易失性存儲中,可以看出DRAM與SSD之間存在巨大的性能鴻溝,在訪問時延上出現(xiàn)了跳變。

        而持久型內(nèi)存位于DRAM與SSD之間,以load/store指令的方式訪問并支持數(shù)據(jù)的持久化,也填補了DRAM與SSD在時延上存在的鴻溝。相比DRAM,持久型內(nèi)存在性能上處于劣勢,但容量和價格均占據(jù)優(yōu)勢;相比NANDSSD,持久型內(nèi)存在性能上處于優(yōu)勢,但容量和價值處于劣勢。

        3.內(nèi)存數(shù)據(jù)庫的發(fā)展歷程

        內(nèi)存數(shù)據(jù)庫的發(fā)展主要經(jīng)歷了雛形期、理論成熟期、市場成長期及高速發(fā)展期四個階段。

        4.內(nèi)存數(shù)據(jù)庫的優(yōu)勢與挑戰(zhàn)

        內(nèi)存數(shù)據(jù)庫在提供高性能讀寫能力的同時,也存在由于器件導(dǎo)致的數(shù)據(jù)易失問題,需要在應(yīng)用中引起注意。

        1).優(yōu)勢:高性能讀寫

        由于省去了磁盤I/O的開銷,在數(shù)據(jù)訪問的時延上內(nèi)存型數(shù)據(jù)庫可以達到傳統(tǒng)關(guān)系型數(shù)據(jù)庫無法達到的微秒級別,單機內(nèi)存數(shù)據(jù)庫的QPS也可以達到10萬以上,配合上用戶態(tài)協(xié)議棧、內(nèi)存大頁等技術(shù)之后,更是可以輕松達到幾十萬QPS的量級,這是傳統(tǒng)的關(guān)系型數(shù)據(jù)庫很難做到的。

        2).挑戰(zhàn):內(nèi)存數(shù)據(jù)易失

        內(nèi)存數(shù)據(jù)庫當(dāng)前主要使用DRAM作為存儲介質(zhì),DRAM屬于掉電易失性介質(zhì),為了保證數(shù)據(jù)的可靠性,內(nèi)存數(shù)據(jù)庫需要考慮持久化方案。現(xiàn)階段主流的鍵值對內(nèi)存數(shù)據(jù)庫對于持久化的支持較為薄弱,持久化性能也不如傳統(tǒng)數(shù)據(jù)庫。

        內(nèi)存型數(shù)據(jù)庫中克服掉電易失性來保障數(shù)據(jù)可靠性的方法主要是以下兩種:

        • 一是每次操作都進行數(shù)據(jù)持久化,這種方式勢必會大幅降低內(nèi)存數(shù)據(jù)庫的性能;
        • 二是按照一定的策略進行操作的持久化,這樣可以達到一定程度的優(yōu)化和緩解,但極端情況下數(shù)據(jù)丟失的情況仍不可避免。
        • 如果您正在學(xué)習(xí)Spring Boot,推薦一個連載多年還在繼續(xù)更新的免費教程:http://blog.didispace.com/spring-boot-learning-2x/

        現(xiàn)階段新型的非易失性存儲器件已經(jīng)發(fā)布但尚未規(guī)?;逃?。相信解決了存儲易失性的難題后,內(nèi)存數(shù)據(jù)庫會具備更多的應(yīng)用。

        5.內(nèi)存數(shù)據(jù)庫的分類

        主流的內(nèi)存數(shù)據(jù)庫可分為鍵值對內(nèi)存數(shù)據(jù)庫、關(guān)系型內(nèi)存數(shù)據(jù)庫以及其他數(shù)據(jù)庫,用戶可根據(jù)自身的業(yè)務(wù)需求選擇適合自己的內(nèi)存數(shù)據(jù)庫類型。

        1).鍵值對內(nèi)存數(shù)據(jù)庫

        鍵值對(KV, Key-Value)內(nèi)存數(shù)據(jù)庫指的是一種以鍵值對為主要存儲結(jié)構(gòu)的內(nèi)存數(shù)據(jù)庫。鍵值對內(nèi)存數(shù)據(jù)庫通常按鍵進行數(shù)據(jù)存取操作,值通常支持各種數(shù)據(jù)類型,使用鍵值存儲的數(shù)據(jù)模型相對簡單,更適合要求性能高、計算簡單的一些場景。鍵值對內(nèi)存數(shù)據(jù)庫的典型代表為 Redis、Memcached 和 Aerospike。

        2).關(guān)系型內(nèi)存數(shù)據(jù)庫

        關(guān)系型內(nèi)存數(shù)據(jù)庫是一種基于數(shù)據(jù)關(guān)系模型的內(nèi)存數(shù)據(jù)庫。關(guān)系型內(nèi)存數(shù)據(jù)庫將傳統(tǒng)的關(guān)系型數(shù)據(jù)庫表搬到內(nèi)存中,支持通過 SQL語句的方式實現(xiàn)對內(nèi)存數(shù)據(jù)的訪問,在實現(xiàn)復(fù)雜分析功能的同時,提升數(shù)據(jù)訪問速度。關(guān)系型內(nèi)存數(shù)據(jù)庫的典型代表軟件為 Oracle TimesTen、SAP HANA、MemSQL 和 SQLite。

        3).其他類型的內(nèi)存數(shù)據(jù)庫

        除鍵值對內(nèi)存數(shù)據(jù)庫、關(guān)系型內(nèi)存數(shù)據(jù)庫之外,其他比較小眾的內(nèi)存數(shù)據(jù)庫稱為其他內(nèi)存數(shù)據(jù)庫,比如圖內(nèi)存數(shù)據(jù)庫 RedisGraph 等。

        6.內(nèi)存數(shù)據(jù)庫產(chǎn)品現(xiàn)狀

        DB-Engines Ranking 是公認較權(quán)威的數(shù)據(jù)庫排行,我們選取了其中最為活躍的 10 款典型內(nèi)存數(shù)據(jù)庫進行對比。開源產(chǎn)品中,Redis 和 Memcached 是最受歡迎的兩款鍵值對內(nèi)存數(shù)據(jù)庫;而 SQLite 是最受歡迎的關(guān)系型內(nèi)存數(shù)據(jù)庫。表中大部分的關(guān)系型內(nèi)存數(shù)據(jù)庫為商用數(shù)據(jù)庫,其中熱度最高的是 SAP HANA。

        早在 1995 年就發(fā)布第一版的Oracle TimesTen 仍然在榜上活躍;2014 年新發(fā)布 Apache Ignite 兼容鍵值和關(guān)系型數(shù)據(jù)結(jié)構(gòu),熱度正穩(wěn)步攀升。事務(wù)支持方面,大部分的關(guān)系型內(nèi)存數(shù)據(jù)庫稱可以支持 ACID,但都需要在性能上作出妥協(xié)。

        7.內(nèi)存數(shù)據(jù)庫選型建議

        技術(shù)服務(wù)于業(yè)務(wù),內(nèi)存數(shù)據(jù)庫的選型應(yīng)首先遵循業(yè)務(wù)場景的需求。業(yè)務(wù)特性決定了數(shù)據(jù)的應(yīng)用特性,包括數(shù)據(jù)量、并發(fā)度、讀寫特性、一致性、響應(yīng)時間、操作復(fù)雜度、業(yè)務(wù)連續(xù)性等要求,對應(yīng)數(shù)據(jù)庫的一致性、容錯性、擴展性、安全性等技術(shù)要求。在做內(nèi)存數(shù)據(jù)庫的選型前,建議先梳理業(yè)務(wù)需求并進行量化;再將核心數(shù)據(jù)應(yīng)用特性映射成數(shù)據(jù)庫技術(shù)要求;最后按篩選出的技術(shù)要求進行選型。

        1).技術(shù)因素

        按照技術(shù)要求進行內(nèi)存數(shù)據(jù)庫選型時,可主要考察業(yè)務(wù)的性能、一致性要求和 SQL 兼容性三個因素。

        業(yè)務(wù)是否有很高的性能要求? 一般有高并發(fā)、低時延讀寫要求的業(yè)務(wù),如游戲?qū)崟r排行、直播粉絲關(guān)注等,建議選擇內(nèi)存數(shù)據(jù)庫。

        業(yè)務(wù)數(shù)據(jù)是否要求強一致性? 如果業(yè)務(wù)對數(shù)據(jù)的可靠性和一致性要求較高、需要 ACID 級別的事務(wù)支持,則建議使用 MySQL 等傳統(tǒng)的關(guān)系型數(shù)據(jù)庫。但需要注意的是,強一致性的要求會對數(shù)據(jù)庫的性能造成一定的影響;如果需要兼具高性能和強一致性,則需要在應(yīng)用架構(gòu)層面進行優(yōu)化,單靠數(shù)據(jù)庫的能力還無法實現(xiàn)。

        數(shù)據(jù)處理是否要求 SQL 兼容性? 在高性能要求的場景下,業(yè)務(wù)中如果數(shù)據(jù)結(jié)構(gòu)固定、有復(fù)雜的關(guān)聯(lián)計算要求,或是需要 SQL 語法支持的情況,建議使用關(guān)系型內(nèi)存數(shù)據(jù)庫;對于數(shù)據(jù)結(jié)構(gòu)多變、擴展性要求高、數(shù)據(jù)模型和操作簡單的場景,建議使用鍵值對內(nèi)存數(shù)據(jù)庫。

        除了這三條考察指標(biāo),還可以結(jié)合數(shù)據(jù)容量、成本、擴展性、可維護性等需求進行綜合考量。

        2).非技術(shù)因素

        上述選型方法主要考量的是技術(shù)因素,除此以外還可以結(jié)合實際情況,引入一些其他維度的考量,進行綜合評估,最終挑選出適合的產(chǎn)品。包括但不限于以下維度:

        • 1)生態(tài)成熟度。指數(shù)據(jù)庫產(chǎn)品的狀態(tài),包括各種配套工具、技術(shù)架構(gòu)成熟度、代碼質(zhì)量、開發(fā)模式、社區(qū)建設(shè)、商業(yè)支持服務(wù)、版權(quán)協(xié)議等;
        • 2)應(yīng)用架構(gòu)適配度。指應(yīng)用架構(gòu)對數(shù)據(jù)庫架構(gòu)的兼容性、以及適配改造友好度,包括技術(shù)架構(gòu)適配、開發(fā)語言適配等;
        • 3)團隊適應(yīng)度。指開發(fā)團隊、維護團隊對數(shù)據(jù)庫的熟悉程度、偏好程度、學(xué)習(xí)成本以及配套運維工具等。

        - END -


        往期推薦

        Java 17 將至,可能帶來哪些新特性呢?

        機械妖姬上門要源碼后續(xù)結(jié)果來了!

        重磅消息:Spring 6 和Spring Boot 3

        短信驗證碼登錄流程思路及詳細步驟

        反996,竟反掉了17%的薪水?!而隔壁的房貸還在漲,怎么就越反越糟糕了呢?



        喜歡本文歡迎轉(zhuǎn)發(fā),關(guān)注我訂閱更多精彩

        關(guān)注我回復(fù)「加群」,加入Spring技術(shù)交流群

        瀏覽 70
        點贊
        評論
        收藏
        分享

        手機掃一掃分享

        分享
        舉報
        評論
        圖片
        表情
        推薦
        點贊
        評論
        收藏
        分享

        手機掃一掃分享

        分享
        舉報
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            被窝电影网午夜伦电影韩国 | 国产精品视频自拍 | 人善交zzzzxxxxx另类 | 777色色 | 欧美一级片在线电影 | 亚州在现免费视 | 天天日天天干天天射天天操 | 亚洲AV无码专区在线观看播放 | 久久色在线播放 | 亚洲精品午夜成人片DY888 |