Redis 在3.0版本前只支持单实例模式,虽然支持主从模式、哨兵模式部署来解决单点故障。但是数据冗余太大,内存浪费。所以,Redis 在 3.0 版本以后就推出了集群模式。
由于集群至少需要6个节点(3主3从模式),我们可以采用端口号来区分,模拟6台服务。
上传redis安装包到/usr/local/src目录
解压安装包
cd /usr/local/src
tar -zxvf redis-3.2.12.tar.gz
编译redis
make
创建集群目录
#mkdir /usr/local/redis-cluster
创建6个节点存放目录
#cd /usr/local/redis-cluster
#mkdir -p 6001/data 6002/data 6003/data 6004/data 6005/data 6006/data
创建脚本存放目录bin
#mkdir bin
复制刚才在解压编译的redis安装包的src目录下的
mkreleasehdr.sh redis-benchmark redis-check-aof redis-check-dump
redis-cli redis-server redis-trib.rb 这6个脚本文件到bin目录
#cd /usr/local/src/redis-3.2.12/src
#\cp mkreleasehdr.sh redis-benchmark redis-check-aof redis-cli redis-server redis-trib.rb /usr/local/redis-cluster/bin
复制配置文件redis.conf到第一个节点6001目录
#cp redis.conf /usr/local/redis-cluster/6001
编辑redis.conf配置文件
#cd /usr/local/redis-cluster/6001
#vi redis.conf
修改项目如下
port 6001(每个节点的端口号)
daemonize yes
bind 192.168.100.131(绑定当前机器 IP)
dir /usr/local/redis-cluster/6001/data/(数据文件存放位置)
pidfile /var/run/redis_6001.pid(pid 6001和port要对应)
cluster-enabled yes(启动集群模式)
cluster-config-file nodes6001.conf(6001和port要对应)
cluster-node-timeout 15000
appendonly yes
集群搭建配置重点就是取消下图中的这三个配置的注释
再复制出五个新 Redis 实例分别到6002,6003,6004,6005,6006
#\cp -rf /usr/local/redis-cluster/6001/* /usr/local/redis-cluster/6002
#\cp -rf /usr/local/redis-cluster/6001/* /usr/local/redis-cluster/6003
#\cp -rf /usr/local/redis-cluster/6001/* /usr/local/redis-cluster/6004
#\cp -rf /usr/local/redis-cluster/6001/* /usr/local/redis-cluster/6005
#\cp -rf /usr/local/redis-cluster/6001/* /usr/local/redis-cluster/6006
依次修改6002,6003,6004,6005,6006五个节点的redis.conf配置文件中的关于端口号的相关配置
6002节点redis.conf配置文件修改,使用vi编辑器命令修改替换端口 命令模式下输入 %s/6001/6002
port 6002
dir /usr/local/redis-cluster/6002/data/
pidfile /var/run/redis_6002.pid
cluster-config-file nodes6002.conf
6003节点redis.conf配置文件修改,使用vi编辑器命令修改替换端口 命令模式下输入 %s/6001/6003
port 6003
dir /usr/local/redis-cluster/6003/data/
pidfile /var/run/redis_6003.pid
cluster-config-file nodes6003.conf
6004节点redis.conf配置文件修改,使用vi编辑器命令修改替换端口 命令模式下输入 %s/6001/6004
port 6004
dir /usr/local/redis-cluster/6004/data/
pidfile /var/run/redis_6004.pid
cluster-config-file nodes6004.conf
6005节点redis.conf配置文件修改,使用vi编辑器命令修改替换端口 命令模式下输入 %s/6001/6005
port 6005
dir /usr/local/redis-cluster/6005/data/
pidfile /var/run/redis_6005.pid
cluster-config-file nodes6005.conf
6006节点redis.conf配置文件修改,使用vi编辑器命令修改替换端口 命令模式下输入 %s/6001/6006
port 6006
dir /usr/local/redis-cluster/6006/data/
pidfile /var/run/redis_6006.pid
cluster-config-file nodes6006.conf
其实我们也就是替换了上面的那四行配置而已。工具能干的人就懒惰一点没有什么不好,呵呵。
到这里,我们已经把最基本的环境搞定了,接下来就是启动了。
/usr/local/redis-cluster/bin/redis-server /usr/local/redis-cluster/6001/redis.conf
/usr/local/redis-cluster/bin/redis-server /usr/local/redis-cluster/6002/redis.conf
/usr/local/redis-cluster/bin/redis-server /usr/local/redis-cluster/6003/redis.conf
/usr/local/redis-cluster/bin/redis-server /usr/local/redis-cluster/6004/redis.conf
/usr/local/redis-cluster/bin/redis-server /usr/local/redis-cluster/6005/redis.conf
/usr/local/redis-cluster/bin/redis-server /usr/local/redis-cluster/6006/redis.conf
查看启动进程
安装集群所需软件
yum -y install ruby
yum -y install rubygems
下载这个文件
链接:https://pan.baidu.com/s/1SBYTJ22FUTVOtsbiSmZNIg 密码:u3ji
进行安装,使用 gem install redis安装基本是无望了,卡死,更改了很多源无效,所以只好下载手动安装了
把下载好的文件上传到/usr/local/src目录
进入上传好的插件目录进行安装
#cd /usr/local/src
#gem install -l redis-3.2.1.gem
调用 ruby 命令来进行创建集群,--replicas 1
表示主从复制比例为 1:1,即一个主节点对应一个从节点;然后,默认给我们分配好了每个主节点和对应从节点服务,以及 solt 的大小,因为在 Redis 集群中有且仅有 16384 个 solt(0--16383) ,默认情况会给我们平均分配,当然你可以指定,后续的增减节点也可以重新分配
/usr/local/redis-cluster/bin/redis-trib.rb create --replicas 1 192.168.100.131:6001 192.168.100.131:6002 192.168.100.131:6003 192.168.100.131:6004 192.168.100.131:6005 192.168.100.131:6006
输入yes
M: e6a21c9f8bd16c9a082c9d93824faf00541f37ec 为主节点Id
S: 8fd465aa4d066d3771209d1a34ce4acfaba82da7 192.168.100.131:6004 replicates e6a21c9f8bd16c9a082c9d93824faf00541f37ec
从节点id 也就是说6004节点是6001的从节点
上图则代表集群搭建成功啦!!!
接下来我们链接6001节点
/usr/local/redis-cluster/bin/redis-cli -c -h 192.168.100.131 -p 6001
我们在6001节点set name 123456 发现自动重定向到6002节点了
这是由于redis集群内部会按照crc16算法把集群按16384个卡槽均分存储,而name通过crc16算法计算给分配到6002节点上了,那么就会自动重定向到6002节点存储。所以我们看到我们明明在6001节点set的数据为啥客户端会定向到6002节点的原因。
现在我们再回到6001节点客户端查询刚才存储的name的值
会定向到6002节点,redis分片集群就是通过crc16算法计算卡槽来重定向从哪里读取数据和存储数据,内部自动实现了重定向。
以上就是redis-cluster集群的搭建和测试步骤。
总结:
Redis 集群采用了P2P的模式,完全去中心化。Redis 把所有的 Key 分成了 16384 个 slot,每个 Redis 实例负责其中一部分 slot 。集群中的
所有信息(节点、端口、slot等),都通过节点之间定期的数据交换而更新。
Redis 客户端可以在任意一个 Redis 实例发出请求,如果所需数据不在该实例中,通过重定向命令引导客户端访问所需的实例。redis的服务器节点。它们任何两个节点之间都是相互连通的。客户端可以与任何一个节点相连接,然后就可以访问集群中的任何一个节点。对其进行存取和其他操作。
那么redis是怎么做到的呢?首先,在redis的每一个节点上,都有这么两个东西,一个是插槽(slot)可以理解为是一个可以存储两个数值的一个变量这个变量的取值范围是:0-16383。还有一个就是cluster我个人把这个cluster理解为是一个集群管理的插件。当我们的存取的key到达的时候,redis会根据crc16的算法得出一个结果,然后把结果对 16384 求余数,这样每个 key 都会对应一个编号在 0-16383 之间的哈希槽,通过这个值,去找到对应的插槽所对应的节点,然后直接自动跳转到这个对应的节点上进行存取操作。