Redis Cluster安装配置

Redis集群介绍

  • Redis 集群是一个提供在多个Redis间节点间共享数据的程序集。
  • Redis集群并不支持处理多个keys的命令,因为这需要在不同的节点间移动数据,从而达不到像Redis那样的性能,在高负载的情况下可能会导致不可预料的错误.
  • Redis 集群通过分区来提供一定程度的可用性,在实际环境中当某个节点宕机或者不可达的情况下继续处理命令.
  • Redis 集群有16384个哈希槽,每个key通过CRC16校验后对16384取模来决定放置哪个槽.集群的每个节点负责一部分hash槽,举个例子,比如当前集群有3个节点,那么: 节点 A 包含 0 到 5500号哈希槽. 节点 B 包含5501 到 11000 号哈希槽. 节点 C 包含11001 到 16384号哈希槽.

Redis Cluster集群的优势:

  • 自动分割数据到不同的节点上。
  • 整个集群的部分节点失败或者不可达的情况下能够继续处理命令。
  • 客户端与redis节点直连,不需要中间proxy层.客户端不需要连接集群所有节点,连接集群中任何一个可用节点即可。
  • 支持主从复制模型。(slave->master 选举,集群容错)

Redis Cluster集群的主从复制模型:

为了使在部分节点失败或者大部分节点无法通信的情况下集群仍然可用,所以集群使用了主从复制模型,假如有A,B,C三个节点的集群,在没有复制模型的情况下,如果节点B失败了,那么整个集群就会以为缺少5501-11000这个范围的槽而不可用.
然而如果在集群创建的时候我们为每个节点添加一个从节点A1,B1,C1,那么整个集群便有三个master节点和三个slave节点组成,这样在节点B失败后,集群便会选举B1为新的主节点继续服务,整个集群便不会因为槽找不到而不可用了。

Redis Cluster模型图

Redis Cluster的官方文档介绍

1、Redis Cluster集群配置

环境:CentOS7,两台服务器:172.18.209.168、172.18.209.168
Redis的安装步骤可以参考之前的文章 Linux安装配置Redis
我们需要创建三个主节点和三个从节点:

172.18.209.168:7001
172.18.209.168:7002
172.18.209.168:7003
172.18.209.169:7004
172.18.209.169:7005
172.18.209.169:7006

为了方便起见,我这里在168这台机器上创建所有的节点。

#cd /usr/local/redis-4.0.1
#mkdir /data/cluster
#cd /data/cluster
#mkdir 7001 7002 7003 7004 7005 7006

复制默认的配置文件到7001端口对应的目录下。

#cp ../../redis.conf 7001/
修改配置文件:
#vim 7001/redis.conf
port 7001
daemonize yes
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes

然后分别copy到其他端口对应的目录下,再打开配置文件修改一下端口号,其他内容不变。
进入对应的端口目录下启动实例:

#redis-server redis.conf

查看进程:

#ps -ef | grep redis
root 5371 1 0 Sep07 ? 00:01:35 redis-server *:6379
root 11891 1 0 10:35 ? 00:00:17 redis-server 172.18.209.168:7002 [cluster]
root 11914 1 0 10:37 ? 00:00:17 redis-server 172.18.209.168:7003 [cluster]
root 11921 1 0 10:37 ? 00:00:17 redis-server 172.18.209.168:7004 [cluster]
root 11926 1 0 10:37 ? 00:00:17 redis-server 172.18.209.168:7005 [cluster]
root 11931 1 0 10:37 ? 00:00:17 redis-server 172.18.209.168:7006 [cluster]

ps:我这里没有7001,是因为我创建后测试被我杀掉了。
接下来就是创建集群了,首先要安装依赖:

#yum install ruby rubygems -y

再安装gem-redis,下载gem-redis-4.0.0
下载gem-redis-4.0.0后执行命令安装

#gem install -l redis-4.0.0.gem

不出意外的话会报错:
ERROR: Error installing redis-4.0.0.gem:
redis requires Ruby version >= 2.2.2.
解决办法参考:redis requires Ruby version >= 2.2.2
为了方便执行命令,copy redis-trib 到/usr/bin目录下。

#cp redis-4.0.0/src/redis-trib.rb /usr/local/bin/redis-trib

接着开始创建集群,执行命令:

#redis-trib create --replicas 1 172.18.209.168:7001 172.18.209.168:7002 172.18.209.168:7003 172.18.209.169:7004 172.18.209.169:7005 172.18.209.169:7006

ps:redis-trib.rb 程序的命令是 create,这表示创建一个新的集群。
–replicas 1 表示为集群中的每个主节点创建一个从节点。
然后redis-trib 会打印出详细配置,确认没问题的话,输入yes确定:

>>> Creating cluster
>>> Performing hash slots allocation on 6 nodes...
Using 3 masters:
172.18.209.168:7001
172.18.209.169:7004
172.18.209.168:7002
Adding replica 172.18.209.169:7005 to 172.18.209.168:7001
Adding replica 172.18.209.168:7003 to 172.18.209.169:7004
Adding replica 172.18.209.169:7006 to 172.18.209.168:7002
M: 3e00a8c896fd0957e7d423e5b350415ba0572182 172.18.209.168:7001
slots:0-5460 (5461 slots) master
M: 28432a59f26a10f2c1eedad3f41c4ac47110d549 172.18.209.168:7002
slots:10923-16383 (5461 slots) master
S: 4806d7fb4c04880b3d7a6a20728088f243c52087 172.18.209.168:7003
replicates a59bef6cacd813b13742cdb22026bd167ef9aeaf
M: a59bef6cacd813b13742cdb22026bd167ef9aeaf 172.18.209.169:7004
slots:5461-10922 (5462 slots) master
S: f715ef8bcf25b1b7c0960c26b1e1b600c12ca09b 172.18.209.169:7005
replicates 3e00a8c896fd0957e7d423e5b350415ba0572182
S: dd39cd4b2b1ba8b34e0207023922f522ae72d2b6 172.18.209.169:7006
replicates 28432a59f26a10f2c1eedad3f41c4ac47110d549
Can I set the above configuration? (type 'yes' to accept):
>>> Nodes configuration updated
>>> Assign a different config epoch to each node
>>> Sending CLUSTER MEET messages to join the cluster
Waiting for the cluster to join...
>>> Performing Cluster Check (using node 172.18.209.168:7001)
M: 3e00a8c896fd0957e7d423e5b350415ba0572182 172.18.209.168:7001
   slots:0-5460 (5461 slots) master
   1 additional replica(s)
M: a59bef6cacd813b13742cdb22026bd167ef9aeaf 172.18.209.169:7004
   slots:5461-10922 (5462 slots) master
   1 additional replica(s)
S: 4806d7fb4c04880b3d7a6a20728088f243c52087 172.18.209.168:7003
   slots: (0 slots) slave
   replicates a59bef6cacd813b13742cdb22026bd167ef9aeaf
M: 28432a59f26a10f2c1eedad3f41c4ac47110d549 172.18.209.168:7002
   slots:10923-16383 (5461 slots) master
   1 additional replica(s)
S: dd39cd4b2b1ba8b34e0207023922f522ae72d2b6 172.18.209.169:7006
   slots: (0 slots) slave
   replicates 28432a59f26a10f2c1eedad3f41c4ac47110d549
S: f715ef8bcf25b1b7c0960c26b1e1b600c12ca09b 172.18.209.169:7005
   slots: (0 slots) slave
   replicates 3e00a8c896fd0957e7d423e5b350415ba0572182
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.

这样就配置成功了。
可以使用命令验证:

#redis-cli -c -h 172.18.209.168 -p 7001
172.18.209.168:7001> set name "abswolf"
-> Redirected to slot [5798] located at 172.18.209.169:7004
OK
172.18.209.168:7001> get name
-> Redirected to slot [5798] located at 172.18.209.169:7004
"abswolf"
172.18.209.169:7004> 

ps:关于Redis集群的介绍来自Redis Cluster集群主从方案(附Jedis Cluster教程)

redis requires Ruby version >= 2.2.2

在做redis集群,安装redis-gem的时候出现该错误:

#gem install -l redis-4.0.0.gem
ERROR:  Error installing redis-4.0.0.gem:
redis requires Ruby version >= 2.2.2.

原来是因为CentOS7 yum库中ruby的版本支持到 2.0.0,可gem 安装redis需要最低是2.2.2。那么只能手动更新了。
解决步骤:

1、安装RVM

gpg2 --keyserver hkp://keys.gnupg.net --recv-keys D39DC0E3
curl -L get.rvm.io | bash -s stable
source /usr/local/rvm/scripts/rvm

2、安装Ruby新版本

rvm install 2.3.3

3、设置默认使用新版本

rvm use 2.3.3 --default

4、卸载旧版本

rvm remove 2.0.0

Linux 安装配置Redis

下载安装

wget http://download.redis.io/releases/redis-4.0.1.tar.gz
解压tar zxvf redis-4.0.1.tar.gz
make && make install

用cp命令复制到usr目录下运行

cp redis-server /usr/local/bin/
cp redis-cli /usr/local/bin/

新建目录,存放配置文件

mkdir /etc/redis
mkdir /var/redis
mkdir /var/redis/log
mkdir /var/redis/run
mkdir /var/redis/6379

在redis解压根目录中找到配置文件模板,复制到如下位置。

cp redis.conf /etc/redis/6379.conf

通过vim命令修改

daemonize yes
pidfile /var/redis/run/redis_6379.pid
logfile /var/redis/log/redis_6379.log
dir /var/redis/6379

最后运行redis:

$ redis-server /etc/redis/6379.conf

添加到系统服务并配置开机启动

进入到redis源码的utils目录,执行 ./install_server.sh ,所有选项默认即可。
修改 /etc/init.d/redis_6379 为 redis : mv /etc/init.d/redis_6379 /etc/init.d/redis

添加到系统服务:chkconfig --add redis
开机启动:chkconfig redis on
这样执行 service redis start|restart|stop 就可以控制redis的启动、重启、停止了。

参考:redis安装部署维护备份