一、概念篇
Redis集群的三种模式
1.主从模式
2.Sentinel模式
3.cluster模式
主从模式
一主多从的特点如图,整个集群只有一个master,
1.master负责写数据(master也可以读),slave负责读数据
2.master如果故障集群将无法提供写服务(因为不会选出新的master),将主服务器重启即可恢复。
3.当写操作发生时会master会将数据发送给slave,保证数据一致性
4.slave如果重启需要重新使用slaveof指令连接集群
链表式主从
特殊的主从模式,缺点是如果slave0故障了后边的slava1与slava2都无法正常同步数据了。优点是减轻了master的同步数据负担,master只负责它的从节点的数据同步。
sentinel模式
sentinel的意思是哨兵,顾名思义就是一个哨兵监控着Redis集群的master是否故障,如果master故障了将由sentinel开启投票选举出一个新的master,当故障的master重启时,故障重启的master将会成为新master的slave。
主从复制数据同步流程
slave启动完成时,立即向master发送同步请求。master收到同步请求后触发RDB策略,保存当前时间的master数据集,并把该RDB文件发送给slave,slave根据此RDB文件进行数据同步。
另外每当master执行写操作之后,都会将该操作发送至从服务器与之同步。
cluster模式
如果不需要扩容一般是不需要用到cluster模式的(不存在Redis内存放不下的情况),但如果Redis已经容量不够了则必须使用cluster。上面的主从模式只解决了高可用的问题,想容量大还得看cluster。假设我们现在的内存是16G,而Redis中要放的内存有48G,此时我们可以将Redis分为三块,如图(实际情况请对内存与需求做评估后决定)。
可见cluster实现了redis的水平扩容。
二、操作(说明:由于链表式主从是特殊的主从模式,配置方式与主从模式一致,故不再进行演示)
下面我们以Windows版本Redis演示集群操作
主从模式
1.下载Redis,GitHubWindows版本下载。
2.解压文件后复制两份同样的文件,修改文件夹名称方便识别。
3.修改每个文件夹中的 redis.windows.conf文件,将port改为对应的port,并且将dbfilename改为不同的值。
6379
6380
剩下的6381如法炮制。
4.创建redis-server.bat文件在对应的文件夹目录下(三个redis副本皆需要此文件),右键编辑粘贴下面脚本保存退出。
redis-server.exe redis.windows.conf
5.创建redis-cli.bat文件在对应的文件夹目录下(三个redis副本皆需要此文件),右键编辑粘贴下面脚本保存退出(请自行修改相应的port)。
redis-cli.exe -p 6379
此时每个redis文件夹内应该有如下两个bat文件
6.在对应的redis文件夹中启动redis-server.bat文件。
7.在对应的redis文件夹中启动 redis-cli.bat文件
8.6380 、 6381两台redis通过 slaveof 127.0.0.1 6379 命令来选择6379当master。执行命令后,6379为master,6380,6381为slave。
此时主从模式搭建成功,我们来试试效果
测试也没问题,搭建成功后我们再来观看一些主从模式的特性。
当master故障时(把master关掉):
info replication命令可以查看redis副本的状态。可以看到master的status为down。
首先可以看到我们依旧能正常读,但因为master故障我们无法往集群中写入数据。并且两台slave并没有任何一台被提升为master,我们可以从server的log看到两台slave一直在等待master重启。
此时我们将master重新启动(启动redis-server.bat文件)
当master重新连接集群时,两台slave将与master进行数据同步(我这里因为默认的RDB策略未保存RDB文件所以数据被清空了)。
再使用master写入k1 v1
当slave故障时重启会不会重新与集群连接呢?让我们看看
先关掉6381
重启6381之后再使用info replication观察它的信息
所以当slave故障重启后我们需要重新使用slaveof 命令来与master重连。
测试到这里可以很清楚的看见与我们概念篇的描述相符合。
sentinel模式
sentinel模式以主从模式为基础,所以在这里我们与上面一样启动6379,6380,6381三台redis实例,6380,6381执行slave of 6379指令,6379为master,另外两台为slave。
1.现在我们要做的事是创建sentinel.conf配置文件
sentinel配置文件解释:
port sentinel服务运行的端口
sentinel monitor <实例名称(自定义)>
sentinel down-after-milliseconds <实例名称> : 指定的实例名称在指定的毫秒内如果未响应则判定实例故障
sentinel parallel-syncs <实例名称> 故障时只能有个redis slave做同步操作
sentinel failover-timeout mymaster : 指定时间内未完成failover event,则判定failover失败
6379的sentinel配置文件
port 10000
sentinel monitor 6379 127.0.0.1 6379 1
sentinel down-after-milliseconds 6379 10000
sentinel parallel-syncs 6379 2
sentinel failover-timeout 6379 10000
6380
port 10001
sentinel monitor 6379 127.0.0.1 6379 1
sentinel down-after-milliseconds 6379 10000
sentinel parallel-syncs 6379 2
sentinel failover-timeout 6379 10000
6381
port 10002
sentinel monitor 6379 127.0.0.1 6379 1
sentinel down-after-milliseconds 6379 10000
sentinel parallel-syncs 6379 2
sentinel failover-timeout 6379 10000
2.在各个redis文件夹下创建redis-sentinel.bat文件
redis-server.exe sentinel.conf --sentinel
3.去6379、6380、6381下启动redis-sentinel.bat,成功如下图所见
4.现有6379,6380,6381三台Redis实例,6379为master、其他两台为slave
现在我们开始测试sentinel模式,当6379故障时会发生什么?
关掉6379实例。
从图中可以观察到在sentinel模式下,6379master故障时,6380被选举为master,并且6381自动切换为6380的slave。
可见sentinel模式自动选举master,有这种模式我想我们再也不需要深更半夜爬起来重启redis了,于是我们可以下出结论,与主从模式对比,肯定选择sentinel模式。
cluster模式
说明:我们将创建一个三主三从的集群。
1.复制6个Redis文件夹,分别修改对应的配置文件。
配置文件修改
port 6379 #改为对应的端口号
cluster-enabled yes
cluster-config-file nodes-6379.conf #改为对应的端口号以区分
cluster-node-timeout 15000
2.创建bat文件
title redis-a-6379;
redis-server.exe redis.windows.conf
请如上创建其他bat文件。
3.安装ruby(我也不想装,redis集群脚本需要ruby环境)
Ruby-Downloads 下载地址。
下载完成后打开exe文件安装就好了。
安装完成出现此内容时选1
如果出现这种东西就是网速太慢(我是开代理解决的,各位可以关掉窗口打开CMD输入
gem sources --add https://gems.ruby-china.org/ --remove https://rubygems.org/
gem sources -l)
安装redis依赖
gem install redis
4.下载集群脚本redis-trib.rb
redis-trib.rb 下载_new Girl的博客-CSDN博客_redis-trib.rb下载 这位老哥这里可以下载。
下载后放到这个位置中
5.先启动所有的redis实例
cmd到redis-trib.rb文件中,执行
ruby redis-trib.rb create --replicas 1 127.0.0.1:6379 127.0.0.1:6389 127.0.0.1:6398 127.0.0.1:6380 127.0.0.1:6390 127.0.0.1:6399 命令
(--replicas的意义是指定集群中每个master配备几个slave。)
最后一行是问我们是否接收此分配:输入yes。
可以看到这次分配 6380,6390,6399是master,其他三台是slave。
至此Redis的集群搭建完成。
6.通过集群方式连接redis cluster
创建bat文件,
redis-cli -c -p 6379
使用cluster nodes命令查看集群信息:
关于slot的说明
每个Redis集群中总共有16383个slot(简单理解为一个范围),当有一个K V键值对想被放入集群时,首先对key进行计算,看此值属于哪个slot(范围),这一对键值对就会被放入哪个master中,因为此机制,redis集群才能实现水平扩容。
可以看到5493值被放入了6389,正好符合上面的slot。
关于Redirected说明
如果要get的值或者set的值不在此次连接的实例上,因为redis的无中心化配置,将会切换到对应的实例上。
7. 测试--当master故障会如何?
关闭6398实例。
当6398故障时,我们任然可以从6399实例获取到k1的value
可以看到6399实例被提升为master了。 当6398重启时,角色将从master转为slave。
如果某一节点的master-slave全部挂掉了,集群是否还可用?此时我们关掉6379与6380。
所以,此处在配置文件总的配置cluster-require-full-coverage如果设置为yes时,整个集群也会down。如果配置为no, 那么集群可以使用,该slot范围无法再存储与读取数据。有兴趣的小伙伴可以试一试。
至此已将所有的redis集群模式介绍完成,有何不妥之处还请各位指正,谢谢!
注意:请删除每个redis文件夹下的此文件再启动,否则会出现错误