爲什麼會有Memlink?
對於大型論壇服務,比如百度貼吧、天涯論壇,日均發帖量過百萬,日均PV過億,日積月累下來的帖子數量可能幾十億。這麼大的一個論壇服務,海量數據的存儲、訪問是一個非常有挑戰性的技術難題。
中小規模的論壇通常使用mysql/sql server作爲後端存儲,當數據量膨脹時,比如一個版面有百萬、千萬級別主貼,一個主貼下有數百萬回覆,此時使用SQL語句select … order by … limit … ,性能可想而知。
大型論壇中的數據可以抽象爲如下幾類數據結構:
- 版面信息、主帖信息、回帖信息等。這是Key-Value結構的數據類型,比如主貼id對應主貼的信息(標題、發帖時間、作者等等),回帖id對應回貼的信息(回覆內容、回覆時間、回覆者等等)。
- 版面的主貼列表,主貼列表可按發表時間或者回復時間排序;主貼下的回覆列表,等等。這種數據類型是key-list數據類型,而且list是可排序的。
- 其他周邊數據。比如斑竹、會員等,由於數據量較小、邏輯關係較複雜,可以使用sql系統存儲。比如檢索數據,由檢索系統承擔。等等。
對於Key-Value系統,市面上有較多選擇,它們的數據容量大小從數百萬到上百億不等,性能、功能也各有差異,由於討論KV系統的文章很多,再次不贅述。
對於Key-list系統,市面上可選擇的餘地就非常小,加之線上工業級別的要求,因而就誕生出了memlink系統。
Memlink簡介
Memlink是一個高性能、持久化、分佈式的Key-list/queue數據引擎。正如名稱中的memlink所示,所有數據都建構在內存中,保證了系統的高性能(大約是redis幾倍),同時使用了redo-log技術保證數據的持久化。Memlink還支持主從複製、讀寫分離、List過濾操作等功能。
特點:
- 內存數據引擎,性能極爲高效
- List塊鏈結構,精簡內存,優化查找效率
- Node數據項可定義,支持多種過濾操作
- 支持redo-log,數據持久化,非Cache模式
- 分佈式,主從同步
與Redis區別
redis同樣也提供key-list 存儲功能,memlink與redis區別有:
- redis比較消耗內存。每個存儲節點,在不支持vm的情況下要額外消耗12字節內存,在支持vm的情況下,每個節點額外消耗24字節內存。對於存儲上億條數據來說,額外消耗的內存太大。
- redis redo-log不夠完善。redis redo-log機制:每隔一段時間同步磁盤(此期間重啓就好丟失數據);追加log方式,會使log文件越來越大,而且性能不夠優化。
- 主從同步不完善。如果從節點因爲網絡原因丟失了部分同步數據,需要重新完全獲取一份主節點的所有數據。在大數據量的情況下,不太合適。
- 網絡處理主事件循環只有一個線程,不能很好的利用多核;同時讀寫沒有分離,沒有進行寫優先處理。
- list節點沒有mask表,不能進行一些屬性過濾。
memlink主要對上述特點進行了改進。
性能
Client API
誰在使用?
目前Memlink應用於天涯來吧、天涯論壇系統。
未來
Memlink是專注於key => list\Queue對象的存儲系統,所以它內存使用更精簡、性能更高效。Key => list\Queue系統作爲Key => value另一種形式補充,爲高性能海量數據的Web應用提供了新的選擇。