目录
一、集群介绍
1.1、简介
1)版本要求:Redis3.0版本开始才支持Cluster;
2)主备要求:集群要求节点必须支持主备模式(即每个master主节点至少有一个slave从节点)
1.2、架构方案
1)每个圈表示一个主节点,任意两个节点之间都可以通信;
2)客户端可以访问任何一个节点,进行数据存取操作;
1.3、投票机制
1)Redis-cluster中各主节点是相互通过ping-pong的方式投票判断节点是否可用;(比如如果有一半以上的主节点去ping某个主节点无响应,则认为其宕机。然后会继续去ping它的从节点,如果也宕机了,则整个集群会进入fail不可用状态)
2)什么状态下集群会不可用?
a、任意集群master节点挂掉,且无slave或slave不可用,进入fail状态;
b、集群半数以上的master节点挂掉(无论slave节点是否可用)
1.4、存储机制
原理
1、redis-cluster会根据crc16算法对操作的key进行计算;
2、将计算结果对16384取余,得到一个0-16383之间的编号;
3、通过整个编号值找到对应hash槽所对应的节点;
4、然后在该节点上面进行数据存取操作;
举例:
在Node1执行 set key hello 操作(以上图说明)
1、crc16算法:比如得到 crc16:key = 26384
2、取余:26384%16384 = 10000
3、哈希槽节点:找到10000对应的哈希槽节点Node2
4、操作:在Node2中真正执行set key hello操作
5、get key hello时原理也一样
二、集群搭建
2.1、准备
1)搭建最小redis-cluster集群,即三对主从(这里使用伪集群)
2)在虚拟机中安装6个redis实例,分别分配端口8001、8002、8003、8004、8005、8006;
3)如果使用已经用过的单机版创建集群,需要删除dump.rdb与apeendonly.aof 文件;
2.2、安装
2.2.1、安装ruby
[root@eureka1 ~]# yum install ruby
...
[root@eureka1 ~]# yum install rubygems
2.2.2、包准备
上传:rz
命令上传至/temp
目录
-rw-r--r--. 1 root root 1358081 1月 17 2020 redis-3.0.0.tar.gz
解压:tar -zxvf redis-3.0.0.tar.gz
drwxrwxr-x. 6 root root 4096 4月 1 2015 redis-3.0.0
2.2.3、找到redis-trib.rb
该文件可以帮助我们创建redis-cluster
,使用ruby语言编写
[root@eureka1 temp]# cd redis-3.0.0/src/
[root@eureka1 src]# ll *.rb
-rwxrwxr-x. 1 root root 48141 4月 1 2015 redis-trib.rb
2.2.4、上传/安装redis-3.0.0.gem
上传至/temp
目录
-rw-r--r--. 1 root root 57856 1月 17 2020 redis-3.0.0.gem
安装
[root@eureka1 temp]# gem install redis-3.0.0.gem
Successfully installed redis-3.0.0
1 gem installed
2.2.5、单机安装(当做为集群安装准备)
编译,进入到解压目录
[root@eureka1 redis-3.0.0]# cd /root/temp/redis-3.0.0
[root@eureka1 redis-3.0.0]# make
安装
[root@eureka1 redis-3.0.0]# make install PREFIX=/usr/local/redis3
拷贝redis.conf
[root@eureka1 redis3]# cp /root/temp/redis-3.0.0/redis.conf /usr/local/redis3/bin/
daemonize no改为yes即可
启动
[root@eureka1 bin]# ./redis-server redis.conf
停止
[root@eureka1 bin]# ./redis-cli shutdown
2.2.6、集群模式安装(6个实例)
1)在/usr/local/
目录下创建redis-cluster
文件夹
[root@eureka1 temp]# cd /usr/local/
[root@eureka1 local]# mkdir redis-cluster
2)将/redis3
目录下的/bin
拷贝到redis-cluster
下,并重命名为redis01
[root@eureka1 redis3]# cp -r bin ../redis-cluster/redis01
[root@eureka1 redis3]#
3)删除redis01中
的dump..rdb
与apeendonly.aof
文件
4)修改redis.conf
配置文件
端口:将默认端口6379
分别改为8001
开启集群:放开cluster-enabled yes
配置注释
5)复制成6个redis实例,并将端口分别修改为8002、8003、8004、8005、8006
[root@eureka1 redis-cluster]# cp -r redis01/ redis02
[root@eureka1 redis-cluster]# cp -r redis01/ redis03
[root@eureka1 redis-cluster]# cp -r redis01/ redis04
[root@eureka1 redis-cluster]# cp -r redis01/ redis05
[root@eureka1 redis-cluster]# cp -r redis01/ redis06
6)将redis-trib.rb
ruby脚本复制到redis-cluster中
[root@eureka1 redis-3.0.0]# cd /root/temp/redis-3.0.0/src/
[root@eureka1 src]# cp redis-trib.rb /usr/local/redis-cluster/
7)创建启动脚本 startall.sh
[root@eureka1 redis-cluster]# vim startall.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 ..
8)脚本授权
[root@eureka1 redis-cluster]# chmod +x startall.sh
9)启动脚本
[root@eureka1 redis-cluster]# ./startall.sh
[root@eureka1 redis-cluster]# ps aux|grep redis
root 4108 0.1 0.6 40596 5688 ? Ssl 13:33 0:00 ./redis-server *:8001 [cluster]
root 4110 0.1 0.4 40596 3660 ? Ssl 13:33 0:00 ./redis-server *:8002 [cluster]
root 4114 0.0 0.4 40596 3660 ? Ssl 13:33 0:00 ./redis-server *:8003 [cluster]
root 4118 0.0 0.4 40596 3700 ? Ssl 13:33 0:00 ./redis-server *:8004 [cluster]
root 4120 0.0 0.4 40596 3664 ? Ssl 13:33 0:00 ./redis-server *:8005 [cluster]
root 4126 0.0 0.4 40596 3612 ? Ssl 13:33 0:00 ./redis-server *:8006 [cluster]
root 4165 0.0 0.1 12320 964 pts/0 S+ 13:33 0:00 grep --color=auto redis
10)创建集群
rb
脚本会自动分配主从节点,1
表示一主一备
[root@eureka1 redis-cluster]# ./redis-trib.rb create --replicas 1 192.168.48.128:8001 192.168.48.128:8002 192.168.48.128:8003 192.168.48.128:8004 192.168.48.128:8005 192.168.48.128:8006
下面日志主节点与从节点分配详情,以及每个主节点的slots哈希槽分配区间;
>>> Performing hash slots allocation on 6 nodes...
Using 3 masters:
192.168.48.128:8001
192.168.48.128:8002
192.168.48.128:8003
Adding replica 192.168.48.128:8004 to 192.168.48.128:8001
Adding replica 192.168.48.128:8005 to 192.168.48.128:8002
Adding replica 192.168.48.128:8006 to 192.168.48.128:8003
M: e85faa81e1260828dbe58118753056796715d81d 192.168.48.128:8001
slots:0-5460 (5461 slots) master
M: 86ce0943516ebbe30e5f3cebf40b7076f46212c7 192.168.48.128:8002
slots:5461-10922 (5462 slots) master
M: b1736ef65c852458e27288162ff82e926fc16ace 192.168.48.128:8003
slots:10923-16383 (5461 slots) master
S: f5c3b41dc41437ab514995c2f5952b53a6eb2a14 192.168.48.128:8004
replicates e85faa81e1260828dbe58118753056796715d81d
S: 0a2a99d9940faa104d4b0b1137f98ec7277974d6 192.168.48.128:8005
replicates 86ce0943516ebbe30e5f3cebf40b7076f46212c7
S: e1f4a09028d9aeeedc8b125e7ba3238dde6a21a9 192.168.48.128:8006
replicates b1736ef65c852458e27288162ff82e926fc16ace
Can I set the above configuration? (type 'yes' to accept): yes
11)通过节点中的nodes.conf
文件,可以查看节点中的集群信息
[root@eureka1 redis01]# cat /usr/local/redis-cluster/redis01/nodes.conf
0a2a99d9940faa104d4b0b1137f98ec7277974d6 192.168.48.128:8005 slave 86ce0943516ebbe30e5f3cebf40b7076f46212c7 0 1599918231045 5 connected
e1f4a09028d9aeeedc8b125e7ba3238dde6a21a9 192.168.48.128:8006 slave b1736ef65c852458e27288162ff82e926fc16ace 0 1599918230327 6 connected
e85faa81e1260828dbe58118753056796715d81d 192.168.48.128:8001 myself,master - 0 0 1 connected 0-5460
b1736ef65c852458e27288162ff82e926fc16ace 192.168.48.128:8003 master - 0 1599918230021 3 connected 10923-16383
86ce0943516ebbe30e5f3cebf40b7076f46212c7 192.168.48.128:8002 master - 0 1599918227975 2 connected 5461-10922
f5c3b41dc41437ab514995c2f5952b53a6eb2a14 192.168.48.128:8004 slave e85faa81e1260828dbe58118753056796715d81d 0 1599918228998 4 connected
vars currentEpoch 6 lastVoteEpoch 0
12)测试集群
可以连接任意一个节点,但是需要加上-c
参数,否则会当做单机模式,操作失败
[root@eureka1 redis-cluster]# ./redis01/redis-cli -h 192.168.48.128 -p 8001 -c
192.168.48.128:8001> set name haha
-> Redirected to slot [5798] located at 192.168.48.128:8002
OK
192.168.48.128:8002> get name
"haha"
13)关闭集群
创建shutdownall.sh
脚本
[root@eureka1 redis-cluster]# vim shutdownall.sh
./redis01/redis-cli -h 192.168.48.128 -p 8001 shutdown
./redis01/redis-cli -h 192.168.48.128 -p 8002 shutdown
./redis01/redis-cli -h 192.168.48.128 -p 8003 shutdown
./redis01/redis-cli -h 192.168.48.128 -p 8004 shutdown
./redis01/redis-cli -h 192.168.48.128 -p 8005 shutdown
./redis01/redis-cli -h 192.168.48.128 -p 8006 shutdown
[root@eureka1 redis-cluster]# chmod +x shutdownall.sh
[root@eureka1 redis-cluster]# ./shutdownall.sh
[root@eureka1 redis-cluster]# ps aux|grep redis
root 5365 0.0 0.1 12320 968 pts/0 R+ 14:02 0:00 grep --color=auto redis