====== Moxi ====== * Memcached를 지원하는 Proxy * [[https://github.com/couchbase/moxi|moxi couchbase github]] * [[http://docs.couchbase.com/moxi-guide/|moxi-guide]] * [[https://code.google.com/p/moxi/|구 moxi 홈페이지]] * [[http://www.slideshare.net/northscale/moxi-memcached-proxy|Moxi - Memcached Proxy]] ===== moxi의 역할 ===== moxi는 죽은 memcached서버를 인식해서 일정시간 동안 요청을 안보내긴 하지만, 죽은 서버에 대한 요청을 다른쪽으로 자동으로 redistribute하지는 않는다. 따라서 memcached가 죽으면 빠르게 살리거나(그러면 moxi가 다시 서버군에 넣어줌), moxi에서 죽은 서버를 빼서 재설정해야 한다. ==== 주의점 ==== 여러대의 memcached가 받아야할 대역폭을 moxi 가 혼자 감당해야 하기 때문에 해당 망의 대역폭과 moxi 가 설치된 서버의 대역폭을 충분히 확보해야만 한다. ===== High Availability(HA, Fail Over) ===== * Moxi 자체를 여러대로 구성하고 * 클라이언트가 직접 Moxi에 붙지 말고 Moxi들 앞에 Load Balancer를 둘 것. * Moxi는 여러대 이더라도 일관성있는 Hashing을 하여 동일 Memcached에 동일 키가 접속 된다. ===== Ubuntu 설치 ===== * [[http://www.couchbase.com/nosql-databases/downloads|Moxi Download]] 에서 다운로드 * [[:memcached|memcached]] 사용시에는 직접 옵션 줘서 실행 * ''/opt/moxi/bin/moxi'' * [[nosql:couchbase|CouchBase]] 사용시 설정정보 * 설정 : ''/opt/moxi/etc'' * 실행 : ''/etc/init.d/moxi-server start'' ===== Memcached 사용시 권장 설정 ===== memcached 사용시에는 cluster 설정이 없고, 접속할 memcached 서버 목록을 실행시 제공한다. ./moxi -z LISTEN_PORT=MEMCACHED_HOST1[:PORT1][,MEMCACHED_HOSTN[:PORTN]] ./moxi -z 11811=mc1:11211,mc2:11211 ===== Options ===== * ''-B [binary|ascii|auto]'' : 바이너리 프로토콜만 허용. 기본은 클라이언트의 요청을 분석하여 ASCII와 BINARY 자동반응. ''binary''로 지정할 경우 ''stats'', ''stats proxy'' 작동 안함. * ''-t [쓰레드갯수]'' : 작업 쓰레드 갯수를 지정한다. CPU Core 갯수보다 같거나 작게 지정한다. ===== 상태보기 ===== * ''%%echo "stats" | nc moxihostname 11811 | sort%%'' * ''%%echo "stats proxy" | nc moxihostname 11811%%'' * ''%%echo "stats proxy config" | nc moxihostname 11811%%'' : 프록시 설정 보여줌 # 아래 명령으로 moxi를 띄웠을 때 ./dev/moxi/moxi -z 11211=127.0.0.1:11411,127.0.0.1:11511 # 다음과 같이 출력됨. echo stats proxy config | nc 127.0.0.1 11211 STAT 11211:default:config 127.0.0.1:11411,127.0.0.1:11511 END * ''%%echo "stats proxy timings" | nc moxihostname 11811%%'' : ''-Z time_stats=1'' 옵션으로 moxi를 실행했을 때 ===== CouchBase 사용시 권장 설정 ===== * **Standalone Moxi Component** 항목 * moxi를 각 애플리케이션마다 다 띄우고, 각 독립 moxi가 전체 설정을 가지고 있는 Cluster Manager에 접속하여 설정 정보를 읽는 형태. ==== moxi.cfg ==== * moxi 기본 설정 ==== moxi-cluster.cfg ==== * moxi 클러스터 관리 설정 url=http://membase01:8091/pools/default/bucketsStreaming/default * 실행시 클러스터를 여러개 지정가능 moxi http://membase0:8091/pools/default/bucketsStreaming/shoppingCarts,http://membase1:8091/pools/default/bucketsStreaming/shoppingCarts * 접속이 되는 곳에 접속을 맺고 정보를 주고 받는다. * 접속이 끊기면 다시 재접속을 시도한다. * **reverse proxy**로 하나의 URL로 접속하게 하는 것이 낫다. ===== Channel ===== ==== Data Channel ==== * memcached 데이터를 주고받는 채널. 기본 ''11211'' 포트 ==== Management Channel ==== * moxi 자체를 관리하고 설정하는 REST URL. 기본 ''8091'' 포트 ==== memcached 무응답시 ==== * Blacklist/Backoff : 특정 memcached가 응답이 없을 경우 일시적으로 더이상 해당 memcached에 요청을 보내지 않고 곧바로 오류를 리턴하는 기능. * 아예 해당 memcached를 목록에서 빼버리는 행동은 하지 않고, 다만 해당 memcached로 전달해야할 Key가 오면 즉각 오류를 리턴해서 성능상 불이익만 줄여주는 컨셉인 것으로 보임. 따라서 클라이언트는 빠르게 오류 메시지를 받게 된다. 어차피 캐시 이므로 오류 발생시 실 데이터소스로 부터 정보를 읽는다. * 꼭 원하면 설정을 변경하여 fail나는 memcached 빼고 재실행 해야 한다. * ''connect_max_errors=횟수''에 지정된 값 이상의 커넥션 오류가 발생하면 Blacklist에 넣고 더이상 요청 보내기 중단. * ''connect_retry_interval=시간 ms''로 blacklist로 지정한 뒤 다시 해당 서버로 요청을 재시도하기까지의 기간을 지정한다. * ''connect_max_errors''는 ''downstream_conn_max(기본값 4)''보다 큰 값으로 지정해야 한다.