一、前言
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&解压
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