Panorama des technologies NoSQL compatibles avec Drupal 7 et 6 à fin 2011: objectifs globaux, tâches fonctionnelles, techniques de mise en oeuvre, coûts, bonnes pratiques, compromis, modules disponibles.
Avec une bibliographie.
1. Drupal et le NoSQL
Frédéric G. MARAND OSInet
http://drupal.org/user/27985 http://drupal.org/node/1121720
2. • "Drupal et le NoSQL" de Frédéric G.
MARAND est mis à disposition selon les
termes de la licence Creative Commons
Paternité - Partage à l'Identique 2.0 France.
• Les autorisations au-delà du champ de cette
licence peuvent être obtenues à
mailto:sales@osinet.fr
5. Objectifs : supporter les volumes
• Contenus stables : entités Drupal
• Flux volatils : ordres de grandeur d'écart
• Exemple, pour U utilisateurs
– nodes : n*U
– comments : c*n*U
– user relationships ; r*U²
– activités : a*(n+c*n+r*U+ ...)*U
6. Objectifs : réduire la complexité
• CCK, SQL Field storage : stockage en étoile
– nombreuses jointures
– requêtes coûteuses à exécuter ou à écrire
• Bases documentaires :
– 1 enregistrement = 1 document complet.
– requêtes économiques à exécuter et à écrire
10. Tâche : backup hors site
• C'est AUSSI une tâche de production
• backup_migrate_*
– FTP
– Amazon S3
– NodeSquirrel (wrapper S3)
– Rackspace Cloudfiles
11. Tâche : déport des blocs
• Limitations du cache de blocs
– node_access en D6
• Drupal 7
– le module block n'est plus obligatoire
– mongodb_block
– possibilité d'autres implémentations
12. Tâche : antémémoire
Profusion de solutions D6, convergence en D7
• In-process, local par frontal :
– apc, eaccelerator, xcache, zend
– incohérence entre frontaux
• Pools mémoire réseau : memcached
• Bases NoSQL : mongodb_cache, redis
13. Tâche : stockage des champs
• Field Storage D7 - Inapplicable en CCK
• MongoDB : référence Examiner.com
– http://drupal.org/project/mongodb
• Riak - pas encore d'EFQ
– http://drupal.org/project/riak_field_storage
• ElasticSearch - pas encore d'EFQ
– http://drupal.org/sandbox/damz/1234634
15. Tâche : exclusion mutuelle
• Le "verrouillage" core de lock.inc
– souffre de problèmes à forte charge
– fonctionne en attente active
• Alternative : redis.lock.inc
– attente passive
– utilisation des mutex Redis
16. Tâche : MapReduce
• Distribution de charge liée aux données
stockées sur un cluster
• MongoDB
– Directement utilisable depuis mongodb
– Pas d'habillage Drupal spécifique
• Riak
– Habillage Drupal dans riak_field_storage
17. Tâche : file d'attente (queue)
• Alternatives SQL, dont AdvancedQueue :
http://drupal.org/project/advancedqueue
• MongoDB:
– Référence Examiner.com
– http://drupal.org/project/mongodb
• Redis
– http://drupal.org/project/redis
– Non lié à Resque et autre files basées sur Redis
18. Tâche : recherche
• Core inadapté aux sites professionnels
• Principaux moteurs interfacés
– SOLR SaaS : Acquia Search, Adyax Cloud Search
– Sphinx, Google
• CouchDB : couchdb_node
– stockage automatique des nodes dans le
stockage documentaire
– pas de fonctions de recherche
24. Technique : Drupal 6 CCK
• Core : La plupart des API sont utilisables
– natif ou backports (Queue API)
– nécessité de patches core multiples
• CCK lié à SQL, pas de field storage NoSQL
– hooks pre-load / post-save
– patches intrusifs ou non, conséquences
– Exemple : Freerice → > 8E9 enregistrements
28. Coût : développement
• Limites du support contrib
– Volume de développement
• Limites de la communauté
– Rareté de la ressource
– Coût des spécialistes
• Nécessité du test unitaire/intégral
29. Coûts : formation
• Corollaire du coût de développement
– pénurie de la ressource "développeur"
– risque technologique
• Investissement ou charge ?
– réduction du coût de développement
– réduction du TCO
– récurrence : turnover, technologie
33. BCP (MongoDB) : modélisation 1
• Ne pas chercher à simuler SQL JOIN
– requêtes multiples avec A/R code
– Field Storage : stockage entité cf index couvrant
• Le document comme cache
– données pour la partie "recherche" du find()
– données additionnelles dans un cache interne
– logique côté client pour scaling horizontal
– penser aux multikeys
34. BCP (MongoDB) : modélisation 2
• Concevoir les documents pour l'indexation
– "1 index par requête" vs "économiser les index"
• 40 index maximum par collection
• MongoDB modifié pour supporter FieldStorage
– Utiliser des index couvrants
• Conformité : penser à l'"après"
– préserver l'accès après la vie de l'application
– la seconde vie du cache interne
– Exemple : craigslist
35. BCP (MongoDB) : Réalisation
• La requête la plus rapide est celle qu'on
n'exécute pas !
• Cache != DB : savoir choisir
• Typage vs pratique PHP/Drupal/MySQL
• Tests en vraie grandeur durant le
développement
– volume
– charge
36. BCP : Production
• Instrumentation : de l'alerte à la réparation
– Alertes et réactions: Monit, Nagios
– Mesure en continu
• Surveillance individuelle : Munin, Cacti,
• Synthèse : Ganglia
– Logs serveur : activer ET utiliser
• Tolérance aux pannes et à la charge
– Réplication ET sauvegardes, deux besoins
38. Compromis : flexibilité schéma
• Schéma relationnel
– flexibilité illimitée
– méthodes de design reconnues et éprouvées
• Document storage (MongoDB)
– pas de schéma par "table" (collection)
– à grande liberté, grandes responsabilités
– pas d'outils pratiques comme PMA, Workbench
39. Compromis : durabilité
• Relationnel :
– évolutivité illimitée
– accessibilité hors application limitée
– encore plus limitée dans Drupal sans FK
• Document (MongoDB)
– évolutivité en production difficile
– accessibilité hors application PEUT être facile :
auto-contenus
40. Compromis : CAP
• Théorème de Brewer (CAP theorem) :
« it is impossible for a distributed computer system to
simultaneously provide all three of the following guarantees:
Consistency, Availability, Partition tolerance »
• Bases SQL : potentiel ACID
– Pas systématique (MyISAM)
• MongoDB, bases K/V : "BASE"
– Basically Available, Soft state, Eventually
consistent
41. Compromis : sharding
• Drupal : pas de sharding applicatif intégré
• Exemple avec MongoDB
http://www.mongodb.org/display/DOCS/Sharding+Introduction
42. Compromis : répliques et clusters
• MySQL
– par défaut : réplication master/slave
• Pressflow 6, core 7
• Utilisation réelle : limites core 6/7
– MySQL cluster
• MongoDB
– master/slave dans le module
– replicaSet dans MongoDB ≥ 1.6
43. Compromis : support
• MySQL = Oracle, membres ODBA, SkySQL
• NoSQL :
– Communautaire : valeur et limitations
– Professionnel
• CouchDB : Couchbase, Cloudant
• MongoDB : 10Gen
• Redis : vmWare
• Ryak : Ryak
44. Compromis : licences
Logiciel Licence par défaut
Drupal et contributions drupal.org GPL 2.0 et suivantes
MongoDB - serveur AGPL 3.0
MongoDB - clients Apache 2.0
MongoDB - documentation Creative Commons
Redis BSD 3 clause
CouchDB Apache 2.0
Riak Apache 2.0
Tokyo Tyrant / Tokyo Tycoon LGPL 2.1
●
Etes-vous concerné ?
●
Agir en conséquence