Redis-cluster集群

Posted vieta

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Redis-cluster集群相关的知识,希望对你有一定的参考价值。

哨兵模式的缺陷

在哨兵模式中,仍然只有一个Master节点。当并发写请求较大时,哨兵模式并不能缓解写压力。

 

我们知道只有主节点才具有写能力,那如果在一个集群中,能够配置多个主节点,是不是就可以缓解写压力了呢?

答:是的。这个就是redis-cluster集群模式。

Redis-cluster集群概念

(1)由多个Redis服务器组成的分布式网络服务集群;

(2)集群之中有多个Master主节点,每一个主节点都可读可写;

(3)节点之间会互相通信,两两相连;

(4)Redis集群无中心节点。

 技术图片

 

 集群节点复制

 

 技术图片

 

在Redis-Cluster集群中,可以给每一个主节点添加从节点,主节点和从节点直接遵循主从模型的特性。

 

当用户需要处理更多读请求的时候,添加从节点可以扩展系统的读性能。

 

故障转移

Redis集群的主节点内置了类似Redis Sentinel的节点故障检测和自动故障转移功能,当集群中的某个主节点下线时,集群中的其他在线主节点会注意到这一点,并对已下线的主节点进行故障转移。

 技术图片

 

 

集群进行故障转移的方法和Redis Sentinel进行故障转移的方法基本一样,不同的是,在集群里面,故障转移是由集群中其他在线的主节点负责进行的,所以集群不必另外使用Redis Sentinel。

 集群分片策略

Redis-cluster分片策略,是用来解决key存储位置的。

 

集群将整个数据库分为16384个槽位slot,所有key-value数据都存储在这些slot中的某一个上。一个slot槽位可以存放多个数据,key的槽位计算公式为:slot_number=crc16(key)%16384,其中crc16为16位的循环冗余校验和函数。

集群中的每个主节点都可以处理0个至16383个槽,当16384个槽都有某个节点在负责处理时,集群进入上线状态,并开始处理客户端发送的数据命令请求。

 技术图片

 

集群redirect转向

由于Redis集群无中心节点,请求会随机发给任意主节点;

主节点只会处理自己负责槽位的命令请求,其它槽位的命令请求,该主节点会返回客户端一个转向错误;

客户端根据错误中包含的地址和端口重新向正确的负责的主节点发起命令请求。

 技术图片

 

 集群搭建

准备工作

(1)安装ruby环境

redis集群管理工具redis-trib.rb依赖ruby环境,首先需要安装ruby环境:

 

yum -y install ruby

yum -y install rubygems

 

(2)安装ruby和redis的接口程序

拷贝redis-3.0.0.gem至/usr/local下,执行安装:

gem install /usr/local/redis-3.0.0.gem

集群规划

(1)Redis集群最少需要6个节点,可以分布在一台或者多台主机上。

本教案在一台主机上创建伪分布式集群,不同的端口表示不同的redis节点,如下:

主节点:192.168.56.3:7001 192.168.56.3:7002 192.168.56.3:7003

从节点:192.168.56.3:7004 192.168.56.3:7005 192.168.56.3:7006

 

(2)在/usr/local/redis下创建redis-cluster目录,其下创建7001、7002。。7006目录,如下:

 技术图片

 

 

(3)将redis解压路径下的配置文件redis.conf,依次拷贝到每个700X目录内,并修改每个700X目录下的redis.conf配置文件:

必选配置:

port 700X

bind 192.168.23.3   

cluster-enabled yes

建议配置:

daemonized  yes

logfile  /usr/local/redis/redis-cluster/700X/node.log

启动每个结点redis服务

依次以700X下的redis.conf,启动redis节点。(必须指定redis.conf文件)

redis-server  /usr/local/redis/redis-cluster/700X/redis.conf

 

执行创建集群命令

进入到redis源码存放目录redis/redis-4.10.3/src下,执行redis-trib.rb,此脚本是ruby脚本,它依赖ruby环境。

./redis-trib.rb create --replicas 1 192.168.159.10:7001 192.168.159.10:7002 192.168.159.10:7003 192.168.159.10:7004 192.168.159.10:7005  192.168.159.10:7006

 

创建过程如下:

 技术图片

 

 

查询集群信息

集群创建成功登陆任意redis结点查询集群中的节点情况。

./redis-cli -c -h 192.168.56.3 -p 7001

 技术图片

 

 

说明:./redis-cli -c -h 192.168.56.3 -p 7001 ,其中:

-c表示以集群方式连接redis

-h指定ip地址,

-p指定端口号

 

cluster nodes 查询集群结点信息;

cluster info 查询集群状态信。

 

  集群管理

添加主节点

  节点规划

集群创建成功后可以向集群中添加节点,下面是添加一个master主节点

添加7007节点,参考集群结点规划章节添加一个“7007”目录作为新节点。

添加节点,执行下边命令:

./redis-trib.rb add-node  192.168.23.3:7007 192.168.23.3:7001

 技术图片

 

 

查看集群结点发现7007已添加到集群中:

 技术图片

 

 

 hash槽重新分配

添加完新的主节点后,需要对主节点进行hash槽分配,这样该主节才可以存储数据。

redis集群有16384个槽,被所有的主节点共同分配,通过查看集群结点可以看到槽占用情况。

 技术图片

 

 

给刚添加的7007结点分配槽:

第一步:连接上集群

./redis-trib.rb reshard 192.168.23.3:7001(连接集群中任意一个可用节点都行)

 

第二步:输入要分配的槽数量

 技术图片

 

 

输入 500表示要分配500个槽

 

第三步:输入接收槽的结点id

 技术图片

 

这里准备给7007分配槽,通过cluster nodes查看7007结点id为79bbb30bba66b4997b9360dd09849c67d2d02bb9

输入:79bbb30bba66b4997b9360dd09849c67d2d02bb9

 

第四步:输入源结点id

 技术图片

 

 

这里输入all,表示从其它主节点中分配。

 

第五步:输入yes开始移动槽到目标结点id

 技术图片

 

 

  添加从节点

集群创建成功后可以向集群中添加节点,下面是添加一个slave从节点。

添加7008从结点,将7008作为7007的从结点。

新增从节点命令格式:

./redis-trib.rb add-node --slave --master-id masterID newNodIP:port MasterIP:port

 

masterID       主节点id,从cluster  nodes信息中查看

newNodIP:port     新增节点的ip:端口

MasterIP:port        主节点的ip:端口

 

执行如下命令:

./redis-trib.rb add-node --slave --master-id 909c349f5f2d4db015101fb7c4e3c227a74ad382 192.168.4.253:7008 192.168.4.253:7007

 

79bbb30bba66b4997b9360dd09849c67d2d02bb9  是7007结点的id,可通过cluster nodes查看。

 技术图片

 

 

注意:

如果原来该结点在集群中的配置信息已经生成cluster-config-file指定的配置文件中(如果cluster-config-file没有指定则默认为nodes.conf),这时可能会报错:

[ERR] Node XXXXXX is not empty. Either the node already knows other nodes (check with CLUSTER NODES) or contains some key in database 0

 

解决方法:

删除生成的配置文件nodes.conf,删除后再执行./redis-trib.rb add-node指令。

 

查看集群中的结点,刚添加的7008为7007的从节点:

 技术图片

 

 

  删除节点:

删除节点命令格式:

./redis-trib.rb del-node nodeIP:port nodeID

nodeIP:port    待删除节点的ip:端口

nodeID        待删除节点的id,从cluster node中查看

注意,删除已经占有hash槽的结点会失败,报错如下:

[ERR] Node 127.0.0.1:7005 is not empty! Reshard data away and try again.

 

需要将该结点占用的hash槽分配出去(参考hash槽重新分配章节)。

以上是关于Redis-cluster集群的主要内容,如果未能解决你的问题,请参考以下文章

Redis-Cluster集群

Redis-cluster集群

Redis-cluster集群

docker部署redis-cluster集群

Redis-cluster高可用集群部署

redis-cluster集群