bitcask論文翻譯/筆記

来源:https://www.cnblogs.com/metaphysics/p/17977236
-Advertisement-
Play Games

什麼是大數據 大數據(Big Data)是指在傳統數據處理方法難以處理的情況下,需要新的處理模式來具有更強的決策力、洞察發現力和過程優化能力的海量、高增長率和多樣化的信息資產。大數據的特征通常被概括為“4V”,即: Volume(容量):大數據的規模非常龐大,通常以 TB(太位元組)、PB(拍位元組)或 ...


翻譯

論文來源:bitcask-intro.pdf (riak.com)

背景介紹

Bitcask的起源與Riak分散式資料庫的歷史緊密相連。在Riak的K/V集群中,每個節點都使用了可插拔的本地存儲;幾乎任何結構的K/V存儲都可以用作每個主機的存儲引擎。這種可插拔性使得Riak的處理能夠並行化,從而可以在不影響代碼庫其他部分的情況下改進和測試存儲引擎。

有很多類似的本地K/V存儲系統,包括但不限於Berkeley DB、Tokyo Cabinet和Innostore。在評估此類存儲引擎時,我們想實現的目標包括:

  • 讀取或寫入每個項目的低延遲
  • 高吞吐量,尤其是在寫入隨機項目的傳入流時
  • 處理比RAM大得多的數據集的能力,無退化
  • 故障友好性,在快速恢復和不丟失數據方面都很好
  • 易於備份和恢復
  • 相對簡單、可理解(因而可支持)的代碼結構和數據格式
  • 訪問負載大或容量大時的可預測行為
  • 允許在Riak中輕鬆預設使用的許可證

實現其中一些目標並不困難,但是想實現所有目標就不那麼容易了。

現有的本地K/V存儲系統(包括但不限於作者編寫的系統)均未達到上述所有目標。當我們在與Eric Brewer討論這個問題時,他關於哈希表日誌合併的關鍵見解是:這樣做可能會比LSM樹更快或更快。

這導致我們以新的視角探索了20世紀80年代和90年代首次開發的日誌結構化文件系統所使用的一些技術。這次探索導致了Bitcask的誕生,它是一個能夠完全實現上述所有目標的存儲系統。雖然Bitcask最初是為了給Riak使用而誕生,但是它的設計很通用,因此也可以作為其他應用程式的本地K/V存儲。

模型描述

active data file

最終採用的模型在概念上非常簡單。Bitcask實例是一個目錄,我們強制規定在給定時間內,只有一個操作系統進程可以打開該Bitcask進行寫入。您可以將該進程有效地視為“資料庫伺服器”。在任何時候,該目錄中都有一個文件由伺服器進行寫入操作。當該文件達到一定大小時,它將被關閉,並創建一個新的活動文件。[font color="#FFA500"]一旦文件被關閉,無論是出於有意還是由於伺服器退出,它都被視為不可變的,並且永遠不會被再次打開進行寫入。[/font]
bitcask on disk

活動文件,也就是上文提到的active data file,只能以追加的方式寫入,這意味著順序寫入的同時不需要磁碟定址。
文件中的每個鍵值對entry的格式如下:
kv
每次寫入時,都只是向active data file追加一個新的entry。刪除操作只是寫入一個特殊的墓碑值(可以理解為是一個特殊標記),它將在下一次合併時被刪除。因此,Bitcask數據文件無非是這些entry的線性序列:
kvs on data file

keydir

active data file中完成追加操作後,接著去記憶體中更新一個名為keydir的數據結構。keydir是一個哈希表(在本論文中它是一個哈希表,也可以是其他數據結構),它將Bitcask中的每個key映射到一個固定大小的結構,這個結構記錄了這個key寫在哪個文件、該鍵在該文件中的偏移量以及大小。

keydir
一開始我覺得上面這張圖就是對bitcask中哈希表存儲內容的正確理解,但是後來覺得下麵這個圖才是,因為哈希表的value存儲的應該是entry的信息,而不是entry中value的信息。原論文中的圖有比較大的迷惑性。
keydir

數據寫入與讀取

數據的寫入其實在上面兩節已經介紹過了,為了方便理解記憶就再總結一下。
寫入很簡單,就是往bitcask中追加一條entry,然後更新keydir(原子操作),將剛剛新增的entry的信息存儲起來,就像下麵這樣:
存儲

數據的讀取流程則是先拿著keykeydir中取出相應的entry信息,然後根據entry中提供的信息去data file中取出key對應的value,就像下麵這樣:
讀取

數據合併

因為bitcask刪除的數據的方式是通過追加一條相同key的entry實現的,所以文件的size會越來越大,就需要定期的合併文件,合併的過程是這樣的:

  1. 先遍歷所有的old data file,將所有的有效數據進行合併,如果有多個entry含有相同的key,則只保留最新的entry,有點像Redis中的AOF
  2. 合併完成後,old data file會變成merge data file,且數量也會減少,例如10個old data file 合併成5個merge data file
  3. 因為bitcask是在記憶體中構建索引,也就是之前提到的keydir,構建keydir需要在啟動的時候掃描所有的data file,如果數據量很大,那麼構建索引的過程就會很耗時,為瞭解決這個問題,bitcask在合併數據的時候還會為每個merge data file生成一個hint file,這個hint file中存儲的也是一堆entry,這些entry的格式和data file中的entry保持一致,唯一的區別就是data file中的entry存儲的value是真實數據,而hint fileentryvalue存儲的是數據的位置。

entry對比

結束

目前對bitcask的理解也就是這些了,肯定有不准確的地方,想要徹底弄明白也只能自己手搓一個kv存儲才行。有任何問題都可以在評論區交流。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • springBoot 引入maven <dependency> <groupId>org.apache.shardingsphere</groupId> <artifactId>sharding-jdbc-spring-boot-starter</artifactId> <version>4.0.0 ...
  • 深入瞭解Redis數據結構 Redis,作為一種高性能的記憶體資料庫,支持多種數據結構,從簡單的字元串到複雜的哈希表。在這篇博文中,我們將深入探討Redis的一些主要數據結構,並通過詳細的例子展示它們的使用。 1. 字元串 (String) 1.1 存儲和獲取 Redis中的字元串是二進位安全的,可以 ...
  • Tansci-Boot 基於 SpringBoot2 + magic-api + Vue3 + Element Plus + amis3.0 快速開發管理系統 Tansci-Boot 是一個前後端分離後臺管理系統, 前端集成 amis 低代碼前端框架,後端集成 magic-api 的介面快速開發框架 ...
  • 函數根據有沒有參數,有沒有返回值,可以相互組合,一共有4種 無參數,無返回值 無參數,有返回值 有參數,無返回值 有參數,有返回值 一、無參數,無返回值的函數 此類函數,不能接收參數,也沒有返回值,一般情況下用來列印提示等類似的功能 def print_menu(): print(' ') prin ...
  • title: 使用json代替resw文件 date: 2024-01-20 categories: 編程 tags: - C# - .NET 前言 在寫WinUI3或UWP項目的時候,總覺得resw文件冗長可讀性又差,希望要是能用json就好了。 我在測試MakePri.exe[1]的時候意外發現 ...
  • title: 分析器/源生成器添加項目依賴的方式 date: 2024-01-19 categories: 編程 tags: - C# - .NET - Roslyn 前言 寫分析器(源生成器)時經常需要引用別的包,但直接引用是無法運行的。 下麵我們分不同情況來討論在分析器項目如何對依賴進行引用。 ...
  • 運算符用於對變數和值執行操作。在C#中,有多種運算符可用,包括算術運算符、關係運算符、邏輯運算符等。 算術運算符 算術運算符用於執行常見的數學運算: int x = 100 + 50; // 加法,結果為 150 int y = x - 30; // 減法,結果為 120 int z = x * 2 ...
  • ​ 1、概念 mvcc作用在於解決併發條件下,讀寫衝突的問題。一般用於RC和RR隔離級別,解決臟讀和不可重覆讀的問題。 (1)當前讀 讀取的是記錄的最新版本,讀取時還要保證其他事務不能修改當前記錄,會對讀取的記錄進行加鎖。對於我們日常的操作,如:select ... lock in share mo ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...