web-dev-qa-db-ja.com

すべてのmemcachedキーのダンプをファイルに取得する最も簡単な方法は何ですか?

これは、約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キーの制限に達しました。回避策はありますか?この?

13
jonderry

免責事項:私は何をしているのかわからず、興味深い問題のように聞こえました。

この記事を見ましたか? "Memcacheからキーをダンプする方法" Lars Windolf著。

記事から:

Memcache自体は、データを最大限に活用する手段を提供します。プロトコルは、スラブ(特定のサイズ範囲のデータのカテゴリー)によって編成されたデータにピークを合わせるコマンドを提供します。ただし、いくつかの重要な制限があります。

  • ダンプできるのは、スラブクラスごとのキーのみです(コンテンツサイズがほぼ同じキー)。
  • ダンプできるのは、スラブクラスごとに1ページ(1 MBのデータ)だけです。
  • これは非公式の機能であり、いつでも削除される可能性があります。

効果的には、memcacheがメモリにデータを格納する方法に関する知識が必要です(私は必要ありません)。各「スラブ」を見つける必要があります。次に、そのスラブのキーをダンプし、最終的にはそれらのキーの値をダンプできます。

記事には、少なくともキーをダンプするためにさまざまな言語を使用するツールセクションがありますが、Perlスクリプトのみがキーと値の両方をダンプします。

13
Zach Bonham

memccat

これが、すべてのオブジェクトを対応するファイルにダンプするために使用しているスクリプトです。

while read -r key; do
    [ -f "$key" ] || echo "get $key" | nc localhost 11211 > "$key.dump";
done < <(memcdump --server localhost)

Memcachedユーティリティの一部であるmemcdumpコマンドを使用します。

圧縮オブジェクトについては、以下を参照してください。 指定されたキーの圧縮オブジェクトをMemcacheからダンプする方法

memcdump

サーバーからキーのリストをダンプするには、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-tool

memcachedの最近のバージョンには、memcached-toolコマンドもあります。

memcached-tool localhost:11211 dump | less # dumps keys and values
4
kenorb

スラブのダンプには、ハードコードされた2MBの制限があります。 do_item_cachedumpを書き直さない限り、すべてのキーを取得することはできません。

3
user1871696

私はこの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 /ポートを交換するだけ

2
greenone83

Bash

Bashを使用してファイルに保存する:

exec {memcache}<>/dev/tcp/localhost/11211
printf "stats items\nquit\n" >&${memcache}
cat <&${memcache} > myfile.txt

関連: 純粋なbashでRedisクライアントを書き込む (Redisですが、非常に似たアプローチです)

1
kenorb