您当前的位置:首页 > 电脑百科 > 数据库 > Redis

Redis集群搭建及选举原理

时间:2020-03-18 10:47:27  来源:  作者:

redis集群简述

哨兵模式中如果主从中 master宕机了,是通过哨兵来选举出新的master,在这个选举切换主从的过程,整个redis服务是不可用的。而且哨兵模式中只有一个主节点对外提供服务,因此没法支持更高的并发。而且当个主节点的内存设置也不宜过大。否则会导致持久化文件过大,影响数据恢复或主从同步的效率。

redis集群是由 一系列的 主从节点群组成的分布式服务器群,它具有复制、高可用和分片特性。 Redis集群不需要 sentinel哨兵也能完成节点移除和故障转移的功能。需要将每个节点设置成集群模式,这种集群模式没有中心节点 ,客户端通过 CRC16算法对key进行hash

得到一个值,来判断该 key存储在哪个主从服务上面,因此就算是某一个主从整个宕机,redis集群也是部分可用的。方便 水平扩展, 可以根据业务规模可以随时加减配置。 据官方文档称可以线性扩展到上万个节点 ( 但是 官方推荐不超过 1000个节点)。redis集群的性能和高可用性均优于哨兵模式 。

Redis集群搭建及选举原理

 

Redis 集群搭建

1. 修改 redis.conf 配置文件

  1. daemonize yes 后台启动
  2. cluster-enabled yes 开启集群模式
  3. cluster-config-file nodes-6379.conf 集群配置信息存放文件名
  4. cluster-node-timeout 5000 节点离线时间限制,到达此值时发起某个主从重新选举 master
  5. protected-mode no 关闭保护模式
  6. requirepass xxx 设置本机密码
  7. masterauth xxx 设置访问别的机器的密码

2. 注意关闭服务器的防火墙,否则可能造成节点之间无法通信,无法搭建集群

使用修改好的配置文件启动 redis 服务,我这里使用三个一主一从来搭建。因此先将 6 个 redis 服务使用指定的配置文件 redis-master.conf 启动起来: src/redis-server redis-master.conf

3.搭建集群服务

为了保险起见最好先检查下每台机器的 redis 服务是否正常启动了 ps -ef|grep redis

可以看见 redis 服务进程后面有个 cluster 的标志,普通启动的 redis 服务是没有这个标志的

Redis集群搭建及选举原理

 

5.0 版本可以直接使用 C 语言客户端提供的指令去构建集群:

src/redis-cli -a xxx --cluster create --cluster-replicas 1 192.168.0.67:6379 192.168.0.68:6379 192.168.0.69:6379 192.168.0.70:6379 192.168.0.71:6379 192.168.0.72:6379

-a 配置的密码

--cluster create 表示集群创建

--cluster-replicas 表示每个 master 几个 slave ,上面一共 6 个 redis 节点,因此会构建三个一主一从。

执行命令之前,如果你的 redis 环境以前搭建过主从或者哨兵之类的,数据不干净可能会报错,最好将持久化文件删掉,然后 flushdb ,将以前脏数据清理掉,否则可能出现如下错误:

Redis集群搭建及选举原理

 

正常执行会返回一个集群分配计划,我们按照它的计划即可:

Redis集群搭建及选举原理

 

然后节点之间就开始通信构建集群,最后会看见 16384 个 slots 分配完毕,可以看见构建计划中有三个 master ,每个 master 都是有指定槽位的。意思就是存入的 key 经过 crc16 hash 算法之后得到的值,在哪个范围内,就存储到那个 redis 主从上面去,这就是 redis 的分片集群模式。

Redis集群搭建及选举原理

 

至此集群搭建完毕

4.集群操作

以集群方式连接 redis 客户端通过 cluster info 查看集群信息,通过 cluster nodes 查看节点信息

src/redis-cli -a 密码 -c 集群方式连接

Redis集群搭建及选举原理

 

我们设置 set abc 123 一个值 会看见客户点会计算 abc 的 slot 是 7638 , 然后重定向到对应的主从的 master 上面去写数据

Redis集群搭建及选举原理

 

现在我看下 JAVA 客户端的 jedis 里面的 key 值计算 redis.clients.util.JedisClusterCRC16#getSlot(java.lang.String) :

Redis集群搭建及选举原理

 

最后计算结果就会落到 0-16383 之间去。

当 Redis Cluster 的客户端来连接集群时,它也会得到一份集群的槽位配置信息并将其缓存在客户端本地。这样当客户 端要查找某个 key 时,可以直接定位到目标节点。同时因为槽位的信息可能会存在客户端与服务器不一致的情况,还需 要纠正机制来实现槽位信息的校验调整。

集中式集群和分片式集群

Redis 节点之间使用的是 gossip 协议进行通信,每个节点之间都会互相通信。

gossip 协议包含多种消息,包括 ping , pong , meet , fail 等等。

ping :每个节点都会频繁给其他节点发送 ping ,其中包含自己的状态还有自己维护的集群元数据,互相通过 ping 交换元数据;

pong: 返回 ping 和 meet ,包含自己的状态和其他信息,也可以用于信息广播和更新;

fail: 某个节点判断另一个节点 fail 之后,就发送 fail 给其他节点,通知其他节点,指定的节点宕机了。

meet :某个节点发送 meet 给新加入的节点,让新节点加入集群中,然后新节点就会开始与其他节点进行通信,不需要发送形成网络的所需的所有 CLUSTER MEET 命令。发送 CLUSTER MEET 消息以便每个节点能够达到其他每个节点只需通 过一条已知的节点链就够了。由于在心跳包中会交换 gossip 信息,将会创建节点间缺失的链接。

gossip 协议的优点在于元数据的更新比较分散,不是集中在一个地方,更新请求会陆陆续续,打到所有节点上去更新, 有一定的延时,降低了压力;缺点在于元数据更新有延时可能导致集群的一些操作会有一些滞后。

就是自己提供服务的端口号 +10000 ,比如 6379 ,那么用于节点间通信 的就是 16379 端口。 每个节点每隔一段时间都会往另外几个节点发送 ping 消息,同时其他几点接收到 ping 消息之后返回 pong 消息。

还有就是集中式的,比如 ZK 集群

集中式的有点在于数据的更新和读取,时效性非常好,一旦元数据出现变更立即就会更新到集中式( master )的存储中,其他节点读取的 时候立即就可以立即感知到;不足在于所有的元数据的更新压力全部集中在一个地方,可能导致元数据的存储压力。

Redis 集群选举机制

当 slave发现自己的master变为FAIL状态时,便尝试 发起选举 ,以期成为新的 master。由于挂掉的master可能会有 多个 slave,从而存在多个slave竞争成为master节点的过程, 其过程如下:

1.slave发现自己的master变为FAIL

2.将自己记录的集群currentEpoch(选举轮次标记)加1,并广播信息给集群中其他节点

3.其他节点收到该信息,只有master响应,判断请求者的合法性,并发送结果

4.尝试选举的slave收集master返回的结果,收到 超过半数 master的统一 后变成新 Master

5.广播Pong消息通知其他集群节点。

如果这次选举不成功,比如三个小的主从 A,B,C组成的集群,A的master挂了,A的两个小弟发起选举,结果B的master投给A的小弟A1,C的master投给了A的小弟A2,这样就会发起第二次选举,选举轮次标记+1继续上面的流程。事实上从节点并不是在主节点一进入 FAIL 状态就马上尝试发起选举,而是有一定延迟,一定的延迟确保我们等待FAIL状态在集群中传播,slave如果立即尝试选举,其它masters或许尚未意识到FAIL状态,可能会拒绝投票。 同时下面公式里面的随机数,也可以有效避免slave同时发起选举,导致的平票情况。

•延迟计算公式:

DELAY = 500ms + random(0 ~ 500ms) + SLAVE_RANK * 1000ms

•SLAVE_RANK表示此slave已经从master复制数据的总量的rank。Rank越小代表已复制的数据越新。这种方式下,持有最新数据的slave将会首先发起选举(理论上)。

前面说到这种分片的集群模式的集群可以部分提供服务, 当 redis.conf的配置cluster-require-full-coverage为no时, 表示当一个小主从整体挂掉的时候集群也可以用,也是说 0-16383个槽位中,落在该主从对应的slots上面的key是用不了的,但是如果key落在其他的范围是仍然可用的。



Tags:Redis集群   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除,谢谢。
▌相关推荐
本文主要针对 Redis 常见的几种使用方式及其优缺点展开分析。一、常见使用方式Redis 的几种常见使用方式包括: Redis 单副本 Redis 多副本(主从) Redis Sentinel(哨兵) Redis...【详细内容】
2021-03-19  Tags: Redis集群  点击:(202)  评论:(0)  加入收藏
Redis集群详解Redis有三种集群模式,分别是:* 主从模式 * Sentinel模式 * Cluster模式三种集群模式各有特点,关于Redis介绍可以参考这里:NoSQL(二)——RedisRedis官网:ht...【详细内容】
2020-10-17  Tags: Redis集群  点击:(127)  评论:(0)  加入收藏
./redis-trib.rb create --replicas 1 172.20.10.8:7001 172.20.10.8:7002 172.20.10.8:7003 172.20.10.8:7004 172.20.10.8:7005 172.20.10.8:70061.安装ruby环境redis集群...【详细内容】
2020-08-11  Tags: Redis集群  点击:(75)  评论:(0)  加入收藏
这里的Redis集群指的是Redis Cluster,它是Redis在3.0版本正式推出的专用集群方案,有效地解决了Redis分布式方面的需求。当单机内存、并发、流量等遇到瓶颈的时候,可以采用这种...【详细内容】
2020-07-16  Tags: Redis集群  点击:(62)  评论:(0)  加入收藏
【51CTO.com原创稿件】 上一篇我们讲解了 Redis 哨兵的工作原理,哨兵主要针对单节点故障无法自动恢复的解决方案,集群主要针对单节点容量、并发问题、线性可扩展性的解决方案...【详细内容】
2020-06-17  Tags: Redis集群  点击:(55)  评论:(0)  加入收藏
redis集群简述哨兵模式中如果主从中 master宕机了,是通过哨兵来选举出新的master,在这个选举切换主从的过程,整个redis服务是不可用的。而且哨兵模式中只有一个主节点对外提供...【详细内容】
2020-03-18  Tags: Redis集群  点击:(67)  评论:(0)  加入收藏
参考 《Redis并发与运维》串行命令由于n个key是比较均匀的分布在Redis Cluster的各个节点上,因此无法使用mget命令一次性获取,所以通常来讲要获取n个key的值,最简单的方法就是...【详细内容】
2020-01-13  Tags: Redis集群  点击:(266)  评论:(0)  加入收藏
前面我们介绍了国人自己开发的Redis集群方案——Codis,Codis友好的管理界面以及强大的自动平衡槽位的功能深受广大开发者的喜爱。今天我们一起来聊一聊Redis作者自...【详细内容】
2019-09-23  Tags: Redis集群  点击:(126)  评论:(0)  加入收藏
▌简易百科推荐
来源: my.oschina.net/xiaomu0082/blog/2990388首先说下问题现象:内网sandbox环境API持续1周出现应用卡死,所有api无响应现象刚开始当测试抱怨环境响应慢的时候 ,我们重启一下应...【详细内容】
2021-12-08  Java识堂    Tags:Redis   点击:(18)  评论:(0)  加入收藏
我不知道为什么你会选择对特定数量的“错误”(或警告)如此具体。听起来您正在寻找将要发布到 Yahoo! 的某些文章的内容。 Insider (N Foos to Blah for the BlahBlah)。那说:...【详细内容】
2021-12-07  富集云科技有限公司    Tags:Redis   点击:(14)  评论:(0)  加入收藏
目录 一、背景 二、步骤 0.理论支持 1、获取数据 2、结果 3、分析数据并评估大小 三、关于repl-backlog-size 一、背景 repl-backlog-size控制这个环形缓冲区. ​ 主从断...【详细内容】
2021-11-05  弈秋的美好生活    Tags:redis   点击:(41)  评论:(0)  加入收藏
Redis 性能测试是通过同时执行多个命令实现的。1,Redis-benchmarkRedis性能命令:redis性能命令格式: redis-benchmark [option] [option value] redis 性能测试工具可选参数如...【详细内容】
2021-11-02  川石信息    Tags:Redis   点击:(41)  评论:(0)  加入收藏
1 概述数据结构和内部编码 无传统关系型数据库的 Table 模型schema 所对应的db仅以编号区分。同一 db 内,key 作为顶层模型,它的值是扁平化的。即 db 就是key的命名空间。 key...【详细内容】
2021-11-01  JavaEdge    Tags:Redis   点击:(28)  评论:(0)  加入收藏
普通java中使用引用Java redis 驱动,即可连接:import redis.clients.jedis.Jedis; public class RedisTestJava { public static void main(String[] args) { //连...【详细内容】
2021-10-13  faesuite    Tags:Redis   点击:(34)  评论:(0)  加入收藏
Redis常用的数据结构有 string list set zset hashstringstring 是 Redis 的基本的数据类型,一个 key 对应一个 value。string 类型是二进制安全的,Redis的string可以包含任...【详细内容】
2021-10-12  语霖    Tags:Redis   点击:(36)  评论:(0)  加入收藏
列表类型可以存储一组按插入顺序排序的字符串,它非常灵活,支持在两端插入、弹出数据,可以充当栈和队列的角色。> LPUSH fruit apple(integer) 1> RPUSH fruit banana(integer)...【详细内容】
2021-09-17  深夜敲代码    Tags:Redis   点击:(54)  评论:(0)  加入收藏
Redis持久化意义 是做灾难恢复,数据恢复,也可以归类到高可用的一个环节里面去,比如你的redis整个挂了,然后redis就不可用了,你要做的事情是让redis变得可用,尽快变得可用 大量的请...【详细内容】
2021-08-12  小李说IT    Tags:Redis   点击:(77)  评论:(0)  加入收藏
当查询Redis中没有的数据时,该查询会下沉到数据库层,同时数据库层也没有该数据,当这种情况大量出现或被恶意攻击时,接口的访问全部透过Redis访问数据库,而数据库中也没有这些数据...【详细内容】
2021-07-30  随便t    Tags:缓存穿透   点击:(91)  评论:(0)  加入收藏
最新更新
栏目热门
栏目头条