読者です 読者をやめる 読者になる 読者になる

weblog of key_amb

主にIT関連の技術メモ

memcached-cli の v0.9.4 までの追加機能の紹介

KVS Perl CPAN develop

3/24 の記事で、最近作った memcached-cli というツールの紹介をしました。

keyamb.hatenablog.com

別に困ってはいないのですが、もっと便利にしたので、Changes から抜粋して追加機能を紹介しておきます。

昨日か一昨日に手元に入れて試してみた、という方はぜひアップデートしてみてください。

gets, add, replace, append, prepend, cas, touch, incr, decr の実装

v0.6.0 以前は get/set/delete しかできませんでしたが、これで memcached/doc/protocol.txt に書かれている Retrieval, Storage コマンド + α のデータ操作が全てできるようになりました。

なんとなくコマンドの解説:

  • add は該当キーのデータが無いときのみ成功します。
  • replace は該当キーのデータが有るときのみ成功します。
  • cas は gets で取得した cas 値に基いて更新を試み、cas 値が異なっていたら更新しません。

append, prepend はこんな感じですね:

memcached@127.0.0.1:11211> add foo Foo
memcached@127.0.0.1:11211> append foo .extension
memcached@127.0.0.1:11211> prepend foo prefix-
memcached@127.0.0.1:11211> get foo
       key:    foo
     value:    prefix-Foo.extension
    length:    20B
     flags:    0

get, gets で複数キーの同時取得に対応

元々 get, gets は複数キーを渡せたので、 memcached-cli でもできるようにしました。

で、複数データ取得した時には下のように LTSV で表示するようにしました。

memcached@SERVER:PORT> gets foo bar
Key:foo Value:Foo       Length:3B       Flags:0 Cas:219
Key:bar Value:Bar       Length:3B       Flags:0 Cas:220

cachedump コマンドで VALUE も取得して表示

以前の cachedump コマンドは stats cachedump の結果をそのまま出力していましたが、上のような LTSV にして、かつデータの中身も合わせて表示できたら便利だな、と思ったので、実装しました。

memcached@SERVER:PORT> cachedump 1
Key:foo Value:Foo       Length:3B       Expire:2016-03-26 00:30:27      Flags:0 Cas:219
Key:bar Value:Bar       Length:3B       Expire:2016-03-26 09:53:19      Flags:0 Cas:220
Key:baz Value:Baz       Length:3B       Expire:2016-03-26 10:49:05      Flags:123       Cas:221

実運用だと、 display でざっと全体の様子をつかんで、気になるスラブ・クラスを cachedump してみて、場合によっては中身を見る、という調査の流れがよくあるかと思いますが、そんなときにこれを使うとすごく捗りそうです。

stats, settings の結果を正規表現でフィルタ可能に

小ネタですが、よく見る指標がある人にはちょっと便利かと。

memcached@127.0.0.1:11211> stats (get|set)
# stats
#                Field          Value
               cmd_get            248
               cmd_set            515
              get_hits             46
            get_misses            202
memcached@127.0.0.1:11211> settings ^lru
# stats settings
#              Field           Value
         lru_crawler              no
   lru_crawler_sleep             100
 lru_crawler_tocrawl               0

ランダムデータ生成機能を実装しました

> randomset [<NUMBER> [<MAX_LENGTH> [<MIN_LENGTH> [<NAMESPACE>]]]]
> randomset                     # 100 個生成
> randomset 50                  # 50 個生成
> randomset 50 1024             # データ長 1-1024B の範囲で生成
> randomset 50 1024 256         # データ長 256-1024B の範囲で生成
> randomset 50 1024 256 sample1 # キーの prefix を 'sample1:' にする

これを使って、前回も話題に触れたネームスペースごとの統計取得・表示を簡単に試すことができます。

memcached@127.0.0.1:11211> settings detail  # 設定を絞込み表示
# stats settings
#              Field           Value
      detail_enabled              no
memcached@127.0.0.1:11211> detail on
OK - Enabled stats collection for detail dump.
memcached@127.0.0.1:11211> settings detail
# stats settings
#              Field           Value
      detail_enabled             yes
memcached@127.0.0.1:11211> \dd  # まだデータが無い
memcached@127.0.0.1:11211> detail on
OK - Enabled stats collection for detail dump.
memcached@127.0.0.1:11211> randomset 1000 0 0 sample1
Random Generate. [....................]
Complete.
memcached@127.0.0.1:11211> randomset 1000 0 0 sample2
Random Generate. [....................]
Complete.
memcached@127.0.0.1:11211> randomset 1000 0 0 sample3
Random Generate. [....................]
Complete.
memcached@127.0.0.1:11211> \dd
PREFIX sample3 get 0 hit 0 set 1000 del 0
PREFIX sample2 get 0 hit 0 set 1000 del 0
PREFIX sample1 get 0 hit 0 set 1000 del 0

(これで、別に作っていたデータ生成ツールは要らなくなりました。)

memcached-tool の "dump" コマンドをインポート

memcached-cli dump_all というコマンドにしました。

memcached-tool の "dump" は expire 0 のデータが正しく dump できない不具合があるのですが、こちらでは直しました。*1

ついでに dump から restore できるようにした

restore_dump <dumpファイル> でできます。
cat <dumpファイル> | telnet SERVER PORT で行けるかなと思ったのですが、やってみたら CLIENT_ERROR の嵐になってしまいましたので、このコマンドを使うといいと思います。

実運用上も、Memcached サーバを再起動しないといけないときに dump して別サーバに restore して IP アドレスを付け替える、みたいな使い方ができるかもしれません。

実装していないコマンドも実行できるようにしました。

call <command> [<arguments>...] という形式で、任意のコマンドを直接 Memcached サーバに投げれるようにしました。

これで、まだ実装していない stats connsslabs reassign <src class> <dest class> のようなコマンドも実行できます。

memcached-tool の sizes コマンドも実装していませんが、 call stats sizes で OK です。

今後 memcached に新しいコマンドが追加されてもなんとかなりそうです。

終りに

memcached 初心者の学習用にも良いかもなー、とも思いました。

もうたぶん、あまりいじることはないと思いますが、何かあれば GitHub のイシューなりでお知らせください。

それでは、Have fun!

*1:本家では修正 PR が出ていますが、まだ取り込まれていません。