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