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.youkuaiyun.com/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”