【Redis】Cluster-集群

简介

  在生产环境中,我们希望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

参考资料

  1. Redis cluster tutorial
  2. Redis Cluster Specification
  3. Redis Cluster

猜你喜欢

转载自blog.csdn.net/u013201439/article/details/81068037