16

これは、約 20M のキー (有効期限なし) と約 2G のデータを持つ単一の memcached サーバーからのものです。

すべてのキーと値のペアをフラット ファイルにダンプする最も簡単な方法は何ですか? 最初に Java net.spy.memcached.MemcachedClient を見ましたが、このクライアントはすべてのキーの取得をサポートしていません (私はそう思います)。すべてのキーのリストがあれば (私は持っていません)、このクライアントを使用してすべての値を簡単に取得できます。

いくつかの telnet コマンド (例: telnet localhost 11211; stats items; stats cachedump ) を使用してすべてのキーを取得できることは知っていますが、これを確実に自動化する方法がわかりません。

EDIT:これは、私のマシンのおもちゃの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

これに基づく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 強しか返されませんが、stats itemstelnet から実行すると 5M を超えるエントリが表示されます。なぜこれが当てはまるのか誰にもわかりますか?

EDIT3: このリンクは、cachedump が memcached からすべてのキーを取得しないことを示唆しています。cachedump、この PHP スクリプト、または Zach Bonham が提供するリンクにあるような perl スクリプトのいずれかによって返される約 50,000 個のキーの制限に達しました。これを回避する方法はありますか?

4

5 に答える 5

14

免責事項: 何をしているのかわかりません。興味深い問題のように聞こえました。

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

記事から:

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

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

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

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

于 2012-12-18T21:21:44.967 に答える
3

この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 /ポートを置き換えるだけです

于 2015-01-23T13:59:07.680 に答える