Redis-Cluster集群介绍与搭建

一、集群介绍

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 117 2020 redis-3.0.0.tar.gz

解压:tar -zxvf redis-3.0.0.tar.gz

drwxrwxr-x.  6 root root     4096 41 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 41 2015 redis-trib.rb

2.2.4、上传/安装redis-3.0.0.gem

上传至/temp目录

-rw-r--r--.  1 root root    57856 117 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..rdbapeendonly.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.rbruby脚本复制到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

猜你喜欢

转载自blog.csdn.net/shaixinxin/article/details/108544770