Esta pagina se ve mejor con JavaScript habilitado

Redis Master-Slave en FreeBSD

 ·  🎃 kr0m

En un artículo anterior ya explicamos como montar un Master-Slave de Redis bajo Linux, en esta ocasión lo haremos bajo FreeBSD, conceptualmente los pasos son los mismos tan solo cambian algunos detalles en cuanto a la instalación y la localización del fichero de configuración.

A modo de prueba montaré dos Jails sobre Iocage donde instalaré todo lo necesario, digo a modo de prueba porque deberíamos de montar el Master y el Slave en servidores físicos distintos e incluso si fuese posible en redes o data centers distintos para incrementar así la robustez del sistema en caso de problemas.

MightyMax # ~> iocage list
+-----+---------+-------+--------------+---------------+  
| JID |  NAME   | STATE |   RELEASE    |      IP4      |  
+=====+=========+=======+==============+===============+  
| 14  | redis00 | up    | 12.2-RELEASE | 192.168.69.55 |  
+-----+---------+-------+--------------+---------------+  
| 12  | redis01 | up    | 12.2-RELEASE | 192.168.69.56 |  
+-----+---------+-------+--------------+---------------+

Instalamos Redis en los dos servidores:

pkg install redis

Bindeamos el servicio a todas las ips:

sed -i -e ’s/bind\ 127.0.0.1/bind\ 0.0.0.0/g’ /usr/local/etc/redis.conf

Habilitamos la autenticación:

echo “requirepass PASSWORD” » /usr/local/etc/redis.conf

Habilitamos el servicio:

sysrc redis_enable="yes"

Arrancamos el servicio:

service redis start

Comprobamos que podamos acceder mediante redis-cli:

redis-cli -a PASSWORD info

# Server  
redis_version:5.0.9  
redis_git_sha1:00000000  
redis_git_dirty:0  
redis_build_id:521d1e24a8a777ac  
redis_mode:standalone  
os:FreeBSD 12.2-RELEASE-p4 amd64  
arch_bits:64  
multiplexing_api:kqueue  
atomicvar_api:atomic-builtin  
gcc_version:4.2.1  
process_id:87069  
run_id:b05eb0f543a393289abd0a5f166a2863c2620a2a  
tcp_port:6379  
uptime_in_seconds:45  
uptime_in_days:0  
hz:10  
configured_hz:10  
lru_clock:6584244  
executable:/usr/local/bin/redis-server  
config_file:/usr/local/etc/redis.conf  
  
# Clients  
connected_clients:1  
client_recent_max_input_buffer:4  
client_recent_max_output_buffer:0  
blocked_clients:0  
  
# Memory  
used_memory:1436628  
used_memory_human:1.37M  
used_memory_rss:1402800  
used_memory_rss_human:1.34M  
used_memory_peak:1436628  
used_memory_peak_human:1.37M  
used_memory_peak_perc:100.00%  
used_memory_overhead:1435094  
used_memory_startup:1385400  
used_memory_dataset:1534  
used_memory_dataset_perc:2.99%  
allocator_allocated:1402800  
allocator_active:1364912  
allocator_resident:1364912  
total_system_memory:0  
total_system_memory_human:0B  
used_memory_lua:37888  
used_memory_lua_human:37.00K  
used_memory_scripts:0  
used_memory_scripts_human:0B  
number_of_cached_scripts:0  
maxmemory:0  
maxmemory_human:0B  
maxmemory_policy:noeviction  
allocator_frag_ratio:0.97  
allocator_frag_bytes:18446744073709513728  
allocator_rss_ratio:1.00  
allocator_rss_bytes:0  
rss_overhead_ratio:1.03  
rss_overhead_bytes:37888  
mem_fragmentation_ratio:1.00  
mem_fragmentation_bytes:0  
mem_not_counted_for_evict:0  
mem_replication_backlog:0  
mem_clients_slaves:0  
mem_clients_normal:49694  
mem_aof_buffer:0  
mem_allocator:libc  
active_defrag_running:0  
lazyfree_pending_objects:0  
  
# Persistence  
loading:0  
rdb_changes_since_last_save:0  
rdb_bgsave_in_progress:0  
rdb_last_save_time:1617196935  
rdb_last_bgsave_status:ok  
rdb_last_bgsave_time_sec:-1  
rdb_current_bgsave_time_sec:-1  
rdb_last_cow_size:0  
aof_enabled:0  
aof_rewrite_in_progress:0  
aof_rewrite_scheduled:0  
aof_last_rewrite_time_sec:-1  
aof_current_rewrite_time_sec:-1  
aof_last_bgrewrite_status:ok  
aof_last_write_status:ok  
aof_last_cow_size:0  
  
# Stats  
total_connections_received:3  
total_commands_processed:4  
instantaneous_ops_per_sec:0  
total_net_input_bytes:132  
total_net_output_bytes:14794  
instantaneous_input_kbps:0.00  
instantaneous_output_kbps:0.00  
rejected_connections:0  
sync_full:0  
sync_partial_ok:0  
sync_partial_err:0  
expired_keys:0  
expired_stale_perc:0.00  
expired_time_cap_reached_count:0  
evicted_keys:0  
keyspace_hits:0  
keyspace_misses:0  
pubsub_channels:0  
pubsub_patterns:0  
latest_fork_usec:0  
migrate_cached_sockets:0  
slave_expires_tracked_keys:0  
active_defrag_hits:0  
active_defrag_misses:0  
active_defrag_key_hits:0  
active_defrag_key_misses:0  
  
# Replication  
role:master  
connected_slaves:0  
master_replid:3b9f3843dde887b4a3c88897e8702698232075a5  
master_replid2:0000000000000000000000000000000000000000  
master_repl_offset:0  
second_repl_offset:-1  
repl_backlog_active:0  
repl_backlog_size:1048576  
repl_backlog_first_byte_offset:0  
repl_backlog_histlen:0  
  
# CPU  
used_cpu_sys:0.007278  
used_cpu_user:0.011265  
used_cpu_sys_children:0.000000  
used_cpu_user_children:0.000000  
  
# Cluster  
cluster_enabled:0  
  
# Keyspace

Ahora vamos a enganchar redis01 como slave de redis00.

Ejecutamos en redis01:

echo “slaveof 192.168.69.55 6379” » /usr/local/etc/redis.conf
echo “masterauth PASSWORD” » /usr/local/etc/redis.conf

Reiniciamos en servicio:

service redis restart

Comprobamos en cada servidor que la topología sea la correcta.

En redis00 veremos:

redis-cli -a PASSWORD info

# Replication  
role:master  
connected_slaves:1  
slave0:ip=192.168.69.56,port=6379,state=online,offset=79226,lag=0

En redis01 veremos:

redis-cli -a PASSWORD info

# Replication  
role:slave  
master_host:192.168.69.55  
master_port:6379  
master_link_status:up

Asignamos en cada servidor reglas de firewall para restringir el acceso a los redis:

$cmd 01114 allow all from CLIENT_IP to REDIS_SERVER_IP any in via $wanif  
$cmd 01114 allow all from REDIS_SERVER_IP any to CLIENT_IP out via $wanif  
$cmd 60000 deny log all from any to any

NOTA: Esto es solo un ejemplo con las reglas específicas de Redis, podemos consultar este artículo anterior donde se explica detalladamente como montar un firewall sobre IPFW.