简介
在生产环境中,我们希望Redis可以支持以下特性:
- 高可用:时刻保证Redis服务可用,降低单节点宕机带来的损失
- 可拓展:随着数据的增多,可以通过简单的增加节点来实现横向扩展
Redis的主从复制与Sentinel相结合可以实现高可用,解决了扩展读的问题,但仍然是一个单实例Redis,没有解决扩展写问题,Redis Cluster便是官方给出的解决方案。
原理
Redis Cluster数据分片没有使用 consistent hashing(一致性哈希),而是使用了一种称之为 hash slot(哈希槽)的新方式。
在Redis Cluster中共有16384(2^14^)个 hash slot,使用key值对应的CRC16码与16384做模运算,然后将value放置到相应的slot中。这16384个 hash slot 会均匀分布在Cluster的所有节点上,如一个包含三个Node的Cluster:
- NodeA包含0-5500个哈希槽
- NodeB包含5501-11000个哈希槽
- NodeC包含11001-16383个哈希槽
哈希槽的方式使得Cluster添加或者移除Node更为简单,如添加一个新Node D,只需要从A、B、C移除一些哈希槽到D中;删除Node A,只需要把A的哈希槽移动到B、C中。
为了保障Cluster的高可用,每个Master会设置一个或者多个Slave,常常采用“三主三从”的架构,如果M1出现故障,S1会自动升级为Master。
配置
以下是一个最小Redis Cluster的配置过程(部署在同一台机器上,伪集群),首先创建如下目录:
mkdir cluster-test
cd cluster-test
mkdir 7000 7001 7002 7003 7004 7005
从7000-7005,每个目录中添加一个redis.conf文件,以7000为例
vi 7000/redis.conf
redis.conf中配置如下内容
port 7000 #修改为各个Redis实例所对应的端口号
cluster-enabled yes #启用cluster模式
cluster-config-file nodes.conf #无需手动创建,Node启动时会自动创建
cluster-node-timeout 5000 #Master在超时时间内没有正常应答,进行故障转移
appendonly yes #开启AOF模式进行持久化
复制redis-server的可执行文件到各个实例目录
cp /path/to/redis-server 7000/
依次启动各个Redis实例,以7000为例
cd 7000
./redis-server redis.conf
复制redis-trib.rb可执行文件到cluster-test目录中
cp /path/to/redis-trib.rb cluster-test/
运行redis-trib需要先安装redis gem(这里主机为Centos 7)
yum install gem
gem install redis
创建Cluster
./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
执行成功后,会看到如下信息
[OK] All 16384 slots covered.
小结
在执行 gem install redis
时,可能会报以下错误:
[root@localhost cluster-test]# gem install redis
ERROR: Error installing redis-4.0.0.gem:
redis requires Ruby version >= 2.2.2.
Centos默认支持ruby到2.0.0,但是这里gem安装redis最低需要2.2.2,因此需要安装更高版本
curl -L get.rvm.io | bash -s stable
source /usr/local/rvm/scripts/rvm
rvm install 2.4.0
rvm use 2.4.0