redis集群之主从复制

69 阅读3分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。 本文基于docker环境进行演示,关于docker下redis的安装请参考:掌握docker的基本使用——以redis为例,主从模式配置过程中遇到的问题集中列举在文末,如有相同问题可以作为参考。

主从配置

基于docker启动两个redis容器: redis-node1:6379 redis-node2:6380

docker run -idt --name redis-node1 -p 6379:6379 -v /usr/local/redis/redis.conf:/etc/redis/redis.conf -v /usr/local/redis/node1/data:/data  --privileged=true docker.io/redis redis-server /etc/redis/redis.conf

docker run -idt --name redis-node2 -p 6379:6379 -v /usr/local/redis/redis.conf:/etc/redis/redis.conf -v /usr/local/redis/node2/data:/data  --privileged=true docker.io/redis redis-server /etc/redis/redis.conf

redis节点启动,默认是master节点,所以只需要配置从节点即可,这里我们让redis-node1做主节点,redis-node2做从节点: 先看看redis-node1:

[root@localhost ~]# docker exec -it redis-node1 /bin/bash
root@2155096fb356:/data# redis-cli -a 123456 #密码123456
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
127.0.0.1:6379> info replication
# Replication
role:master    ## 当前节点是master节点
connected_slaves:0 ##已连接的从节点个数0
master_failover_state:no-failover
master_replid:5e6312b18d6fab29d272edff3c80f9dcbf846153
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:625
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:625``

配置从节点的方式有两种:命令行配置和配置文件配置

命令行配置从节点

[root@localhost redis]#  docker exec -it redis-node2 /bin/bash
root@9dafda3f150c:/data# redis-cli -a 123456
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
127.0.0.1:6379> slaveof 192.168.247.128 6379
OK
127.0.0.1:6379> config set masterauth 123456
OK

主从测试

在这里插入图片描述 在这里插入图片描述 这说明主从模式配置是成功了的;

如果发现配置失败,可以通过下面这个命令查看日志,根据具体失败原因到文末找解决方案; docker logs --tail 10 -f redis-node2

配置文件配置

################################# REPLICATION #################################
replicaof 192.168.247.128 6379
masterauth 123456

从节点切换成主节点

slaveof no one

127.0.0.1:6379> info Replication
# Replication
role:slave
master_host:192.168.247.128
master_port:6379
master_link_status:down
master_last_io_seconds_ago:-1
master_sync_in_progress:0
slave_read_repl_offset:1798
slave_repl_offset:1798
master_link_down_since_seconds:23
slave_priority:100
slave_read_only:1
replica_announced:1
connected_slaves:0
master_failover_state:no-failover
master_replid:5e6312b18d6fab29d272edff3c80f9dcbf846153
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:1798
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:626
repl_backlog_histlen:1173
127.0.0.1:6379> slaveof no one
OK
127.0.0.1:6379> info Replication
# Replication
role:master
connected_slaves:0
master_failover_state:no-failover
master_replid:1a8e6b4e225d5de7a58f03a15648905bdbab6277
master_replid2:5e6312b18d6fab29d272edff3c80f9dcbf846153
master_repl_offset:1798
second_repl_offset:1799
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:626
repl_backlog_histlen:1173

AQ

  • Q: Error reply to PING from master: '-DENIED Redis is running in protected mode because protected mode is enabled, no bind address was specified, no authentication password is requested to clients. In this mode connections are only accepted from the loopback interface. If you want to connect'
  • A:采用以下任何一种方案即可: -- 1. 关闭protected模式:protected-mode no -- 2. 设置密码:requirepass 123456