SlideShare ist ein Scribd-Unternehmen logo
1 von 43
Downloaden Sie, um offline zu lesen
RIAK	
  ADMINISTRATION	
  &	
  
DÉVELOPPEMENT	
  
Hayssam	
  Saleh	
  
h:ps://www.linkedin.com/in/hayssams	
  
@hayssams	
  
h:ps://github.com/ebiznext	
  
21	
  novembre	
  2012	
  
ADMINISTRATION	
  
SecMon	
  1/2	
  
Installa1on	
  /	
  Exploita1on	
  
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.	
  
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	
  
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.	
  
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.	
  
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	
  
INSTALLATION	
  /	
  EXPLOITATION	
  
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	
  
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	
  
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	
  
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	
  
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}
]},
	
  
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"}]]	
  
	
  
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	
  
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	
  
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	
  
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	
  
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
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	
  
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	
  
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	
  
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.	
  
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	
  
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	
  
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	
  
DÉVELOPPEMENT	
  
SecMon	
  2/2	
  
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.	
  
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	
  
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	
  
	
  	
  	
  	
  }	
  
}	
  
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.	
  
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.	
  	
  
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	
  
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.	
  
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	
  
MAP	
  REDUCE	
  :	
  UN	
  PRINCIPE	
  FONCTIONNEL	
  
Map
Map
Map
Map
Map
Job'
request
Reduce
Combine
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	
  "	
  
}	
  
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()	
  
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	
  
}	
  
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	
  
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.	
  
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"]]	
  
	
  	
  	
  },	
  
	
  	
  	
  //	
  ...	
  
}	
  
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	
  

Weitere ähnliche Inhalte

Was ist angesagt?

Cassandra pour les développeurs java
Cassandra pour les développeurs javaCassandra pour les développeurs java
Cassandra pour les développeurs javaJérémy Sevellec
 
Meetup kafka 21 Novembre 2017
Meetup kafka 21 Novembre 2017Meetup kafka 21 Novembre 2017
Meetup kafka 21 Novembre 2017Saïd Bouras
 
Le futur d'apache cassandra
Le futur d'apache cassandraLe futur d'apache cassandra
Le futur d'apache cassandraDuyhai Doan
 
Apache Cassandra - Concepts et fonctionnalités
Apache Cassandra - Concepts et fonctionnalitésApache Cassandra - Concepts et fonctionnalités
Apache Cassandra - Concepts et fonctionnalitésRomain Hardouin
 
Pourquoi Terraform n'est pas le bon outil pour les déploiements automatisés d...
Pourquoi Terraform n'est pas le bon outil pour les déploiements automatisés d...Pourquoi Terraform n'est pas le bon outil pour les déploiements automatisés d...
Pourquoi Terraform n'est pas le bon outil pour les déploiements automatisés d...Duyhai Doan
 
Kubernetes University, Cap sur l’orchestration Docker
Kubernetes University, Cap sur l’orchestration DockerKubernetes University, Cap sur l’orchestration Docker
Kubernetes University, Cap sur l’orchestration DockerJean-Baptiste Claramonte
 
Spark Streaming
Spark StreamingSpark Streaming
Spark StreamingPALO IT
 
Introduction à Apache Cassandra — IppEvent chez OVH 2017-03-02
Introduction à Apache Cassandra — IppEvent chez OVH 2017-03-02Introduction à Apache Cassandra — IppEvent chez OVH 2017-03-02
Introduction à Apache Cassandra — IppEvent chez OVH 2017-03-02Jérôme Mainaud
 
Apache Kafka, Un système distribué de messagerie hautement performant
Apache Kafka, Un système distribué de messagerie hautement performantApache Kafka, Un système distribué de messagerie hautement performant
Apache Kafka, Un système distribué de messagerie hautement performantALTIC Altic
 
Consolidez vos journaux et vos métriques avec Elastic Beats
Consolidez vos journaux et vos métriques avec Elastic BeatsConsolidez vos journaux et vos métriques avec Elastic Beats
Consolidez vos journaux et vos métriques avec Elastic Beatsgcatt
 
Caching reboot: javax.cache & Ehcache 3
Caching reboot: javax.cache & Ehcache 3Caching reboot: javax.cache & Ehcache 3
Caching reboot: javax.cache & Ehcache 3Louis Jacomet
 
Big Data Paris 2015 - Cassandra chez Chronopost
Big Data Paris 2015 - Cassandra chez ChronopostBig Data Paris 2015 - Cassandra chez Chronopost
Big Data Paris 2015 - Cassandra chez ChronopostAlexander DEJANOVSKI
 
Paris stormusergroup intrudocution
Paris stormusergroup intrudocutionParis stormusergroup intrudocution
Paris stormusergroup intrudocutionParis_Storm_UG
 
Présentation de Apache Zookeeper
Présentation de Apache ZookeeperPrésentation de Apache Zookeeper
Présentation de Apache ZookeeperMichaël Morello
 
Stream processing avec Apache Pulsar
Stream processing avec Apache PulsarStream processing avec Apache Pulsar
Stream processing avec Apache PulsarBruno Bonnin
 
Architecture Big Data open source S.M.A.C.K
Architecture Big Data open source S.M.A.C.KArchitecture Big Data open source S.M.A.C.K
Architecture Big Data open source S.M.A.C.KJulien Anguenot
 
Redis - (nosqlfr meetup #2)
Redis - (nosqlfr meetup #2) Redis - (nosqlfr meetup #2)
Redis - (nosqlfr meetup #2) Frank Denis
 
Introduction à Cassandra
Introduction à CassandraIntroduction à Cassandra
Introduction à CassandraVMware Tanzu
 

Was ist angesagt? (20)

Cassandra pour les développeurs java
Cassandra pour les développeurs javaCassandra pour les développeurs java
Cassandra pour les développeurs java
 
Meetup kafka 21 Novembre 2017
Meetup kafka 21 Novembre 2017Meetup kafka 21 Novembre 2017
Meetup kafka 21 Novembre 2017
 
Le futur d'apache cassandra
Le futur d'apache cassandraLe futur d'apache cassandra
Le futur d'apache cassandra
 
Apache Cassandra - Concepts et fonctionnalités
Apache Cassandra - Concepts et fonctionnalitésApache Cassandra - Concepts et fonctionnalités
Apache Cassandra - Concepts et fonctionnalités
 
Pourquoi Terraform n'est pas le bon outil pour les déploiements automatisés d...
Pourquoi Terraform n'est pas le bon outil pour les déploiements automatisés d...Pourquoi Terraform n'est pas le bon outil pour les déploiements automatisés d...
Pourquoi Terraform n'est pas le bon outil pour les déploiements automatisés d...
 
Kubernetes University, Cap sur l’orchestration Docker
Kubernetes University, Cap sur l’orchestration DockerKubernetes University, Cap sur l’orchestration Docker
Kubernetes University, Cap sur l’orchestration Docker
 
Spark Streaming
Spark StreamingSpark Streaming
Spark Streaming
 
Introduction à Apache Cassandra — IppEvent chez OVH 2017-03-02
Introduction à Apache Cassandra — IppEvent chez OVH 2017-03-02Introduction à Apache Cassandra — IppEvent chez OVH 2017-03-02
Introduction à Apache Cassandra — IppEvent chez OVH 2017-03-02
 
Apache Kafka, Un système distribué de messagerie hautement performant
Apache Kafka, Un système distribué de messagerie hautement performantApache Kafka, Un système distribué de messagerie hautement performant
Apache Kafka, Un système distribué de messagerie hautement performant
 
kubernetes, pourquoi et comment
kubernetes, pourquoi et commentkubernetes, pourquoi et comment
kubernetes, pourquoi et comment
 
Consolidez vos journaux et vos métriques avec Elastic Beats
Consolidez vos journaux et vos métriques avec Elastic BeatsConsolidez vos journaux et vos métriques avec Elastic Beats
Consolidez vos journaux et vos métriques avec Elastic Beats
 
Caching reboot: javax.cache & Ehcache 3
Caching reboot: javax.cache & Ehcache 3Caching reboot: javax.cache & Ehcache 3
Caching reboot: javax.cache & Ehcache 3
 
REX Storm Redis
REX Storm RedisREX Storm Redis
REX Storm Redis
 
Big Data Paris 2015 - Cassandra chez Chronopost
Big Data Paris 2015 - Cassandra chez ChronopostBig Data Paris 2015 - Cassandra chez Chronopost
Big Data Paris 2015 - Cassandra chez Chronopost
 
Paris stormusergroup intrudocution
Paris stormusergroup intrudocutionParis stormusergroup intrudocution
Paris stormusergroup intrudocution
 
Présentation de Apache Zookeeper
Présentation de Apache ZookeeperPrésentation de Apache Zookeeper
Présentation de Apache Zookeeper
 
Stream processing avec Apache Pulsar
Stream processing avec Apache PulsarStream processing avec Apache Pulsar
Stream processing avec Apache Pulsar
 
Architecture Big Data open source S.M.A.C.K
Architecture Big Data open source S.M.A.C.KArchitecture Big Data open source S.M.A.C.K
Architecture Big Data open source S.M.A.C.K
 
Redis - (nosqlfr meetup #2)
Redis - (nosqlfr meetup #2) Redis - (nosqlfr meetup #2)
Redis - (nosqlfr meetup #2)
 
Introduction à Cassandra
Introduction à CassandraIntroduction à Cassandra
Introduction à Cassandra
 

Andere mochten auch

Spark / Mesos Cluster Optimization
Spark / Mesos Cluster OptimizationSpark / Mesos Cluster Optimization
Spark / Mesos Cluster Optimizationebiznext
 
Machine learning
Machine learningMachine learning
Machine learningebiznext
 
Machine Learning - Spark / MLlib
Machine Learning - Spark / MLlibMachine Learning - Spark / MLlib
Machine Learning - Spark / MLlibebiznext
 
Audit your reactive applications
Audit your reactive applicationsAudit your reactive applications
Audit your reactive applicationsOCTO Technology
 
Les secrets de la JVM pour les algos à haute fréquence
Les secrets de la JVM pour les algos à haute fréquenceLes secrets de la JVM pour les algos à haute fréquence
Les secrets de la JVM pour les algos à haute fréquenceOCTO Technology
 
Curriculum vitae jairo
Curriculum vitae  jairoCurriculum vitae  jairo
Curriculum vitae jairoJAIRODONY
 
Microsoft BPOS - Online Services
Microsoft BPOS - Online ServicesMicrosoft BPOS - Online Services
Microsoft BPOS - Online Servicesaisnet it
 
2010 communautes
2010 communautes2010 communautes
2010 communautesEDinstitut
 
De la Ciudad Industrial a la Ciudad Digital
De la Ciudad Industrial a la Ciudad DigitalDe la Ciudad Industrial a la Ciudad Digital
De la Ciudad Industrial a la Ciudad DigitalBiblioteca EPM
 
Aéronews Payerne 2/2012
Aéronews Payerne 2/2012Aéronews Payerne 2/2012
Aéronews Payerne 2/2012aviapic
 
Sonidos Para Ver el Mundo
Sonidos Para Ver el MundoSonidos Para Ver el Mundo
Sonidos Para Ver el MundoBiblioteca EPM
 
Monelle Sylvestre - fr Aug 2016
Monelle Sylvestre - fr Aug 2016Monelle Sylvestre - fr Aug 2016
Monelle Sylvestre - fr Aug 2016Monelle Sylvestre
 
Le secteur du conseil : péril ou renouveau ?
Le secteur du conseil : péril ou renouveau ?Le secteur du conseil : péril ou renouveau ?
Le secteur du conseil : péril ou renouveau ?MBC_master128
 
GEV Conférence sur le BRF à la Fête des Ouches à Morogues
GEV Conférence sur le BRF à la Fête des Ouches à MoroguesGEV Conférence sur le BRF à la Fête des Ouches à Morogues
GEV Conférence sur le BRF à la Fête des Ouches à MoroguesMichel BARBEAU
 
Las 10 Redes Sociales mas importantes
Las 10 Redes Sociales mas importantes Las 10 Redes Sociales mas importantes
Las 10 Redes Sociales mas importantes darygzz17
 
Tema transversal
Tema transversalTema transversal
Tema transversalmario ramos
 
Le SMAT au service des 18-24 ans
Le SMAT au service des 18-24 ansLe SMAT au service des 18-24 ans
Le SMAT au service des 18-24 ansComSanté
 

Andere mochten auch (20)

Spark / Mesos Cluster Optimization
Spark / Mesos Cluster OptimizationSpark / Mesos Cluster Optimization
Spark / Mesos Cluster Optimization
 
Machine learning
Machine learningMachine learning
Machine learning
 
Machine Learning - Spark / MLlib
Machine Learning - Spark / MLlibMachine Learning - Spark / MLlib
Machine Learning - Spark / MLlib
 
Audit your reactive applications
Audit your reactive applicationsAudit your reactive applications
Audit your reactive applications
 
Les secrets de la JVM pour les algos à haute fréquence
Les secrets de la JVM pour les algos à haute fréquenceLes secrets de la JVM pour les algos à haute fréquence
Les secrets de la JVM pour les algos à haute fréquence
 
Big Data Science in Scala
Big Data Science in ScalaBig Data Science in Scala
Big Data Science in Scala
 
Curriculum vitae jairo
Curriculum vitae  jairoCurriculum vitae  jairo
Curriculum vitae jairo
 
Microsoft BPOS - Online Services
Microsoft BPOS - Online ServicesMicrosoft BPOS - Online Services
Microsoft BPOS - Online Services
 
2010 communautes
2010 communautes2010 communautes
2010 communautes
 
Evaluacion web
Evaluacion webEvaluacion web
Evaluacion web
 
De la Ciudad Industrial a la Ciudad Digital
De la Ciudad Industrial a la Ciudad DigitalDe la Ciudad Industrial a la Ciudad Digital
De la Ciudad Industrial a la Ciudad Digital
 
Aéronews Payerne 2/2012
Aéronews Payerne 2/2012Aéronews Payerne 2/2012
Aéronews Payerne 2/2012
 
Sonidos Para Ver el Mundo
Sonidos Para Ver el MundoSonidos Para Ver el Mundo
Sonidos Para Ver el Mundo
 
Monelle Sylvestre - fr Aug 2016
Monelle Sylvestre - fr Aug 2016Monelle Sylvestre - fr Aug 2016
Monelle Sylvestre - fr Aug 2016
 
Le secteur du conseil : péril ou renouveau ?
Le secteur du conseil : péril ou renouveau ?Le secteur du conseil : péril ou renouveau ?
Le secteur du conseil : péril ou renouveau ?
 
GEV Conférence sur le BRF à la Fête des Ouches à Morogues
GEV Conférence sur le BRF à la Fête des Ouches à MoroguesGEV Conférence sur le BRF à la Fête des Ouches à Morogues
GEV Conférence sur le BRF à la Fête des Ouches à Morogues
 
Las 10 Redes Sociales mas importantes
Las 10 Redes Sociales mas importantes Las 10 Redes Sociales mas importantes
Las 10 Redes Sociales mas importantes
 
Tema transversal
Tema transversalTema transversal
Tema transversal
 
Dimensiones
DimensionesDimensiones
Dimensiones
 
Le SMAT au service des 18-24 ans
Le SMAT au service des 18-24 ansLe SMAT au service des 18-24 ans
Le SMAT au service des 18-24 ans
 

Ähnlich wie EBIZNEXT-RIAK

Real Time Meta Events
Real Time Meta EventsReal Time Meta Events
Real Time Meta Eventskerush
 
Cassandra Java Driver : vers Cassandra 1.2 et au-delà
Cassandra Java Driver : vers Cassandra 1.2 et au-delàCassandra Java Driver : vers Cassandra 1.2 et au-delà
Cassandra Java Driver : vers Cassandra 1.2 et au-delàIppon
 
Présentation de WAMP.ws, le protocole pour faire du PUB/SUB et RPC over Webso...
Présentation de WAMP.ws, le protocole pour faire du PUB/SUB et RPC over Webso...Présentation de WAMP.ws, le protocole pour faire du PUB/SUB et RPC over Webso...
Présentation de WAMP.ws, le protocole pour faire du PUB/SUB et RPC over Webso...sametmax
 
06 - creation-playbook-multi-distributions.pdf
06 - creation-playbook-multi-distributions.pdf06 - creation-playbook-multi-distributions.pdf
06 - creation-playbook-multi-distributions.pdfbibouechristian
 
802.1X filaire, un monde idéal illusoire? (Olivier Bilodeau)
802.1X filaire, un monde idéal illusoire? (Olivier Bilodeau)802.1X filaire, un monde idéal illusoire? (Olivier Bilodeau)
802.1X filaire, un monde idéal illusoire? (Olivier Bilodeau)Hackfest Communication
 
Etes vous prêts pour le succes ?
Etes vous prêts pour le succes ?Etes vous prêts pour le succes ?
Etes vous prêts pour le succes ?Steven VAN POECK
 
Performance serveur et apache
Performance serveur et apachePerformance serveur et apache
Performance serveur et apacheafup Paris
 
Apache Storm - Introduction au traitement temps-réel avec Storm
Apache Storm - Introduction au traitement temps-réel avec StormApache Storm - Introduction au traitement temps-réel avec Storm
Apache Storm - Introduction au traitement temps-réel avec StormParis_Storm_UG
 
Chef - Paris BlockCamp - Nov 09
Chef - Paris BlockCamp - Nov 09Chef - Paris BlockCamp - Nov 09
Chef - Paris BlockCamp - Nov 09Olivier Gutknecht
 
configuration vpn-ipsec-routeur
 configuration vpn-ipsec-routeur configuration vpn-ipsec-routeur
configuration vpn-ipsec-routeurJULIOR MIKALA
 
System Center 2012 Configuration Manager R2 : Quoi de neuf ?
System Center 2012 Configuration Manager R2 : Quoi de neuf ?System Center 2012 Configuration Manager R2 : Quoi de neuf ?
System Center 2012 Configuration Manager R2 : Quoi de neuf ?Microsoft Technet France
 
DataStax et Cassandra dans Azure au Microsoft Techdays
DataStax et Cassandra dans Azure au Microsoft TechdaysDataStax et Cassandra dans Azure au Microsoft Techdays
DataStax et Cassandra dans Azure au Microsoft TechdaysVictor Coustenoble
 

Ähnlich wie EBIZNEXT-RIAK (20)

Real Time Meta Events
Real Time Meta EventsReal Time Meta Events
Real Time Meta Events
 
Cassandra Java Driver : vers Cassandra 1.2 et au-delà
Cassandra Java Driver : vers Cassandra 1.2 et au-delàCassandra Java Driver : vers Cassandra 1.2 et au-delà
Cassandra Java Driver : vers Cassandra 1.2 et au-delà
 
Présentation de WAMP.ws, le protocole pour faire du PUB/SUB et RPC over Webso...
Présentation de WAMP.ws, le protocole pour faire du PUB/SUB et RPC over Webso...Présentation de WAMP.ws, le protocole pour faire du PUB/SUB et RPC over Webso...
Présentation de WAMP.ws, le protocole pour faire du PUB/SUB et RPC over Webso...
 
06 - creation-playbook-multi-distributions.pdf
06 - creation-playbook-multi-distributions.pdf06 - creation-playbook-multi-distributions.pdf
06 - creation-playbook-multi-distributions.pdf
 
802.1X filaire, un monde idéal illusoire? (Olivier Bilodeau)
802.1X filaire, un monde idéal illusoire? (Olivier Bilodeau)802.1X filaire, un monde idéal illusoire? (Olivier Bilodeau)
802.1X filaire, un monde idéal illusoire? (Olivier Bilodeau)
 
Netconf et Yang
Netconf et YangNetconf et Yang
Netconf et Yang
 
APACHE TOMCAT
APACHE TOMCATAPACHE TOMCAT
APACHE TOMCAT
 
Rapport projet
Rapport projetRapport projet
Rapport projet
 
Etes vous prêts pour le succes ?
Etes vous prêts pour le succes ?Etes vous prêts pour le succes ?
Etes vous prêts pour le succes ?
 
Performance serveur et apache
Performance serveur et apachePerformance serveur et apache
Performance serveur et apache
 
CCNA 3.pdf
CCNA 3.pdfCCNA 3.pdf
CCNA 3.pdf
 
Cours 8 squid.pdf
Cours 8 squid.pdfCours 8 squid.pdf
Cours 8 squid.pdf
 
Apache Storm - Introduction au traitement temps-réel avec Storm
Apache Storm - Introduction au traitement temps-réel avec StormApache Storm - Introduction au traitement temps-réel avec Storm
Apache Storm - Introduction au traitement temps-réel avec Storm
 
Chef - Paris BlockCamp - Nov 09
Chef - Paris BlockCamp - Nov 09Chef - Paris BlockCamp - Nov 09
Chef - Paris BlockCamp - Nov 09
 
configuration vpn-ipsec-routeur
 configuration vpn-ipsec-routeur configuration vpn-ipsec-routeur
configuration vpn-ipsec-routeur
 
Atmosphere Framework
Atmosphere FrameworkAtmosphere Framework
Atmosphere Framework
 
Services rest & jersey
Services rest & jerseyServices rest & jersey
Services rest & jersey
 
System Center 2012 Configuration Manager R2 : Quoi de neuf ?
System Center 2012 Configuration Manager R2 : Quoi de neuf ?System Center 2012 Configuration Manager R2 : Quoi de neuf ?
System Center 2012 Configuration Manager R2 : Quoi de neuf ?
 
Switching
SwitchingSwitching
Switching
 
DataStax et Cassandra dans Azure au Microsoft Techdays
DataStax et Cassandra dans Azure au Microsoft TechdaysDataStax et Cassandra dans Azure au Microsoft Techdays
DataStax et Cassandra dans Azure au Microsoft Techdays
 

EBIZNEXT-RIAK

  • 1. RIAK  ADMINISTRATION  &   DÉVELOPPEMENT   Hayssam  Saleh   h:ps://www.linkedin.com/in/hayssams   @hayssams   h:ps://github.com/ebiznext   21  novembre  2012  
  • 2. ADMINISTRATION   SecMon  1/2   Installa1on  /  Exploita1on  
  • 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. 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. 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. 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. 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  
  • 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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  
  • 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. 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. 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. 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. 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. 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. 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. 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. MAP  REDUCE  :  UN  PRINCIPE  FONCTIONNEL   Map Map Map Map Map Job' request Reduce Combine
  • 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. 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. 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. 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. 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. 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. 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