ElastiCache でのアイテムサイズ

Amazon ElastiCache (インメモリキャッシュ管理・操作サービス) | AWSAWSの提供する memcached 。マネジメントコンソールからポチポチしてるだけで適当に動き出す、設定条件とかあんまり意識しなくても良い。使う EC2側のセキュリティグループの設定とかあるけど。
で、細かい設定を調整しようとしたときに、どうしたら良いか探してマネジメントコンソールをさまよう事になる。(これは僕がある程度マネジメントコンソールが非力じゃなくなってからの AWSユーザだからで、それ以前からやってるような強者はコマンドライン見に行ったり API叩きに行くのかもしれない)。

max_item_size のデフォルトは 1048576 bytes (概ね 1M)。これを増やしたかった。それには Cache Parameter Groups を経由して調整することになる、デフォルトで適用されるグループ「default.memcached1.4」では値をいじれないの注意。新しく作って値を調整、その後そのパラメータグループでキャッシュクラスターを作る。或いはキャッシュクラスターの一覧から Modify のリンクを辿るとパラメータグループの割付も変更できる。max_item_size の場合、その後 Reboot が必要になるんでその辺も。(勿論キャッシュはクリアされる)

キーとか値とか

そんな ElastiCache で、実際に格納されているキーと値を見たかったり。まあなんかクライアント使うか、telnet で見に行けば良いんだけど。

#!/usr/local/bin/ruby
# coding: utf-8
require 'net/telnet'

sess_save = `php -r "echo ini_get('session.save_path');"`
OptsECache = {
  'Host'       => sess_save,
  'Port'       => 11211,
  'Telnetmode' => false,
  'Prompt'     => /^END\n/,
}
ecache = Net::Telnet.new OptsECache
begin # ensure
  if ARGV.size <= 0 then
    ecache.cmd('stats items') \
    .each_line.select{|l| /number/ =~ l} \
    .map{|l| /items:(\d+):number (\d+)/.match(l).values_at(1, 2)} \
    .map do |slab_no, limit|
      ecache.cmd("stats cachedump #{slab_no} #{limit}") \
      .each_line.reject{|l| /END/ =~ l}
    end.flatten.join.display
  else # if ARGV.size <= 0
    ARGV.map{ |key| ecache.cmd "get #{key}" }.join.display
  end # if ARGV.size <= 0
ensure
  ecache.close
end # ensure

そもそも PHP のセッション情報を memcachedストアにしたかったので ElastiCache を使おうとしてるので、PHP自身に ElastiCacheサービスの場所(ノードのエンドポイントの URL)を訊きに行く。引数無しだとキー情報の一覧、引数にキーを渡すと値を返す。