Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Redis6安装(下) - 集群与故障转移

Redis6安装(下) - 集群与故障转移

作者头像
风间影月
发布于 2020-12-24 06:59:08
发布于 2020-12-24 06:59:08
82900
代码可运行
举报
文章被收录于专栏:BeJavaGodBeJavaGod
运行总次数:0
代码可运行

Redis Cluster 搭建准备工作

  1. 搭建集群之前,务必有一点需要注意就是选举,因为在如今很多的分布式中间件里,集群都会有选举这个概念,一定要达到半数以上的节点,才能够发起公平的投票,否则就会脑裂,比如redis,zk,es等,所以至少保证3个master节点,master会发起选举投票的。这一点要须知。
  2. 配置6个节点的虚拟机(预先做好)
    • 192.168.1.221
    • 192.168.1.222
    • 192.168.1.223
    • 192.168.1.224
    • 192.168.1.225
    • 192.168.1.226
    • 192.168.1.227(新增Master)
    • 192.168.1.228(新增Slave)
  3. 每个节点搭建单机redis,清理aof和rdb文件(预先做好)
  4. 如果为单实例的Redis设置了密码password,那么每个节点都必须要设置masterauth,也就是对应密码,这样是为了master挂掉以后,对应的slave可以升级为master。
  5. 需要注意,选举的过程会短暂的对外不可用。

Redis Cluster 搭建实操演练

附: 关闭redis

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
./redis-cli -p <修改的端口号> -a <修改的密码> shutdown

开启redis:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
./redis-server redis.conf

每个单实例中的 redis.conf 配置:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 配置redis日志,便于检查
logfile /usr/local/redis/redis-221.log

# 开启集群模式
cluster-enabled yes
# 每一个节点需要有一个配置文件,需要6份。每个节点处于集群的角色都需要告知其他所有节点,彼此知道,这个文件用于存储集群模式下的集群状态等信息,这个文件是由redis自己维护,我们不用管。如果你要重新创建集群,那么把这个文件删了就行
cluster-config-file nodes-221.conf
# 超时时间,超时则认为master宕机,随后主备切换
cluster-node-timeout 5000
# 开启AOF
appendonly yes

创建集群,在任意节点运行如下命令一次:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#####
# 注意1:如果你使用的是redis3.x版本,需要使用redis-trib.rb来构建集群,最新版使用C语言来构建了,这个要注意
# 注意2:以下为新版的redis构建方式
#####

# 创建集群,主节点和从节点比例为11-3为主,4-6为从,这也是最经典用的最多的集群模式。cluster-replicas是几个slave,-a是执行秘密。
./redis-cli --cluster create ip1:port1 ip2:port2 ip3:port3 ip4:port4 ip5:port5 ip6:port6 --cluster-replicas 1 -a 123456

从上图中可以看到,slots槽,用于装数据,主节点有,从节点没有。

在任意节点查看集群信息:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
./redis-cli --cluster check 192.168.1.221:6379 -a 123456

查看主从状态信息:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
./redis-cli -a 123456
info replication

搭建集群时的日志

M221与S225

M222与S226

M223与S224

从节点日志,主要进行复制:

cluster nodes 查看各个节点的信息

故障转移

如果一个master挂了,那么剩余的2个master会发起投票选举,从挂了的master对应的slave中选举出一个新的master,发生故障的master不会参与投票,这个要注意。

选举的时候需要半数以上的master都投票给同一个slave,那么他才会成为新的master。所以redis集群中至少需要3个主节点,2个是不行的。而且我们也是建议在不同的物理节点上去进行配置,如果是伪分布式集群,那么可能会有问题。

故障转移的主要流程首先是主观下线,然后是客观下线,这个我们在课程里有说过,要以客观为主,也就是半数以上的master都收不到某节点的心跳,则认为他宕机了,此时发起选举。

验证故障转移

  1. redis宕机,停止某一台master,观察日志,以及对应的从。

上图中,225升级为master,原来的221下线。slots自动重新分配。

  1. 重启原来的221,可以发现,他加入到了225的麾下,成为他的slave,并且进行了主从数据同步

在新的主225中可以看到221的加入ask询问同步等信息

  1. 直接关闭225服务器,直接关停,相当于服务器炸了。测试后发现,221成为新的master,也就是说不论是redis宕机还是服务器炸了,对应的slave都能被选举为新的master,因为只要master集群客观认为你下线了,那么就会进行选举。

验证数据能否都在主从中获取

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
./redis-cli -a 123456 -c
 set name lee

集群中设值与取值,需要加-c。 图中数据进入到了主222中,那么验证一下从某个从节点中能不能获取,他会跳转到222中去获取,因为现在是一个集群形态。

如果不加-c,以单实例形式去操作,那么会报错。

关闭主222,观察原来设置的数据,在slave226转变为master后,数据是否存在:

因为数据会主从同步,所以master宕机后,slave中还是会有他的数据。这些数据都是跟着slot走的。

master宕机,他的slave升级为master,再次宕机,看看剩余的2主2从能否运行

紧接上面的,接着关闭新主226,剩余2主2从,查看状态,你会发现出错,提示说slots分配不均匀,因为有一对主从没有的slot都没了。

随后在任意节点去查询数据,提示说当前集群不可用,我们需要恢复了。

多master宕机数超过半数以上,集群不可用

同时有2个redis-master都宕机,那么无法达到半数以上,此时无法选举,当前集群不可用。由于速度比较快,虚拟机里难以演示,所以此处意会一下哈~ (如果半数以上 Master 处于关闭状态那么整个集群处于不可用状态。)

集群节点通信 gossip了解即可,无需深究

redis集群模式下的几个节点之间也会相互通信,他们的通信协议是gossip,各个节点之间会有ping pong等消息类型,每个节点也维护着redis的元数据,一旦发生更改会相互发送。

redis 水平扩容,增加节点,重新shard分配slot

新增192.168.1.227 修改redis.conf文件后,启动服务。查看分片信息:

对比现有的master

对比后他自己虽然标识master,但是没起作用,也没加入到现有的集群

这个时候需要使用如下命令,把节点加入到当前集群:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 添加一个新的节点到现有的集群中。第一个ip为新节点,第二个ip为现有集群中的某个节点ip
新增192.168.1.227
./redis-cli --cluster add-node 192.168.1.227:6379 192.168.1.221:6379 -a 123456

如上图,新节点,加入成功。

这个时候新加入的节点为master了,但是从图中看的出来,并没有slot槽位信息,我们还需要重新分槽,才能使用。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# ip端口是集群中任意一个节点和对应端口号
./redis-cli --cluster reshard  ip:port -a 密码

询问需要迁移多少个slots,迁移之后,原来的数据还是存在与slots中的,因为哈希后取模的接口还是对应某个slot,数据还在。

填入需要迁移的节点id,也就是新增的master的id,复制进去。

随后输入all,表示从每个现有master中都取出一定的slot进行迁移。(done的话是从指定的节点中拿出一部分slot来迁移) 然后再yes,表示执行reshard操作。

等待一段时间迁移后,迁移成功。重新检查集群信息。这个时候227中有2000个slot,分别都是从其他节点迁移的一部分共同组合的。

如此一来,新的master节点加入到集群了。

之前的name是在别的master中,由于slot迁移了,这个时候再查询的时候,他会路由到227节点,说明了数据不会因为节点增加而丢失,都会跟着slot走。

测试关闭这台新的master,由于slot不完整,集群不可用。其实也就是说明了整个集群形态下,总数16384个哈希槽必须都存在,缺少了就不完整了。所以就必定需要使用高可用,每个master下都要挂在至少1个slave。

新加slave,把他安排到某个特定的master之下

执行如下命令:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
./redis-cli --cluster add-node --cluster-slave --cluster-master-id [master-id] [slave-ip:port] [master-ip:port]

添加节点成功。 这个时候查看,可以看到228加入到集群,并且成为了slave:

228的分片信息slave归属为227,如此一来slave添加到某个master下成功了。

Redis集群总结

  1. 读写都是在master,slave加入集群,会进行数据同步,连接集群中的任意主或从节点去读写数据,都会根据key哈希取模后路由到某个master节点去处理。slave不提供读写服务,只会同步数据。
  2. 关闭任意一主,会导致部分写操作失败,是由于从节点不能执行写操作,在Slave升级为Master期间会有少量的失败。
  3. 关闭从节点对于整个集群没有影响
  4. 某个主节点和他麾下的所有从节点全部挂掉,我们集群就进入faill状态,不可用。因为slot不完整。
  5. 如果集群超过半数以上master挂掉,无论他们是否有对应slave,集群进入fail状态,因为无法选举。
  6. 如果集群中的任意master宕机,且此master没有slave。集群不可用。(同3)
  7. 投票选举过程是集群中所有master参与,如果半数以上master节点与master节点通信超时(cluster-node-timeout),认为当前master节点挂掉。
  8. 选举只会针对某个master下的所有slave选举,而不是对所有全量的slave选举。
  9. 原先的master重新恢复连接后,他会成为新master的从服务器。由于主从同步,客户端的写入命令,有可能会丢失(为啥?参考主从复制原理AOF与RDB)。redis并非强一致性,由于主从特性,所以最后一部分数据会丢失。CAP理论。
  10. 集群只实现了主节点的故障转移;从节点故障时只会被下线,不会进行故障转移。因此,使用集群时,一般不会使用读写分离技术,因为从节点故障会导致读服务不可用,可用性变差了。所以不要在集群里做读写分离。
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-12-16,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 BeJavaGod 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Redis高可用(cluster集群):从单点故障到集群弹性扩展
这里推荐一篇实用的文章:《图灵测试到底是什么?怎么才能测试通过》,作者:【用户10024547】。
Lion 莱恩呀
2024/11/20
4890
Redis高可用(cluster集群):从单点故障到集群弹性扩展
4.Redis基础运维之哨兵和集群安装配置
描述: 哨兵模式是主从的升级版,因为主从的出现故障后,不会自动恢复,需要人为干预,这就很蛋疼啊。在主从的基础上,实现哨兵模式就是为了监控主从的运行状况,对主从的健壮进行监控,就好像哨兵一样,只要有异常就发出警告,对异常状况进行处理。
全栈工程师修炼指南
2022/09/28
1.3K0
4.Redis基础运维之哨兵和集群安装配置
慕课网2021-01-29 Redis6直播笔记 - 下(多线程/哈希slot/集群)
以前的redis是单线程模型,其实就是多路复用机制,知道多路复用的来一波6,我们在架构师课程中讲过,那么netty也有,看过老师相关课程的也应该知道。这里不多说了。
风间影月
2021/02/05
3790
慕课网2021-01-29 Redis6直播笔记 - 下(多线程/哈希slot/集群)
Redis 高可用集群原理和实践
Redis 集群是 Redis 提供的分布式数据库方案,集群痛殴分片(sharding)来进行数据共享,并提供复制和故障转移能力。
PHP开发工程师
2022/05/31
4000
Redis 高可用集群原理和实践
一文搞懂 Redis 的三种集群方案
在开发测试环境中,我们一般搭建Redis的单实例来应对开发测试需求,但是在生产环境,如果对可用性、可靠性要求较高,则需要引入Redis的集群方案。虽然现在各大云平台有提供缓存服务可以直接使用,但了解一下其背后的实现与原理总还是有些必要(比如面试), 本文就一起来学习一下Redis的几种集群方案。
iMike
2020/11/24
11.3K0
一文搞懂 Redis 的三种集群方案
Redis 集群
所谓的集群,就是通过添加服务器的数量,提供相同的服务,从而让服务器达到一个稳定、高效的状态(高可用)。
Carlos Ouyang
2019/08/19
1.9K0
Redis 集群
Redis系列:Redis主从、哨兵、集群介绍
主从复制模式就是,部署多台 Redis 节点,其中只有一台节点是主节点(Master),其他的节点都是从节点(Slave),也叫备份节点(Replica)。只有 Master 节点提供数据的事务性操作(增删改),Slave 节点只提供读操作。所有 Slave 节点的数据都是从 Master 节点同步过来的
栗筝i
2022/12/01
5.3K0
Redis系列:Redis主从、哨兵、集群介绍
Redis技术知识总结之五——Redis集群模式
Redis 集群模式有三种:主从模式(Redis 2.8 版本之前)、哨兵模式(Redis 3.0 之前)、集群模式(Redis 3.0 之后)。
剑影啸清寒
2020/07/09
6990
Redis集群搭建及原理解剖
在前面的文章,已经写过redis主从架构和redis哨兵架构了,那么本文介绍的是redis集群架构,redis集群是当前大型互联网公司常用的架构模式了,由于它的强大高效而又便捷的功能,得到了广泛的使用。
黎明大大
2021/03/09
1.3K0
Redis入坟(六)分布式集群,概念、原理、实操
可用性、数据安全、性能都可以通过搭建多个 Reids 服务实现。其中有一个是主节点(master),可以有多个从节点(slave)。主从之间通过数据同步,存储完全相同的数据。如果主节点发生故障,则把某个从节点改成主节点,访问新的主节点。
源码之路
2020/09/04
8600
Redis入坟(六)分布式集群,概念、原理、实操
Redis Cluster 集群的介绍
Redis 集群模式是 Redis 提供的分布式解决方案,哨兵解决了高可用的问题,而集群就是终极方案,一举解决高可用和分布式问题。在集群模式下,数据会被分散在多个 Redis 节点上,每个节点负责存储整个数据库的一部分,这种方式称为数据分片。
栗筝i
2023/10/16
8550
Redis Cluster 集群的介绍
深入理解Redis Cluster
Redis Cluster采用虚拟槽分区,所有的key根据哈希函数映射到0~16383槽内,计算公式:
星哥玩云
2022/08/18
3970
Redis 部署架构
由于单机模式在⾼并发下会出现性能瓶颈,升级到⼀主多从的⽅式,master节点处理写操作,slave节点处理从操作,slave从master同步数据。
羽毛球初学者
2024/10/13
6580
一文读懂 Redis 集群
前面写完了 Redis 的主从复制、哨兵模式、Redis 持久化方式。这篇文章开始写 Redis 集群啦。
程序员爱酸奶
2020/02/29
8.5K0
Redis原理—3.复制、哨兵和集群
命令传播操作用于在主服务器的数据库状态被修改,导致主从服务器的数据库状态出现不一致时,让主从服务器的数据库重新回到一致状态。
东阳马生架构
2025/02/24
2340
Redis6.0主从、哨兵、集群搭建和原理
由于单机Redis存储能力受单机限制,以及无法实现读写操作的负载均衡和读写分离,无法保证高可用。本篇就来介绍 Redis 集群搭建方案及实现原理,实现Redis对数据的冗余备份,从而保证数据和服务的高可用。主从复制是哨兵和集群的基石,因此我们循序渐进,由浅入深一层层的将Redis高可用方案抽丝剥茧展示在大家面前。
王知无-import_bigdata
2020/07/22
4.1K0
Redis6.0主从、哨兵、集群搭建和原理
一文读懂Redis的三种模式(下)
在上一篇中,我们简单介绍了Redis三种模式中的两种模式,即主从模式、Sentinel模式,并对这两种模式的优缺点进行了总结:
高性能架构探索
2021/04/13
5490
Redis 高可用篇:Cluster 集群能支撑的数据有多大?
本文将对集群的节点、槽指派、命令执行、重新分片、转向、故障转移、消息等各个方面进行深入拆解。
码哥字节
2021/04/23
1.5K0
Redis 高可用篇:Cluster 集群能支撑的数据有多大?
通过 Docker 部署 Redis 集群
在 Redis 3.0 版本后正式推出 Redis 集群模式,该模式是 Redis 的分布式的解决方案,是一个提供在多个 Redis 节点间共享数据的程序集,且 Redis 集群是去中心化的,它的每个 Master 节点都可以进行读写数据,每个节点都拥有平等的关系,每个节点都保持各自的数据和整个集群的状态。
JAVA葵花宝典
2021/04/08
9450
通过 Docker 部署 Redis 集群
Redis集群机制及一个Redis架构演进实例
Redis的replication机制允许slave从master那里通过网络传输拷贝到完整的数据备份,从而达到主从机制。为了实现主从复制,我们准备三个redis服务,依次命名为master,slave1,slave2。
程序视点
2025/03/16
1670
相关推荐
Redis高可用(cluster集群):从单点故障到集群弹性扩展
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验