twemproxyとmemcached

アプリ側を改修をしなくてキーの分散を行えないかと調べてたら 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コマンドのみサポートしています

Memcache Command Support

■参考URL かっぱのほげふが | ElastiCache for memcached の分散処理をどうするか悩む TwemproxyからElastiCacheに分散(同じキーは同じElastiCacheへ)してみる ElastiCacheとELBとtwemproxy