軽量MemcachedエージェントTwemproxyの導入


軽量MemcachedエージェントTwemproxyの導入
Twemproxy(nutcrackerとも呼ばれる)は、バックエンドキャッシュサーバへの接続数を減らすために主に使用される軽量レベルのRedisおよびMemcachedエージェントです.Twitterによってオープンソースされたキャッシュサーバクラスタ管理ツールは、主にRedisとMemcachedがクラスタ管理に指摘した不足を補うために使用されます.
 
Twemproxyは、Memcached ASCIIプロトコルと更新されたRedisプロトコルをサポートする高速の単一スレッドエージェントです.
 
Twemproxyが最も苦手なのは、ノードが失敗したときにアンインストールし、しばらくしてから接続を再試行したり、プロファイルに書かれているキーとサーバの対応関係に厳格に従って接続したりすることです.
 
導入のインストール
既存の試験機:192.168.11.51/52/68
まず51と52の試験機にlibeventとmemcachedを取り付け、それぞれ2つのmemcachedインスタンスを起動する.
次に68にtwemproxyをインストールし、パラメータを構成し、twemproxyインスタンスを起動します.
 
memcachedインスタンスのインストールと起動
詳細については、以前のブログ「Memcached 1.4.22インストールと構成」を参照して、次の例をそれぞれ起動してください.
/usr/local/bin/memcached -d -m 128 -u memcached -l 192.168.11.51 -p 11211 -c 1024 -P /var/run/memcached/memcached1.pid
/usr/local/bin/memcached -d -m 128 -u memcached -l 192.168.11.51 -p 11212 -c 1024 -P /var/run/memcached/memcached2.pid
/usr/local/bin/memcached -d -m 128 -u memcached -l 192.168.11.52 -p 11211 -c 1024 -P /var/run/memcached/memcached1.pid
/usr/local/bin/memcached -d -m 128 -u memcached -l 192.168.11.52 -p 11212 -c 1024 -P /var/run/memcached/memcached2.pid

 
twemproxyインスタンスのインストールと起動
1、autoconfのインストール
cd /tmp
wget http://ftp.gnu.org/gnu/autoconf/autoconf-2.69.tar.gz
tar zxvf autoconf-2.69.tar.gz
cd autoconf-2.69
./configure --prefix=/usr/
make && make install

 
2、twemproxyをインストールする
cd /tmp
wget https://github.com/twitter/twemproxy/archive/master.zip
unzip master.zip -d /usr/local/
cd /usr/local
mv twemproxy-master twemproxy
cd twemproxy
CFLAGS="-ggdb3 -O0" autoreconf -fvi
./configure --prefix=/usr/local/twemproxy --enable-debug=log
make && make install

 
3、ヘルプの表示
[root@test01 twemproxy]# ./sbin/nutcracker -h
This is nutcracker-0.4.0
Usage: nutcracker [-?hVdDt] [-v verbosity level] [-o output file]
[-c conf file] [-s stats port] [-a stats addr]
[-i stats interval] [-p pid file] [-m mbuf size]
Options:
-h, --help : this help
-V, --version : show version and exit
-t, --test-conf : test configuration for syntax errors and exit
-d, --daemonize : run as a daemon
-D, --describe-stats : print stats description and exit
-v, --verbose=N : set logging level (default: 5, min: 0, max: 11)
-o, --output=S : set logging file (default: stderr)
-c, --conf-file=S : set configuration file (default: conf/nutcracker.yml)
-s, --stats-port=N : set stats monitoring port (default: 22222)
-a, --stats-addr=S : set stats monitoring ip (default: 0.0.0.0)
-i, --stats-interval=N : set stats aggregation interval in msec (default: 30000 msec)
-p, --pid-file=S : set pid file (default: off)
-m, --mbuf-size=N : set size of mbuf chunk in bytes (default: 16384 bytes)

 
4、プロファイルの変更
mkdir /etc/nutcracker
cp ./conf/nutcracker.yml /etc/nutcracker/
vi /etc/nutcracker/nutcracker.yml
memcached:
listen: 192.168.11.55:22121
hash: fnvla_64
distribution: ketama
timeout: 400
backlog: 1024
preconnect: true
auto_eject_hosts: true
server_retry_timeout: 30000
server_failure_limit: 3
servers:
- 192.168.11.51:11211:1
- 192.168.11.51:11212:1
- 192.168.11.52:11211:1
- 192.168.11.52:11212:1

パラメータ解析:
Listen:twemproxyサービスを開始するIPとポート
hash:特定のハッシュ関数を指定する
distribution:特定のハッシュアルゴリズムを指定する
preconnect:コントロールのnutcrackerフロントエンドがこのプールに接続されているすべてのサーバプロセスが開始された場合、ブール値.デフォルトは偽です
auto_eject_hosts:ノードが応答できない場合に一時的にノードを削除するかどうか
server_retry_timeout:再試行時間(ミリ秒)
server_failure_limit:ノード障害は何回か取り外しても
servers:以下にすべてのmemcachedノード(IP:ポート番号:ウェイト)を示す
 
5、サービスで起動するように構成する
cp ./scripts/nutcracker.init /etc/init.d/nutcracker
chmod 755 /etc/init.d/nutcracker
vi /etc/init.d/nutcracker

1.新規定義daemo
daemon="/usr/local/twemproxy/sbin/nutcracker"

2.すべて置換
daemon --user ${USER} ${prog} $OPTIONS

を選択します.
${daemo} $OPTIONS
chkconfig --add nutcracker
chkconfig --level 35 nutcracker on
chkconfig --list nutcracker
vi /etc/profile

追加:
export PATH="$PATH:/usr/local/twemproxy/sbin"
. /etc/profile
echo $PATH

 
6、構成をテストしてサービスを開始する
nutcracker -t -c /etc/nutcracker/nutcracker.yml
service nutcracker start

 
データ書き込みテスト
[root@test01 init.d]# telnet 192.168.11.55 11211
Trying 192.168.11.55...
Connected to 192.168.11.55.
Escape character is '^]'.
set key1 0 0 1
1
STORED
set key2 0 0 2
22
STORED
set key3 0 0 3
333
STORED
set key4 0 0 4
4444
STORED
set key5 0 0 5
55555
STORED
quit
Connection closed by foreign host.
[root@test01 ~]# telnet 192.168.11.51 11211
Trying 192.168.11.51...
Connected to 192.168.11.51.
Escape character is '^]'.
get key1
END
get key2
END
get key3
END
get key4
END
get key5
END
quit
Connection closed by foreign host.
[root@test01 ~]# telnet 192.168.11.51 11212
Trying 192.168.11.51...
Connected to 192.168.11.51.
Escape character is '^]'.
get key1
END
get key2
END
get key3
END
get key4
END
get key5
END
quit
Connection closed by foreign host.
[root@test02 ~]# telnet 192.168.11.52 11211
Trying 192.168.11.52...
Connected to 192.168.11.52.
Escape character is '^]'.
get key1
END
get key2
END
get key3
END
get key4
END
get key5
END
quit
Connection closed by foreign host.
[root@test02 ~]# telnet 192.168.11.52 11212
Trying 192.168.11.52...
Connected to 192.168.11.52.
Escape character is '^]'.
get key1
VALUE key1 0 1
1
END
get key2
VALUE key2 0 2
22
END
get key3
VALUE key3 0 3
333
END
get key4
VALUE key4 0 4
4444
END
get key5
VALUE key5 0 5
55555
END
quit
Connection closed by foreign host.

52の11212ポートからすべてのデータが取得されていることがわかります.
52の11212ポートサービスを停止します.
エージェントにデータを書き続けます.
[root@test03 init.d]# telnet 192.168.11.55 11211
Trying 192.168.11.55...
Connected to 192.168.11.55.
Escape character is '^]'.
set username 0 0 6
ryanxu
STORED
set aa 0 0 2
aa
STORED
quit
Connection closed by foreign host.
[root@test03 init.d]# telnet 192.168.11.55 11211
Trying 192.168.11.55...
Connected to 192.168.11.55.
Escape character is '^]'.
get key1
SERVER_ERROR Connection refused
Connection closed by foreign host.
[root@test03 init.d]# telnet 192.168.11.55 11211
Trying 192.168.11.55...
Connected to 192.168.11.55.
Escape character is '^]'.
get key1
SERVER_ERROR Connection refused
Connection closed by foreign host.
[root@test03 init.d]# telnet 192.168.11.55 11211
Trying 192.168.11.55...
Connected to 192.168.11.55.
Escape character is '^]'.
get key1
END
get key2
END
get key3
END
quit
Connection closed by foreign host.

 
1台のmemcachedを切るとtwemproxyが自動的に取り外すことができます.リカバリ後、twemproxyはmemcachedグループに自動的に認識、リカバリ、再追加して再使用できます.
問題のまとめ
1).ymlプロファイルの各パラメータ値ペア区切り記号:」の後にスペースが必要です.
2)異なる階層のパラメータはインデント区分が必要であり、tabキーを使用してインデントすることが望ましい.そうしないとnutcrackerプロセスは開始できない.
3)auto_eject_hosts:trueの場合、memcachedインスタンスを閉じた後も、データを書き込むには「(error)ERR Connection refused」というプロンプトが表示されます.これとserver_retry_timeoutパラメータの設定が小さすぎて、30000は良い選択です.