Post on 29-Jan-2018
L’AVENIR DE LAMPInnovation dans la pile
AFUP, Paris, 12 novembre 2009
C’EST GLACHMMP!
C’EST GLACHMMP!S’il vous plait,
utilisez plus de voyelles dans les noms de projets Open Source
ORDRE DU JOUR
D’éléphpants
De canapés
D’engrenages
D’esclaves
De cochons
INTERVENANT
Damien Seguy
Services expert Open Source
Eleveur d’éléphpants
damien.seguy@alterway.fr
ARCHIApproche classique
CACHE LOCAL
Cache local
Redondance
Double travail
Limitation à la capacité localeWeb
Cache
Web
Cache
AVEC MEMCACHE
Cache partagé
Capacité doublée
Partage des résultats
La capacité dépasse les limitations physiques
Web Web
Memcache
PRATIQUE COURANTE
Cache partagé
Capacité extensible
Centralisation des cachesWeb
Memcache
Web Web
MEMCACHE
http://memcached.org/
Un cache géant en mémoire
Une table de hashage extensible
Intégrée dans PHP
EXEMPLE
<?php
$memcache = new Memcache;$memcache->connect('memcache.wan', 11211);
$membre = new Membre_AFUP();$membre->nom = 'Seguy';$membre->prenom = 'Damien';$membre->elephpants = 1009;
$memcache->set( $membre->nom. $membre->prenom, $membre, false, 0);
?>
EXEMPLE
<?php
$memcache = new Memcache;$memcache->connect('memcache.wan', 11211);
$membre = $memcache->get('DamienSeguy');
var_dump($membre);?>
add
get
set
replace
increment
UTILISATION
Reproduction rapide d’objets/ contextes
Résultats de requêtes SQL
Fichiers distants (RSS, etc...)
Stockage de sessions
ARCHIApproche avec cache
STOCKAGE DE BLOB
Memcache == stockage de BLOB
Stockage plus structuré ?
Tableaux de données, multi-dimensionnels
ENTREPÔTS CLÉ/VALEUR
Uniquement des paires clé => valeur
Les lignes deviennent un document
Les tables deviennent des collections
Il n’y a plus de modèle de données
Quelques types : date, entier, chaîne, booléen, list, map
STRUCTURE
{
"_id": "ABBC89DDEBC",
"_rev": "876BBDC",
"type": "blog",
"titre": "Un nouveau paradigme de bases de données",
"contenus": "Un nouveau paradigme de bases de données",
"tags": ["bd", "json", "super"],
"publié": true
}
STRUCTURE
{
"_id": "ABBC89DDEBC",
"_rev": "876BBDC",
"type": "blog",
"titre": "Un nouveau paradigme de bases de données",
"contenus": "Un nouveau paradigme de bases de données",
"tags": ["bd", "json", "super"],
"publié": true
}
Format JSON (comme XML, mais plus simple)
STRUCTURE
{
"_id": "ABBC89DDEBC",
"_rev": "876BBDC",
"type": "blog",
"titre": "Un nouveau paradigme de bases de données",
"contenus": "Un nouveau paradigme de bases de données",
"tags": ["bd", "json", "super"],
"publié": true
}
Format JSON (comme XML, mais plus simple)
Clé primaire pour tous
STRUCTURE
{
"_id": "ABBC89DDEBC",
"_rev": "876BBDC",
"type": "blog",
"titre": "Un nouveau paradigme de bases de données",
"contenus": "Un nouveau paradigme de bases de données",
"tags": ["bd", "json", "super"],
"publié": true
}
Format JSON (comme XML, mais plus simple)
Clé primaire pour tous
Numéro de révision
STRUCTURE
{
"_id": "ABBC89DDEBC",
"_rev": "876BBDC",
"type": "blog",
"titre": "Un nouveau paradigme de bases de données",
"contenus": "Un nouveau paradigme de bases de données",
"tags": ["bd", "json", "super"],
"publié": true
}
Format JSON (comme XML, mais plus simple)
Clé primaire pour tous
Numéro de révision
Booléen
STRUCTURE
{
"_id": "ABBC89DDEBC",
"_rev": "876BBDC",
"type": "blog",
"titre": "Un nouveau paradigme de bases de données",
"contenus": "Un nouveau paradigme de bases de données",
"tags": ["bd", "json", "super"],
"publié": true
}
Format JSON (comme XML, mais plus simple)
Clé primaire pour tous
Numéro de révision
Liste
Booléen
VUES function (doc) {
for(var i in doc.tags)
emit(doc.tags[i], 1);
}
Les vues sont écrites en JavaScript
Possibilités de filtrer, retraiter
Approche map/reduce
Groupages multiples, sous-requêtes...
"bd"
"json"
"super"
VUES function (doc) {
for(var i in doc.tags)
emit(doc.tags[i], 1);
}
Les vues sont écrites en JavaScript
Possibilités de filtrer, retraiter
Approche map/reduce
Groupages multiples, sous-requêtes...
"bd"
"json"
"super"
"bd",1
"json",2
"super",1
function (Key, Values) {
var sum = 0;
for(var i in Values)
sum += Values[i];
return sum;
}
AVANTAGES
Une approche naturelle des documents
Migration naturelle, pas de NULL
Pas de délire avec les jointures
Indexation
Partitionnement, réplication, clustering, fail over, MVCC
API REST en HTTP
LIMITATIONS
Ce n’est pas une base objet
Syndrome de PHP3!
Pas de transactions
Attention aux conflits!
ACTUELLEMENT
Apache’s CouchDB, Cassandra, MongoDB
Utilisés en production par Digg, Facebook.
Amazon simpleDB
ARCHISources de données
CONCEPTION DE SCRIPT
Application de forum
Modèle hiérarchique : entrée >> sortie
modèle adjacent : sortie >> entrée
PHP assume le travail, en ligne avec l’internaute!
ARCHILa transaction Web doit
attendre chaque élément de l’architecture
ARCHIPHP est assez rapide pour
servir le client
ARCHIIl faut exporter
les tâches lourdes
GEARMAN
Anagramme de manager
Un système de distribution de tâches
Trois acteurs :
serveur, gearmand : distribue les tâches
client, gearman : émet les commandes
esclave, worker : effectue les tâches
MiniaturesPDF
Recherche
PDF Miniatures
FONCTIONNEMENT
PHP assure le filtrage des données, l’enregistrement des commandes, la restitution au navigateur
Gearman répartit les tâches entre esclaves
Si la charge augmente, il faut ajouter des esclaves
Spécialisation des serveurs, réorganisation
Découplage des frontaux Web
ARCHIAvec tâches lourdes
Corpus
Map Map Map Map
m1:1,3 m2:2,1 m3:1
m1:4 m2:3 m3:1
Reduce Reduce Reduce
Regroupement
m1:1; m2:2 m2:1 m1:3; m3:1
MAP/REDUCE
Découpage du travail en lots
Traitement du lot : MAP
Concentration des résultats : reduce
Résultat final
Hadoop fait tout sauf map et réduce
UN MODÈLE ROBUSTE
Détection des crash
Relance des tâches de map et reduce
Doublement des tâches lentes
Map et reduce fonctionnent simultanément
Résultats intermédiaires possibles
Addition des capacités de traitement
HADOOP
Fonctions exportables via stdin/out
Hive : HADOPP appliqué aux bases de données
HDFS : cluster de stockage
1 Po de données, triées en 16h15
1 To de données triées en 62 secondes
3800 machines approx.
MAÎTRISE
Personnalisation
Public/ répétition
Tâches de fond
Contexte
Cohérence
Tâches lourdes
QUESTIONS?