Montando un cluster Master-Slave de Redis con Docker y ejemplos de uso.

Hay varias imágenes de Redis para bajar del “hub” de Docker, nos quedamos con esta

# docker pull bitnami/redis:latest
latest: Pulling from bitnami/redis
21a7e111de8c: Pull complete 
65e50e28a4a4: Pull complete 
b94a89aafdb1: Pull complete 
7487ef2491c8: Pull complete 
fbabf81a333a: Pull complete 
f532281efb89: Pull complete 
898a96d873bf: Pull complete 
669bbe1b9a26: Pull complete 
Digest: sha256:bb3bfa6031bd1c1532653216f6d5149821b712818008f3864445c80459d6633f
Status: Downloaded newer image for bitnami/redis:latest

La imágen que bajamos mide 113 mbs.

# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
bitnami/redis       latest              3235bef8ad2d        4 weeks ago         113MB

Arrancamos ahora un contenedor con Redis en modo “master”, indicamos la clave de acceso para darle cierta seguridad al cluster.

# docker run --name redis-master \
  -e REDIS_REPLICATION_MODE=master \
  -e REDIS_PASSWORD=masterpassword123 \
  bitnami/redis:latest

 Welcome to the Bitnami redis container
Subscribe to project updates by watching https://github.com/bitnami/bitnami-docker-redis
Submit issues and feature requests at https://github.com/bitnami/bitnami-docker-redis/issues
Send us your feedback at containers@bitnami.com

nami    INFO  Initializing redis
redis   INFO  ==> Validating inputs...
redis   INFO  ==> Configuring replication settings...
redis   INFO  ==> Setting up Redis master...
redis   INFO 
redis   INFO  ########################################################################
redis   INFO   Installation parameters for redis:
redis   INFO     Password: **********
redis   INFO     Replication Mode: master
redis   INFO   (Passwords are not shown for security reasons)
redis   INFO  ########################################################################
redis   INFO 
nami    INFO  redis successfully initialized
INFO  ==> Starting redis... 
31:C 27 Nov 17:23:52.324 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
31:C 27 Nov 17:23:52.324 # Redis version=4.0.2, bits=64, commit=00000000, modified=0, pid=31, just started
31:C 27 Nov 17:23:52.324 # Configuration loaded
                _._                                                  
           _.-``__ ''-._                                             
      _.-``    `.  `_.  ''-._           Redis 4.0.2 (00000000/0) 64 bit
  .-`` .-```.  ```\/    _.,_ ''-._                                   
 (    '      ,       .-`  | `,    )     Running in standalone mode
 |`-._`-...-` __...-.``-._|'` _.-'|     Port: 6379
 |    `-._   `._    /     _.-'    |     PID: 31
  `-._    `-._  `-./  _.-'    _.-'                                   
 |`-._`-._    `-.__.-'    _.-'_.-'|                                  
 |    `-._`-._        _.-'_.-'    |           http://redis.io        
  `-._    `-._`-.__.-'_.-'    _.-'                                   
 |`-._`-._    `-.__.-'    _.-'_.-'|                                  
 |    `-._`-._        _.-'_.-'    |                                  
  `-._    `-._`-.__.-'_.-'    _.-'                                   
      `-._    `-.__.-'    _.-'                                       
          `-._        _.-'                                           
              `-.__.-'                                               

Ahora arrancaremos el nodo “slave” o “esclavo” asociado al nodo “master” o “maestro”.

# docker run --name redis-slave \
  --link redis-master:master \
  -e REDIS_REPLICATION_MODE=slave \
  -e REDIS_MASTER_HOST=172.17.0.2 \
  -e REDIS_MASTER_PORT_NUMBER=6379 \
  -e REDIS_MASTER_PASSWORD=masterpassword123 \
  -e REDIS_PASSWORD=masterpassword123 \
  bitnami/redis:latest

28:S 27 Nov 17:24:01.402 * Ready to accept connections
28:S 27 Nov 17:24:01.402 * Connecting to MASTER 172.17.0.2:6379
28:S 27 Nov 17:24:01.404 * MASTER <-> SLAVE sync started
28:S 27 Nov 17:24:01.404 * Non blocking connect for SYNC fired the event.
28:S 27 Nov 17:24:01.405 * Master replied to PING, replication can continue...
28:S 27 Nov 17:24:01.406 * Partial resynchronization not possible (no cached master)
28:S 27 Nov 17:24:01.407 * Full resync from master: a55e4292580fa84c04640fce730c5a9ee8800888:0
28:S 27 Nov 17:24:01.454 * MASTER <-> SLAVE sync: receiving 175 bytes from master
28:S 27 Nov 17:24:01.454 * MASTER <-> SLAVE sync: Flushing old data
28:S 27 Nov 17:24:01.454 * MASTER <-> SLAVE sync: Loading DB in memory
28:S 27 Nov 17:24:01.454 * MASTER <-> SLAVE sync: Finished with success
28:S 27 Nov 17:24:01.455 * Background append only file rewriting started by pid 38
28:S 27 Nov 17:24:01.478 * AOF rewrite child asks to stop sending diffs.
38:C 27 Nov 17:24:01.478 * Parent agreed to stop sending diffs. Finalizing AOF...
38:C 27 Nov 17:24:01.478 * Concatenating 0.00 MB of AOF diff received from parent.
38:C 27 Nov 17:24:01.478 * SYNC append only file rewrite performed
38:C 27 Nov 17:24:01.479 * AOF rewrite: 0 MB of memory used by copy-on-write
28:S 27 Nov 17:24:01.504 * Background AOF rewrite terminated with success
28:S 27 Nov 17:24:01.504 * Residual parent diff successfully flushed to the rewritten AOF (0.00 MB)
28:S 27 Nov 17:24:01.504 * Background AOF rewrite finished successfully

Nos conectamos ahora con el cliente al nodo Master para probar la persistencia.

# redis-cli -h 172.17.0.2 -a masterpassword123 
172.17.0.2:6379> set aa 1
OK
172.17.0.2:6379> set bb 2
OK
172.17.0.2:6379> get aa
"1"
172.17.0.2:6379> get bb
"2"
172.17.0.2:6379> ping
PONG
172.17.0.2:6379> quit

Pedimos estadísticas de uso del Nodo.

# redis-cli -h 172.17.0.2 -a masterpassword123 --stat
------- data ------ --------------------- load -------------------- - child -
keys       mem      clients blocked requests            connections          
2          828.77K  2       0       22 (+0)             6           
2          828.77K  2       0       23 (+1)             6           
2          828.77K  2       0       24 (+1)             6           
2          828.77K  2       0       25 (+1)             6           
2          828.77K  2       0       26 (+1)             6           
2          828.77K  2       0       27 (+1)             6           
2          828.77K  2       0       28 (+1)             6           
2          828.77K  2       0       29 (+1)             6           
2          828.77K  2       0       30 (+1)             6           
2          828.77K  2       0       31 (+1)             6    

Con este comando, podemos ver todas las unidades de información almacenadas.

# redis-cli -h 172.17.0.2 -a masterpassword123 --scan
bb
aa

Ahora podemos buscar algunas mediante un texto (* es algo), en este caso, objetos que contengan en su nombre la letra “a”.

# redis-cli -h 172.17.0.2 -a masterpassword123 --scan --pattern '*a*'
aa

Podemos activar un monitor, donde veremos en pantalla todos los comandos que llegan al Nodo.

# redis-cli -h 172.17.0.2 -a masterpassword123 monitor
OK
1511798824.960750 [0 172.17.0.1:41126] "set" "zz" "999"
1511798829.839087 [0 172.17.0.1:41126] "get" "zz"

Verificación de latencia, mediante esta herramienta.

# redis-cli -h 172.17.0.2 -a masterpassword123 --latency-dist
---------------------------------------------
. - * #          .01 .125 .25 .5 milliseconds
1,2,3,...,9      from 1 to 9     milliseconds
A,B,C,D,E        10,20,30,40,50  milliseconds
F,G,H,I,J        .1,.2,.3,.4,.5       seconds
K,L,M,N,O,P,Q,?  1,2,4,8,16,30,60,>60 seconds
From 0 to 100%:                    
---------------------------------------------
.-*#123456789ABCDEFGHIJKLMNOPQ?
.-*#123456789ABCDEFGHIJKLMNOPQ?
.-*#123456789ABCDEFGHIJKLMNOPQ?
.-*#123456789ABCDEFGHIJKLMNOPQ?
.-*#123456789ABCDEFGHIJKLMNOPQ?

Ahora hacemos un testeo Least Recently Used (LRU).

# redis-cli -h 172.17.0.2 -a masterpassword123 --lru-test 1000
208750 Gets/sec | Hits: 208171 (99.72%) | Misses: 579 (0.28%)
228000 Gets/sec | Hits: 227966 (99.99%) | Misses: 34 (0.01%)
243250 Gets/sec | Hits: 243234 (99.99%) | Misses: 16 (0.01%)
216000 Gets/sec | Hits: 215990 (100.00%) | Misses: 10 (0.00%)
234750 Gets/sec | Hits: 234740 (100.00%) | Misses: 10 (0.00%)
233750 Gets/sec | Hits: 233741 (100.00%) | Misses: 9 (0.00%)
219250 Gets/sec | Hits: 219248 (100.00%) | Misses: 2 (0.00%)

Se puede pedir el estado del cluster desde la línea de comando. Nos dirá si es un Master o un Slave.

# redis-cli -h 172.17.0.3 -a masterpassword123 info replication

Es posible conectarnos a un nodo y cambiar el modo (master o slave) En este caso nos conectamos al nodo 2 y le decimos que pasará a ser “slave de” el nodo Master.

# redis-cli -h 172.17.0.3 -a masterpassword123 
172.17.0.3:6379> slaveof 172.17.0.2 6379 
OK
172.17.0.3:6379> info replication
# Replication
role:slave
master_host:172.17.0.2
master_port:6379
master_link_status:up
master_last_io_seconds_ago:2
master_sync_in_progress:0
slave_repl_offset:0
slave_priority:100
slave_read_only:1
connected_slaves:0
master_replid:4e0d9092e2a021cb735473264ee2a2f468528f84
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:0
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:0

Verificaremos que lo que pasa en el primer nodo, se refleja en el slave, pasaremos a distintas sesiones, una conectada a “MASTER” y la otra a “SLAVE”.

MASTER
172.17.0.2:6379> get aa
"88"
SLAVE
172.17.0.3:6379> get aa
"88"
MASTER
172.17.0.2:6379> set aa 99
OK
SLAVE
172.17.0.3:6379> get aa
"99"

Y también verificamos que el nodo “slave” esta en modo lectura.

SLAVE
172.17.0.3:6379> set aa 77
(error) READONLY You can't write against a read only slave.

Para ver todos los objetos definidos en el cluster.

172.17.0.3:6379> KEYS *
1) "aa"
2) "bb"

172.17.0.3:6379> KEYS a?
1) "aa"

172.17.0.3:6379> keys *a*
1) "aa"
172.17.0.3:6379> keys *b*
1) "bb"

Como realizar copias de datos de Redis

# cp /var/lib/redis/dump.rdb /home/dac/redis_backup

Si te interesó el artículo escríbenos a DockerTipsHelp@gmail.com.