概述
redis3.0版本之前只支持单例模式,在3.0版本及以后才支持集群,我这里用的是redis3.2.3版本
1.redis集群采用P2P模式,是完全去中心化的,不存在中心节点或者代理节点;
2.redis集群是没有统一的入口的,客户端(client)连接集群的时候连接集群中的任意节点(node)即可,集群内部的节点是相互通信的(PING-PONG机制),每个节点都是一个redis实例;
3.为了实现集群的高可用,即判断节点是否健康(能否正常使用),redis-cluster有这么一个投票容错机制:如果集群中超过半数的节点投票认为某个节点挂了,那么这个节点就挂了(fail)。这是判断节点是 否挂了的方法;
4.那么如何判断集群是否挂了呢? -> 如果集群中任意一个节点挂了,而且该节点没有从节点(备份节点),那么这个集群就挂了。这是判断集群是否挂了的方法;
5.那么为什么任意一个节点挂了(没有从节点)这个集群就挂了呢? -> 因为集群内置了16384个slot(哈希槽),并且把所有的物理节点映射到了这16384[0-16383]个slot上,或者说把这些slot均等的分配给了 各个节点。当需要在Redis集群存放一个数据(key-value)时,redis会先对这个key进行crc16算法,然后得到一个结果。再把这个结果对16384进行求余,这个余数会对应[0-16383]其中一个槽,进而决定 key-value存储到哪个节点中。所以一旦某个节点挂了,该节点对应的slot就无法使用,那么就会导致集群无法正常工作。
6.redis 不支持那些需要同时处理多个Key 的命令,因为执行这些命令会在多个节点间移动数据,高负载下会降低集群性能,并导致不可预测行为。
7.Redis集群至少需要3个节点,因为投票容错机制要求超过半数节点认为某个节点挂了该节点才是挂了,所以2个节点无法构成集群。这里说的节点是主节点,不是从节点。
8.要保证集群的高可用,需要每个节点都有从节点,也就是备份节点,所以Redis集群至少需要6台服务器。当然也可以在一台服务器上启动6个实例
环境准备
3台服务器,6个实例组成集群,每个机器启动2个实例,3主3从架构,主节点挂了从节点顶替。
安装ruby (ruby 提供了创建集群的脚本)
yum -y install ruby rubygems gem install redis
报错:gem 安装 redis提示:redis requires Ruby version >= 2.2.2的报错,查了资料发现是Centos默认支持ruby到2.0.0,可gem 安装redis需要最低是2.2.3
解决:
gem source --add https://gems.ruby-china.com/ --remove htts://rubygems.org/ #更换源为国内的 yum install curl -y curl -L get.rvm.io | bash -s stable source /usr/local/rvm/scripts/rvm rvm install 2.3.3 rvm use 2.3.3 --default rvm remove 2.0.0 #卸载已知版本
gem install redis #解决后重新安装
安装配置
1、编译安装redis,复制6个redis 的目录放到3台服务器上,每台两个目录
2、删除dmp.rdb
3、配置文件更改:
port 7000-7005 pidfile aof yes dir "./" cluster-enabled yes cluster-config-file nodes.conf cluster-node-timeout 5000
4、分别启动6个redis ,进入到src在绝对路径启动各个redis否则如果一台机器上多个实例无法同时启动
5、创建集群
./src/redis-trib.rb create --replicas 1 192.168.231.100:7000 192.168.231.100:7001 192.168.231.101:7002 192.168.231.101:7003 192.168.231.102:7004 192.168.231.102:7005
解释:replicas 1 表示一主一从,2表示一主两从
报错:[ERR] Sorry, can't connect to node 192.168.231.100:7000
解决:每个配置文件中注释掉 requrepass ...
6、连接集群
./redis-cli -c -h 192.168.231.100 -p 7000 #连接集群必须有-c 参数,连接任意一个节点即可
./redis-cli -c -h 192.168.231.101 -p 7003 cluster nodes #查看谁是主谁是从
如果自动分配不满意可以通过命令再次分片