一、前言

1、Redis Cluster(Redis集群)简介

  • redis是一个开源的key value存储系统,受到了广大互联网公司的青睐;
  • redis集群是由一系列的主从节点群组成的分布式服务器群,它具有复制、高可用和分片特性。Redis集群不需要sentinel哨兵也能完成节点移除和故障转移的功能。需要将每个节点设置成集群模式,这种集群模式没有中心节点,客户端通过CRC16算法对key进行hash得到一个值,来判断该key存储在哪个主从服务上面,因此就算是某一个主从整个宕机,redis集群也是部分可用的。方便水平扩展,可以根据业务规模随时加减配置;
  • redis集群是没有统一的入口的,客户端(client)连接集群的时候连接集群中的任意节点(node)即可,集群内部的节点是相互通信的(PING-PONG机制),每个节点都是一个redis实例;
  • redis-cluster有一个投票容错机制;如果集群中超过半数的节点投票认为某个节点挂了,那么这个节点就挂了(fail),所以Redis集群至少需要3个节点

2、Redis集群搭建需要的环境

  • Redis是c开发的,因此安装redis需要c语言的编译环境,即需要安装gcc;
  • Redis集群至少需要3个节点,要保证集群的高可用,需要每个节点都有从节点,也就是备份节点,所以Redis集群至少需要6台服务器,考虑成本问题,这次测试搭建的是伪分布式集群,即一台服务器虚拟运行6个redis实例,修改端口号为(7001-7006),当然实际生产环境的Redis集群搭建和这里是一样的;
  • 安装Ruby,redis3.0和4.0搭建集群的话,需要使用一个工具(脚本文件),这个工具在redis解压文件的源代码里,因为这个工具是一个ruby脚本文件,所以这个工具的运行需要ruby的运行环境,咱们这里使用的是redis 5.0.8(可以不用ruby)

3、软件版本说明 

说明
Linux Server CentOS 7.6
gcc 4.8.5
redis 5.0.8
ruby 2.7.1
redis-gem 4.2.1

 

 

 

 

 

 

 

二、集群搭建具体步骤如下

1、查看是否安装gcc

gcc -v  

如果没有gcc,则需要在线安装,命令如下

yum install gcc-c++

2、安装配置redis

下载redis&解压

官网:https://redis.io/download

cd /opt
wget http://download.redis.io/releases/redis-5.0.8.tar.gz
tar -zxvf redis-5.0.8.tar.gz

编译安装redis

#进入到redis-5.0.8目录下
cd redis-5.0.8
[root@10-7-28-179 redis-5.0.8]# ls
00-RELEASENOTES  CONTRIBUTING  deps     Makefile   README.md   runtest          runtest-moduleapi  sentinel.conf  tests
BUGS             COPYING       INSTALL  MANIFESTO  redis.conf  runtest-cluster  runtest-sentinel   src            utils

#Makefile     make相关命令存放处
#redis.conf   redis配置文件 
#src             编译后的源文件

[root@10-7-28-179 redis-5.0.8]# make #编译redis源码
[root@10-7-28-179 redis-5.0.8]# make install PREFIX=/usr/local/redis  #指定redis存放目录

#查看redis目录下的bin目录里面的文件,如下
[root@10-7-28-179 ~]# cd /usr/local/redis/bin/
[root@10-7-28-179 bin]# ls
dump.rdb  redis-benchmark  redis-check-aof  redis-check-rdb  redis-cli  redis.conf  redis-sentinel  redis-server

启动redis,默认启动模式为前端启动,指令如下

./redis-server

更改成后台启动,修改redis.conf文件,将daemonize no -> daemonize yes

vim redis.conf
./redis-server redis.conf   #(后台启动)

3、集群搭建

# 在/usr/local目录下新建redis-cluster目录,用于存放集群节点,命令如下:
cd /usr/loca
mkdir redis-cluster
# 把redis目录下的bin目录所有文件复制到/usr/local/redis-cluster/redis01目录下,redis01目录会自动创建,命令如下:
cp -r redis/bin/ redis-cluster/redis01
# 删除redis01目录下的快照文件dump.rdb,并修改该目录下的redis.conf文件,具体修改两处地方:一是端口号port改为7001,二是开启集群创建(cluster-enabled)模式,打开注释即可
rm -rf redis-cluster/redis01/dump.rdb
vim redis-cluster/redis01/redis.conf
[root@10-7-28-179 redis-cluster]# grep 700 redis01/redis.conf
port 7001
[root@10-7-28-179 redis-cluster]# grep cluster redis01/redis.conf
# started as cluster nodes can. In order to start a Redis instance as a
# cluster node enable the cluster support uncommenting the following:
cluster-enabled yes

将redis-cluster/redis01文件复制5份到redis-cluster目录下(redis02-redis06),创建6个redis实例,模拟Redis集群到6个节点。然后将其余5个文件下的redis.conf里面的端口号分别修改为7002-7006.

接着启动所有redis节点,由于一个一个启动太麻烦了,所以在这里创建一个批量启动redis节点的脚本文件,文件名为start-all.sh,文件内容如下:

cd redis01
./redis-server redis.conf
cd ..
cd redis02
./redis-server redis.conf
cd ..
cd redis03
./redis-server redis.conf
cd ..
cd redis04
./redis-server redis.conf
cd ..
cd redis05
./redis-server redis.conf
cd ..
cd redis06
./redis-server redis.conf
cd ..

创建好启动脚本文件之后,需要修改该脚本的权限,使之能够执行,指令如下:

chmod +x start-all.sh

执行start-all.sh脚本,启动6个redis节点

至此6个redis节点启动成功,接下来正式开启搭建集群,以上都是准备条件(搭建6个redis实例并启动)

4、下载安装Ruby

Ruby官方下载地址:https://www.ruby-lang.org/en/downloads/

cd /opt/
wget https://cache.ruby-lang.org/pub/ruby/2.7/ruby-2.7.1.tar.gz
tar -zxvf ruby-2.7.1.tar.gz
./configure -prefix=/usr/local/ruby
make
make install
cd /usr/local/ruby
cp bin/ruby /usr/local/bin/
cp bin/gem /usr/local/bin/
#安装Rubygem redis依赖:

[root@10-7-28-179 opt]# /usr/local/bin/gem install redis
Fetching redis-4.2.1.gem
Successfully installed redis-4.2.1
Parsing documentation for redis-4.2.1
Installing ri documentation for redis-4.2.1
Done installing documentation for redis after 0 seconds
1 gem installed
[root@10-7-28-179 opt]# /usr/local/bin/gem list redis gem

*** LOCAL GEMS ***

redis (4.2.1)

*** LOCAL GEMS ***

将ruby工具(redis-trib.rb)复制到redis-cluster目录下,指令如下:

cp /opt/redis-5.0.8/src/redis-trib.rb /usr/local/redis-cluster/
cp /usr/local/redis/redis-cli /usr/local/redis-cluster/

使用ruby工具文件搭建集群,指令如下:

[root@10-7-28-179 redis-cluster]# ./redis-trib.rb create --replicas 1 128.1.136.135:7001 128.1.136.135:7002 128.1.136.135:7003 128.1.136.135:7004 128.1.136.135:7005 128.1.136.135:7006
WARNING: redis-trib.rb is not longer available!
You should use redis-cli instead.

All commands and features belonging to redis-trib.rb have been moved
to redis-cli.
In order to use them you should call redis-cli with the --cluster
option followed by the subcommand name, arguments and options.

Use the following syntax:
redis-cli --cluster SUBCOMMAND [ARGUMENTS] [OPTIONS]

Example:
redis-cli --cluster create 128.1.136.135:7001 128.1.136.135:7002 128.1.136.135:7003 128.1.136.135:7004 128.1.136.135:7005 128.1.136.135:7006 --cluster-replicas 1

To get help about all subcommands, type:
redis-cli --cluster help

[root@10-7-28-179 redis-cluster]# ./redis-cli --cluster create 128.1.136.135:7001 128.1.136.135:7002 128.1.136.135:7003 128.1.136.135:7004 128.1.136.135:7005 128.1.136.135:7006 --cluster-replicas 1
Could not connect to Redis at 128.1.136.135:7001: Connection timed out

 

至此,Redis集群搭建成功!最后一段文字,显示了每个节点所分配到slots(哈希槽),这里总共6个节点,其中3个是从节点,所以3个主节点分别映射了0-5460、5461-10922、10923-16383slots。

三、集群操作

以集群方式连接 ,redis客户端通过cluster info查看集群信息,通过cluster nodes查看节点信息

[root@10-7-28-179 redis-cluster]# cd redis01
[root@10-7-28-179 redis01]# ./redis-cli -p 7001 -c
127.0.0.1:7001> ping
PONG
127.0.0.1:7001> set str1 1
OK
127.0.0.1:7001> set str2 2
-> Redirected to slot [9547] located at 127.0.0.1:7002
OK
127.0.0.1:7002> set str3 3
-> Redirected to slot [13674] located at 127.0.0.1:7003
OK
127.0.0.1:7003> set str4 4
-> Redirected to slot [1421] located at 127.0.0.1:7001
OK
127.0.0.1:7001> cluster info
cluster_state:ok
cluster_slots_assigned:16384
cluster_slots_ok:16384
cluster_slots_pfail:0
cluster_slots_fail:0
cluster_known_nodes:6
cluster_size:3
cluster_current_epoch:6
cluster_my_epoch:1
cluster_stats_messages_ping_sent:190
cluster_stats_messages_pong_sent:201
cluster_stats_messages_sent:391
cluster_stats_messages_ping_received:196
cluster_stats_messages_pong_received:190
cluster_stats_messages_meet_received:5
cluster_stats_messages_received:391
127.0.0.1:7001> cluster nodes
25b57bdc158c7bddb4775a8099ae545d8a8056c0 127.0.0.1:7001@17001 myself,master - 0 1596374102000 1 connected 0-5460
ac2e50b4f8cd6249348a4f1fbbbdc12577f1619b 127.0.0.1:7004@17004 slave 94857bf92e40c7f769f18fa0d652524f525da3c2 0 1596374103049 4 connected
aec07d568b5cd760e9b34418a9074529b1220348 127.0.0.1:7003@17003 master - 0 1596374103000 3 connected 10923-16383
29a5115a4e09e3418d5cdf7b1eeca7863847d3f3 127.0.0.1:7006@17006 slave 25b57bdc158c7bddb4775a8099ae545d8a8056c0 0 1596374104051 6 connected
94857bf92e40c7f769f18fa0d652524f525da3c2 127.0.0.1:7002@17002 master - 0 1596374103000 2 connected 5461-10922
8c0e1800606625e849b55546b812bfe0c7a6a7b8 127.0.0.1:7005@17005 slave aec07d568b5cd760e9b34418a9074529b1220348 0 1596374103000 5 connected

PS: -a 密码

     -c 集群方式(要加-c,不然节点之间无法自动跳转)

redis-cli --cluster help具有以下功能:

1、 create :创建集群

2、 check :检查集群

3、 info :查看集群信息

4、 fix :修复集群

5、 reshard :在线迁移slot

6、 rebalance :平衡集群节点slot数量

7、 add-node :将新节点加入集群

8、 del-node :从集群中删除节点

9、 set-timeout :设置集群节点间心跳连接的超时时间

10、 call :在集群全部节点上执行命令

11、 import :将外部redis数据导入集群

相关链接:https://blog.csdn.net/u014344668/article/details/105848359

               https://www.javazhiyin.com/26753.html

               https://stor.51cto.com/art/202004/614940.htm