Redis集群之主从模式

Redis的定位还是分布式缓存,关于分布式的特点和挑战这里不再介绍。
一、 Redis主从模式的必要性

    备份数据:当一个节点损坏时,数据因为有备份,可以方便恢复。
    负载均衡:避免所有客户端都访问一个节点,有了主从模式后,查询操作就可以通过查询从节点来完成。

二、Redis主从模式的特点:

    一个Master可以有多个Slaves
    默认配置下,master节点可以进行读和写,slave节点只能进行读操作,写操作被禁止
    不要修改配置让slave节点支持写操作,没有意义,因为,首先写入的数据不会被同步到其他节点,其次,当master节点修改同一条数据后,slave节点的数据会被覆盖掉
    slave节点挂了不影响其他slave节点的读和master节点的读和写,重新启动后会将数据从master节点同步过来
    master节点挂了以后,不影响slave节点的读,Redis将不再提供写服务,master节点启动后Redis将重新对外提供写服务。
    master节点过了以后,不会从slave节点中重新选一个master。
    对由密码的情况说明:当master节点设置密码时:
    * 客户端访问master需要密码;
    * 启动slave需要密码,在配置中进行配置即可;
    * 客户端访问slave不需要密码

三、Redis主从模式的缺点:

    master节点挂了以后,redis就不会对外提供写服务了,因为剩下的slave节点不会成为master

    所以生产环境不会单单只有主从模式。

四、 搭建Redis主从模式:
1. 准备本机redis集群环境

参看:https://blog.csdn.net/xiaoxiaoyusheng2012/article/details/82051744
假设这一步已经配置了3个Redis服务,redis6380、redis6381、redis6382,对应的配置文件分别是redis.windows.6380.conf、redis.windows.6381.conf、redis.windows.6382.conf
2. 配置master节点、slave节点

我们让redis6380为master节点,redis6381、redis6382为slave节点,步骤如下:

(1). 修改redis.window.6380.conf的内容,改为redis单实例安装时的原始配置:

    bind 127.0.0.1
    protected-mode yes
    port 6380
    tcp-backlog 511
    timeout 0
    tcp-keepalive 0
    loglevel notice
    logfile "C:/RedisLogs/redis6380_log.txt"
    databases 16
    save 900 1
    save 300 10
    save 60 10000
    stop-writes-on-bgsave-error yes
    rdbcompression yes
    rdbchecksum yes
    dbfilename dump.rdb
    dir ./
    slave-serve-stale-data yes
    slave-read-only yes
    repl-diskless-sync no
    repl-diskless-sync-delay 5
    repl-disable-tcp-nodelay no
    slave-priority 100
    appendonly no
    appendfilename "appendonly.aof"
    appendfsync everysec
    no-appendfsync-on-rewrite no
    auto-aof-rewrite-percentage 100
    auto-aof-rewrite-min-size 64mb
    aof-load-truncated yes
    lua-time-limit 5000
    slowlog-log-slower-than 10000
    slowlog-max-len 128
    latency-monitor-threshold 0
    notify-keyspace-events ""
    hash-max-ziplist-entries 512
    hash-max-ziplist-value 64
    list-max-ziplist-size -2
    list-compress-depth 0
    set-max-intset-entries 512
    zset-max-ziplist-entries 128
    zset-max-ziplist-value 64
    hll-sparse-max-bytes 3000
    activerehashing yes
    client-output-buffer-limit normal 0 0 0
    client-output-buffer-limit slave 256mb 64mb 60
    client-output-buffer-limit pubsub 32mb 8mb 60
    hz 10
    aof-rewrite-incremental-fsync yes

(2). 修改redis.window.6381.conf和redis.window.6382.conf,在配置文件去除cluster相关配置,添加slaveof:内容如下(以redis6382为例):

    port 6382      
    loglevel notice   
    logfile "C:/RedisLogs/redis6382_log.txt"        
    appendonly yes
    appendfilename "appendonly.6382.aof"   
    
    slaveof 127.0.0.1 6380

(3). 启动redis6380、redis6381、redis6382服务

    redis-server.exe --service-start --service-name redis6380
    redis-server.exe --service-start --service-name redis6381
    redis-server.exe --service-start --service-name redis6382

(4). WIN+R启动三个命令行窗口,通过redis-cli -h -p 命令 启动客户端,查看服务信息

    窗口1:命令1:redis-cli -h 127.0.0.1 -p 6380, 命令2:info Replication
    窗口2:命令1:redis-cli -h 127.0.0.1 -p 6381, 命令2:info Replication
    窗口2:命令1:redis-cli -h 127.0.0.1 -p 6382, 命令2: info Replication

则会看到如下信息:

窗口1:

窗口2:

窗口3:

四、验证Redis主从模式特性:
1、验证:slaves节点不可写:

    slaves节点6381客户端(窗口2):输入->set mykey6381_1 myvalue6381_1 提示:(error) READONLY You can't write against a read only slave.
    slaves节点6382客户端(窗口3):输入->set mykey6382_1 myvalue6382_1 提示:(error) READONLY You can't write against a read only slave.

2、验证master节点写,slaves节点可读

    写:master节点6380客户端(窗口1):输入->set mykey6380_1 myvalue6380_1 提示:OK
    读:master节点6380客户端(窗口1):输入->get mykey6380_1 提示:“myvalue6380_1”
    读:slaves节点6381客户端(窗口2):输入->get mykey6380_1 提示:“myvalue6380_1”
    读:slaves节点6382客户端(窗口3):输入->get mykey6380_1 提示:“myvalue6380_1”

3、验证一个slaves节点挂了,不影响其他slaves节点和master节点

    停止:slaves节点6381服务,命令行:redis-server.exe --service-stop --service-name Redis6381
    写:master节点6380客户端(窗口1):输入->set mykey6380_2 myvalue6380_2 提示:OK
    读:master节点6380客户端(窗口1):输入->get mykey6380_2 提示:“myvalue6380_2”
    读:slaves节点6382客户端(窗口3):输入->get mykey6380_2 提示:“myvalue6380_2”

4、验证slaves重启后数据会从master节点同步过来

    启动:slaves节点6381服务,命令行:redis-server.exe --service-start --service-name Redis6381
    读:slaves节点6381客户端:输入->get mykey6380_2 提示:“myvalue6380_2”

5、验证master节点挂掉后,slaves节点不会变成master节点(不能写操作)

    停止:master节点6380服务,命令行:redis-server.exe --service-stop --service-name Redis6380
    读:slaves节点6382客户端(窗口3):输入->get mykey6380_2 提示:“myvalue6380_2”
    写:slaves节点6381客户端(窗口2):输入->set mykey6381_1 myvalue6381_1 提示:(error) READONLY You can't write against a read only slave.

6、重启master节点,恢复写操作

    启动:master节点6380服务,命令行:redis-server.exe --service-start --service-name Redis6380
    写:master节点6380客户端(窗口1):输入->set mykey6380_3 myvalue6380_3 提示:OK
    读:slaves节点6382客户端(窗口3):输入->get mykey6380_3 提示:“myvalue6380_3”

参看:https://www.cnblogs.com/yiwangzhibujian/p/7047458.html
---------------------

评论