一、Redis Cluster模式
redis集群并没有使用一致性hash算法而引入了哈希槽概念,Redis 集群有16384个哈希槽,每个key通过CRC16校验后对16384取模来决定放置哪个槽.集群的每个节点负责一部分hash槽.也就是说如果key是不变的对应的slot也是不变的。
Redis3.0版本之后支持Cluster.
- 目前redis支持的cluster特性:
1):节点自动发现
2):slave->master 选举,集群容错
3):Hot resharding:在线分片
4):进群管理:cluster xxx
5):基于配置(nodes-port.conf)的集群管理
6):ASK 转向/MOVED 转向机制.
redis集群采用P2P模式,是完全去中心化的,不存在中心节点或者代理节点;
redis集群是没有统一的入口的,客户端(client)连接集群的时候连接集群中的任意节点(node)即可,集群内部的节点是相互通信的(PING-PONG机制),每个节点都是一个redis实例;
为了实现集群的高可用,即判断节点是否健康(能否正常使用),redis-cluster有这么一个投票容错机制:如果集群中超过半数的节点投票认为某个节点挂了,那么这个节点就挂了(fail)。这是判断节点是否挂了的方法; - 集群搭建需要的环境
Redis集群至少需要3个节点,因为投票容错机制要求超过半数节点认为某个节点挂了该节点才是挂了,所以2个节点无法构成集群。
要保证集群的高可用,需要每个节点都有从节点,也就是备份节点,所以Redis集群至少需要6台服务器。
二、集群安装
搭建 Redis集群,三个主节点,三个从节点,多主节点为了分布集群,从节点是为了高可用性。
安装redis:
二、集群配置(Windows环境)
修改每台redis.windows.conf,修改里面的端口号,以及集群的配置
redis.windows.conf
# 修改 79行
port 6380
# 添加 707行 启用集群
cluster-enabled yes
# 添加 715行 配置每个节点的配置文件,可以以端口号为名称
cluster-config-file nodes.conf
# 添加 722行
cluster-node-timeout 15000
# 修改 581行 启动AOF增量持久化策略
appendonly yes
所有文件除端口号不同外,其它配置相同。
在每个目录下面新建一个bat脚本,用于启动每台redis服务:
start-server.bat 内容:
redis-server redis.windows.conf
三、安装Ruby
- 安装Ruby
Redis 的集群是用Ruby脚本编写,所以系统需要有 Ruby 环境。
https://rubyinstaller.org/downloads/
安装,下面红框标记的地方必选。
验证:打开cmd窗口,输入ruby –version出现版本号 表示安装成功
- 安装redis的ruby驱动rubygems
地址:https://rubygems.org/pages/download
解压安装:
解压到6380文件夹下面。
进入rubygems-3.0.3目录下面执行cmd命令:ruby setup.rb
D:\6380\rubygems-3.0.3>ruby setup.rb
-
切换到6380目录下面,执行命令gem install redis
四、启动集群
-
进入每个端口的文件夹,执行start-server.bat文件,启动每个节点的服务
其它如同。
安装集群脚本redis-trib
下载:
https://github.com/MicrosoftArchive/redis/releases
- 在当前目录执行以下命令
ruby redis-trib.rb create --replicas 1 127.0.0.1:6380 127.0.0.1:6381 127.0.0.1:6382 127.0.0.1:6383 127.0.0.1:6384 127.0.0.1:6385
--replicas 1 表示 自动为每一个master节点分配一个slave节点 上面有6个节点,程序会按照一定规则生成 3个master(主)3个slave(从)。
注:如果出现Node is not empty,先清空所有端口目录下面的nodes.conf和dump.rdb文件,
重启所有Redis,然后再执行上面的命令。
- 验证集群是否启动成功
D:\6380>redis-cli -c -p 6380
127.0.0.1:6380> cluster info
五、常见问题:
-
一直等待 Waiting for the cluster to join 很久都没有反应
解决方案:
1:进入各个节点的redis的rdb文件保存位置
删除rdb持久化文件和nodes.conf文件
2:关闭所有redis示例
3:启动redis
4:用redis-trib.rb创建集群查看是否成功