Redis学习笔记(八)

在之前的文章中,我们讲解了使用Redis集群哨兵模式(sentinel),本篇文章我们来讲解一下Redis Cluster。

一、Redis Cluster原理

Redis Cluster 是Redis的集群实现,内置数据自动分片机制,集群内部将所有的key映射到16384个Slot中,集群中的每个Redis Instance负责其中的一部分的Slot的读写。集群客户端连接集群中任一Redis Instance即可发送命令,当Redis Instance收到自己不负责的Slot的请求时,会将负责请求Key所在Slot的Redis Instance地址返回给客户端,客户端收到后自动将原请求重新发往这个地址,对外部透明。一个Key到底属于哪个Slot由crc16(key) % 16384 决定。

关于负载均衡,集群的Redis Instance之间可以迁移数据,以Slot为单位,但不是自动的,需要外部命令触发。

关于集群成员管理,集群的节点(Redis Instance)和节点之间两两定期交换集群内节点信息并且更新,从发送节点的角度看,这些信息包括:集群内有哪些节点,IP和PORT是什么,节点名字是什么,节点的状态(比如OK,PFAIL,FAIL等)是什么,包括节点角色(master 或者 slave)等。

关于可用性,集群由N组主从Redis Instance组成。主可以没有从,但是没有从意味着主宕机后主负责的Slot读写服务不可用。一个主可以有多个从,主宕机时,某个从会被提升为主,具体哪个从被提升为主,协议类似于Raft,参见这里。如何检测主宕机?Redis Cluster采用quorum+心跳的机制。从节点的角度看,节点会定期给其他所有的节点发送Ping,cluster-node-timeout(可配置,秒级)时间内没有收到对方的回复,则单方面认为对端节点宕机,将该节点标为PFAIL状态。通过节点之间交换信息收集到quorum个节点都认为这个节点为PFAIL,则将该节点标记为FAIL,并且将其发送给其他所有节点,其他所有节点收到后立即认为该节点宕机。从这里可以看出,主宕机后,至少cluster-node-timeout时间内该主所负责的Slot的读写服务不可用。

详细了解可参考:http://doc.redisfans.com/topic/cluster-tutorial.html#id5

二、Redis Cluster集群的搭建

Redis对于Linux是官方支持的,参考:http://redis.io/download;Redis官方是不支持windows的,只是 Microsoft Open Tech group(微软开源技术项目组) 在 GitHub上开发了一个Win64的版本,项目地址:https://github.com/MSOpenTech/redis/releases。

1、ruby的安装(redis cluster搭建需要ruby环境支持)

ruby下载安装地址:https://rubyinstaller.org/downloads/

我们下载Ruby2.3.3(x64)位,如下图:

安装Ruby,如下图:

安装完成以后,查看是否安装成功,如下图:

2、安装Ruby gem,Redis的ruby支持环境

rubygem下载地址:https://rubygems.org/pages/download;我们下载zip格式的文件,下载下来是一个压缩包,我们使用cmd进入解压后的目录,然后运行setup.rb,运行命令:ruby setup.rb,安装 rubyGems。

特别说明:

安装ruby依赖,由于墙的原因ruby自带的源有时候很慢,我们换成淘宝的源,不然下面安装redis依赖会失败;cmd下替换ruby自带的源如下:

现在是http://gems.ruby-china.org

不过本人在测试的时候并没有更换ruby源,redis依赖也安装成功了,安装如下图:

三、搭建redis cluster

按照文档的说明步骤来做就行了,详情地址:http://doc.redisfans.com/topic/cluster-tutorial.html#id5

把 redis 解压后,再复制出 5 份,配置 三主三从集群。 由于 redis 默认端口号为 6379,那么其它5份的端口可以为6380,6381,6382,6383,6384。 并且把目录使用"Redis"+端口号命名,命名完成以后,如下图:

修改各个文件夹中redis.windows.conf中port参数,分别为6379、6380、6381、6382、6383、6384;同时在redis.windows.conf文件的末尾添加如下配置:

cluster-enabled yes

cluster-config-file nodes.conf

cluster-node-timeout 5000

appendonly yes

参数说明:

cluster-enabled 是否启用redis cluster集群模式,

cluster-conf-file 选项则设定了保存节点配置文件的路径, 默认值为nodes.conf 。

nodes.conf 节点配置文件无须人为修改, 它由 Redis 集群在启动时创建, 并在有需要时自动进行更新。

cluster-node-timeout:cluster node间超时时间

appendonly:持久化机制

1、安装配置好的redis服务

新建一个文本文件,重命名为redisserver.bat,安装redis-server服务,内容如下图:

2、安装集群脚本redis-trib

由于使用的redis版本是Redis3.2版本,所以我们需要下载响应版本的redis-trib.rb,下载地址如下:

https://github.com/antirez/redis/blob/3.2/src/redis-trib.rb

下载完成以后,我们把redis-trib.rb文件放到D:\Install目录,使用cmd进入该目录,执行命令:redis-trib.rb create --replicas 1 127.0.0.1:6379 127.0.0.1:6380 127.0.0.1:6381 127.0.0.1:6382 127.0.0.1:6383 127.0.0.1:6384

--replicas 1 表示每个主数据库拥有从数据库个数为1。master节点不能少于3个,所以我们用了6个redis

如下图:

备注:有朋友反应上面的语句执行不成功。可以在前面加上ruby再运行。

输入"yes“,按回车,如下图:

四、测试搭建好的集群

使用Redis客户端Redis-cli.exe来查看数据记录数,以及集群相关信息,

命令 redis-cli –c –h ”地址” –p "端口号" ; c 表示集群

1、输入dbsize查询 记录总数

2、输入cluster info可以从客户端的查看集群的信息,见上图。

3、数据的存取

通过上面的截图,我们可以知道redis cluster集群创建成功,下面我们简单的来测试下数据的增加和获取吧。老样子,在cmd窗口用redis-cli来处理数据,注意命令和非集群相比加了一个-c

redis-cli -h 127.0.0.1 -p 6379 -c 或者redis-cli -c -h 127.0.0.1 -p 6379

到了这里,我们向redis存储一个数据:hello,world,存储如下图:

可以清晰的看到数据放到6381节点去了,好了,redis cluster在windows下集群搭建就这样了。

五、Redis集群的卸载与重新安装

1、如果需要修改端口号,则需要将原来的Redis各节点的服务器卸载,并重新安装

redis-server --service-uninstall --service-name redis6379

2、删除对应的数据文件 appendonly.aof和配置文件 nodes.conf

六、Redis Cluster添加节点

重新安装两个Redis服务,然后执行添加节点命令,如下:

redis-trib.rb add-node 127.0.0.1:6385 127.0.0.1:6386

运行命令后如下图:

七、碰到的坑

在使用redis-trip.tr创建redis cluster集群时,总是创建不成功,提示如下图:

原因是redis-trib.rb的链接指向官网最新的版本。从对应版本(redis3.2.0即可)的源码压缩包中src文件夹下找到对应的redis-trib.rb文件使用,即可解决问题。最新版本的下载地址如下:

https://github.com/antirez/redis/tree/unstable/src

提示redis-trib.rb已经不再支持,如下图:

下载redis源码版压缩包:http://download.redis.io/releases/

至此,redis集群搭建成功,可在项目中测试redis集群

参考:

4、https://blog.csdn.net/mingojiang/article/details/78971594

7、https://www.cnblogs.com/learnapi/p/9523075.html

8、https://www.cnblogs.com/yaozb/p/6911395.html

9、https://www.cnblogs.com/yangjinwang/p/8581313.html

10、https://www.cnblogs.com/lcawen/p/7059707.html

11、http://doc.redisfans.com/topic/cluster-tutorial.html#id5

12、https://www.cnblogs.com/yudongdong/p/6440016.html

13、https://www.cnblogs.com/yuanermen/p/5717885.html

14、https://www.cnblogs.com/yaozb/p/6911395.html

16、集群的卸载:https://www.cnblogs.com/tommy-huang/p/6733967.html

17、集群添加节点:http://blog.51cto.com/hsbxxl/1965706

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20181003G1AL3000?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券