地方エンジニアの学習日記

興味ある技術の雑なメモだったりを書いてくブログ。たまに日記とガジェット紹介。

debian × perl × memcached

社内勉強プロジェクトでDebianを触る機会があったのでそのついでに操作に慣れるためにperlmemcachedのセットアップをしたのでメモ。

Debianmemcachedをインストールし、Perlから接続する 名前を良く聞くmemcached http://code.google.com/p/memcached/

Debianにインストールし、Perlから接続してみます。

memcachedのインストール

まず、必須モジュールのインストールを行います。

$ apt-get install libevent-dev

ソースコードを取得し、インストールを実行します。

# cd /usr/local/src
# wget http://memcached.googlecode.com/files/memcached-1.4.3.tar.gz
# tar zxvf memcached-1.4.3.tar.gz
# cd memcached-1.4.3
# make
# make install

Debianはaptでの管理ぐらいが注意点。

memcachedの起動

memcachedを起動してみます。

$ /usr/local/bin/memcached -p 11211 -m 64m

オプションは割と適当で動いて接続できれば良いぐらいであげてます。

ちなみに、-dオプションをつけると、バックグラウンドで実行してくれます。

memcachedの停止

手順は、ps aux | grep memcachedを実行し、プロセス番号を確認。 kill -KILL [調べたプロセス番号]を実行して、停止させる。

以下、コマンドの実行例です。

ps aux | grep memcached

www-data 12393 5.9 6.5 59952 16840 ? Ssl 11:14 0:07 /usr/local/bin/memcached -p 11211 -m 64m -u www-data -d root 12402 0.0 0.3 3048 792 pts/1 R+ 11:16 0:00 grep memcached

kill -KILL 12393

Cache::Memcached::Fastを使用し、Perlから接続

Cache::Memcached::Fastを使用してPerlから接続します。

CPANからモジュールのインストール。

$ perl -MCAPN -e shell
cpan> install Cache::Memcached::Fast

metacpan.org

思ったより何も悩まずにできた。Debianは触るの初めてだけどubuntuでaptはある程度慣れているし設定ファイルなりはFHS準拠なので特にって感じですね。。

ネットワーク周りだったりを弄るとまた違った知見が得られそう。

memcachedのメモ

memcached

今更memcachedのメモ

github.com

お試し用の環境として以下を用意しました。全てコンテナだけで済ませる予定です。

GitHub - ryuichi1208/memcached-test

telnetから使う

接続

$ telnet [ip or host] port

set/get/delete

# set
> set mykey 0 60 7
> myvalue
STORED

# get
> get mykey
VALUE mykey 0 7
myvalue
END

# delete
> delete mykey

# 状態取得
stats
stats items
stats cachedump
stats slabs

statsの表示項目についての概要。

項目 概要
pid プロセスID
uptime memcachedの起動時間(秒)
time 現在時刻のタイムスタンプ
version memcacheのバージョン
curr_items 現在のデータ数
total_items 累計のデータ数
bytes 現在の使用メモリ
curr_connections 現在のコネクション数
total_connections memcacheの起動からの累計コネクション数
connection_structures memcacheが確保したコネクション構造体数
cmd_get GETコマンド発行の累計
cmd_set SETコマンド発行の累計
get_hits リクエストでキーが見つかった数
get_misses リクエストでキーが見つからなかった数
evictions 容量(メモリ)不足でmemcacheから追い出した回数
bytes_read ネットワークから受信したバイト数
bytes_written ネットワークへ送信したバイト数
limit_maxbytes memcacheの最大容量
threads リクエスト当たりに動作するスレッド数

データ置換

replace key1 0 0 6

全削除

> flush_all

memcahced-toolを使ってみる

memcached/memcached-tool at master · memcached/memcached · GitHub

ツール自体はmemcachedリポジトリ配下に置いてあるのでそのまま使える。(perlmemcachedperlで使えるライブラリが必要)

/ # memcached-tool
Usage: memcached-tool <host[:port] | /path/to/socket> [mode]

       memcached-tool 10.0.0.5:11211 display        # shows slabs
       memcached-tool 10.0.0.5:11211                # same.  (default is display)
       memcached-tool 10.0.0.5:11211 stats          # shows general stats
       memcached-tool 10.0.0.5:11211 settings       # shows settings stats
       memcached-tool 10.0.0.5:11211 sizes          # shows sizes stats
       memcached-tool 10.0.0.5:11211 dump [limit]   # dumps keys and values

概要は以下の通り。

command 概要
display スラブの一覧と使用状況の表示
dump データのダンプ
stats memcachedの統計データの表示

多分一番使うのがdumpになりますかね。こちらについての概要

実行結果

add test::key::3::44 0 1596979025 198
my;kO.R1&#(l'#cg1{bmRk@st(=eR['dQ*|;OP!`:HDV\k9|!g[WaRn~~=:MFddRVUzq@1DO@Fgr:Cek8kA*m"S^ks#C6iD223dwz25M>|inx|F'&k-[`wH`(T1}/w=$8mp?_^4!#Xy_\rg5yR)iXxXhJ!puTI'U>0vT\j!B"K6Js(X,$qpur[n]qx/>`hkiyt(jgm
add test::key::14::44 0 1596979014 216
Pl`&!KOub_o<".A,RQgrXj_cHXUm\H$]7l.q*Rt?iH9\!c"t6"/B]hP9/|,Gw@Afi|mtm4A"LG;}!i2:lE<MPbo??U{p5x?jX"'{}'s%h_pH}%8T!aY:ca\UriI0haoA5dml:1"^NSE?AAE,1je`KswhFmTa';j]_Lm`4*0=ZB/&hzIb#W'\s9qaYcRvy^V\XL#JlrP3zbj&[7,q0IN}JQ4W
add test::key::7::46 0 1596979021 140
1EUy.4B.uNM]n[vagDCE8<gYA$zmV>yU|J(E0~)|uID[D3`EZ#r}<mN;^/_HBHmQ7yzhm".YQ('3"K{P9n(;Y_A0_*_LhYh(HO-9FLxX!?~}`n*e}'[vL#$@E)X_B<K}]?}&l9j@SF)6
add test::key::7::44 0 1596979021 77
:'x}C-)]pU2gOES*/Py<~";>7z03@T]I}='Xgp(_uthxhdj2<~\=sf])3\#b00fn$PX(JJ]td@Z4e
add test::key::5::46 0 1596979023 11
=LnMG42l\A9
add test::key::5::44 0 1596979023 49
F$o"E&`ALb]8Kcv<0;SI{[f>>1XNt9olS5+f;xhRN_^Cd&)1N

add ~ ごとに1項目ずつ表示されている。

項目 概要
slab total num データが保存されているスラブの数
chunk total num データが保存されているチャンクの数
slab num スラブ番号
chunk num チャンクの数
key キー値
flags データ保存時の指定フラグ
exptime データの有効期限(unix time)
bytes データのバイト数
data block データ

expireがunix timeなので変換が必要なのを除けば直感的に分かりやすい値で出してくれるので便利。

キー一覧の取得

qiita.com

上記を参考に今回使ってる環境用に修正してみました。

#!/bin/bash -eu

IFS=$'\n'

for host in ${hosts[@]}; do
  for port in ${ports[@]}; do
    keys=()   
    echo "host:${host}:${port}"
    set +e
    items=$((echo 'stats items'; sleep 0.5s;) | telnet ${host} ${port} 2>/dev/null | egrep 'items:[0-9]+:number [0-9]+')
    set -e
    for item in ${items[@]}; do
      items=$(echo $item | perl -pe 's/^STAT items:([0-9]+):.+$/$1/')
      number=$(echo $item | perl -pe 's/^.+ ([0-9]+)$/$1/')
      keys+=($((echo "stats cachedump $items $number"; sleep 0.5s;) | telnet localhost ${port} 2>/dev/null | egrep -v 'END|^Escape.+|^Trying.+|^Connected.+'))
    done

    for key in "${keys[@]+"${keys[@]}"}"; do
      echo $key | perl -pe 's/^ITEM (.+)?/$1/'
    done
  done
done

go プチTips集 (+ vimでコーディングする時)

構造体をフィールド名付きでデバッグ

fmt.Printf("%+v\n", data)

コードの速度計測

benchmarkを使ってればおそらく事足りそう。

qiita.com

テストカバレッジ

go test -coverでカバレッジを取れる。

medium.com

補完が動作しない.

go get -u github.com/nsf/gocode

gocodeで何か起きてる可能性が高く↑を実行すれば治ることが多かった。

with_itemsで環境ごとにループを分けるテクニック

全ての環境でAという操作をしたいがBという操作は特定の環境のみに生成させたい時に使えるテクニック

  tasks:
    - name: Fix modperl config
      lineinfile:
        dest=/tmp/test.txt
        insertafter=EOF
        line={{ item }}
      with_items:
        - 'aaa'
        - 'bbb'
        - 'ccc'
      when:
        ansible_facts['os_family'] == "Debian" and item != 'bbb'

やることはwhenで条件を書くことで目的を達成できる。with_itemsのitemを判定することがポイント

CLIからdevなりprodなりステージングなりのパラメータを与えてwhenで条件判定すればもっと複雑な条件判定も行うことができる。

git cloneで鍵を使い回す話

sshの公開鍵認証では秘密鍵と公開鍵のセットがサーバにあればよくて基本的には使い回しが可能。

例えばサーバAで作った鍵はサーバBへ公開鍵と秘密鍵をコピーすれば使用することが可能。

これを使ってサーバC/サーバDなんかでプライベートリポジトリのgit cloneを自動で行う設定が可能になる。

この時仮に複数ホストのgitサーバがある場合は以下のようにsshのconfigを書くと良い

Host deploy1
  Hostname github.com
  User git
  IdentityFile ~/.ssh/deploy1_key

Host deploy2
  Hostname github.com
  User git
  IdentityFile ~/.ssh/deploy2_key

上記のように~/.ssh/configを書いたらあとはgit cloneのコマンドでhostsを指定するようにすれば良い

$ git clone deploy2:ryuichi1208/plever.git

OpenSSHのリモートサーバへのyes/noを消すならStrictHostKeyChecking noとかしておけば良い。

自動化するならまずは鍵の配布 -> ssh_configの配布 -> clone的な流れを行うだけでうまいこといくはず

docs.ansible.com