Quelle est la façon la plus simple de faire un dump de toutes les memcached clés dans un fichier?
C'est à partir d'un seul serveur memcache, avec près de 20M de touches (pas de date d'expiration), et autour de 2G de données.
Quel est le moyen le plus facile pour faire un dump de toutes les paires clé/valeur dans un fichier plat? J'ai d'abord regardé la java net.espion.memcached.MemcachedClient, mais ce client ne prend pas en charge l'obtention de toutes les clés (je pense). Si j'avais une liste de toutes les clés (que je n'ai pas), je pourrais facilement utiliser ce client de se concentrer toutes les valeurs.
Je sais que je peux obtenir toutes les touches à l'aide de quelques commandes telnet (par exemple, telnet localhost 11211; stats éléments; stats cachedump ), mais il n'est pas clair pour moi comment faire pour automatiser cette robuste.
EDIT: Voici ce que j'ai fait pour le faire fonctionner sur un jouet serveur memcache sur ma machine. Il semble fonctionner mais je n'en ai mis deux touches dans memcached, donc j'espère que cette méthode va à l'échelle ok:
commandes shell:
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
script php, basé sur cette:
<?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: Le script ci-dessus ne semble pas rendre tous les mappages. Si j'insère la ligne count($entries)
, il retourne uniquement un peu plus de 50k, même avec le paramètre de limite de jeu à 100M, mais l'exécution de stats items
à partir de telnet affiche plus de 5 millions d'entrées. Personne ne sait à quoi cela peut-il être le cas?
EDIT3: Ce lien suggère que cachedump ne pas obtenir toutes les clés de memcache. J'ai atteint une limite d'environ 50k clés qui sont retournés soit par cachedump, ce script PHP, ou un script perl similaire à celui dans le lien fourni par Zach Bonham. Est-il un moyen de contourner cela?
- Trouvé ceci, qui pourrait être utile: blog.evanweaver.com/2009/04/20/peeping-into-memcached
- Double Possible de obtenir toutes les clés définies dans memcached
Vous devez vous connecter pour publier un commentaire.
avertissement: je ne sais pas ce que je"m, sonnait comme un problème intéressant.
Avez-vous vu cet article? "Comment vider les Touches de Memcache" par Lars Windolf.
De l'article:
De manière efficace, il nécessite une certaine connaissance de la façon dont memcache stocke les données dans la mémoire (que je n'ai pas). Vous avez besoin de trouver chaque 'dalle', alors vous pouvez vider les clés pour que dalle, et puis en fin de compte, les valeurs de ces clés.
Il est un des outils de la section dans l'article qui utilise plusieurs langues pour vider au moins les clés, mais seulement le script perl décharges à la fois des clés et des valeurs.
memccat
Voici le script que j'utilise pour vider tous les objets dans les fichiers correspondants:
Il utilise
memcdump
de commande qui doit faire partie de memcached utils.Pour les objets compressés, voir: Comment faire un dump d'un comprimé objet étant donné la clé de Memcache?
memcdump
Pour vider une liste de clés à partir d'un serveur, utilisez
memcdump
/memdump
outil, par exemplePour imprimer la valeur d'un élément, utilisez
netcat
:De vider tous les objets dans l'écran via
memcdump
/memdump
etnetcat
:memcached-outil
Dans la version récente de
memcached
il est égalementmemcached-tool
de commande, par exempleIl est codée en dur dans la limite de 2 mo pour le vidage de la dalle. À moins que vous réécrivez la do_item_cachedump, vous ne serez pas en mesure d'obtenir toutes les clés.
J'ai utilisé ce script bash
il suffit de remplacer l'IP /port si nécessaire
memcdump
au lieu dememdump
sur votre distribution.Bash
À l'aide de Bash et de les enregistrer dans le fichier:
Connexes: L'écriture d'un Redis client dans le plus pur bash (c'est le Redis, mais très similaire à l'approche)