redis集群(二)集群(主从+哨兵)模式介绍

一、Redis Cluster(Redis集群)简介

1、redis是一个开源的key value存储系统,redis3.0版本之前只支持单例模式,在3.0版本及以后才支持集群;redis集群采用P2P模式,是完全去中心化的,不存在中心节点或者代理节点;
2、redis集群是没有统一的入口的,客户端(client)连接集群的时候连接集群中的任意节点(node)即可,集群内部的节点是相互通信的(PING-PONG机制),每个节点都是一个redis实例;
3、高可用:

(1)判断节点是否挂了的方法:为了实现集群的高可用,即判断节点是否健康(能否正常使用),redis-cluster有这么一个投票容错机制:如果集群中超过半数的节点投票认为某个节点挂了,那么这个节点就挂了(fail)。这是判断节点是否挂了的方法;
(2)判断集群是否挂了: 如果集群中任意一个节点挂了,而且该节点没有从节点(备份节点),那么这个集群就挂了。这是判断集群是否挂了的方法;那么为什么任意一个节点挂了(没有从节点)这个集群就挂了呢? -> 因为集群内置了16384个slot(哈希槽),并且把所有的物理节点映射到了这16384[0-16383]个slot上,或者说把这些slot均等的分配给了各个节点。当需要在Redis集群存放一个数据(key-value)时,redis会先对这个key进行crc16算法,然后得到一个结果。再把这个结果对16384进行求余,这个余数会对应[0-16383]其中一个槽,进而决定key-value存储到哪个节点中。所以一旦某个节点挂了,该节点对应的slot就无法使用,那么就会导致集群无法正常工作。
综上所述,每个Redis集群理论上最多可以有16384个节点。


二、集群搭建需要的环境:redis集群一般指的是主从+哨兵集群模式

1、一般的集群最少需要两个节点(两台服务器)就可以了:如服务集群(通过Nginx负载均衡实现,两个节点分别部署前、后端,访问前端vip即虚拟ip,nginx分发到前端两个实例上,前端两个节点再各自分发到后端两个实例上),Job集群(quartz集群模式),dubbo集群(dubbo服务两个节点注册到zk注册中心,通过zk负载均衡),mysql集群(通过vip调用mysql,mysq配置l主从模式,主库写,从库读)。

2、但是Redis集群至少需要3个节点,因为投票容错机制要求超过半数节点认为某个节点挂了该节点才是挂了,所以2个节点无法构成集群;另外,前面说了,redis集群一个节点挂了这个集群就挂了(这样就回到了单机模式的痛点上,挂一个全部挂),所以为了保证集群的高可用,Redis集群又至少需要6个节点,我们一般把这6个实例部署在三台服务器上,组成一主二从三哨兵。

redis架构(主从+哨兵).png

1)主从:从节点完成数据复制

  一个主节点(master)可拥有多个从节点(slave),从节点实现对主节点的复制,保证数据同步。

2)哨兵(sentinel):完成容灾切换

  Redis Sentinel是Redis 的高可用性解决方案,由一个或多个Sentinel(哨兵)实例组成。它可以监视任意多个主服务器,以及这些主服务器属下的所有从服务器,并在被监视的主服务器进入下线状态时,自动将下线主服务器属下的某个从服务器升级为新的主服务器,它的主要功能如下:

  • 监控(Monitoring):Sentinel会不断地检查你的主服务器和从服务器是否运作正常。
  • 通知(Notification):当被监控的某个 Redis 服务器出现问题时, Sentinel可以通过API向管理员或者其他应用程序发送通知。
  • 故障迁移:当主服务器不能正常工作时,Sentinel会自动进行故障迁移,也就是主从切换。
  • 统一的配置管理:连接者询问sentinel取得主从的地址。

  哨兵原理:Sentinel 使用的算法核心是 Raft 算法,主要用途就是用于分布式系统,系统容错,以及Leader选举,每个Sentinel都需要定期的执行以下任务:

  • 每个 Sentinel 会自动发现其他 Sentinel 和从服务器,它以每秒钟一次的频率向它所知的主服务器、从服务器以及其他 Sentinel 实例发送一个 PING 命令。

  • 如果一个实例(instance)距离最后一次有效回复 PING 命令的时间超过 down-after-milliseconds 选项所指定的值, 那么这个实例会被 Sentinel 标记为主观下线。 有效回复可以是: +PONG 、 -LOADING 或者 -MASTERDOWN 。

  • 如果一个主服务器被标记为主观下线, 那么正在监视这个主服务器的所有Sentinel要以每秒一次的频率确认主服务器的确进入了主观下线状态。

  • 如果一个主服务器被标记为主观下线, 并且有足够数量的Sentinel(至少要达到配置文件指定的数量)在指定的时间范围内同意这一判断, 那么这个主服务器被标记为客观下线。

  • 在一般情况下, 每个Sentinel会以每 10 秒一次的频率向它已知的所有主服务器和从服务器发送 INFO 命令。 当一个主服务器被Sentinel标记为客观下线时,Sentinel向下线主服务器的所有从服务器发送 INFO 命令的频率会从 10 秒一次改为每秒一次。

  • 当没有足够数量的Sentinel同意主服务器已经下线, 主服务器的客观下线状态就会被移除。 当主服务器重新向Sentinel的 PING 命令返回有效回复时, 主服务器的主管下线状态就会被移除。

    哨兵原理.png

3、redis的集群使用 ruby脚本编写,所以系统需要有 Ruby 环境。

三、windows搭建redis集群过程:

 需要安装Redis、Ruby语言运行环境、Redis的Ruby驱动redis-3.2.2.gem、创建Redis集群的工具redis-trib.rb。

  1、下载redis最新版本(版本必需要3.0以上),见单机版redis安装过程;

  2、(1)安装Ruby语言运行环境 http://dl.bintray.com/oneclick/rubyinstaller/rubyinstaller-2.2.4-x64.exe

     

(2)下载ruby环境下Redis的驱动,考虑到兼容性,这里下载的是3.2.2版本,下载地址:redis | RubyGems.org | your community gem host,将下载的文件放在ruby安装目录下

redis集群(二)集群(主从+哨兵)模式介绍_第1张图片

安装该驱动,命令如下:gem install --local redis-3.2.2.gem

redis集群(二)集群(主从+哨兵)模式介绍_第2张图片

3、在redis目录下创建6个节点的文件夹:7000-7005,其中三个为主节点, 而其余三个则是各个主节点的从节点

    redis集群(二)集群(主从+哨兵)模式介绍_第3张图片

   将redis下面的文件复制到每个节点文件夹下面

4、修改6个文件夹下redis.windows.conf、redis.windows-service.conf  文件配置,以7000节点为例

(1)先修改节点的端口号

     

(2)修改其他配置支持集群,去掉前面的#

cluster-enabled yes
cluster-config-file nodes-7000.conf
cluster-node-timeout 15000
appendonly yes

 如果cluster-enabled 不为yes, 那么在使用JedisCluster集群代码获取的时候,会报错。
 cluster-node-timeout 调整为  15000,那么在创建集群的时候,不会超时。
 cluster-config-file nodes-7000.conf 是为该节点的配置信息,这里使用 nodes-端口.conf命名方法。服务启动后会在目录生成该文 件。

5、编写一个bat来启动redis,在每个节点目录下创建start.bat,内容如下(端口记得对应):

title redis-7000
redis-server.exe redis.windows.conf

  分别运行这6个脚本启动这些节点。

6、下载安装集群脚本 redis-trib.rb : GitHub - beebol/redis-trib.rb: redis-trib.rb,放到redis目录下:

redis集群(二)集群(主从+哨兵)模式介绍_第4张图片

7、在redis目录下在cmd中执行:

ruby redis-trib.rb create --replicas 1 127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005  

在出现 Can I set the above configuration? (type 'yes' to accept):   请确定并输入 yes 。 

命令的意义如下:给定 redis-trib.rb 程序的命令是 create , 这表示我们希望创建一个新的集群。 选项 --replicas 1 表示我们希望为集群中的每个主节点创建一个从节点。 之后跟着的其他参数则是实例的地址列表, 我们希望程序使用这些地址所指示的实例来创建新集群。 简单来说, 以上命令的意思就是让 redis-trib 程序创建一个包含三个主节点和三个从节点的集群。

注:报错:

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