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には stats
や settings
と言ったモードがありますがこの辺は以下のようにすれば同じようなことができるので特に移植予定はありません。
% 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の拡張用のライブラリとして利用するために書き始めた背景があります。
ぜひご利用ください。