Beringei是Facebook推出的一個開源的時間序列數(shù)據(jù)庫。它的設(shè)計目標(biāo)是為了支持高效的數(shù)據(jù)插入和查詢,并提供良好的可擴展性和高可用性。Beringei最初是為了解決Facebook的一些內(nèi)部需求而開發(fā)的,后來被開源,成為了一個社區(qū)驅(qū)動的項目。
Beringei采用了MySQL作為其底層存儲引擎。這一選擇是基于團隊對MySQL的熟悉度和MySQL的廣泛應(yīng)用。但是,Beringei并不是使用MySQL的標(biāo)準(zhǔn)方式。它使用MySQL作為一個簡單的key-value存儲,每個key對應(yīng)一個時間序列的數(shù)據(jù)點。這種存儲方式可能會對MySQL的性能和可擴展性造成挑戰(zhàn)。
// Beringei中的MySQL存儲格式
CREATE TABLE `ts` (
`key` blob NOT NULL, // key為二進制格式
`timestamp` bigint(20) NOT NULL,
`value` double NOT NULL,
`version` bigint(20) NOT NULL,
PRIMARY KEY (`key`,`timestamp`,`version`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;
為了解決這些問題,Beringei團隊開發(fā)了一些MySQL特定的優(yōu)化和擴展,包括:
使用異步寫入:Beringei使用異步寫入來提高插入時間序列數(shù)據(jù)的性能。數(shù)據(jù)首先被寫入內(nèi)存緩沖區(qū),并在后臺異步寫入MySQL數(shù)據(jù)庫。這種方式可以避免寫入過程中的阻塞,提高了Beringei的插入性能。
合并多個查詢結(jié)果:Beringei使用MySQL的GROUP BY操作合并多個查詢結(jié)果。這種方式比在應(yīng)用程序中合并結(jié)果要更高效。
使用MySQL Binlog進行復(fù)制:Beringei團隊實現(xiàn)了一個自定義的MySQL Binlog復(fù)制程序,用于在Beringei集群之間進行數(shù)據(jù)復(fù)制。
Beringei作為一個開源項目,其代碼可以在GitHub上找到。如果你對時間序列數(shù)據(jù)庫的實現(xiàn)和應(yīng)用感興趣,可以嘗試一下Beringei。