想讓前輩們給點建議,想用erlang實現一個簡單的分散式緩存資料庫?

想讓各位前輩給點建議,提前謝謝啦

自己打算寫一個類似redis的緩存資料庫(簡單版的),發現自己對存儲方面比較感興趣 最近學習了下erlang,感覺很棒,所以打算用erlang來實現成分散式,看過一點redis方面的書籍。

想請問下前輩們單用erlang實現好還是erlang+c。

我個人感覺是erlang對底層數據組織沒有c控制的好,所以有些疑問 前輩們有沒有一些相關資料推薦(相關資料都行^ _ ^ ,我知道Erlang/otp並發編程實戰第二部分有介紹,正在學習...)

還有寫這個需要注意些什麼嗎 小白一枚,提前謝謝各位^ _ ^

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

感謝各位前輩的回答 :)

可能我的理解有偏差,我打算的是類似redis那種可以部署到多台機器上,有master管理的,應該稱為簡單的集群吧...不能叫分散式

打算只實現redis一小部分功能。

自己知識儲備還是太少,繼續加油!


erlang/otp並發編程實戰

這本書中就構造了一個簡單的適用於存儲session的分散式內存高速緩存資料庫

題主可以參考一下

另外在我看來,erlang做資料庫有個巨大缺陷是,erlang的數據結構並不能直接兼容與其他的編程語言,這意味著在跨語言邊界上需要做一些有關類型轉換的工作

但是相反的,erlang因為天生的分散式特性,在設計與構建中,可以很容易地構建一個能夠分散式並容錯的數據緩存


謝邀

不懂erlang,不知道為什麼邀請我回答了,不過既然說到想做緩存又對存儲感興趣,練練手,玩緩存設計、內存管理、網路框架、無鎖數據結構,為什麼不用C/C++這種能直接控制內存及其申請釋放的語言呢


用 C 語言寫一個完整的分散式系統工作量巨大,一個人估計要幾年的時間。

Erlang 實現網路管理,C 實現存儲,以你的情況可行性高很多。


沒人邀請我。

針對 @Dylan Wen 的答案,什麼叫『先用Erlang來編寫版本A』?我表示不是很服。

著作權歸作者所有。

商業轉載請聯繫作者獲得授權,非商業轉載請註明出處。

作者:Dylan Wen

鏈接:想讓前輩們給點建議,想用erlang實現一個簡單的分散式緩存資料庫? - 知乎用戶的回答

來源:知乎

如果只是練手,可以先用Erlang來編寫版本A,熟悉一下Erlang的標準庫/OTP,開發工具及流程

因為Erlang的調度和GC會對性能有所影響,具體影響的程度如何要實際測試過版本A才能得出數據。如果要做到跟原來redis同樣的工業級別性能(個位數毫秒級延時,數百k吞吐每秒),我個人估計其中內存管理部分應該要改用C來編寫,成為版本B

資料方面,Erlang的兩本書《Erlang 程序設計》《Erlang/OTP並發編程實戰》是必看的,redis可以參考《Redis實戰》和《Redis 設計與實現》, redis的源代碼代碼量也不大,可以通讀。

redis 性能真就比得上Erlang的ets table 嗎?

首先貼一個 余鋒 的神貼:

Erlang內置資料庫挑戰7000WQPS

7000W的QPS

好吧,我測不了那麼高大上,我就用我的小mac 測一下吧,就單張ets table 好了,insert 的data byte size 就240 好了。不算欺負redis吧。

這個redis 官方的性能壓測。 How fast is Redis?

先貼代碼:

-module(bench_ets).

-export([start/2, insert_data/3]).

start(ProcNum, TotalNum) -&>
InsertData = {1, "dumy", "dumy", "dumy"},
io:format("insert data byte size : ~p~n", [erlang_term:byte_size(InsertData)]),
io:format("-------------- test begin ------------- ~n"),
EtsTable = ets:new(bench_ets, [public, {write_concurrency, true}, {read_concurrency, true}]),
BeforeTS = os:timestamp(),
Step = TotalNum div ProcNum,
TaskRefList = [task:async(?MODULE, insert_data, [EtsTable, Begin, End])
|| [Begin, End] &<- [[X, X + Step - 1] || X &<- lists:seq(1, TotalNum, Step)]], [task:await(TaskRef, infinity) || TaskRef &<- TaskRefList], AfterTS = os:timestamp(), io:format("-------------- test end ------------- ~n"), TimeUsed = timer:now_diff(AfterTS, BeforeTS), io:format(" ** using ~p process insert ~p records, time used : ~p~n" " ** per second, insert ~p records ~n", [ProcNum, TotalNum, TimeUsed, TotalNum/TimeUsed*1000000]). insert_data(_EtsTable, End, End) -&>
ok;
insert_data(EtsTable, Begin, End) -&>
ets:insert(EtsTable, {Begin, "dumy", "dumy", "dumy"}),
insert_data(EtsTable, Begin + 1, End).

到底結果怎麼樣,不著急,我們先說說GC schedule 什麼的,我這測試就先不調整這些虛擬機參數了。默認好了。

$ erl -pa ./*/ebin -pa ./bench_ets_test/
Erlang/OTP 18 [erts-7.0.3] [source] [64-bit] [smp:8:8] [async-threads:10] [hipe] [kernel-poll:false] [dtrace]

Eshell V7.0.3 (abort with ^G)
1&> bench_ets:start(1000, 10000000).
insert data byte size : 240
-------------- test begin -------------
-------------- test end -------------
** using 1000 process insert 10000000 records, time used : 3868583
** per second, insert 2584925.7984124934 records
ok
2&>

GET的,就不測了,沒意思。

我的測試就到這了,反正性能方便已經快把redis干趴下了,哦,對了,ets table的個數,我就只用了一個。我們生產環境的ets table 的數量是10W級別的。拆表之後,配合Erlang的並發進程,畫面太美,不敢太吹。

說了這麼多廢話,最後想給題主童鞋說,先學基礎語法,然後多寫代碼,多讀代碼,明白Erlang可以怎麼用了,你就知道了。

我這是小號,噴子們別噴我。不服也別來辯,沒意思,我們的生產環境asdhirohifh[1ru1924hoihfq8ywrmaaih801rb1pinbv0 p f8r 019r1


1.參考redis的話就是提供什麼命令,什麼數據結構,是否可以並發訪問

2.分散式的話,確定你的系統邊界,是多點寫入,主主,主備,選擇什麼一致性模型,協議就用redis協議可以否,數據快照怎麼做,節點數據如何恢復,高可用,failover等等怎麼做

3.選擇erlang,golang,c/c++都可以

4.不懂的話就一個一個問題解決,認真補課


不懂。mnesia本身就可用作分散式緩存資料庫啊,只是沒法直接與別的語言互通,但是寫一套介面應該是沒問題的


現在有各種開源庫,建議如下:1、網路傳輸和消息機制這塊可以用protobuf+zmq。2、分手式集群,可以參考storm模式,這塊建議用zookeeper管理。3、還有就是需要能夠支持數據流配置,方便分布計算。具體實現比較繁瑣,但是多用開源庫,核心自己寫還是可以比較快實現。


簡單的沒有,複雜的倒是有個現成的。Riak,你看它那代碼量


Erlang語言和工程經驗起碼1年以上,最好還有其他底子。

然後再說,分散式系統,CAP理論,分散式的話還要看一些消息機制和優化。


推薦閱讀:

QCon 2017分享總結——分散式系統設計的幾點思考
[跟吉姆一起讀LevelDB]2.LSM Tree與leveldb::DB::Open操作(1)
redis4.0、codis、阿里雲redis 3種redis集群對比分析
B+樹並發協議
怎樣操作leveldb資料庫,實現增刪改查?

TAG:資料庫 | Redis | CC | Erlang編程語言 |