Engula云原生存儲(chǔ)引擎
Engula 是一款全新的存儲(chǔ)引擎,旨在幫助工程師們更加從容地構(gòu)建可靠、高性價(jià)比的數(shù)據(jù)庫。設(shè)計(jì)目標(biāo)如下:
-
云原生,把存儲(chǔ)引擎的計(jì)算、緩存、日志和文件等組件分離,使得各個(gè)組件能夠按需使用云上的彈性資源
-
智能化,根據(jù)業(yè)務(wù)負(fù)載對(duì)底層的存儲(chǔ)結(jié)構(gòu)進(jìn)行自我優(yōu)化
-
可擴(kuò)展,提供靈活的 API 讓用戶更加方便地實(shí)現(xiàn)自己的業(yè)務(wù)邏輯
-
平臺(tái)中立,支持靈活的部署方式,在物理機(jī)、私有云和公有云環(huán)境都能很好的運(yùn)行
Engula 是用于下一代數(shù)據(jù)基礎(chǔ)架構(gòu)的云原生存儲(chǔ)引擎。旨在以最低的成本在云平臺(tái)上提供可靠和高性能的服務(wù)。云平臺(tái)提供可以按需配置的彈性資源,這為重新構(gòu)建存儲(chǔ)引擎以利用它提供了廣泛的機(jī)會(huì)。為了實(shí)現(xiàn)這一目標(biāo),Engula 從頭開始??設(shè)計(jì),以充分利用這些平臺(tái)上的彈性資源。
Engula 將經(jīng)典存儲(chǔ)引擎的組件拆分為單一功能單元。例如,有些單元負(fù)責(zé)數(shù)據(jù)存儲(chǔ),有些單元負(fù)責(zé)命令執(zhí)行。每個(gè)單元都是一個(gè)輕量級(jí)的容器,運(yùn)行在一個(gè)節(jié)點(diǎn)上,并在該節(jié)點(diǎn)上擁有一定數(shù)量的資源。節(jié)點(diǎn)由運(yùn)行平臺(tái)提供,構(gòu)成統(tǒng)一的資源池為單元提供服務(wù)。也就是說,Engula 可以看作是一個(gè)整體提供存儲(chǔ)服務(wù)的單元編排系統(tǒng)。
Engula的設(shè)計(jì)原則如下:
- 首先使其簡(jiǎn)單可靠,然后使其具有成本效益和高性能。
- 使其足夠智能,只需最少的操作和配置。
- 避免平臺(tái)未內(nèi)置的外部依賴項(xiàng)。
目前 Engula 還處于非常早期的階段;可查看路線圖以了解更多詳情。
use std::sync::Arc;
use engula::{
Database, FileSystem, JobRuntime, LocalFileSystem, LocalJobRuntime, LocalJournal, LocalStorage,
Options, StorageOptions,
};
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
let options = Options {
memtable_size: 1024,
};
let storage_options = StorageOptions::default();
let dirname = "/tmp/engula";
let fs = LocalFileSystem::new(dirname)?;
let fs: Arc<Box<dyn FileSystem>> = Arc::new(Box::new(fs));
let job = LocalJobRuntime::new(fs.clone());
let job: Arc<Box<dyn JobRuntime>> = Arc::new(Box::new(job));
let storage = LocalStorage::new(storage_options, fs, job)?;
let journal = LocalJournal::new(dirname, false)?;
let db = Database::new(options, Box::new(journal), Box::new(storage)).await;
for i in 0..1024u64 {
let v = i.to_be_bytes().to_vec();
db.put(v.clone(), v.clone()).await?;
let got = db.get(&v).await?;
assert_eq!(got, Some(v.clone()));
}
Ok(())
}