在搜尋引擎的設計中,往往需要使用倒排索引,在當前記憶體**不斷走低的情況下,記憶體資料庫必然會成為主流。kv資料庫由於適合map-reduce用於分布式處理。
本系統設計實現如下目標:
* 實現極高效能的查詢
* 實現分布式集群儲存
* 實現可靠的日誌系統
索引採用b數索引,這樣做的目的是大大利用cpu的快取,讓每個節點的大小與cpu二級快取相匹配,另外,將索引值連續儲存在節點中,可以減少tlb失配的次數。由於b樹的結構,樹高不會太高,設想在16gb的記憶體中建立資料庫,資料庫使用8g記憶體,每條記錄1k,那麼就有8m個鍵,如果是每個節點儲存256個節點的b樹,那麼log256(8m)=3,樹高是3,每次查詢節點跳轉最多2次,節點內二分查詢是在快取記憶體中進行,快取記憶體的效率大約是裝載記憶體讀取的4~5倍(6000次查詢),節點內二分查詢的最大次數為8次,資料可能可以優化,在後續實驗中進行。
對於為搜尋引擎定製的資料庫,對於插入的效能要求不是很高,之前做過的實驗表明,爬取的效能瓶頸在於網路io,網路延遲遠遠大於資料庫插入,故可以犧牲插入效能來獲得較高的查詢效能。
以下是b樹索引的查詢以及部分插入實現:
//b_tree.go
package index
/* 最大程度提高查詢效率,忽略插入效率,插入效率被爬蟲爬取效率瓶頸
*/const (
l2_cache_size =256
*1024
//256kb l2快取
node_data_num = l2_cache_size /64
max_support_key_length =8
//最大支援8個位元組的關鍵字查詢
)type node struct
type b_tree struct
func (bt * b_tree) init()
type selecterror struct
func (se selecterror) error() (string)
//獲得hash值
//取前8個位元組作為hash
func hash(text byte) (uint64)
for i :=0;i < length;i++
return hash_
}//查詢指定索引 如果找到返回找到的node和position,失敗的話返回最近的node和position,
//並返回返回值相對於查詢值是大了還是小了 true->小 false->大 優先返回大 供插入時插在前面
func (bt *b_tree) select(index byte) (*node,int,uint64,error)
}hash_key := hash(index)
node_ := &bt.root
pos_r :=0
//返回位置
var err selecterror //返回錯誤
var node_r *node
for node_ != nil
if node_.hash_key[node_.hash_key_num -1] < hash_key
//進行二分查詢
pos := node_.hash_key_num /2
c := node_.hash_key_num /2
for else
if node_.hash_key[pos] < hash_key
c /=2
if c ==0
pos += c
} else
if node_.hash_key[pos] > hash_key
c /=2
if c ==0
pos -= c}}
}}
return node_r,pos_r,0,err
}func (bt *b_tree) set(text byte,primary_key uint64) (error) else else
node_.hash_key[pos] = hash(text)
node_.primary_key[pos] = primary_key
node_.hash_key_num++}}
//todo 空間不足的情況
}return
nil}
單元測試(未測試多層~待續)
package index
import (
_"fmt"
"testing"
)func expected(t *testing.t,expecting uint64,real uint64)
}func test_hash(t *testing.t) ))
}func test_select(t *testing.t)
func test_set(t *testing.t)
打造先進的記憶體KV資料庫 5 TCP偵聽
作為支援集群的資料庫,必定要與多個客戶端互動資訊,不可能讓資料庫與所有客戶共享位址空間 雖然這樣效能好 所以需要使用tcp協議進行互動資料,udp協議不可靠。棄用 c語言的tcp庫其實還好,但是對於高併發和並行的處理不如go,而且併發鎖機制比較難寫,所以使用go寫了伺服器和客戶端呼叫c的庫,目前版本...
資料庫原理剖析 序列1 B 樹
關係型資料庫在查詢方面有一些重要特性,是kv型的資料庫或者快取所不具備的,比如 1 範圍查詢。2 字首匹配模糊查詢。3 排序和分頁。這些特性的支援,要歸功於b 樹這種資料結構。下面來分析b 樹是如何支援這些查詢特性的。圖6 1展示了資料庫的主鍵對應的b 樹的邏輯結構,這個結構有幾個關鍵特徵 1 在葉...
資料庫採用B 樹而不是B 樹 b樹的原因
總結 1.不包含data 每頁的包含的內容會比較多,出度比較高.深度低,有效保證效能 2.葉子節點包含所有內容,便於全域性遍歷.原因 相對於b樹,1 b 樹空間利用率更高,可減少i o次數,一般來說,索引本身也很大,不可能全部儲存在記憶體中,因此索引往往以索引檔案的形式儲存的磁碟上。這樣的話,索引查...