- 論壇徽章:
- 9
|
本帖最后由 wlmqgzm 于 2016-05-09 14:35 編輯
存儲(chǔ)層的數(shù)據(jù)規(guī)劃思路:
1)主要技術(shù)思路與Mangodb接近.分為數(shù)據(jù)和索引兩部分, 數(shù)據(jù)完全在存放在文件中, 由File mapping管理, 所有的讀寫全部由操作系統(tǒng)來控制, 代碼除了定期flush一下, 就完全不管了. 索引全部放在內(nèi)存中.
其余部分是與mangoDB不同的:
2)索引部分是真正由自己的代碼控制, 主要就是一個(gè)"hash(Key)===>(Key_value data)offset"的構(gòu)造, 實(shí)現(xiàn)Key--Value的查詢.
查詢過程是: Key==>Hash(key) 統(tǒng)一轉(zhuǎn)化為8字節(jié)的編碼==>hash_map find, map內(nèi)部第2次hash,==>輸出8字節(jié)全局Offset==>3字節(jié)文件索引號(hào)+4字節(jié)File offset+1字節(jié)塊內(nèi)部索引編號(hào)
==>利用file mapping讀取數(shù)據(jù)頭, 發(fā)現(xiàn)是LZ4壓縮, 執(zhí)行LZ4讀, 如果是非壓縮格式, 直接讀
3)只有索引部分常駐內(nèi)存, 因此,這部分?jǐn)?shù)據(jù)決定了內(nèi)存的消耗量, 目前的設(shè)計(jì)是16個(gè)字節(jié)索引一條記錄, 8字節(jié)的hash(Key), 8字節(jié)的全局Offset. 對(duì)于1億條記錄, 總體消耗1.6G內(nèi)存.
32G內(nèi)存, 理論上總體可實(shí)現(xiàn)20億條記錄的索引全部緩存在內(nèi)存中, 實(shí)際按照80%可用內(nèi)存消耗計(jì)算, 對(duì)于32G的單機(jī), 大約是16億條記錄每臺(tái)服務(wù)器.
8字節(jié)全局Offset==>3字節(jié)文件索引號(hào)+4字節(jié)File offset+1字節(jié)塊內(nèi)部索引編號(hào)
3字節(jié)索引號(hào) 表示最大使用1600萬個(gè)文件.
4字節(jié)File offset 表示每個(gè)文件最大4G字節(jié), 其實(shí)默認(rèn)就是4G字節(jié), 也是推薦的參數(shù). 這個(gè)可以把4字節(jié)的每個(gè)比特都用盡, 不浪費(fèi).
1字節(jié)塊內(nèi)部索引編號(hào) 表示每個(gè)數(shù)據(jù)塊最大存儲(chǔ)254個(gè)記錄, 其中記錄號(hào)0保留作為單塊單記錄的標(biāo)識(shí), 記錄號(hào)255保留做未來擴(kuò)充使用, 能夠使用的只有1-254, 一共能夠最大存儲(chǔ)254個(gè)記錄.
為了提高性能, 初步確定, 每個(gè)數(shù)據(jù)塊內(nèi)部的記錄Offset使用2個(gè)字節(jié)來表示, 因此,數(shù)據(jù)塊最大長(zhǎng)度為64KByte, 這個(gè)塊的大小是可調(diào)整的, 建議的范圍是0K--64KB, 這個(gè)塊大小與Mysql 4K-32K很接近.
最終推薦大小將根據(jù)產(chǎn)品的實(shí)際測(cè)試情況,推薦或者固定為一個(gè)最優(yōu)值.
與過去的其他任何數(shù)據(jù)庫的設(shè)計(jì)的重要的區(qū)別:
1)這次設(shè)計(jì)的數(shù)據(jù)塊要完全優(yōu)化SSD, 絕對(duì)避免隨機(jī)寫, 任何數(shù)據(jù)塊都是只寫一次, 不會(huì)有第2次重寫, 因此, 為了節(jié)約存儲(chǔ)空間, 所有的塊都是按照實(shí)際使用量連續(xù)排列的, 內(nèi)部沒有任何浪費(fèi),沒有任何預(yù)留空間, 并且塊開頭不是4K對(duì)齊的.
由于塊與塊是緊密相連的, 為了故障處理和崩潰恢復(fù), 在塊與塊之間, 引入了同步隔離碼的概念.
2)數(shù)據(jù)是壓縮與非壓縮混合的, 任何一個(gè)數(shù)據(jù)塊在第一次寫入時(shí)都是非壓縮的, 就是說任何最近的數(shù)據(jù)都是非壓縮格式. 這樣提供了最高的讀寫性能.
對(duì)于稍微舊一些的數(shù)據(jù)(還是有效數(shù)據(jù)), 或者在夜間時(shí)段,或者滿足一定的條件, 將在后臺(tái)低優(yōu)先級(jí)進(jìn)程啟用最高壓縮率的處理, 數(shù)據(jù)將第2次寫入, 但是寫入到新的區(qū)域,
使用LZ4壓縮, LZ4壓縮方式是HC模式, 即默認(rèn)高壓縮模式, 該模式非常消耗CPU資源, 大約壓縮性能與gzip相當(dāng), LZ4解壓是高性能的, 大約500M字節(jié)每秒.
這種設(shè)計(jì)實(shí)現(xiàn)了高性能并發(fā)與高壓縮比同時(shí)兼顧, 并且實(shí)現(xiàn)了查詢下的高性能解壓縮, 從設(shè)計(jì)理念上是非常先進(jìn)的.
數(shù)據(jù)塊內(nèi)部的進(jìn)一步編碼優(yōu)化: 這個(gè)部分尚在仔細(xì)考慮設(shè)計(jì)中, 因?yàn)橐呀?jīng)決定使用LZ4壓縮存儲(chǔ), 對(duì)塊內(nèi)部的壓縮, 或者沒有必要進(jìn)行額外的壓縮處理. (正在考慮是否采用)
長(zhǎng)整數(shù)編碼的壓縮設(shè)計(jì): 使用壓縮編碼來編碼8字節(jié)長(zhǎng)整數(shù), 壓縮后編碼長(zhǎng)度范圍是1字節(jié)到9字節(jié), 平均長(zhǎng)度是4字節(jié). 4字節(jié)整數(shù)的壓縮后平均長(zhǎng)度是2字節(jié)
這部分整數(shù)壓縮代碼雖然已經(jīng)測(cè)試完畢, 但是可能最終會(huì)廢棄不使用. 整數(shù)壓縮的原理是: 4-8字節(jié)的整數(shù), 可能多數(shù)時(shí)候只有少數(shù)字節(jié)是非零的,這樣就可以用非零字節(jié)數(shù)+非零字節(jié)來表示, 尤其是全零的整數(shù), 只需要1個(gè)字節(jié)就可表示.
先提交這部分設(shè)計(jì), 后續(xù)再寫. |
|