これは、約2,000万のキー(有効期限なし)と約2Gのデータを持つ単一のmemcachedサーバーからのものです。
すべてのキーと値のペアのダンプをフラットファイルに取得する最も簡単な方法は何ですか?最初にJava net.spy.memcached.MemcachedClientを調べましたが、このクライアントはすべてのキーの取得をサポートしていません(私はそう思います)。すべてのキーのリスト( t)、このクライアントを使用してすべての値を簡単に取得できます。
一部のtelnetコマンド(telnet localhost 11211、統計項目、統計cachedumpなど)を使用してすべてのキーを取得できることはわかっていますが、これを確実に自動化する方法はわかりません。
編集:これは私のマシンのおもちゃのmemcachedサーバーでこれを機能させるために私がやったことです。機能しているようですが、memcachedには2つのキーしか配置しないので、うまくいけば、このメソッドで問題なくスケーリングできます。
シェルコマンド:
_Sudo yum install memcached
Sudo /etc/init.d/memcached restart # maybe unnecessary
Sudo yum install php
Sudo yum install php-pecl-memcache
Sudo service httpd reload
_
this に基づくphpスクリプト:
_<?php
$memcache = new Memcache();
$memcache->connect('127.0.0.1', 11211) or die ("Could not connect");
$list = array();
$allSlabs = $memcache->getExtendedStats('slabs');
$items = $memcache->getExtendedStats('items');
foreach($allSlabs as $server => $slabs) {
foreach($slabs AS $slabId => $slabMeta) {
if (!is_int($slabId)) {
continue;
}
$cdump = $memcache->getExtendedStats('cachedump', (int) $slabId, 100000000);
foreach($cdump AS $server => $entries) {
if ($entries) {
foreach($entries AS $eName => $eData) {
print_r($eName);
print_r(":");
$val = $memcache->get($eName);
print_r($val);
print_r("\n");
}
}
}
}
}
?>
_
EDIT2:上記のスクリプトは、すべてのマッピングを返すようには見えません。行count($entries)
を挿入すると、limitパラメータが100Mに設定されていても、50kを少し超えるだけが返されますが、telnetから_stats items
_を実行すると5Mを超えるエントリが表示されます。なぜこれが当てはまるのか誰か知っていますか?
EDIT3:これ link は、cachedumpがmemcachedからすべてのキーを取得しないことを示唆しています。 cachedump、PHPスクリプト、またはZach Bonhamによって提供されたリンクにあるものと同様のPerlスクリプトのいずれかによって返される約50kキーの制限に達しました。回避策はありますか?この?
免責事項:私は何をしているのかわからず、興味深い問題のように聞こえました。
この記事を見ましたか? "Memcacheからキーをダンプする方法" Lars Windolf著。
記事から:
Memcache自体は、データを最大限に活用する手段を提供します。プロトコルは、スラブ(特定のサイズ範囲のデータのカテゴリー)によって編成されたデータにピークを合わせるコマンドを提供します。ただし、いくつかの重要な制限があります。
- ダンプできるのは、スラブクラスごとのキーのみです(コンテンツサイズがほぼ同じキー)。
- ダンプできるのは、スラブクラスごとに1ページ(1 MBのデータ)だけです。
- これは非公式の機能であり、いつでも削除される可能性があります。
効果的には、memcacheがメモリにデータを格納する方法に関する知識が必要です(私は必要ありません)。各「スラブ」を見つける必要があります。次に、そのスラブのキーをダンプし、最終的にはそれらのキーの値をダンプできます。
記事には、少なくともキーをダンプするためにさまざまな言語を使用するツールセクションがありますが、Perlスクリプトのみがキーと値の両方をダンプします。
これが、すべてのオブジェクトを対応するファイルにダンプするために使用しているスクリプトです。
while read -r key; do
[ -f "$key" ] || echo "get $key" | nc localhost 11211 > "$key.dump";
done < <(memcdump --server localhost)
Memcachedユーティリティの一部であるmemcdump
コマンドを使用します。
圧縮オブジェクトについては、以下を参照してください。 指定されたキーの圧縮オブジェクトをMemcacheからダンプする方法
サーバーからキーのリストをダンプするには、memcdump
/memdump
ツールを使用します。
memcdump --servers=localhost | tee my_keys.lst
1つのアイテムの値を出力するには、netcat
を使用します。
echo "get 13456_-cache-some_object" | nc localhost 11211
memcdump
/memdump
およびnetcat
を介してすべてのオブジェクトを画面にダンプするには:
memcdump --servers=localhost | xargs -L1 -I% sh -c 'echo "get %" | nc localhost 11211'
memcached
の最近のバージョンには、memcached-tool
コマンドもあります。
memcached-tool localhost:11211 dump | less # dumps keys and values
スラブのダンプには、ハードコードされた2MBの制限があります。 do_item_cachedumpを書き直さない限り、すべてのキーを取得することはできません。
私はこのbashスクリプトを使用しました
#!/bin/sh
MESSAGE=`memdump --servers="127.0.0.1"`
while read -r line; do
echo $line
VALUE=`echo "get $line" | nc 127.0.0.1 11211`
echo $VALUE
done <<< "$MESSAGE"
必要に応じてIP /ポートを交換するだけ
Bashを使用してファイルに保存する:
exec {memcache}<>/dev/tcp/localhost/11211
printf "stats items\nquit\n" >&${memcache}
cat <&${memcache} > myfile.txt
関連: 純粋なbashでRedisクライアントを書き込む (Redisですが、非常に似たアプローチです)