アプリ側を改修をしなくてキーの分散を行えないかと調べてたら twemproxyというミドルウェアがあったので試してみた
twemproxyドキュメントや日本語訳のドキュメントは下記URLを参考に A fast, light-weight proxy for memcached and redis twemproxy 本家ドキュメント日本語訳
■twemproxy(nutcracker)のインストール
git clone https://github.com/twitter/twemproxy.git cd twemproxy autoreconf -fvi ./configure make sudo make install
■twemproxy(nutcracker)の設定 /etc/twemproxy/nutcracker.ymlに設置
kvs: listen: 0.0.0.0:22124 hash: fnv1a_64 distribution: ketama auto_eject_hosts: false server_retry_timeout: 3000 server_failure_limit: 1 servers: - 127.0.0.1:11211:1 - 192.168.1.101:11211:1
■twemproxy(nutcracker)の起動
twemproxy -d -c /etc/twemproxy/nutcracker.yml -o /var/log/twemproxy/twemproxy.log
■動作確認
telnet localhost 22124 Trying 127.0.0.1... Connected to localhost. Escape character is '^]'. set foo 0 0 3 bar STORED get foo VALUE foo 0 3 bar END
■twemproxyのモニタリング
curl -s localhost:22222 | jq . { "service": "nutcracker", "source": "192.168.1.100", "version": "0.4.1", "uptime": 23, "timestamp": 1480123789, "total_connections": 3, "curr_connections": 2, "kvs": { "client_eof": 1, "client_err": 0, "client_connections": 0, "server_ejects": 0, "forward_error": 0, "fragments": 0, "127.0.0.1": { "server_eof": 0, "server_err": 0, "server_timedout": 0, "server_connections": 0, "server_ejected_at": 0, "requests": 0, "request_bytes": 0, "responses": 0, "response_bytes": 0, "in_queue": 0, "in_queue_bytes": 0, "out_queue": 0, "out_queue_bytes": 0 }, "192.168.1.101": { "server_eof": 0, "server_err": 0, "server_timedout": 0, "server_connections": 1, "server_ejected_at": 0, "requests": 2, "request_bytes": 30, "responses": 2, "response_bytes": 33, "in_queue": 0, "in_queue_bytes": 0, "out_queue": 0, "out_queue_bytes": 0 } } }
サポートしているmemcache commandは下記の通り ※memcached ASCIIコマンドのみサポートしています
■参考URL かっぱのほげふが | ElastiCache for memcached の分散処理をどうするか悩む TwemproxyからElastiCacheに分散(同じキーは同じElastiCacheへ)してみる ElastiCacheとELBとtwemproxy