redis cluster集群—高可用

1.概述

在前面的文章中介绍过了redis的主从和哨兵两种集群方案,redis从3.0版本开始引入了redis-cluster(集群)。
从主从-哨兵-集群可以看到redis的不断完善;主从复制是最简单的节点同步方案无法主从自动故障转移。
哨兵可以同时管理多个主从同步方案同时也可以处理主从自动故障转移,通过配置多个哨兵节点可以解决单点网络故障问题,
但是单个节点的性能压力问题无法解决。集群解决了前面两个方案的所有问题。

redis最开始使用主从模式做集群,若master宕机需要手动配置slave转为master;后来为了高可用提出来哨兵模式,该模式下有一个哨兵监视master和slave,若master宕机可自动将slave转为master,但它也有一个问题,就是不能动态扩充;所以在3.x提出cluster集群模式。

(1)Redis-Cluster采用无中心结构
每个节点都和其它节点通过互ping保持连接,每个节点保存整个集群的状态信息,可以通过连接任意节点读取或者写入数据
(甚至是没有数据的空节点)。

(2)只有当集群中的大多数节点同时fail整个集群才fail
一般情况下是集群当中超过一半以上的节点fail的时候,集群才会fail

(3)整个集群有16384个slot
当需要在 Redis 集群中放置一个key-value 时,根据 CRC16(key) mod 16384的值,决定将一个key放到哪个桶中。
读取一个key时也是相同的算法。

(4)当主节点fail时从节点会升级为主节点
fail的主节点online之后自动变成了从节点

2.Redis 集群的数据分片

Redis 集群没有使用一致性hash, 而是引入了 哈希槽的概念.

Redis 集群有16384个哈希槽,每个key通过CRC16校验后对16384取模来决定放置哪个槽.集群的每个节点负责一部分hash槽,举个例子,比如当前集群有3个节点,那么:

节点 A 包含 0 到 5500号哈希槽.
节点 B 包含5501 到 11000 号哈希槽.
节点 C 包含11001 到 16384号哈希槽.

这种结构很容易添加或者删除节点. 比如如果我想新添加个节点D, 我需要从节点 A, B, C中得部分槽到D上.
如果我想移除节点A,需要将A中的槽移到B和C节点上,然后将没有任何槽的A节点从集群中移除即可.
由于从一个节点将哈希槽移动到另一个节点并不会停止服务,所以无论添加删除或者改变某个节点的哈希槽的数量都不会造成集群不可用的状态.

3.Redis集群介绍

Redis 集群是一个提供在多个Redis间节点间共享数据的程序集。

Redis集群并不支持处理多个keys的命令,因为这需要在不同的节点间移动数据,从而达不到像Redis那样的性能,在高负载的情况下可能会导致不可预料的错误.

Redis 集群通过分区来提供一定程度的可用性,在实际环境中当某个节点宕机或者不可达的情况下继续处理命令. Redis 集群的优势:

自动分割数据到不同的节点上。
整个集群的部分节点失败或者不可达的情况下能够继续处理命令。

在这里插入图片描述其结构特点:

1、所有的redis节点彼此互联(PING-PONG机制),内部使用二进制协议优化传输速度和带宽。
2、节点的fail是通过集群中超过半数的节点检测失效时才生效。
3、客户端与redis节点直连,不需要中间proxy层.客户端不需要连接集群所有节点,连接集群中任何一个可用节点即可。
4、redis-cluster把所有的物理节点映射到[0-16383]slot上(不一定是平均分配),cluster 负责维护node<->slot<->value。
5、Redis集群预分好16384个桶,当需要在 Redis 集群中放置一个 key-value 时,根据 CRC16(key) mod 16384的值,决定将一个key放到哪个桶中。
链接:https://www.jianshu.com/p/813a79ddf932

a.redis cluster节点分配
现在我们是三个主节点分别是:A, B, C 三个节点,它们可以是一台机器上的三个端口,也可以是三台不同的服务器。那么,采用哈希槽 (hash slot)的方式来分配16384个slot 的话,它们三个节点分别承担的slot 区间是:

节点A覆盖0-5460;

节点B覆盖5461-10922;

节点C覆盖10923-16383.

获取数据:
如果存入一个值,按照redis cluster哈希槽的算法: CRC16('key')384 = 6782。
 那么就会把这个key 的存储分配到 B 上了。同样,当我连接(A,B,C)任何一个节点想获取'key'这个key时,
 也会这样的算法,然后内部跳转到B节点上获取数据

新增一个主节点:
新增一个节点D,redis cluster的这种做法是从各个节点的前面各拿取一部分slot到D上,我会在接下来的实践中实验。大致就会变成这样:

节点A覆盖1365-5460

节点B覆盖6827-10922

节点C覆盖12288-16383

节点D覆盖0-1364,5461-6826,10923-12287

同样删除一个节点也是类似,移动完成后就可以删除这个节点了。

由于从一个节点将哈希槽移动到另一个节点并不会停止服务,
所以无论添加删除或者改变某个节点的哈希槽的数量都不会造成集群不可用的状态.

b.Redis Cluster主从模式

redis cluster
为了保证数据的高可用性,加入了主从模式,一个主节点对应一个或多个从节点,主节点提供数据存取,从节点则是从主节点拉取数据备份,当这个主节点挂掉后,就会有这个从节点选取一个来充当主节点,从而保证集群不会挂掉

上面那个例子里, 集群有ABC三个主节点,
如果这3个节点都没有加入从节点,如果B挂掉了,我们就无法访问整个集群了。A和C的slot也无法访问。

所以我们在集群建立的时候,一定要为每个主节点都添加了从节点, 比如像这样, 集群包含主节点A、B、C, 以及从节点A1、B1、C1,
那么即使B挂掉系统也可以继续正确工作。

B1节点替代了B节点,所以Redis集群将会选择B1节点作为新的主节点,集群将会继续正确地提供服务。
当B重新开启后,它就会变成B1的从节点。

不过需要注意,如果节点B和B1同时挂了,Redis集群就无法继续正确地提供服务了。

5.什么是哈希槽?

Redis 集群没有使用一致性hash, 而是引入了哈希槽的概念。 Redis集群有16384个哈希槽,每个key通过CRC16校验后对16384取模来决定放置哪个槽.集群的每个节点负责一部分hash槽。
这种结构很容易添加或者删除节点,并且无论是添加删除或者修改某一个节点,都不会造成集群不可用的状态。
使用哈希槽的好处就在于可以方便的添加或移除节点。 当需要增加节点时,只需要把其他节点的某些哈希槽挪到新节点就可以了;
当需要移除节点时,只需要把移除节点上的哈希槽挪到其他节点就行了; 在这一点上,我们以后新增或移除节点的时候不用先停掉所有的 redis服务。

redis集群

http://www.redis.cn/topics/cluster-tutorial.html	##配置复制官网的

#先关闭之前的redis
[root@server1 ~]# /etc/init.d/redis_6379 stop

在这里插入图片描述
(1)在server1上创建 6个Redis 节点
首先在 server1 机器上 /usr/local/目录下创建 redis_cluster 目录;
在 redis_cluster 目录下,创建名为7001、7002、7003、7004、7005、7006的目录
进入7001目录,编写redis.conf文件

#新建redis目录
[root@server1 ~]# mkdir /usr/local/rediscluster

[root@server1 rediscluster]# mkdir 700{1..6}

#编辑配置文件

[root@server1 7001]# cat redis.conf 
port 7001       //端口7001,7002,7003,7004,7005,7006  
cluster-enabled yes   ##开启集群
cluster-config-file nodes.conf  ##集群的配置,配置文件首次启动自动生成7001-7006
cluster-node-timeout 5000  ##请求超时,默认5秒,可自行设置
appendonly yes  ##aof日志开启,有需要的开启,它会每次写操作都记录一条日志。
pidfile "/usr/local/rediscluster/7001/redis.pid"
logfile "/usr/local/rediscluster/7001/redis.log"
daemonize yes   ##redis后台运行
dir "/usr/local/rediscluster/7001"

在这里插入图片描述在这里插入图片描述

#启动
[root@server1 7001]# redis-server redis.conf

#查看
ps ax

 1332 ?        Ssl    0:00 redis-server *:7000 [cluster]

在这里插入图片描述在这里插入图片描述同时配置其他5个节点,并且开启服务
在这里插入图片描述全部替换
在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述查看6个节点全部开启
在这里插入图片描述

#测试
[root@server1 7001]# redis-cli -p 7001
127.0.0.1:7001> info

# Cluster
cluster_enabled:1	##集群激活

#同理配置7002~7006,并启动

 ps ax

 1348 ?        Ssl    0:00 redis-server *:7001 [cluster]
 1382 ?        Ssl    0:00 redis-server *:7002 [cluster]
 1388 ?        Ssl    0:00 redis-server *:7003 [cluster]
 1394 ?        Ssl    0:00 redis-server *:7004 [cluster]
 1400 ?        Ssl    0:00 redis-server *:7005 [cluster]
 1405 ?        Ssl    0:00 redis-server *:7006 [cluster]

起了6个之后 redis-cli -p 7001 -->info 查看slave为0
因为需要联系 整合

在这里插入图片描述在这里插入图片描述

创建集群 --help


#拷贝ruby脚本
[root@server1 src]# pwd
/root/redis-5.0.3/src

[root@server1 src]# cp redis-trib.rb /usr/local/bin/

在这里插入图片描述

#执行命令
[root@server1 src]# redis-trib.rb 
/usr/bin/env: ruby: No such file or directory	##报错了,因为没有ruby

[root@server1 src]# yum install -y ruby

在这里插入图片描述

[root@server1 src]# redis-trib.rb
WARNING: redis-trib.rb is not longer available!
You should use redis-cli instead.	##redis-trib.rb不可用了,用redis-cli

[root@server1 ~]# redis-cli --cluster help

在这里插入图片描述在这里插入图片描述在server1上创建redis-cluster集群

#创建集群
注意:要指定一主一从
[root@server1 ~]# redis-cli --cluster create --cluster-replicas 1 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005 127.0.0.1:7006   

#--cluster-replicas 1表示为每一个master创建1个slave

然后输入yes

[OK] All 16384 slots covered.	#看到这个表示16384个槽都分配好了

在这里插入图片描述在这里插入图片描述

#三个主三个slave 三个主互相联系

#测试集群有用没 -c -p

#查看集群信息
[root@server1 ~]# redis-cli --cluster info 127.0.0.1:7001	##输入其他端口也可以,但是必须输一个端口

#测试存储信息
[root@server1 ~]# redis-cli -c -p 7001  (也可以info查看server1的slave是7002)
127.0.0.1:7001> set name wsp
-> Redirected to slot [5798] located at 127.0.0.1:7002
OK
127.0.0.1:7002> get name
"wsp"

#数据保存在5798个哈希槽中,在7002上

在这里插入图片描述

[root@server1 ~]# redis-cli -c -p 7005
127.0.0.1:7005> get name
-> Redirected to slot [5798] located at 127.0.0.1:7002
"wsp"	#在任意节点都可以获取到信息,但是都会跳转到7002

在这里插入图片描述

##挂掉7002,key还会保存在7004上
[root@server1 ~]# redis-cli -c -p 7005
127.0.0.1:7005> get name
-> Redirected to slot [5798] located at 127.0.0.1:7002
"wsp"
127.0.0.1:7002> SHUTDOWN
not connected> 

################################################################
[root@server1 src]# redis-cli -c -p 7001
127.0.0.1:7001> get name
-> Redirected to slot [5798] located at 127.0.0.1:7002
Could not connect to Redis at 127.0.0.1:7002: Connection refused
Could not connect to Redis at 127.0.0.1:7002: Connection refused
not connected> exit
[root@server1 src]# redis-cli --cluster info 127.0.0.1:7001
Could not connect to Redis at 127.0.0.1:7002: Connection refused
127.0.0.1:7001 (70f07453...) -> 0 keys | 5461 slots | 1 slaves.
127.0.0.1:7006 (3d5a0313...) -> 1 keys | 5462 slots | 0 slaves.
127.0.0.1:7003 (ae486b18...) -> 0 keys | 5461 slots | 1 slaves.
[OK] 1 keys in 3 masters.
0.00 keys per slot on average.
[root@server1 src]# redis-cli -c -p 7001
127.0.0.1:7001> get name
-> Redirected to slot [5798] located at 127.0.0.1:7006

################################################################
##
[root@server1 ~]# redis-cli --cluster info 127.0.0.1:7001
Could not connect to Redis at 127.0.0.1:7002: Connection refused
127.0.0.1:7001 (4f5065af...) -> 0 keys | 5461 slots | 1 slaves.
127.0.0.1:7004 (fc590a43...) -> 1 keys | 5462 slots | 0 slaves.
127.0.0.1:7003 (0b2f0c60...) -> 0 keys | 5461 slots | 1 slaves.
[OK] 1 keys in 3 masters.
0.00 keys per slot on average.

##再挂掉7004,key丢失
[root@server1 ~]# redis-cli -c -p 127.0.0.1:7004
Could not connect to Redis at 127.0.0.1:127: Connection refused
not connected> 
[root@server1 ~]# redis-cli -c -p 7004
127.0.0.1:7004> SHUTDOWN
not connected> 

##查看发现只有两个master了
[root@server1 ~]# redis-cli --cluster info 127.0.0.1:7001
Could not connect to Redis at 127.0.0.1:7004: Connection refused
Could not connect to Redis at 127.0.0.1:7002: Connection refused
127.0.0.1:7001 (4f5065af...) -> 0 keys | 5461 slots | 1 slaves.
127.0.0.1:7003 (0b2f0c60...) -> 0 keys | 5461 slots | 1 slaves.
[OK] 0 keys in 2 masters.
0.00 keys per slot on average.

##
[root@server1 ~]# redis-cli -c -p 7001
127.0.0.1:7001> get name
(error) CLUSTERDOWN The cluster is down  ##及集群已经down

##挂掉7002,key还会保存在7005上
在这里插入图片描述
再挂掉7005,key丢失
在这里插入图片描述
在挂掉server2之后查看集群的状况,发现server2的slave节点server5自动变为新的master了 redis-cli --cluster check 127.0.0.1:7001
发现7005变成了master,并且有一个key,且没有slave
ps aux 查看进程也没有7002的了
然后将server5也down掉
再次查看发现只有两个master了 redis-cli --cluster info 127.0.0.1:7001
检查集群中的哈希槽已经不够用了,集群已经down了
redis-cli --cluster check 127.0.0.1:7001

[root@server1 ~]# cd /usr/local/rediscluster/
[root@server1 7002]# cat appendonly.aof 
*2
$6
SELECT
$1
0
*3
$3
set
$4
name
$3
wsp

#可以看到刚才添加的信息

在这里插入图片描述在这里插入图片描述

#再启动7002和7004  ###注意4和2一定是匹配的
[root@server1 7002]# redis-server redis.conf
[root@server1 7004]# redis-server redis.conf

[root@server1 ~]# redis-cli -c -p 7001
127.0.0.1:7001> get name
-> Redirected to slot [5798] located at 127.0.0.1:7006
"wsp"
#正常查询

在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述注意:当集群当中的一半以上的master都down掉以后,集群也会down掉了
redis-cli -p 7001 shutdown
redis-cli -p 7003 shutdown
尝试进入集群发现集群已经down了

redis添加新节点

[root@server1 rediscluster]# cp 7001/redis.conf 7007/
[root@server1 rediscluster]# cp 7001/redis.conf 7008/

在这里插入图片描述在这里插入图片描述在这里插入图片描述

[root@server1 7007]# redis-server redis.conf
[root@server1 7008]# redis-server redis.conf

在这里插入图片描述在这里插入图片描述

[root@server1 7008]# redis-cli --cluster add-node 127.0.0.1:7007 127.0.0.1:7001	##添加节点

在这里插入图片描述

[root@server1 7008]# redis-cli -c -p 7007
127.0.0.1:7007> cluster nodes	##查看节点信息

b9ee016d45dde6a0067dd3e19139f1044a621d77 127.0.0.1:7007@17007 myself,master - 0 1554949235000 0 connected
#发现7007没有哈希槽
#尽管新节点没有包含任何哈希槽, 但它仍然是一个主节点, 所以在集群需要将某个从节点升级为新的主节点时, 这个新节点不会被选中,所以要添加一个slave

[root@server2 ~]# redis-cli --cluster help	##查看帮助

  add-node       new_host:new_port existing_host:existing_port
                 --cluster-slave
                 --cluster-master-id <arg>


[root@server1 ~]# redis-cli --cluster add-node 127.0.0.1:7008 127.0.0.1:7007 --cluster-slave --cluster-master-id b9ee016d45dde6a0067dd3e19139f1044a621d77

在这里插入图片描述

[root@server1 ~]# redis-cli -c -p 7001
127.0.0.1:7001> cluster nodes	##查看

[root@server1 ~]# redis-cli --cluster info 127.0.0.1:7001	##查看集群信息

在这里插入图片描述

##为新节点分配哈希槽
[root@server1 ~]# redis-cli --cluster reshard 127.0.0.1:7007

How many slots do you want to move (from 1 to 16384)? 300	##随便分配一点

What is the receiving node ID? b9ee016d45dde6a0067dd3e19139f1044a621d77	##接收哈希槽的节点ID

Please enter all the source node IDs.
  Type 'all' to use all the nodes as source nodes for the hash slots.
  Type 'done' once you entered all the source nodes IDs.
Source node #1: all 这个意思是从所以的节点里选出500个槽位
#从所有节点获取哈希槽

在这里插入图片描述在这里插入图片描述在这里插入图片描述
[root@server1 ~]# redis-cli --cluster check 127.0.0.1:7001 ##检查可以看到已经分配哈希槽
在这里插入图片描述

####但是上面分配不均等,可能导致数据不同步
[root@server1 ~]# redis-cli --cluster rebalance --cluster-threshold 1 --cluster-use-empty-masters 127.0.0.1:7001	##均分哈希槽

[root@server1 ~]# redis-cli --cluster check 127.0.0.1:7001

在这里插入图片描述在这里插入图片描述在这里插入图片描述

##查看数据
[root@server1 ~]# redis-cli -c -p 7008
127.0.0.1:7008> get name
-> Redirected to slot [5798] located at 127.0.0.1:7007
"wsp"

####集群完成####

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值