hollyさんのwiki

memcached proxy. unix domain socketで起動できて、分散も簡単にできるらしい

install

これらがなければインストールしておく
yum install libevent-devel libevent glibc-static

インストールは以下で
cd /usr/local/src
mkdir magent
cd magent
curl -LO http://memagent.googlecode.com/files/magent-0.6.tar.gz
tar xvfz magent-0.6.tar.gz

試してみてわかったことだが、v0.6はconsistent hashingの実装にbugがあるようだ。特定のサーバにしかkeyが保存されない。

http://saylinux.net/story/002295/magent-memcached-...とかhttp://blog.s135.com/post/393/ v0.5だと試した限りうまく振り分けられる。

githubにv0.7?がupされているようだ。

というわけでこれはv0.6の方法となっている。展開すると以下ができる
Makefile
ketama.c
ketama.h
magent.c

そのままではmakeできないので、以下を行う

ketema.h

0.5ではいけてたのか?あまり深くは追求しない。とりあえずSSIZE_MAXを定義する
 diff ketama.h.org ketama.h
2a3,5
> #ifndef SSIZE_MAX
> # define SSIZE_MAX      32767
> #endif

Makefile

数学系ライブラリ?をリンクするようにする。直接関係ないけどこういうことなんだろう。CFLAGSのところに追加する http://stackoverflow.com/questions/2418157/ubuntu-...
sed -i.org -e "s/\(-Wall\)/\1 -lrt /" Makefile

make

ここまですればmakeできる
make
gcc -Wall -lrt  -g -O2 -I/usr/local/include -m64 -c -o magent.o magent.c
magentバイナリが出来るのでこれを適当なところに設置する。とりあえず/usr/local/bin とかにする
cp -p magent /usr/local/bin/

使い方

please provide -s "ip:port" argument

memcached agent v0.6 Build-Date: Jul 24 2012 15:06:28
Usage:
  -h this message
  -u uid
  -g gid
  -p port, default is 11211. (0 to disable tcp support)
  -s ip:port, set memcached server ip and port
  -b ip:port, set backup memcached server ip and port
  -l ip, local bind ip address, default is 0.0.0.0
  -n number, set max connections, default is 4096
  -D don't go to background
  -k use ketama key allocation algorithm
  -f file, unix socket path to listen on. default is off
  -i number, set max keep alive connections for one memcached server, default is 20
  -v verbose
sでサーバを複数指定して、-kをするとconsistent hashingを実現できる(http://www.hyuki.com/yukiwiki/wiki.cgi?ConsistentH...が詳しい)。アプリケーションからはあくまでmagentがI/Fとなる。もうひとついうとunix domain socketで接続するとtcp connectionのオーバーヘッドを減らすことができる。こんな感じか。
# -p 0はlistenしないという意味。かわりに-fでunix domain socketのpathを指定すること
magent -u $uid -g $gid -p 0 -s 127.0.0.1:11211 -f /tmp/magent.sock -D -k -v

memcachedのかわりにkyototycoon でmemcached互換モードで起動していれば、そのままmagent経由でkyototycoonを使うことができる

v0.7のコンパイル

たぶん新しいバージョンで動かすほうがいいと思うので再度書き直すことにする(マニュアルがほぼなし)。v0.6と同じくお手軽にやりたいならv0.5のほうがいいだろう。

install

libevent-devel libevent glibc-staticに加え、glib2-develが必要
yum instal glib2-devel

githubから取得
cd /usr/local/src
git clone git://github.com/wangmh/memagent.git

cd memagent
make

cc -Wall -g  `pkg-config --cflags glib-2.0` -c -o magent.o magent.c
cc -Wall -g  `pkg-config --cflags glib-2.0` -c -o ketama.o ketama.c
cc -Wall -g  `pkg-config --cflags glib-2.0` -c -o log.o log.c
cc -Wall -g  `pkg-config --cflags glib-2.0` -o magent magent.o ketama.o log.o -levent -lm -lglib-2.0

とりあえずbinaryはできる。インストールは/home/memagentとかとなっているので、/usr/local/memagent-0.7としたいので
 sed -i.org -e 's#home/memagent#usr/local/memagent-0.7#g' Makefile
make install
(cd /usr/local; ln -s memagent-0.7 memagent)
とする

設定ファイル

マニュアルなし。以前のバージョンのほうが単純でわかりやすかったのに。とりあえずmagent.cをみてみるとこういうことのようだ
項目
daemon_modetrue or false
logdir必須。ちょっといけてない。とりあえず/usr/local/memagent/logとしておく
verbose_modetrue or false
useketamatrue or false
port11215がdefault。unix domain socketはどうやら機能的にはないらしい?(socketファイルを作る関数は定義されているが実行するところがない)
host_ip未定義だと0.0.0.0となるので127.0.0.1を必ず定義
maxidelmax keepalive connectionのこと。 20 default
maxconnsmax connectionのことのようだ。4096 default
mastersこれは配列で定義するようだ ,(カンマ)で区切ればよい
backupsこれもあれば。mastersと同じ

実行

実際はアプリケーションを動かすユーザ権限で起動するほうが何かと便利そうなので、以下のようにしてみる
管理ディレクトリ作成
mkdir -p .memagent/{log,conf}
cp /usr/local/memagent/conf/magent.conf .memagent/conf/
設定
シンプルに
[General]<
#max keep alive connections for one memcached server-<
maxidle=20<
<
#max connection from  all clients<
maxconns=4096<
<
#mqagent port;<
host_ip=127.0.0.1<
<
#use ketama consistance hash-<
useketama=true<
<
#daemon mode<
daemon_mode=false<
<
#logfile<
logdir=/home/holly/.memagent/log<
<
masters=127.0.0.1:11211,127.0.0.1:11212,127.0.0.1:11213<
起動
/usr/local/memagent/bin/magent -c ~/.memagent/conf/magent.conf

とすれば3サーバにkeyが分散できることを確認
タグ

Wiki内検索

Menu

ここは自由に編集できるエリアです。

管理人/副管理人のみ編集できます