EBIZNEXT-RIAK

917 vues

Publié le

Publié dans : Données & analyses
1 commentaire
3 j’aime
Statistiques
Remarques
Aucun téléchargement
Vues
Nombre de vues
917
Sur SlideShare
0
Issues des intégrations
0
Intégrations
43
Actions
Partages
0
Téléchargements
17
Commentaires
1
J’aime
3
Intégrations 0
Aucune incorporation

Aucune remarque pour cette diapositive

EBIZNEXT-RIAK

  1. 1. RIAK  ADMINISTRATION  &   DÉVELOPPEMENT   Hayssam  Saleh   h:ps://www.linkedin.com/in/hayssams   @hayssams   h:ps://github.com/ebiznext   21  novembre  2012  
  2. 2. ADMINISTRATION   SecMon  1/2   Installa1on  /  Exploita1on  
  3. 3. NOSQL  :  THÉORÈME  CAP   ¢  Cohérence  (Consistency)   —  Tous  les  nœuds  du  système  voient  exactement  les  mêmes   données  au  même  moment   ¢  Disponibilité  (Availablity)   —  Garan1e  que  les  requêtes  reçoivent  une  réponse  même  si  un   ou  plusieurs  nœuds  sont  défaillants   ¢  Résistance  au  morcellement  (Par11on  Tolerance)   —  Aucune  panne  autre  qu’une  coupure  réseau  totale  ne  doit   empêcher  le  système  de  répondre.  Idéalement,  le  système   doit  être  en  mesure  de  réconcilier  les  mises  à  jour  une  fois   les  nœuds  à  nouveaux  accessibles  les  uns  des  autres   ¢  Théorème  de  Brewer:   —  Un  système  distribué  ne  peut  garan1r  à  un  instant  donné   que  2  de  ces  3  contraintes.  
  4. 4. LES  QUORUMS   ¢  Qorum   —  Le  nombre  minimum  de  nœuds  qui  doivent  répondre  avec  succès  pour   considérer  que  l’opéra1on  s’est  déroulée  avec  succès   ¢  Permet  de  réconcilier  la  cohérence  et  la  disponibilité.   —  N   ¢  Nombre  de  nœuds  sur  lesquels  les  données  doivent  être  répliquées.   —  R   ¢  Les  R  premiers  nœuds  qui  renvoient  la  valeur  demandée     ¢  R  <  N   —  W     ¢  Nombre  de  nœuds  qui  doivent  répondre  avec  succès  pour  considérer  que  la   créa1on/mise  à  jour  a  été  effectuée  avec  succès   ¢  W  <  N   —  Les  performances  sont  directement  liées  à  l’importance  des  valeurs  R  &   W.   ¢  Cohérence  et  disponibilité   —  Tolérer  un  nœud  défaillant  :  N  =  3,  R  =  W  =  2   —  Tolérer  deux  nœuds  défaillants  :  N  =  5,  R  =  W  =  3  
  5. 5. CONSISTENT  HASHING   ¢  Une  clef  est  sur  160  bits   ¢  La  parMMonnement  est  réalisé   une  fois  pour  toutes  et  devient   DEFINITIF.   ¢  Chaque  par11on  est  gérée  par  un   et  un  seul  vnoeud   ¢  Les  vnoeud  sont  répar1s  sur  les   noeuds  physiques   ¢  L’ajout  ou  le  retrait  d’un  nœud   physique  amène  le  système  à  se   reconfigurer  en  déplaçant  des   vnoeuds  pour  conserver  une   répar11on  uniforme  des   par11ons.   ¢  Nombre  minimum  de  par11ons   doit  être  de  10.   •  3  nœuds  et  64  par11ons   –  22  par11ons  sur  un  nœud  et  21  sur  les  deux  autres.   •  On  ajoute  1  nœud  supplémentaire   –  Le  système  se  reconfigure  pour  avoir  16  par11ons  par  noeud.  
  6. 6. VECTOR  CLOCKS   ¢  Chaque  donnée  est  accompagnée  d’un  iden1fiant  de   nœud  et  d’un  1mestamp   ¢  Quand  deux  clients  mekent  à  jour  la  même  donnée,  on   ob1ent  une  donnée  avec  deux  vector  clocks  dis1ncts.   ¢  La  résolu1on  est  alors  à  l’ini1a1ve  du  client.  
  7. 7. RIAK   ¢  Une  implémenta1on  de  Amazon  Dynamo  avec  en  plus  :   —  La  possibilité  de  lier  les  objets  pour  une  naviga1on   associa1ve   —  Un  moteur  MapReduce  programmable  en  JavaScript  J  ou   Erlang   —  Moteur  de  recherche  en  texte  intégral  compa1ble  avec  la   syntaxe  Apache  SOLR   —  Des  index  secondaires  pour  une  recherche  par  akributs  
  8. 8. INSTALLATION  /  EXPLOITATION  
  9. 9. INSTALLATION  SUR  LINUX   ¢  Installa1on  sur  RHEDL  6   —  wget http://downloads.basho.com.s3-website-us- east-1.amazonaws.com/riak/CURRENT/rhel/6/ riak-1.2.1-1.el6.x86_64.rpm —  sudo rpm -Uvh riak-1.2.1-1.el6.x86_64.rpm ¢  Fichiers  de  configura1on   —  /etc/riak   ¢  app.config   ¢  vm.args  
  10. 10. FICHIER  DE  CONFIGURATION  VM.ARGS   Nom     DescripMon   Valeur  par  défaut   Valeur   ##   Désigne  un  commentaire   name   Nom  logique  du  nœud  dans  le   cluster.  A  renommer   impéra1vement  sur  chaque   machine   riak@127.0.0.1   riak@adresseipdunoeud   setcookie   Riak  est  développé  en  Erlang   qui  s’appuie  sur  un  magic   cookie  pour  autoriser  deux   nœuds  à  communiquer  entre   eux.  Ce  cookie  doit  être   iden1que  sur  tous  les  noeuds   du  cluster   riak   Valeur  secrète  spécifique  à   chaque  cluster  Riak  et   commune  à  tous  les  noeuds   du  cluster   heart   Indique  à  riak  que  le  nœud   doit  être  redémarré  lorsqu’il   ne  répond  plus   Désac1vé   Désac1vé   env  ERL_CRASH_DUMP   Répertoire  de  crash  dump  des   noeuds  RIAK   ./log/erl_crash.dump  
  11. 11. FICHIER  DE  CONFIGURATION  APP.CONFIG   Nom     DescripMon   Valeur  par  défaut   Valeur   ##   Désigne  un  commentaire   ring_crea1on_size   Taille  de  l’anneau.  Ceke  taille   est  défini1ve  et  détermine  le   nombre  de  par11ons  par   nœud  physique.   64   3  nœuds  :  64   5  nœuds  :  128   ring_state_dir   Répertoire  contenant  l’état   de  l’anneau.   ./data/ring   hkp  et  hkps   Liste  d’adresses  IP  et  de  ports   sur  lesquels  la  webmachine   RIAK  répond  aux  requêtes.   [  {"127.0.0.1",  8098  }  ]   [  {"127.0.0.1",  8069  }  ]   Pour  HTTP  [  {"127.0.0.1",   8098  },  {    "monadressip",   8098  }]     Pour  HTTPS  [  {"127.0.0.1",   8069  },  {    "monadressip",   8069  }]     riak_kv/storage_backend   Moteur  de  persistance  à   mekre  en  œuvre.   riak_kv_bitcask_backend   riak_kv_eleveldb_backend   raw_name   Racine  de  l’URL  pour   akeindre  RIAK   riak   riak   mapred_name   Racine  de  l’URL  pour   akeindre  le  service  de   MapReduce  
  12. 12. FICHIER  DE  CONFIGURATION  APP.CONFIG   Nom     DescripMon   Valeur  par  défaut   Valeur   map_js_vm_count   reduce_js_vm_count   hook_js_vm_count   Nombre  d  eJVM  disponible   pour  exécuter  les  services  de   map/reduce  et  hooks  de  pre-­‐ post  commits   8   6   2   js_source_dir   Répertoire  contenant  les   fichiers  JS  à  charger  au   démarrage  des  VM  Javascript   /tmp/js_source   riak_search/enabled   La  recherche  est-­‐elle  ac1vée   {enabled,  false}   {enabled,  true}   eleveldb/data_root   Répertoire  de  données  RIAK   ./data/leveldb   crash_log   Nom  du  fichier  de  crash  log   ./log/crash.log   crash_log_size   Taille  en  octets  du  fichier  de   crash  log  avant  rota1on   10485760  (10Mo)   crash_log_count   Nombre  de  fichiers  de  crash   log  à  conserver   5  
  13. 13. FICHIER  DE  CONFIGURATION  APP.CONFIG   Nom     DescripMon   Valeur  par  défaut   Valeur   inet_dist_listen_min   inet_dist_listen_max   Intervalle  de  ports  sur   lesquels  les  nœuds  RIAK   communiquent  entre  eux   Exemple:   { kernel, [ {inet_dist_listen_min, 10000}, {inet_dist_listen_max, 12999} ]},  
  14. 14. FICHIER  DE  CONFIGURATION  APP.CONFIG   Nom     DescripMon   Valeur  par  défaut   Valeur   riak_control/enabled   La  console  d’administra1on   accessible  sur  l’url  HTTPS  à  la   racine  admin  est-­‐elle   disponible  ?   {enabled,  false}   {enabled,  true}   riak_control/auth   Une  authen1fica1on  est-­‐elle   requise  (valeurs  possibles   userlist  ou  none)   {auth,  userlist}   {auth,  userlist}   riak_control/userlist   Liste  des  u1lisateurs  autorisés   [{"user",  "pass"}]   [{"user1",  "pass2"},   [{"user2",  "pass2"}]]    
  15. 15. FICHIER  DE  CONFIGURATION  APP.CONFIG   Nom     DescripMon   Valeur  par  défaut   Valeur   riak_api/pb_ip   Adresse  IP  sur  laquelle  écoute   RIAK  pour  le  protocole  PCB   127.0.0.1   Monadresseip   riak_api/pb_port   Port  dur  PCB   8087  
  16. 16. PCB  VERSUS  HTTP   ¢  Riak  peut  être  accédé  en  PB  (ProtocolBuffer)ou  en  HTTP   ¢  PB  :  protocole  binaire  très  très  performant   ¢  HTTP  :  protocole  facile  à  mekre  au  point,  à  u1liser  en   développement   ¢  Certains  services  ne  sont  disponibles  qu’en  HTTP     —  SOLR  API   —  index  secondaires   —  Accès  à  certaines  propriétés  des  buckets  
  17. 17. MOTEUR  DE  PERSISTANCE   ¢  Innostore   —  Premier  moteur  RIAK   —  Présente  l’inconvénient  d’être  une  structure  de  données  mutable.  Les  nœuds  sont  réorganisés  au   fur  et  à  mesure  des  écritures  pour  conserver  les  clefs  triées  dans  le  B-­‐tree.   —  Obsolète   ¢  Bitcask   —  Spécifique  à  RIAK   —  Une  lecture  /  écriture  requiert  un  seul  accès  disque   —  Toutes  les  clefs  sont  conservées  en  mémoire   —  Ne  supporte  pas  les  recherches  sur  les  index  secondaires   ¢  LevelDB   —  Même  principe  que  Bitcask  pour  les  écritures   —  Avec  un  cache  mémoire  en  plus   —  Par  contre  plusieurs  accès  peuvent  être  requis  pour  une  lecture   —  Supporte  les  recherches  sur  les  index  secondaires   —  Beaucoup  plus  rapide  qu’Innostore   —  La  taille  du  cache  (propriété  elveldb/cache_size  )  se  calcule  comme  suit  :   ¢  (Free  RAM  /  2)/(nombre  de  par11ons/nombre  de  nœuds  -­‐FailNodes)   —  FailNodes  correspond  au  nombre  de  nœuds  qui  peuvent  échouer   ¢  U1liser   —  Bitcask  pour  une  performance  maximale  et  un  nombre  de  clefs  «  limité  »   —  LevelDB  pourun  nombre  de  clefs  «  infini  »  et/ou  faire  de  la  recherche  indexée  
  18. 18. DIMENSIONNEMENT  LEVELDB   ¢  RAM  disponible     —  U1lisée  par  l’OS  comme  mémoire  tampon  pour  les  accès   disque   ¢  25  à  35%  réservée  à  l’OS  si  disque  SSD   ¢  35  à  50%  réservée  à  l’OS  si  disque  mécaniques   ¢  Sur  un  serveur  avec  16G  de  RAM  et  des  disques  SSD   ¢  16Go  *  (1  –  0.3)  =  11Go   ¢  Mémoire  par  vnode   ¢  Mémoire  levelDB  /  nombre  de  vnodes   ¢  Avec  un  anneau  de  64  par11ons  on  ob1ent     —  11Go  /  64  =  176  Mo  par  vnode  
  19. 19. TUNING  LEVELDB   ¢  Surveiller  la  limite  de  handle  de  fichiers   —  20  /  par11on     —  Pour  un  anneau  de  64  pari11ons  =>  1280  fichiers  ouverts   ¢  Limiter  les  accès  disques  en  désac1vant  noa1me   —  Ajouter  noa1me  dans  /etc/fstab   ¢  Valeurs  recommandées  /etc/sysctl.conf   ¢  net.core.wmem_default=8388608 ¢  net.core.rmem_default=8388608 ¢  net.core.wmem_max=8388608 ¢  net.core.rmem_max=8388608 ¢  net.core.netdev_max_backlog=10000 ¢  net.core.somaxconn=4000 ¢  net.ipv4.tcp_max_syn_backlog=40000 ¢  net.ipv4.tcp_fin_timeout=15 ¢  net.ipv4.tcp_tw_reuse=1
  20. 20. TUNING  LEVELDB   ¢  Block  device  scheduler   —  Modifier  le  fichier  /boot/grub/grub.conf  comme  suit  :   ¢  elevator=noop —  Le  système  de  fichiers  ext4  améliore  l’intégrité  des  données  mais   diminue  les  performances.  Nous  pouvons  nous  passer  du   mécanisme  offert  par  LINUX,  l’intégrité  étant  assurée  par  la   mul1plicité  des  nœuds  RIAK.  Mekre  à  jour  le  système  de  fichier   ext4  avec  les  valeurs  suivantes  :   ¢  barrier=0 ¢  data=writeback ¢  Désac1ver  la  sauvegarde  d’énergie  par  varia1on  de   fréquence  du  processeur   —  cpufreq-­‐selector  –g  performance   ¢  Demander  à  l’OS  de  limiter  au  maximum  le  swap  disque  en   modifiant  dans  /etc/sysctl.conf   —  vm.swappiness=0 —  more  /proc/sys/vm/swappiness    #pour  afficher  sa  valeur  
  21. 21. BACKUP  /  RESTORE   ¢  Backup   —  Arrêter  le  nœud     —  Sauvegarder  le  répertoire  de  données  et  de  configura1on   —  Redémarrer  le  nœud   ¢  Restore   —  Réinstaller  RIAK   —  Restaurer  les  fichiers  de  configura1on  et  de  données   —  Démarrer  le  nœud  et  vérifier  le  bon  fonc1onnement   ¢  riak  ping   ¢  riak-­‐admin  status  
  22. 22. REJOINDRE  /  QUITTER  UN  CLUSTER   ¢  Planifier  une  entrée  dans  un  cluster   —  Il  suffit  de  lancer  la  commande   ¢  riak-­‐admin  cluster  join  riak@192.168.1.21   —  Pour  le  moment,  le  nœud  n’a  pas  encore  rejoint  le  cluster,  il  s’agit  juste  d’une   planifica1on   ¢  Planifier  la  sor1e  d’un  nœud  du  cluster   —  riak-­‐admin  cluster  leave  riak@192.168.1.21  pour  planifier  la  sor1e  du  noeud   —  riak-­‐admin  cluster  force-­‐remove  riak@192.168.1.21  pour  planifier  la  sor1e  d’un   nœud  sans  l’arrêter  «  proprement  »  (des  données  pourront  être  perdues)   ¢  Remplacer  un  nœud  par  un  autre   —  riak-­‐admin  cluster  replace  riak@192.168.1.21  riak@192.168.1.22   —  riak-­‐admin  cluster  force-­‐replace    riak@192.168.1.21  riak@192.168.1.22   —  riak@192.168.1.212  devient  le  nœud  ac1f  et  se  voit  assigner  toutes  les  par11ons     ¢  Pour  afficher  la  liste  des  commandes  planifiées   —  riad-­‐admin  cluster  plan   ¢  Pour  exécuter  les  commandes  planifiées   —  riak-­‐admin  cluster  commit   ¢  Pour  les  «  oublier  »   —  riak-­‐admin  cluster  clear  
  23. 23. RÉGULATION  DE  CHARGE  SUR  LE  CLUSTER  RIAK   ¢  Masterless   —  Tout  nœud  RIAK  est  poten1ellement  adressé  des  clients   ¢  Régula1on  de  charge  avec  HA-­‐PROXY   —  Exemple  de  configura1on  pour  les  listeners  HTTP   ¢  server  riak-­‐1  192.168.0.1:8098  weight  1  maxconn  4096   ¢  server  riak-­‐1  192.168.0.2:8098  weight  1  maxconn  4096   ¢  server  riak-­‐1  192.168.0.3:8098  weight  1  maxconn  4096   —  Exemple  de  configura1on  pour  les  listeners  PBC   ¢  server  riak-­‐1  192.168.0.1:8097  weight  1  maxconn  4096   ¢  server  riak-­‐1  192.168.0.2:8097  weight  1  maxconn  4096   ¢  server  riak-­‐1  192.168.0.3:8097  weight  1  maxconn  4096   ¢  Eviter  que  le  régulateur  de  charge  ne  devienne  un  SPOF   —  HA-­‐PROXY  est  installé  et  configuré  sur  chaque  instance  hébergeant  un   serveur  d’applica1on.  
  24. 24. MONITORING  DE  RIAK   ¢  RIAK  peut  être  monitoré  à  l’URL  /stats   —  curl  hkp://monadressip:8098/stats  |  pre‡fy_json   ¢  Format  JSON   —  Riak-­‐admin  status   ¢  Format  Erlang   ¢  L’indicateur  le  plus  important  à  suivre  est  le  temps  mis  par  une  requête  Riak  dans  les  60  dernières   secondes   —  node_get/put_fsm_time_95 —  node_get/put_fsm_time_99 —  node_get/put_fsm_time_100 —  node_get/put_fsm_time ¢  Interpréta1on   —  Les  percen1les  permekent  de  détecter  le  nombre  de  requêtes  affectées  par  des  problèmes  temporaires  de   performance   ¢  Monitorer  les  performances  :  Compteurs  FSM_Time   —  Temps  en  microseconds  que  le  code  a  mis  pour  traverser  la  machine  à  états  finis.   ¢  Prévoir  le  dimensionnement  futur  par  le  nombre  de  requêtes  dans  les  60  dernières  secondes  ou   depuis  le  démarrage  du  noeud   —  vnode_gets/puts(_total) ¢  Monitorer  la  taille  des  objets   —  Temps  en  microseconds  que  le  code  a  mis  pour  traverser  la  machine  à  états  finis.   —  node_get_fsm_objsize  
  25. 25. MONITORING  DE  RIAK   ¢ Explosion  des  copies  mul1ples  due  à  des   latences  importantes   —  node_get_fsm_sibling_{95/99/100/mean/median}   ¢ Surveillance  de  la  mémoire   —  Mem_total —  Mem_allocated ¢ Ou1l  de  diagnos1cs   —  Riaknos1c  
  26. 26. RIAKNOSTIC   ¢  Installa1on     —  Récupérer  la  dernière  version  sur  hkps://github.com/basho/ riaknos1c/downloads   —  Copier     ¢  sous  RHEL  dans  le  répertoire    /usr/lib64/riak/lib   ¢  Sous  MacOS    ./libexec/lib   —  Pour  un  bilan  complet     ¢  riak-­‐admin  diag  –level  debug   —  Vérifica1on  de  la  configura1on  disque   ¢  riak-­‐admin  diag  disk   —  Des  crashs  ont-­‐ils  eu  lieu  ?   ¢  riak-­‐admin  diag  dumps   —  Nombre  de  nœuds  connectés  en  ce  moment   ¢  riak-­‐admin  diag  nodes_connected  
  27. 27. DÉVELOPPEMENT   SecMon  2/2  
  28. 28. BUCKETS  /  CLEFS  /  VALEURS   ¢  Clefs  /  Valeurs   —  Riak  est  une  base  clef  /  valeur.   —  C’est  une  map  dont     ¢  les  clefs  sont  des  chaînes  de  caractères  et   ¢  les  valeurs  des  données  arbitraires.   ¢  Buckets   —  Les  couples  clefs  /  valeurs  sont  stockés  dans  des  buckets.   —  Un  bucket  permet  de  regrouper  un  sous-­‐ensemble  de  clefs/valeurs   —  Aken1on  :  Un  bucket  n’existe  pas  physiquement,  c’est  juste  une   commodité.  En  fait  le  nom  du  bucket  est  juxtaposé  au  nom  de  la  clef   pour  cons1tuer  une  clef  unique  dans  le  système.   —  Par  contre  certaines  propriétés  comme  les  règles  de  réplica1on  sont   posi1onnées  au  niveau  des  données.  
  29. 29. CRUD  RIAK  VIA  HTTP   ¢  Créer  un  objet  c’est  créer  une  couple  clef/valeur  dans  un  bucket  avec  le  protocole  PUT   —  curl  -­‐v  -­‐XPUT  -­‐d  'value'  hkp://riakIP:riakPort/riak/monbucket/maclef   ¢  Récupérer  la  valeur  d’une  clef   —  curl  -­‐v  hkp:///riakIP:riakPort/riak/monbucket/maclef   ¢  Modifier  la  valeur  associée  à  une  clef   —  Iden1que  à  la  créa1on,  si  la  clef  existe  déjà  elle  est  remplacée.   —  curl  -­‐v  -­‐XPUT  -­‐d  'value'  hkp://riakIP:riakPort/riak/monbucket/maclef   ¢  Supprimer  une  clef   —  curl  -­‐v  -­‐X  DELETE  hkp://riakIP:riakPort/riak/monbucket/maclef   ¢  Lister  tous  les  buckets  du  cluster   —  curl  -­‐v  hkp:///riakIP:riakPort/riak/buckets?buckets=true   ¢  Lister  toutes  les  clefs  d’un  bucket   —  curl  –v  hkp://riakHost:riakPort/buckets/monbucket/keys?keys=true   —  curl  –v  hkp://riakHost:riakPort/buckets/monbucket/keys?keys=stream   ¢  U1liser  stream  lorsque  le  nombre  de  clefs  est  trop  important.  Riak  renvoie  alors  les  clefs  au  fur  et  à  mesure   de  leur  récupéra1on   —  Ne  jamais  effectuer  cet  appel  en  produc1on  
  30. 30. PROPRIÉTÉS  D’UN  BUCKET   ¢  Ces  propriétés  sont  partagées  par  toutes  les  clefs/valeurs  du   bucket.   —  curl  –v  hkp://riakHost:riakPort/buckets/monbucket/props   {          "props":  {                  "name":  ”monbucket",                  "allow_mult":  false,                  "basic_quorum":  false,                  "big_vclock":  50,                  "chash_keyfun":  {                          "mod":  "riak_core_u1l",                          "fun":  "chash_std_keyfun"                  },                  "dw":  "quorum",                  "last_write_wins":  false,                  "linkfun":  {                          "mod":  "riak_kv_wm_link_walker",                          "fun":  "mapreduce_linkfun"                  },                  "n_val":  3,                  "no‹ound_ok":  true,                  "old_vclock":  86400,                  "postcommit":  [],                  "pr":  0,                  "precommit":  [],                  "pw":  0,                  "r":  "quorum",                  "rw":  "quorum",                  "small_vclock":  50,                  "w":  "quorum",                  "young_vclock":  20          }   }  
  31. 31. PROPRIÉTÉS  D’UN  BUCKET   Propriété   Valeur   DescripMon   n_val   Valeur  en1ère  posi1ve   Nombre  de  replicas  à  créer  pour  les  objets  de  ce  bucket   allow_mult   Booléen   Des  copies  peuvent-­‐elles  cohabiter  ?   Autrement  dit  lorsque  deux  u1lisateurs  tentent  d’écrire  en  même  temps  la  même  la  donnée,  le  système   crée-­‐t-­‐il  des  doublons  ?   Par  défaut  ceke  valeur  est  à  false   last_write_wins   Booléen   La  dernière  valeur  écrase  la  précédente.  Si  ceke  propriété  est  à  true  alors  allow_mult  doit  être  à  false  et   vice  versa.   Par  défaut  ceke  valeur  est  à  false   precommit   postcommit   r   all/quorum/one  ou  une   valeur  en1ère  <  n_val   nombre  de  nœuds  qui  doivent  répondre  posi1vement  à  une  lecture  pour  considérer  que  la  lecture  a   réussi   all  -­‐>  tous  les  noeuds  doivent  répondre   quorum  -­‐>  plus  de  la  moi1é  des  nœuds  (n_val/2)+1.  Valeur  par  défaut   one  -­‐>  1   w   all/quorum/one  ou  une   valeur  en1ère  <  n_val   nombre  de  nœuds  qui  doivent  répondre  posi1vement  à  une  écriture  pour  considérer  que  l’écriture  a   réussi   rw   all/quorum/one  ou  une   valeur  en1ère  <  n_val   nombre  de  nœuds  qui  doivent  répondre  posi1vement  à  une  suppression  pour  considérer  que  la   suppression  a  réussi  (suppression  =  read  suivi  de  write)   dw   all/quorum/one  ou  une   valeur  en1ère  <  n_val   Nombre  d’écriture  effec1ve  sur  disque  (post  flush  Riak  plus  précisément).     pr,pw   all/quorum/one  ou  une   valeur  en1ère  <  n_val   Similaire  à  r,w  mis  à  part  que  l’on  exige  que  la  confirma1on  provienne  de  nœuds  primaires.  
  32. 32. PROPRIÉTÉS  D’UN  BUCKET   Propriété   Valeur   DescripMon   backend   String   Nom  du  backend  pour  ce  bucket.   precommit   Tableau  de  fonc1ons   Liste  de  fonc1ons  JavaScript/Erlang  à  exécuter  avant  de  valdier  l’écriture  (créa1on  /  mise  à  jour  /   suppression.   Le  type  d’opéra1on  est  présent  dans  les  metadata  de  l’objet  passé  en  paramètre   Renvoie  l’objet  modifié  ou  une  erreur  qui  empêche  alors  l’écriture   postcommit   Tableau  de  fonc1ons   Idem  precommit  mais  survient  après  l’écriture  et  donc  sans  valeur  de  retour.    
  33. 33. VERSION  D’OBJETS   ¢  Une  version  d’objets  est  posi1onnée  par  le  développeur.   ¢  Ceke  no1on  doit  être  mise  en  œuvre  uniquement  si  :   —  Des  mises  à  jour  concurrentes  d’un  même  objet  peuvent  survenir   ¢  Dans  tous  les  autres  cas   —  last_write_wins=true   ¢  Signifie  ne  pas  u1liser  les  vector  clocks   ¢  Le  1mestamp  suffit  a  déterminer  la  version  la  plus  récente.   —  allow_mult=false   ¢  S’appuie  sur  les  vector  clocks  pour  effectuer  la  résolu1on  après  créa1on  des   copies.   ¢  Donc  les  copies  existent  dans  le  système  même  si  en  apparence  elles  sont   présentes.   ¢  Préférer  last_write_wins     —  Ges1on  de  sessions   —  Cache  de  données   —  Inser1on  d’un  volume  important  de  données  
  34. 34. VERSION  D’OBJETS   ¢  Pour  éviter  l’explosion  de  vector-­‐clock,  Riak  va  périodiquement   purger  des  versions  en  fonc1on  des  paramètres  suivants  :   Propriété   Valeur   DescripMon   small_vclock     Nombre   Si  la    liste  de  vclock  est  inférieure  à  ceke  valeur  alors  elle  ne  sera  pas  purgée   big_vclock   Nombre   Si  la  liste  est  supérieure  à  ceke  taille  alors  elle  sera  purgée     young_vlock   old_vclock   Durée  en  secondes     Pour  les  listes  dont  la  taille  est  comprise  entre  small_vclock  et  big_vclock,  les  entrées  sont  évaluées.   Celles  qui  sont  plus  récentes  que  young_vclock  sont  conservées  et  celles  qui  sont  plus  anciennes  que   old_vclock  sont  purgées.   n  si  last_write_wins=true   l  Ce  processus  n’a  pas  lieu   l  Les  Vclock  n’existent  tout  simplement  pas.  
  35. 35. VERSION  D’OBJETS   ¢  Une  version  d’objets  est  posi1onnée  par  le  développeur.   ¢  Ceke  no1on  doit  être  mise  en  œuvre  uniquement  si  :   —  Des  mises  à  jour  concurrentes  d’un  même  objet  peuvent  survenir   ¢  Dans  tous  les  autres  cas   —  last_write_wins=true   ¢  Signifie  ne  pas  u1liser  les  vector  clocks   ¢  Le  1mestamp  suffit  a  déterminer  la  version  la  plus  récente.   —  allow_mult=false   ¢  S’appuie  sur  les  vector  clocks  pour  effectuer  la  résolu1on  après  créa1on  des   copies.   ¢  Donc  les  copies  existent  dans  le  système  même  si  en  apparence  elles  sont   présentes.   ¢  Préférer  last_write_wins     —  Ges1on  de  sessions   —  Cache  de  données  
  36. 36. MAP  REDUCE  :  UN  PRINCIPE  FONCTIONNEL   Map Map Map Map Map Job' request Reduce Combine
  37. 37. MAP  REDUCE   ¢  Exemple  :  Calculer  le  nombre  de  pages  dans  la  catégorie  AUTO  accédées   entre  le  1er  janvier  et  le  7  janvier   {  "categories"  :  [  “Assurance”,”  Auto”,  “Promo1on”  ],      "interac1on"  :  {  "age"  :  -­‐1,              "domain"  :  null,              "name"  :  "INTERACTION_ID",              "path"  :  null,              "value"  :  "4b40•8b-­‐55eb-­‐4319-­‐9745-­‐fccfe2be8f88"          },      "keywords"  :  [    “ASSUR”  ],      "nodePath"  :  "/sites/ACME-­‐SPACE/home/community/publica1ons",      "requestData"  :  {  "accept"  :  "text/html,applica1on/xhtml+xml,applica1on/xml;q=0.9,*/*;q=0.8",              "accept-­‐charset"  :  "ISO-­‐8859-­‐1,u‹-­‐8;q=0.7,*;q=0.3",              "accept-­‐encoding"  :  "gzip,deflate,sdch",              "accept-­‐language"  :  "en-­‐US,en;q=0.8,fr;q=0.6",              "connec1on"  :  "keep-­‐alive",              "cookie"  :  "JSESSIONID=62b7421a-­‐8e85-­‐42aa-­‐a0fd-­‐816c34456502;  INTERACTION_ID=4b40•8b-­‐55eb-­‐4319-­‐9745-­‐fccfe2be8f88",              "host"  :  "127.0.0.1:8080",              "ipAddress"  :  "127.0.0.1",              "referer"  :  "hkp://127.0.0.1:8080/cms/en/sites/ACME-­‐SPACE/home/ac1vi1es/satellites.html",              "user-­‐agent"  :  "Mozilla/5.0  (Macintosh;  Intel  Mac  OS  X  10_8_2)  AppleWebKit/537.11  (KHTML,  like  Gecko)  Chrome/23.0.1271.64  Safari/537.11"          },      "sessionId"  :  "62b7421a-­‐8e85-­‐42aa-­‐a0fd-­‐816c34456502",      "tags"  :  [  “Avantages”  ],      "1me"  :  1353415058212,      "userid"  :  "  guest  "   }  
  38. 38. MAP  /  REDUCE  :  UN  EXEMPLE  CONCRET   ¢  Phase  de  Mapping  :  Un  objet  est  à  retenir  s’il  référence  la  catégorie  Auto   var  doTheMap  =  func1on(value)  {    try  {      var  obj  =  Riak.mapValuesJson(value)[0];      if  (obj.categories.indexOf("Auto")  >  -­‐1  &&              new  Date(2012,0,1).getTime()  >=  obj.1me  &&              new  Date(2012,0,7).getTime()  <=  obj.1me  )        return  [obj];      else        return  [];    }    catch  (error)  {      return  [];    }   }   var  reduceIt  =  func1on(values)  {    return  [values.reduce(func1on(total,  value)  {  return  total  +  1;},  0)];   }   n  Phase  de  Reduce  :  Compter  le  nombre  de  pages   n  Lancer  le  Map/Reduce  sur  le  bucket  des  visites       n  Plusieurs  phases  de  maps  et  de  reduce  peuvent  être  appliquées  successivement     n  riak.add("visites").map(doTheMap1).map(doTheMap2). reduce(reduceIt1). reduce(reduceIt2).run() riak.add("visites").map(doTheMap).reduce(reduceIt).run()  
  39. 39. FILTRES   ¢  Les  performances  de  Riak  sont  très  limités  lorsqu’il  s’agit  de   parcourir  l’ensemble  des  données.   ¢  Il  est  important  de  filtrer  sur  les  clefs  auparavant  dans  la   mesure  du  possible   ¢  Il  est  donc  possible  d’appliquer  un  prédicat  après  une   éventuelle  transforma1on  afin  de  filtrer  les  données  en  entrée   de  l’opéra1on  de  MapReduce   {      "inputs":{            "bucket":”users",            "key_filters":[["ends_with",  ”@assur.fr"],  ["ends_with",  ”@assur.fr"]]      }      //  ...  Suite  du  job  mapreduce   }  
  40. 40. FILTRES   Nom     greater_than   less_than   greater_than_eq   between   neq   eq   set_member   similar_to   Distance  de  Levenshtein   starts_with   ends_witj   and   or   not  
  41. 41. TRANSFORMATIONS   Nom     int_to_string   string_to_int   float_to_string   string_to_float   to_upper   to_lower   tokenize   urldecode   n  La  clef  peut  être  transformée  avant  applicaMon  du  filtre   l  Ces  transforma1ons  sont  ajoutées  en  amont  dans  la  liste  des  filtres.  
  42. 42. EXEMPLES  DE  FILTRE   n  Toutes  les  requêtes  réalisées  par  des  <clients   {      "inputs":{            "bucket":”visites"            "key_filters":[["tokenize",  "-­‐",  1],["eq",  ”client"]]        },        //  ...   }   n  Toutes  les  requêtes  réalisées  dans  la  semaine   {      "inputs":{            "bucket":”visites"            "key_filters":[["tokenize",  "-­‐",  2],  ["between",  "20120101",  "201201307"]]        },        //  ...   }  
  43. 43. POINTS  D’ATTENTION   ¢  Concevoir  de  manière  intelligente  les  clefs   ¢  Filter  /  Filtrer  /  Filtrer   ¢  Eviter  le  data-­‐crunching   —  Erlang  est  bon  pour  le  scaker  /  gather   —  La  JVM  excelle  pour  les  calculs  intensifs   ¢  Pour  des  volumes  de  données  importants   —  Réaliser  les  fonc1ons  de  Map/Reduce  en  Erlang  directement   —  Manque  de  courage  ?   ¢  Mul1plier  les  VM  Javascript   ¢  Préparer  les  données  dans  les  hooks  de  postcommit  

×