10 ago

Instalación de Voldemort

Después de explicar una idea general de qué es voldemort, vamos a explicar como realizar la instalación de Voldemort, y montaremos un cluster de 2 nodos. En los siguientes post veremos como ampliarlo a tres nodos.

Preparación del paquete

Si nos vamos a la pagina del proyecto http://www.project-voldemort.com/voldemort/ veremos que la ultima version disponible que nos encontramos en la 1.6, versión muy antigua respecto a la actual, 1.9.12, ¿dónde encontramos esta versión?

https://github.com/voldemort/voldemort.git

Tenemos el código y deberemos compilarlo para poder utilizarlo.

Pues vamos a ello.

En mi caso voy a montar 2 instancias lxc,  lo haremos de la siguiente manera.

Crearemos 2 instancias de lxc, voldemort y voldemort1 (ya que querremos probar el cluster en los siguientes post).

[email protected]:~# lxc-create -t download -n voldemort1 -- --dist ubuntu --release trusty --arch amd64

Arrancamos y nos conectamos a la máquina voldemort

lxc-start -n voldemort1 ; lxc-attach -n voldemort1 

Necesitamos una serie de paquetes para compilar y hacer correr Voldemort.

 sudo apt-get install openjdk-7-jre openjdk-7-jre-headless gradle openjdk-7-jdk git 

Bajamos el codigo de github

 git clone https://github.com/voldemort/voldemort.git cd voldemort 

Compilamos

 ./gradlew clean jar 

Esperamos y nos quedamos con los siguientes directorios.

dist/*.jar
lib/*.jar
contrib/*/lib/*.jar
contrib/*/lib/*.jar
src/java/log4j.properties
config/ bin/

Ya tenemos el paquete montado.

Configuración de Voldemort 

Vamos a ver los ficheros importantes

Cluster.xml – Fichero que debe ser igual en todos los nodos del cluster  y tendrá la información sobre puertos, hostnames, el nombre del cluster y por supuesto las particiones (explicadas en el post), donde definiremos como vamos a repartir los datos por nuestro cluster, debemos recordad que las particiones son estáticas en numero o sea que deberemos pensar bien cuantas seleccionamos.

Stores.xml  – Aquí nos encontraremos la definición de las tablas, así como todos parámetros para las mismas, por ejemplo el número de lecturas y escrituras que tiene que ir bien para dar el dato como bueno, o el tipo de replicación que tendremos por store.

Server.properties – Contiene los parámetros de optimización para cada nodo en particular, por ejemplo el id del nodo (único para todos nodos del cluster), este es un fichero diferente para cada nodo.

Entonces, deberemos tocar en ambos nodos el fichero cluster.xml, podemos poner algo así.

 

<cluster>
 <name>Test</name>
 <server>
 <id>0</id>
 <host>node1</host>
 <http-port>8081</http-port>
 <socket-port>6666</socket-port>
 <partitions>0, 2, 4</partitions>
 </server>
 <server>
 <id>1</id>
 <host>node2</host>
 <http-port>8081</http-port>
 <socket-port>6666</socket-port>
 <partitions>1, 3, 5</partitions>
 </server>
</cluster>

Definimos el hostname de los servidores, los puertos y las particiones, elegí 5 particiones ya que como sabemos son estáticas y tengo pensado añadir un nuevo nodo, con lo que deberemos rehacer la reasignación.

Arrancamos…  La última linea debe ser algo así,

[10:27:01,032 voldemort.server.VoldemortServer] INFO Startup completed in 566 ms. [main]

Si nos fijamos en el log de salida, la verdad es que no nos da mucha información de si el cluster esta activo o no, nuestro gran amigo para interactuar con el cluster es vadmin (lo encontramos en la carpeta /bin)

Podemos lanzar algo así.

bin/vadmin.sh meta check-version --url tcp://10.2.11.201:6666
Node : 0 Version : version() ts:1438175142424
Node : 1 Version : version() ts:1438175142424
All the nodes have the same metadata versions.
avro-example=0
stores.xml=0
cluster.xml=0
test=0

Parece que tenemos un cluster de voldemort!

Creación de Stores

Ahora que tenemos el cluster montado debemos crear algún store, podemos utilizar algunos de los xml que vienen de prueba en el paquete de instalación.

<store>
 <name>Primer_Store</name>
 <persistence>bdb</persistence>
 <description>Test store</description>
 <owners>[email protected], [email protected]</owners>
 <routing-strategy>consistent-routing</routing-strategy>
 <routing>client</routing>
 <replication-factor>1</replication-factor>
 <required-reads>1</required-reads>
 <required-writes>1</required-writes>
 <key-serializer>
 <type>string</type>
 </key-serializer>
 <value-serializer>
 <type>string</type>
 </value-serializer>
 <hinted-handoff-strategy>consistent-handoff</hinted-handoff-strategy>
</store>

Deberemos fijarnos en los siguientes campos.

routing-strategy: Definimos el tipo de estrategia para grabar los datos, en el caso que nuestro cluster no tenga zonas utilizaremos consisten-routing.
required-reads: Numero de lecturas necesarias para que la operación se de por buena.
required-writes: Numero de escrituras necesarias para que la operación se de por buena.

Creamos el store.

bin/vadmin.sh store add --file repo_stores/primer_store.xml --url tcp://nodo1:6666

Podemos comprobar en el log algo tal que así

Aug 02 10:57:47 voldemort-server.sh[3563]: [10:57:47,572 voldemort.utils.StoreDefinitionUtils] INFO Validating schema for store: Primera_Store [voldemort-admin-server-t8]Aug 02 voldemort-server.sh[3563]: [10:57:47,595 voldemort.store.metadata.MetadataStore] INFO Updating routing strategy for all stores [voldemort-admin-server-t8]
Aug 02 10:57:47 voldemort-server.sh[3563]: [10:57:47,595 voldemort.server.protocol.admin.AdminServiceRequestHandler] INFO Successfully added new store 'Primera_Store' [voldemort-admin-server-t8]

Por último vamos a realizar una pequeña prueba de stress, para comprobar si es tan rapido como dicen.

./bin/voldemort-performance-tool.sh --record-count 500000
                                    --value-size 10240
                                    --ops-count 1000000
                                    --target-throughput 100
                                    --url tcp://prod:6666
                                    --store-name Primera_Store
                                    -r 90 -m 10

Donde

record-count: Numero de registros insertados
value-size: tamaño de cada registro
target-throughput: Numero de operaciones por segundo.
Y 95% de lecturas.

bootstrapTime=1438673554246 [0/1956]
context=
deploymentPath=/opt/voldemort-1.9.12
localHostName=
sequence=0
storeName=prueba
updateTime=1438673554021
releaseVersion=1.9.18
clusterMetadataVersion=0
max_connections=50
max_total_connections=8
connection_timeout_ms=500
socket_timeout_ms=1500
routing_timeout_ms=1500
client_zone_id=-1
failuredetector_implementation=voldemort.cluster.failuredetector.ThresholdFailureDetector
failuredetector_threshold=95
failuredetector_threshold_count_minimum=30
failuredetector_threshold_interval=300000
failuredetector_threshold_async_recovery_interval=10000
[main]
Running warmup
[warmup] RunTime(ms): 1088442
[warmup] Throughput(ops/sec): 9187.4441
======================= iteration = 0 ======================================
[benchmark] RunTime(ms): 36187
[benchmark] Throughput(ops/sec): 13955.2878
[reads] Operations: 152027
[reads] Average(ms): 0.0179
[reads] Min(ms): 0
[reads] Max(ms): 201
[reads] Median(ms): 0
[reads] 95th(ms): 0
[reads] 99th(ms): 0
[writes] Operations: 251929
[writes] Average(ms): 0.0972
[writes] Min(ms): 0
[writes] Max(ms): 213
[writes] Median(ms): 0
[writes] 95th(ms): 0
[writes] 99th(ms): 1
[transactions] Operations: 50742
[transactions] Average(ms): 0.1662
[transactions] Min(ms): 0
[transactions] Max(ms): 212
[transactions] Median(ms): 0
[transactions] 95th(ms): 1
[transactions] 99th(ms): 2
[deletes] Operations: 50302
[deletes] Average(ms): 0.0149
[deletes] Min(ms): 0
[deletes] Max(ms): 132
[deletes] Median(ms): 0
[deletes] 95th(ms): 0
[deletes] 99th(ms): 0
[09:51:18,948 voldemort.common.service.VoldemortService] INFO Stopping scheduler-service [main]

Esto parece que va, ya tenemos hecha la Instalación de Voldemort con una media de:

0.017ms en lectura

0.09 en escritura

0.014 en borrado

No esta nada mal para las 13900 operaciones por segundo que le lanzamos….

 

Notes

http://www.project-voldemort.com/voldemort/