おそらくはそれさえも平凡な日々

go-memcached-toolを書いていた

はてなエンジニア Advent Calendar 2017の3日目です。 昨日は、id:y_uuki さんによるウェブシステムの運用自律化に向けた構想 - 第3回ウェブサイエンス研究会でした。

さて、memcachedにはmemcached-toolというツールが同梱されています。

https://github.com/memcached/memcached/blob/master/scripts/memcached-tool

これを、今回(実は大分前に書いていたのですが)、Goに移植しました。

https://github.com/Songmu/go-memcached-tool

以下のようにインストール可能ですが、GitHub Releasesにも置いてあります

% go get github.com/Songmu/go-memcached-tool/cmd/go-memcached-tool

memcached-toolは、memcachedの作者であり、今はGoのメインコミッターの一人であるBradfitz氏の書いたPerlスクリプトなのですが、これを僕がGoに移植したというのがちょっと面白ポイントです。

memcached-toolにはいくつか機能がありますが、今回は、よく使われる、memcachedのslabの状態とかをいい感じに表示してくれる display モードと、memcachedのデータをダンプする dump モードを移植しました。

memcachedのslabとは何ぞやとか、memcached-toolの使い方は以下の記事によくまとまっています。

参考: 第2回 memcachedのメモリストレージを理解する:memcachedを知り尽くす

memcached-toolと同様ではありますが、軽く使い方の説明を。

displayモード

memcachedの各slabの状態を良い感じに表示してくれます。

% go-memcached-tool 127.0.0.1:11211
  #  Item_Size  Max_age   Pages   Count   Full?  Evicted Evict_Time OOM
  1      96B  17550349s       1   10922     yes  1121115        0    0
  2     120B  17529950s       3   26214     yes  2693486        0    0
  3     152B  17656340s       2   13793     yes  1262170        0    0
  4     192B  17652024s       2   10917     yes   139583        0    0
  ...

dumpモード

memcachedの内容を書き出すことができます。

% go-memcached-tool 127.0.0.1:11211 dump > memd.dump

以下のようにすれば、あるサーバーのキャッシュをゴソッと別サーバーに移すことができるのが面白いですね。実際にはこんな乱暴なことはしないとは思いますが。

% go-memcached-tool 127.0.0.1:11211 dump | nc cache2.example.com:11211

その他のモード(stats/settings)について

オリジナルのmemcached-toolには statssettings と言ったモードがありますがこの辺は以下のようにすれば同じようなことができるので特に移植予定はありません。

% echo "stats"          | nc 127.0.0.1 11211
% echo "stats settings" | nc 127.0.0.1 11211

ライブラリとして使う

以下のようにライブラリとしても利用可能です。Goでmemcachedをモニタリングするようなツールを書く際に有用でしょう。

import (
    "net"
    "github.com/Songmu/go-memcached-tool"
)
func main() {
    conn, _ := net.Dial("tcp", "127.0.0.1:11211")
    items, err := memdtool.GetSlabStats(conn)
    ...
}

コマンドラインツールを書く時に、その言語のライブラリとしても再利用可能にすることは個人的に心がけている点です。実は、このgo-memcached-tool自体、mackerel-plugin-memcachedの拡張用のライブラリとして利用するために書き始めた背景があります。

ぜひご利用ください。

created at
last modified at
comments powered by Disqus