ebiznext-riak

43
RIAK ADMINISTRATION & DÉVELOPPEMENT Hayssam Saleh h:ps://www.linkedin.com/in/hayssams @hayssams h:ps://github.com/ebiznext 21 novembre 2012

Upload: ebiznext

Post on 16-Jul-2015

448 views

Category:

Data & Analytics


0 download

TRANSCRIPT

Page 1: EBIZNEXT-RIAK

RIAK  ADMINISTRATION  &  DÉVELOPPEMENT  

Hayssam  Saleh  h:ps://www.linkedin.com/in/hayssams  @hayssams  h:ps://github.com/ebiznext  

21  novembre  2012  

Page 2: EBIZNEXT-RIAK

ADMINISTRATION  SecMon  1/2  

Installa1on  /  Exploita1on  

Page 3: EBIZNEXT-RIAK

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.  

Page 4: EBIZNEXT-RIAK

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  

Page 5: EBIZNEXT-RIAK

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.  

Page 6: EBIZNEXT-RIAK

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.  

Page 7: EBIZNEXT-RIAK

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  

Page 8: EBIZNEXT-RIAK

INSTALLATION  /  EXPLOITATION  

Page 9: EBIZNEXT-RIAK

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  

Page 10: EBIZNEXT-RIAK

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  

[email protected]   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  

Page 11: EBIZNEXT-RIAK

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  

Page 12: EBIZNEXT-RIAK

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  

Page 13: EBIZNEXT-RIAK

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} ]},

 

Page 14: EBIZNEXT-RIAK

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"}]]    

Page 15: EBIZNEXT-RIAK

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  

Page 16: EBIZNEXT-RIAK

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  

Page 17: EBIZNEXT-RIAK

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  

Page 18: EBIZNEXT-RIAK

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  

Page 19: EBIZNEXT-RIAK

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

Page 20: EBIZNEXT-RIAK

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  

Page 21: EBIZNEXT-RIAK

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  

Page 22: EBIZNEXT-RIAK

REJOINDRE  /  QUITTER  UN  CLUSTER  ¢  Planifier  une  entrée  dans  un  cluster  

�  Il  suffit  de  lancer  la  commande  ¢  riak-­‐admin  cluster  join  [email protected]  

�  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  [email protected]  pour  planifier  la  sor1e  du  noeud  �  riak-­‐admin  cluster  force-­‐remove  [email protected]  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  [email protected]  [email protected]  �  riak-­‐admin  cluster  force-­‐replace    [email protected]  [email protected]  �  [email protected]  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  

Page 23: EBIZNEXT-RIAK

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.  

Page 24: EBIZNEXT-RIAK

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  

Page 25: EBIZNEXT-RIAK

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  

Page 26: EBIZNEXT-RIAK

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  

Page 27: EBIZNEXT-RIAK

DÉVELOPPEMENT  

SecMon  2/2  

Page 28: EBIZNEXT-RIAK

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.  

Page 29: EBIZNEXT-RIAK

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  

Page 30: EBIZNEXT-RIAK

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          }  }  

Page 31: EBIZNEXT-RIAK

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.  

Page 32: EBIZNEXT-RIAK

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.    

Page 33: EBIZNEXT-RIAK

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  

 

Page 34: EBIZNEXT-RIAK

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.  

Page 35: EBIZNEXT-RIAK

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  

 

Page 36: EBIZNEXT-RIAK

MAP  REDUCE  :  UN  PRINCIPE  FONCTIONNEL  

Map

Map

Map

Map

Map

Job'request Reduce

Combine

Page 37: EBIZNEXT-RIAK

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  "  }  

Page 38: EBIZNEXT-RIAK

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()  

Page 39: EBIZNEXT-RIAK

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  }  

Page 40: EBIZNEXT-RIAK

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  

Page 41: EBIZNEXT-RIAK

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.  

Page 42: EBIZNEXT-RIAK

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"]]        },        //  ...  }  

Page 43: EBIZNEXT-RIAK

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