系統架構:
Cassandra 是 一 套 開 源 分 布 式 No -SQL 數據庫系統, 基於一致性哈希算法的 P2P 環形結構。 這種結構 各節點功能完全相 同, 可靈活添加節點來完成系 統的擴充或刪除節點, 且無需大規模轉移數據, 同 時徹底避免系 統因 單點故障
導致的不穩定性; 每個節點通過 Gossip 機制進行消息同步; 每 個 數據 項 都 會 被 復 制 到 N 個節 點( N 是通過參數配置的副本因 子), 系 統利 用 數據
的復制機將存儲在各節點上的數據復制到其他節點上, 實現了數據的高度可獲得性與安全性。
數據模型:
Cassandra 使用 寬 列 存 儲 模 型, 每 行 數 據 記錄是以 Key - Value 形式進行存儲, 其中 Key為 唯一標識。 每 個Key- Value 其 中 的 Value 也 稱 為Column, 作 為 一 個 三 元 組, 包 含 有
Column Name 、 Column Value 與 timestamp ; 每 個 CF 由一個 Key及其對應的若干個 Column 標識組成。一個
keyspace 包含若干 個 CF , 類似關系 型數據庫中一個
database 可有 多 個table 。
下 圖 為 一 個Column 型數據模型。
CPA理論:
NoSQL 典 型 遵 循 由 Eric Brewer 提 出 的CAP 理論 , 依據此理論, 在一個大規模的分布式數據系統中, 有三個需求是彼此循環依賴的, 一致性( consistency ) 、 可 用 性 ( availability ) 、 分 區 耐受性( partition tolerance ) 。
一致性: 對所有數據庫客戶 端 使 用 同 樣 查 詢 都 可 得 到 相 同 的 數 據;
可用性: 所 有 數 據 庫 客 戶 端 都 可 讀 寫 數 據;
分區耐受性: 數 據 庫 分 散 到 多 個 服 務 器 上, 即使發生 網 絡 故 障, 仍 可 提 供 服 務。
CAP 理 論 可簡單描述 為 :
一 個 分 布 式 系 統 不 能 同 時 滿 足 以上三個 特 性, 最 多 只 能 同 時 滿 足 兩 個。
Cassandra 主要支持 可 用 性 和 分 區 耐 受 性。
在 Cassandra 中 , 數據 具 備 最 終 一 致 性, 集 群 整 體 的 完 全
可用 性。
存儲機制
Cassandra 依賴本地的文件系統通過內存與磁盤的雙重存儲機制來保證數 據的持久性 。
Cassandra 有三 個重 要 的 數 據 結 構, 記錄 於 內 存
的 Memtable , 保 存 在 磁 盤 中 的 Commit Log和
SSTable 。
Memtable 記 錄 最 近 的 修 改, 而SSTable 記錄着數據庫 所承載的 絕大部分數據。通常 情 況 下, 一 個 Cassandra 表 會 對 應 着 一 個
Memtable 和多 個SSTable 。
Cassandra 接收到 客戶端發送來的數據, 首先將寫操作記錄到 位於磁
盤的 CommitLog 中; 上述操作成功 后, 更新位於內存中 的 Memtable 數 據 結 構。 持 續 的 寫 入 數據, 使得 Memtable 逐漸增長, 當 其數據量到 達某個閾 值時, Cassandra 的數據遷移被觸發, 一 方面將
Memtable 刷 寫 到 本 地 磁 盤 上 成 為 永 久 的SSTable , 另一方面將 CommitLog 中 的 寫 入記錄移除。 對於讀操作, 客 戶 端 先 查 詢
Memtable 中的數據, 若無法獲取所需信息, 則 檢索本地磁盤。
Cassandra 會定期執行壓緊compact 操作, 將同一條數據不同的版本進行合並, 過時數據也會在此過程中被刪除; 分層數據壓縮, 有效減少數據體積
及磁盤 I / O 。
系統設置(集群)
針對實時氣象數據存儲系統, 用戶對該系統讀取的性能需求遠遠高於寫入數據。 通過對副本數進行合理設置, 可分散讀取壓力 。 對於5 節點集群, 將副本數設置為 3 ;
Row 分區 模式:
采用自動分區方式, 使不同的 Row Key 均勻分布在各節點上, 有利於數據讀取壓力的分散。
Cassandra 表設計
作為典型的非結構化數據,氣象數據可以由多維索引 來確定一個唯一的數據。
業務用戶常見的操作包括“最新數據”“左右翻頁”“上下翻頁”等。
數據表
根據不同數據類型建立相應數據表, 用於存儲數據內容, 包括:
ECMWFHR(高分辨率數值預報產品 )、
SATELLITE ( 衛 星 資料)、
UPPERAIR (高空站點資料)、
SINGLERADAR (雷達資料) 等。
以“ T639 ”為 例 說明 數據表結構(表 1 )。
建表 語 句: CREATE TABLE "T639 "
( "dataPath " text , column1 text ,
value blob , PRIMARY KEY (" dataPath " ,
column1 ) ) ;
層次表
用於存儲所有模式或實況的層次信息, 表名為level ; 用 戶 在 客戶 端進行上下翻頁操作, 從level 表中獲取當前層次的上一層或下一層信息; 利用層次表與數據表, 可檢索到不同層次的數據(表2 )。
建表語 句: CREATE TABLE level (
"dataPath " text , column1 int , value int , PRIMARY KEY (" dataPath " , column1 )) ;
最新時刻表
用於存儲各類數據的最新時刻信息, 表名 為latestdatatime 。 利 用 最新時刻表, 用戶能通過客戶端快速查找到最新數據文件名。 用戶根據完整索引 (文件路徑與最新數據文件名), 例: T639 / WIND / 500 / 17030108. 000 , 即可在“數據表”中獲取到對應數據(表 3 )。
建表語句: CREATE TABLE latestdatatime
( " dataPath " text , column1 text , value text ,PRIMARY KEY (" dataPath " , column1 )) ;
存儲系統性能測試
測試環境
選用5台相同配置的服務器用來搭建分布式存儲系統。 服 務 器 操作 系 統 為 Red Hat Enter -prise Linux Server release 7. 1 , 處理器參數為Intel ( R ) Xeon ( R ) CPU E5 - 2620 v2 @ 2. 10GHz , 主頻為2. 1 GHz ; 內 存大小為 256 GB ;6 塊4TB SATA 硬盤; 服務器間通過萬兆光纖連接。Cassandra 數據庫版本為2. 2. 5 。
高可用性測試
由 5 個節點所組成分布式存儲系統, 其結構上具有如下特點。
( 1 )服務器雙網卡綁定, 即將兩個物理網卡虛擬成一個邏輯網卡; 提升服務器之間的傳輸帶寬,實現網卡冗余。
( 2 )用於集群內部數據交換的兩台萬兆光纖交換機, 采取級聯方式, 可互為備份。
( 3 ) 6 塊SATA 硬盤, 其中 2 塊做 RAID1, 安裝操作 系 統 及 軟 件; 另 外 4 塊 4TB 用 作 兩 個RAID0 , 用於存儲數據。
( 4 )服務器集群為環形結構, 沒有 master 節點, 各節點功能完全一樣。
按照表4中內容, 對系統的基礎設施層(包括網絡設備、存儲設備等)、 軟件層(數據庫) 進行測試, 來驗證系統的高可用 性; 從表中結論可知, 系統中用於內部數據交換的光纖或網卡、交換機及任一 Cassandra 服務器故障, 均不影響 MICAPS4客戶端調取數據。
讀取性能測試
通過讀取數據的腳本文件(可獲取數據字節數信息, 表5中 ECMWF _ HR / TMP / 100 目 錄下數 據 字 節 數 為 132642 字 節, SATELLITE /
FY2E / L1 / IR3 / EQUAL 下數據字節數為554944字節,
T639 / WIND / 100 下數據字節數為1449052字節), 模擬單用戶及50 用 戶 、 100 用 戶 客戶 端對同一類型數據進行讀取, 共分 3 組, 即對三種不同類型的數據進行測試, 測試性能見表5 , 注意測試結果包含網絡傳輸時間。
從數據讀取的測試結果可以看出 :
( 1 )50 用戶並發和100 用 戶 並發 客戶 端 同 時 對 同 一 類 型數據進行 讀 取 的 時 間 與 單 用 戶 讀 取 時 間 相 當 。以 T639 / WIND/100 為 例, 50 用 戶 並 發 和 100用 戶 並發與單用 戶 讀取相 關數據 所 花 費 的 平 均時間 均在20 ms 左右。
( 2 ) 在100 用 戶 並發情況下, 從數據庫 中 調 取數據 所消 耗 的 時 間 均 以 ms量級為 單 位 ( 包 含 網 絡 傳 輸 時 間 ) , 時 間 遠 遠 小於在samba 服 務 器 上 讀 取 數 據 的 時 間 。
( 3) 數據讀取時 間 和 單 個 數 據 的 字 節 數 近 似 成 正 比,即單個數 據 文 件 字 節 數 越 大, 讀 取 數 據 所 花 費的時間 則 越長。
結語
利用 Cassandra 分布式數據庫搭建的存儲環境, 提高了實時氣象數據存儲效率與檢索速度, 通過統一的數據平台, 實現了運維人員對該系統“零”維護。 通過在實際業務環境中進行測試, 驗證了該分布式數據環境的高可用性; 以毫秒級為單位的數據讀取時間, 能很好地滿足業務對數據時效性的需求。