首页 > 数据库 >面试题-如何实现Redis的高可用

面试题-如何实现Redis的高可用

时间:2023-02-01 11:26:36浏览次数:56  
标签:面试题 可用 插槽 Redis 哨兵 集群 key 节点

如何实现Redis的高可用

实现Redis的高可用,主要有哨兵集群两种方式。

哨兵

简单的一句话:反客为主的自动版,能够后台监控主机是否故障,如果故障了根据投票数自动将从库转换为主库

Redis Sentinel(哨兵)是一个分布式架构,它包含若干个哨兵节点和数据节点。每个哨兵节点会对数据节点和其余的哨兵节点进行监控,当发现节点不可达时,会对节点做下线标识。如果被标识的是主节点,它就会与其他的哨兵节点进行协商,当多数哨兵节点都认为主节点不可达时,它们便会选举出一个哨兵节点来完成自动故障转移的工作,同时还会将这个变化实时地通知给应用方。整个过程是自动的,不需要人工介入,有效地解决了Redis的高可用问题!

一组哨兵可以监控一个主节点,也可以同时监控多个主节点,两种情况的拓扑结构如下图:

img

哨兵节点包含如下的特征:

  1. 哨兵节点会定期监控数据节点,其他哨兵节点是否可达;
  2. 哨兵节点会将故障转移的结果通知给应用方;
  3. 哨兵节点可以将从节点晋升为主节点,并维护后续正确的主从关系;
  4. 哨兵模式下,客户端连接的是哨兵节点集合,从中获取主节点信息;
  5. 节点的故障判断是由多个哨兵节点共同完成的,可有效地防止误判;
  6. 哨兵节点集合是由多个哨兵节点组成的,即使个别哨兵节点不可用,整个集合依然是健壮的;
  7. 哨兵节点也是独立的Redis节点,是特殊的Redis节点,它们不存储数据,只支持部分命令。

集群

问题

容量不够,redis如何进行扩容?

并发写操作, redis如何分摊?

另外,主从模式,薪火相传模式,主机宕机,导致ip地址发生变化,应用程序中配置需要修改对应的主机地址、端口等信息。

之前通过代理主机来解决,但是redis3.0中提供了解决方案。就是无中心化集群配置

什么是集群

Redis集群采用虚拟槽分区来实现数据分片,它把所有的键根据哈希函数映射到0-16383整数槽内,计算公式为slot=CRC16(key) % 16384,每一个节点负责维护一部分槽以及槽所映射的键值数据

简单一句话:

Redis 集群实现了对Redis的水平扩容,即启动N个redis节点,将整个数据库分布存储在这N个节点中,每个节点存储总数据的1/N。

什么是slot?

一个 Redis 集群包含 16384 个插槽(hash slot), 数据库中的每个键都属于这 16384 个插槽的其中一个,

集群使用公式 CRC16(key) % 16384 来计算键 key 属于哪个槽, 其中 CRC16(key) 语句用于计算键 key 的 CRC16 校验和 。

集群中的每个节点负责处理一部分插槽。 举个例子, 如果一个集群可以有主节点, 其中:

  • 节点 A 负责处理 0 号至 5460 号插槽。
  • 节点 B 负责处理 5461 号至 10922 号插槽。
  • 节点 C 负责处理 10923 号至 16383 号插槽。

集群优缺点

优点:

  • 实现扩容
  • 分摊压力
  • 无中心配置相对简单

缺点:

  • 多键操作是不被支持的
  • 多键的Redis事务是不被支持的。lua脚本不被支持
  • 由于集群方案出现较晚,很多公司已经采用了其他的集群方案,而代理或者客户端分片的方案想要迁移至redis cluster,需要整体迁移而不是逐步过渡,复杂度较大。

标签:面试题,可用,插槽,Redis,哨兵,集群,key,节点
From: https://www.cnblogs.com/galo/p/17081953.html

相关文章

  • redis的五大数据类型
    redis的五大数据类型Redis是一个开源(BSD许可)的,内存中的数据结构存储系统,它可以用作​​数据库​​​、​​缓存​​​和​​消息中间件MQ​​。它支持多种类型的数据结构,......
  • redis之三种特殊数据类型
    redis之三种特殊数据类型一、Geospatial(地理位置)朋友的定位,附近的人,打车距离计算?Redis的Geo在Redis3.2版本就推出了!这个功能可以推算地理位置的信息,两地之间的距离,方......
  • Redis主从复制
    Redis主从复一、概念主从复制,是指将一台Redis服务器的数据,复制到其他的Redis服务器。前者称为主节点(Master/Leader),后者称为从节点(Slave/Follower),​​数据的复制是单向的,只......
  • StringRedisTemplate和RedisTemplate的使用区别
    最近在使用redis的过程中,整合java的时候,用redisTemplate的过程产生一个bug,通过stringRedisTemplate解决了,这里分享下解决过程,仅供参考。RedisTemplate使用的序列类在在操作......
  • 面试题积累_01
    1如何判断一个数是否为奇数?//常规方法boolisOdd_Method1(intn){ if(n%2) returntrue; else returnfalse; }//高效方法boolisOdd_Method2(intn){......
  • Redis15-redis集群间的数据迁移
    1、准备两个redis集群1、查看新旧集群的节点(redis实例)//老集群]#redis-cli-h10.1.1.13-p8001-aadmin10.1.1.13:8001>clusternodes0d16af555f59c703e06faf1e......
  • 说一说Redis的持久化策略
    说一说Redis的持久化策略Redis支持RDB持久化、AOF持久化、RDB-AOF混合持久化这三种持久化方式。RDB持久化是什么RDB(RedisDatabase)是Redis默认采用的持久化方式,它以......
  • 面试题 03.02. 栈的最小值
    1.题目请设计一个栈,除了常规栈支持的pop与push函数以外,还支持min函数,该函数返回栈元素中的最小值。执行push、pop和min操作的时间复杂度必须为O(1)。3.代码classMinStack{......
  • Redis配置文件中各个配置项含义
    redis是一款开源的、高性能的键-值存储(key-valuestore),和memcached类似,redis常被称作是一款key-value内存存储系统或者内存数据库,同时由于它支持丰富的数据结构,又被称为一......
  • redis基本数据类型 Hash
    Hash类型Hash类型的常见命令HSETkeyfieldvalue:添加或者修改hash类型key的field的值HGETkeyfield:获取一个hash类型key的field的值HMSET:批量添加多个hash类......