tft每日頭條

 > 科技

 > nosql數據庫與數據倉庫

nosql數據庫與數據倉庫

科技 更新时间:2025-02-13 11:04:08
概述

前面已經對Cassandra的一些概念性東西做了介紹,所以就不多說明了,今天主要分享Cassandra 的數據存儲結構幾種形式--CommitLog、Memtable和SSTable,下面一起看看吧!


Cassandra 的數據存儲結構

Cassandra 中的數據主要分為三種:

  1. CommitLog:主要記錄下客戶端提交過來的數據以及操作。這個數據将被持久化到磁盤中,以便數據沒有被持久化到磁盤時可以用來恢複。
  2. Memtable:用戶寫的數據在内存中的形式,它的對象結構在後面詳細介紹。其實還有另外一種形式是 BinaryMemtable 這個格式目前 Cassandra 并沒有使用,這裡不再介紹了。
  3. SSTable:數據被持久化到磁盤,這又分為 Data、Index 和 Filter 三種數據格式。

CommitLog數據格式

CommitLog 的數據隻有一種,那就是按照一定格式組成 byte組數,寫到IO緩沖區中定時的被刷到磁盤中持久化,CommitLog 的持久化方式有兩種,一個是 Periodic,一個是 Batch,它們的數據格式都是一樣的,隻是前者是異步的,後者是同步的,數據被刷到磁盤的頻繁度不一樣。

nosql數據庫與數據倉庫(詳解分布式nosql數據庫Cassandra數據存儲結構)1

CommitLog 的相關的類結構圖

它持久化的策略也很簡單,就是首先将用戶提交的數據所在的對象 RowMutation 序列化成 byte 數組,然後把這個對象和 byte 數組傳給 LogRecordAdder 對象,由 LogRecordAdder 對象調用 CommitLogSegment 的 write 方法去完成寫操作。

nosql數據庫與數據倉庫(詳解分布式nosql數據庫Cassandra數據存儲結構)2

CommitLog 文件數組結構

上圖中每個不同的 columnFamily 的 id 都包含在 header 中,這樣做的目的是更容易的判斷那些數據沒有被序列化。

CommitLog 的作用主要是為恢複沒有被寫到磁盤中的數據。

nosql數據庫與數據倉庫(詳解分布式nosql數據庫Cassandra數據存儲結構)3

CommitLog 數據格式的變化過程


Memtable 内存中數據結構

Memtable 内存中數據結構比較簡單,一個 ColumnFamily 對應一個唯一的 Memtable 對象,所以 Memtable 主要就是維護一個 ConcurrentSkipListMap類型的數據結構,當一個新的 RowMutation 對象加進來時,Memtable 隻要看看這個結構是否 <DecoratedKey, ColumnFamily> 集合已經存在,沒有的話就加進來,有的話取出這個 Key 對應的 ColumnFamily,再把它們的 Column 合并。

Memtable 相關的類結構圖如下:

nosql數據庫與數據倉庫(詳解分布式nosql數據庫Cassandra數據存儲結構)4

Memtable 相關的類結構圖

Memtable 中的數據會根據配置文件中的相應配置參數刷到本地磁盤中。

其實Cassandra 的寫的性能很好,好的原因就是因為 Cassandra 寫到數據首先被寫到 Memtable 中,而 Memtable 是内存中的數據結構,所以 Cassandra 的寫是寫内存的。下圖基本上描述了一個 key/value 數據是怎麼樣寫到 Cassandra 中的 Memtable 數據結構中的。

nosql數據庫與數據倉庫(詳解分布式nosql數據庫Cassandra數據存儲結構)5

數據被寫到 Memtable


SSTable 數據格式

每添加一條數據到 Memtable 中,程序都會檢查一下這個 Memtable 是否已經滿足被寫到磁盤的條件,如果條件滿足這個 Memtable 就會寫到磁盤中。先看一下這個過程涉及到的類。相關類圖如圖 所示:

nosql數據庫與數據倉庫(詳解分布式nosql數據庫Cassandra數據存儲結構)6

SSTable 持久化類結構圖

Memtable 的條件滿足後,它會創建一個 SSTableWriter 對象,然後取出 Memtable 中所有的 <DecoratedKey, ColumnFamily> 集合,将 ColumnFamily 對象的序列化結構寫到 DataOutputBuffer 中。接下去 SSTableWriter 根據 DecoratedKey 和 DataOutputBuffer 分别寫到 Date、Index 和 Filter 三個文件中。


總結

今天主要描述了 Cassandra 中數據的主要的存儲格式,包括内存中和磁盤中數據的格式,其實Cassandra的存儲機制借鑒了Bigtable的設計,采用Memtable和SSTable的方式。

Cassandra在寫數據之前,需要先記錄日志,稱之為Commit Log,然後數據才會寫入到Column Family對應的MemTable中,且MemTable中的數據是按照key排序好的。SSTable一旦完成寫入,就不可變更,隻能讀取。

後面會分享更多devops和DBA方面的内容,感興趣的朋友可以關注一下~

nosql數據庫與數據倉庫(詳解分布式nosql數據庫Cassandra數據存儲結構)7

,

更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!

查看全部

相关科技资讯推荐

热门科技资讯推荐

网友关注

Copyright 2023-2025 - www.tftnews.com All Rights Reserved