Redis集群(windows版本操作)

一、概念篇

Redis集群的三种模式

1.主从模式

2.Sentinel模式

3.cluster模式

主从模式

Redis集群(windows版本操作)_第1张图片

一主多从的特点如图,整个集群只有一个master,

1.master负责写数据(master也可以读),slave负责读数据

2.master如果故障集群将无法提供写服务(因为不会选出新的master),将主服务器重启即可恢复。

3.当写操作发生时会master会将数据发送给slave,保证数据一致性

4.slave如果重启需要重新使用slaveof指令连接集群

链表式主从

Redis集群(windows版本操作)_第2张图片

 特殊的主从模式,缺点是如果slave0故障了后边的slava1与slava2都无法正常同步数据了。优点是减轻了master的同步数据负担,master只负责它的从节点的数据同步。

sentinel模式

sentinel的意思是哨兵,顾名思义就是一个哨兵监控着Redis集群的master是否故障,如果master故障了将由sentinel开启投票选举出一个新的master,当故障的master重启时,故障重启的master将会成为新master的slave。Redis集群(windows版本操作)_第3张图片

主从复制数据同步流程

slave启动完成时,立即向master发送同步请求。master收到同步请求后触发RDB策略,保存当前时间的master数据集,并把该RDB文件发送给slave,slave根据此RDB文件进行数据同步。

另外每当master执行写操作之后,都会将该操作发送至从服务器与之同步。


cluster模式 

如果不需要扩容一般是不需要用到cluster模式的(不存在Redis内存放不下的情况),但如果Redis已经容量不够了则必须使用cluster。上面的主从模式只解决了高可用的问题,想容量大还得看cluster。假设我们现在的内存是16G,而Redis中要放的内存有48G,此时我们可以将Redis分为三块,如图(实际情况请对内存与需求做评估后决定)。

Redis集群(windows版本操作)_第4张图片

 可见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文件

Redis集群(windows版本操作)_第5张图片

6.在对应的redis文件夹中启动redis-server.bat文件。

Redis集群(windows版本操作)_第6张图片

7.在对应的redis文件夹中启动 redis-cli.bat文件

Redis集群(windows版本操作)_第7张图片

8.6380 、 6381两台redis通过 slaveof 127.0.0.1 6379 命令来选择6379当master。执行命令后,6379为master,6380,6381为slave。

 Redis集群(windows版本操作)_第8张图片

此时主从模式搭建成功,我们来试试效果

Redis集群(windows版本操作)_第9张图片

测试也没问题,搭建成功后我们再来观看一些主从模式的特性。

当master故障时(把master关掉):

 Redis集群(windows版本操作)_第10张图片

 info replication命令可以查看redis副本的状态。可以看到master的status为down。

 首先可以看到我们依旧能正常读,但因为master故障我们无法往集群中写入数据。并且两台slave并没有任何一台被提升为master,我们可以从server的log看到两台slave一直在等待master重启。

Redis集群(windows版本操作)_第11张图片

 此时我们将master重新启动(启动redis-server.bat文件)

Redis集群(windows版本操作)_第12张图片

 当master重新连接集群时,两台slave将与master进行数据同步(我这里因为默认的RDB策略未保存RDB文件所以数据被清空了)。

Redis集群(windows版本操作)_第13张图片

 再使用master写入k1 v1

Redis集群(windows版本操作)_第14张图片

当slave故障时重启会不会重新与集群连接呢?让我们看看

先关掉6381

重启6381之后再使用info replication观察它的信息

 Redis集群(windows版本操作)_第15张图片

所以当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,成功如下图所见

Redis集群(windows版本操作)_第16张图片

4.现有6379,6380,6381三台Redis实例,6379为master、其他两台为slave

Redis集群(windows版本操作)_第17张图片

 Redis集群(windows版本操作)_第18张图片

现在我们开始测试sentinel模式,当6379故障时会发生什么?

关掉6379实例。

Redis集群(windows版本操作)_第19张图片

 Redis集群(windows版本操作)_第20张图片

 从图中可以观察到在sentinel模式下,6379master故障时,6380被选举为master,并且6381自动切换为6380的slave。

可见sentinel模式自动选举master,有这种模式我想我们再也不需要深更半夜爬起来重启redis了,于是我们可以下出结论,与主从模式对比,肯定选择sentinel模式。


cluster模式

说明:我们将创建一个三主三从的集群。

1.复制6个Redis文件夹,分别修改对应的配置文件。

Redis集群(windows版本操作)_第21张图片

 配置文件修改

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

Redis集群(windows版本操作)_第22张图片

如果出现这种东西就是网速太慢(我是开代理解决的,各位可以关掉窗口打开CMD输入

gem sources --add https://gems.ruby-china.org/ --remove https://rubygems.org/

gem sources -l)

Redis集群(windows版本操作)_第23张图片

 使用ruby-v出现下图内容时表示安装完成

 安装redis依赖 

gem install redis

4.下载集群脚本redis-trib.rb

redis-trib.rb 下载_new Girl的博客-CSDN博客_redis-trib.rb下载 这位老哥这里可以下载。

下载后放到这个位置中

Redis集群(windows版本操作)_第24张图片

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。)

Redis集群(windows版本操作)_第25张图片

 最后一行是问我们是否接收此分配:输入yes。

 可以看到这次分配 6380,6390,6399是master,其他三台是slave。

 至此Redis的集群搭建完成。

6.通过集群方式连接redis cluster

  创建bat文件,

redis-cli -c -p 6379

运行bat文件,

 使用cluster nodes命令查看集群信息:

Redis集群(windows版本操作)_第26张图片

关于slot的说明

Redis集群(windows版本操作)_第27张图片

 每个Redis集群中总共有16383个slot(简单理解为一个范围),当有一个K V键值对想被放入集群时,首先对key进行计算,看此值属于哪个slot(范围),这一对键值对就会被放入哪个master中,因为此机制,redis集群才能实现水平扩容。

 可以看到5493值被放入了6389,正好符合上面的slot。

关于Redirected说明

Redis集群(windows版本操作)_第28张图片

如果要get的值或者set的值不在此次连接的实例上,因为redis的无中心化配置,将会切换到对应的实例上。 

7. 测试--当master故障会如何?

关闭6398实例。

当6398故障时,我们任然可以从6399实例获取到k1的value

 Redis集群(windows版本操作)_第29张图片

可以看到6399实例被提升为master了。 当6398重启时,角色将从master转为slave。

如果某一节点的master-slave全部挂掉了,集群是否还可用?此时我们关掉6379与6380。

所以,此处在配置文件总的配置cluster-require-full-coverage如果设置为yes时,整个集群也会down。如果配置为no, 那么集群可以使用,该slot范围无法再存储与读取数据。有兴趣的小伙伴可以试一试。

至此已将所有的redis集群模式介绍完成,有何不妥之处还请各位指正,谢谢!

注意:请删除每个redis文件夹下的此文件再启动,否则会出现错误

你可能感兴趣的:(Redis,nosql,redis)