Cassandra的內部資料儲存結構

weixin_30808253發表於2011-07-21

Cassandra中資料存放規則

  1. data:儲存真正的資料檔案,既後面的SStable檔案,可以指定多個目錄。
  2. commitlog:儲存未寫入SSTable中的資料(在每次寫入之前先放入日誌檔案)。
  3. cache:儲存系統中的快取資料(在服務重啟的時候從這個目錄中載入快取資料)。
合理安排上面節點之間的位置以提高效能。

Commitlog
Commilog中包括兩個部分: Commilog-XXXX.log和 Commilog-XXXX.log.header。 Commitlog-XXXX.log檔案中儲存上次更新操作的值, Commitlog-XXXX.log.header記錄了那些資料已經從Memtable中寫入SSTable中。Cassandra有“週期”和“批量”兩種方式記錄Commitlog的方式。當一個Commitlog檔案的大小超過一定閥值的時候就會新建一個Commitlog。Cassandra每次更新資訊將寫入Commitlog中,並且每隔一定時間間隔同步檔案(還要同步快取中的資料,使其全部儲存在Commitlog中)。

Memtable
資料寫入Commitlog中後會快取在Memtable中(每個Memtable為一個ColumnFamily服務)。在Memtable中容量、條數、時間間隔超過閥值後就會將資料寫入磁碟形成一個SSTable檔案。Memtable中儲存的資料是ConcurrentSkipListMap<DecoratedKey, ColumnFamily>。寫入時按照Key的順序。使用Memtable的優勢就是把隨機的IO變成了順序IO(這個好像在很多系統中都會用到)。

SSTable
Cf1的一個SSTable檔案由如下檔案組成:
  1. Cf1-e-1-Data.db
  2. Cf1-e-1-Filter.db
  3. Cf1-e-1-Index.db
  4. Cf1-e-1-Statistics.db
(檔名)-(版本號)-(檔案ID)-(四個不同部分)
  1. Filter檔案的作用是快速定位某一個Key是否在該SSTable檔案中(用布林過濾器來做判斷)。
  2. Index檔案用於索引檔案,儲存Key和在Data檔案中對應的位置。在記憶體中查詢的時候先雜湊再二分查詢(還有一個cache的優化,這個怎麼感覺很像kernel中慣用的手法,哈哈)。
  3. Data檔案儲存資料和與Key對應的一些Column的索引資訊(利用索引快速地找到要找的值)。
  4. Statistics檔案用來儲存SSTable中所包含的Column的個數和Row的個數。

系統表空間
這個部分就和很多的關係型資料庫的做法很像哈。
在Cassandra中除了使用者自己定義的Keyspace之外還有一個特殊的Keyspace:system。
  1. 管理Cassandra的系統後設資料資訊。
  2. 快取HINT資料。
歡迎拍磚。

轉載於:https://www.cnblogs.com/ggzwtj/archive/2011/07/21/2113350.html

相關文章