레이블이 riak인 게시물을 표시합니다. 모든 게시물 표시
레이블이 riak인 게시물을 표시합니다. 모든 게시물 표시

2014년 11월 19일 수요일

First Experience on Google Compute Engine

Google Compute Engine에서 Erlang,Riak,Cowboy 기반 서비스 설치 완료했습니다.

인상적인 것은, 다른 Region에서도 VM Instance를 만들면, 프로젝트가 쓰고 있는 같은 Privte 망에 붙어서 생성됩니다. 
그래서, cookie 만 같으면, Region간 통신이 바로 됩니다.

Regioin간 통신은 150ms 정도 나오고요.
같은 Region내의 다른 Zone간에는 1ms 이하로 떨어집니다.


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)와 성능을 확보하면 완벽할 듯.



2012년 6월 27일 수요일

mongoDB to riak + postgres


http://vimeo.com/42744689

mongoDB로 고생하다가
riak + postgres로 바꾼 스토리다.

덤덤하게 이야기하지만, 많이 고생했을 것 같다.


2012년 6월 15일 금요일

using riakpool_client in erlang

https://github.com/dweldon/riakpool

riakpool_client는 riak pb client에 connection pooling 기능을 넣어서 쓸 수 있게 해준다.
간단하게 쓸 수 있다. 하지만, 실전에 쓰기에는 아직 부족함이 많다.
riak http client ( https://github.com/basho/riak-erlang-http-client )을 쓰는 것이 맞을지도 모르겠다. 어떤 것을 쓰는게 빠를지 테스트 해 볼 예정이다.

riak은 key-value store다. value에 attribute들을 여러개 넣으려면,  record를 저장해야 할텐데, binary로 변환해서 저장한다. 즉, record를 꽉 채워서 넣어야 한다. 일부 field만 저장하는 것은 지원하지 않는다. 그렇게 하려면, record를 읽어와서, 바뀐 field만 다시 record에 넣고, put해야 한다. 이 부분은, 좀 아쉽다! 근데, 다른 key-value store도 내부적으로 그렇게 할 듯 하다. 확인이 필요한 부분이다. 현재까지 내가 확인 한 것은 그렇다. -.-;;
다음은 간단히 record를 put하는 예제를 구현해 봤다.

1> rd(item, {id,name} ).
item
2> It=#item{ id= <<"aaa">> , name = <<"bbb">> }.
#item{id = <<"aaa">>,name = <<"bbb">>}

3> riakpool_client:put( <<"aaa">> , <<"bbb">> , term_to_binary(It) ).
ok
4> { ok , R } =  riakpool_client:get( <<"aaa">> , <<"bbb">> ).

5> binary_to_term(R).
#item{id = <<"aaa">>,name = <<"bbb">>}
6> R2 = binary_to_term(R).
#item{id = <<"aaa">>,name = <<"bbb">>}
7> R2#item.id.
<<"aaa">>