2012년 7월 5일 목요일

using rebar


Richard Jones 님이 정리한, rebar 사용법.
http://www.metabrew.com/article/erlang-rebar-tutorial-generating-releases-upgrades

이건 2010년도에 Belo Horizonte님이 정리한 사용법
http://alancastro.org/2010/05/01/erlang-application-management-with-rebar.html

그런데, outdated된 내용도 있고, 그대로 딱 되지는 않는다.

당장 필요한 것만 정리하면 다음과 같다.

1. rebar를 다운로드 받는다.
https://github.com/basho/rebar

2. 프로젝트 루트 디렉토리를 만든다. 그리고 rebar를 copy한다.
#> mkdir proj_home
#> cd proj_home

3.  proj_home/apps/mysample/src 로 프로젝트를 만든다.
디렉토리 구조는, https://github.com/RJ/erlang_rebar_example_project/tree/v1 이것을 참조하면 된다.

src 폴더에서,
#> rebar create-app appid=mysample
로 소스를 생성한다.

mysample_app.erl 을 mysample.erl로 mv하고, start/0 함수를 추가한다.

다음을 rebar.config에 추가한다.


{sub_dirs, [
            "apps/mysample",
            "rel"
           ]}.


그리고, 추가 소스를 넣고, 동작이 되게 하고, 컴파일한다.
#> ./rebar compile

4. release버젼을 만들어 본다.

#> mkdir rel
#> cd rel
#> ../rebar create-node nodeid=mysample

=> rel.config를 수정한다.
https://github.com/RJ/erlang_rebar_example_project/blob/v1/rel/reltool.config
{lib_dirs, ["../apps"]},

{rel, "dummy", "1",
        [
         kernel,
         stdlib,
         sasl,
         dummy_app
        ]},

이 부분을 수정하면 된다.

#> cd ..
#> ./rebar generate

5. 확인한다.
#> bin/mysample 치면 console,start,stop,attach,ping 등을 해 볼 수 있다.





2012년 7월 2일 월요일

distributed read/write cache for type value store


riak을 ram(memory) backend로 설정도 해보고,
redis/memcached도 고려해 보고,
couchBase도 고려해보고,
RabbitMQ를 이용한 방식도 생각해봤다.
scalaris도 설치해봤다.

riak은 내부적으로 erlang의 ets를 사용하는데, stress test시 garbage collection을 제대로 처리 못해서, swap memory를 사용한다. 그래서, 갑자기 퍼포먼스가 떨어진다.

redis/memcached는 memory flush out에 callback을 붙이는 것이 단기간에는 쉽지 않았다.

couchBase는 license비용 때문에, 엄두가 나질 않았다.

scalaris는 설정하다가 실패. 아직 찾아볼 자료도 별로 없다. 소스 리뷰는 도움이 된다.

결국, cache에 대해서는, mnesia를 사용해서 자체적인 분산처리 agent를 만들기로 결정했다.

결론적으로, 현재의 best practice는 memory cache 를 read only로 redis를 사용하고,(그것이 싫다면 자체제작) persistence에 대해서는 riak의 bitcask를 사용하는 것인 듯.

mongoDB와 riak은 근본적으로 분산처리 알고리즘이 다르다.
어떻게 다른지, 잘 알고 써야 한다. mongoDB는 controller를 통해서, hash key를 통제하는 방식이고, riak은 vnode를 사용하여, peer끼리 gossip하며 balance시키며 교환하는 방식이다. mongoDB는 자체적으로 memory cache를 갖고 있기 때문에, 성능이 더 좋다. 하지만, 잘 쓰기 나름이다. 개인적으로 riak이 더 마음에 든다.
Riak의로 AP를 확보하고, Memory Cache로 C(Consistency)와 성능을 확보하면 완벽할 듯.



mongoDB value size


type-value store를 넘어서 document store라고 알려져 있는데...
실제로는 그렇지 않다.
최대 value size를 10k 이하로 유지할 것.
그러기 위해서 key를 잘 선정하고, 잘 쪼갤 것.

그리고, nested 구조를 쓰지 말 것.


그렇다고, couchDB(couchBase)는 잘 될까?