PythonでMemcachedを使ってみた。
因みに複数node構成。
前提条件
memcachedのインストール
2台のサーバそれぞれインストール。
# yum install memcached
memcached起動
2台のサーバそれぞれ起動しておく。
# /etc/init.d/memcached start
python用memcachedモジュール
# easy_install python-memcached
テスト
node1 192.168.1.1でpython実行
In [1]: import memcache
In [2]: mc = memcache.Client(['127.0.0.1:11211','192.168.1.2:11211'])
In [5]: mc.flush_all()
In [6]: mc.set("kapi1", "cache data")
Out[6]: True
In [7]: mc.get("kapi1")
Out[7]: "cache data"
In [8]: mc = memcache.Client(['127.0.0.1:11211','192.168.1.2:11211'])
In [9]: mc.get("kapi1")
Out[9]: "cache data"#192.168.1.1のmemcachedにアクセス
In [10]: my_mc = memcache.Client(['127.0.0.1:11211'])
#192.168.1.1のmemcachedには入っていない
In [11]: my_mc.get("kapi1")
#192.168.1.2のmemcachedにアクセス
In [12]: c_mc = memcache.Client(['192.168.1.2:11211'])
#192.168.1.1のmemcachedにデータが存在する。
In [13]: c_mc.get("kapi1")
Out[13]: "cache data"
#メインのmemcacheclientからはどちらにデータがあるか気にせずアクセスできる。
In [14]: mc.get("kapi1")
Out[14]: "cache data"
#MemoryをFlashする。
In [15]: mc.flush_all()
#192.168.1.1のmemcachedにデータが消えている
In [16]: c_mc.get("kapi1")
In [17]:
以下pythonからアクセス中にtelnetで実行していた結果。
node2 192.168.1.1のtelnet
telnet localhost 11211
Trying 127.0.0.1...
Connected to localhost.localdomain (127.0.0.1).
Escape character is '^]'.
#[1]の時の状態
get kapi1
END
#[7]の時の状態
get kapi1
END
#[11]の時の状態
get kapi1
END
node2 192.168.1.2のtelnet
telnet localhost 11211
Trying 127.0.0.1...
Connected to localhost.localdomain (127.0.0.1).
Escape character is '^]'.
#[1]の時の状態
get kapi1
END
#[7]の時の状態
get 1000
VALUE kapi1 0 10
cache data
END
#[16]の時の状態
get kapi1
END
複数node時の挙動
なんかバランサされてるのかと思われるが、微妙にそうでもなく、
一方にset()されると、ずっと同じnodeにset()するような動き。
node停止時の挙動
どちらかのnodeのmemcachedを止めると、もう片方のnodeにset()しだす。
この辺りは、ちゃんと切り替わるようだが、何度か試した内、set()の結果がFalseになって
nodeを見失う(それか、接続出来ないnodeにset()しようとしてる?)動きをした。
しかし、数秒後には接続できるnodeにset()し始めたので、set()の結果Falseを返すなら、
しばらくリトライする必要がありそう。
最初から2台構成のみのmemcached環境ならこんなのもあり
http://lab.klab.org/wiki/Repcached
参考URL
http://kapi.jp/kapi_blog/267
2010年04月14日
関連カテゴリ etc