Redis学习笔记(二)高级特性之持久化、事务、主从复制及集群模式

目录

持久化

概念

意义

RDB模式

save指令工作原理

bgsave 指令工作原理

RDB启动方式

RDB优缺点

AOF

AOF概念

AOF配置

AOF重写机制(压缩指令)

缓冲策略

RDB和AOF对比

RDB与AOF的选择策略

持久化场景

Redis事务

Redis事务的定义

事务的基本操作

事务操作的基本流程

事务操作的注意事项

业务场景1

业务场景2

业务场景3

删除策略

         数据删除策略

定时删除

惰性删除

定期删除

逐出算法

服务器基础配置

主从复制

背景

多台服务器连接方案

主从模式

主从模式作用

工作流程

哨兵模式

简介

作用

配置哨兵

工作原理

监控阶段

通知阶段

故障转移

集群模式

集群架构

集群的作用

Redis集群结构设计

集群内部通讯设计


持久化

概念

利用永久性存储介质将数据进行保存,在特定的时间将保存的数据进行恢复的工作机制称为持久化。

意义

防止数据的意外丢失,确保数据安全性

持久化过程保存什么

  • 将当前数据状态进行保存,快照形式,存储数据结果,存储格式简单,关注点在数据
  • 将数据的操作过程进行保存,日志形式,存储操作过程,存储格式复杂,关注点在数据的操作过程

RDB模式

RDB启动方式—save

命令

save

执行完之后,会在data文件夹中生成rdb文件,

RDB配置相关命令

在配置文件中改写。

  • dbfilename dump.rdb
    • 说明:设置本地数据库文件名,默认值为 dump.rdb
    • 经验:通常设置为dump-端口号.rdb
  • dir
    • 说明:设置存储.rdb文件的路径
    • 经验:通常设置成存储空间较大的目录中,目录名称data
  • rdbcompression yes
    • 说明:设置存储至本地数据库时是否压缩数据,默认为 yes,采用 LZF 压缩
    • 经验:通常默认为开启状态,如果设置为no,可以节省 CPU 运行时间,但会使存储的文件变大(巨大)
  • rdbchecksum yes
    • 说明:设置是否进行RDB文件格式校验,该校验过程在写文件和读文件过程均进行
    • 经验:通常默认为开启状态,如果设置为no,可以节约读写性过程约10%时间消耗,但是存储一定的数据损坏风险

save指令工作原理

注意save指令的执行会阻塞当前Redis服务器,直到当前RDB过程完成为止,有可能会造成长时间阻塞,线上环境不建议使用

bgsave 指令工作原理

bgsave

bgsave命令是针对save阻塞问题做的优化。Redis内部所有涉及到RDB操作都采用bgsave的方式,save命令可以放弃使用,推荐使用bgsave捕获21

 

调用fork函数生成子进程。

RDB启动方式

自动保存save 配置

配置

conf文件中进行配置

save second changes

作用:

满足限定时间范围内key的变化数量达到指定数量即进行持久化

参数:

  • second:监控时间范围
  • changes:监控key的变化量

控制频度的,时间周期,如果该时间周期过完,未达到变化量,重新计时计数,周期达到,存所有改变。

  • save配置要根据实际业务情况进行设置,频度过高或过低都会出现性能问题,结果可能是灾难性的
  • save配置中对于second与changes设置通常具有互补对应关系(一个大一个小),尽量不要设置成包含性关系
  • save配置启动后执行的是bgsave操作

三种对比

save配置实际上是bgsave

默认情况下执行shutdown命令时,自动执行 bgsave

RDB优缺点

  • 优点
    • RDB是一个紧凑压缩的二进制文件,存储效率较高
    • RDB内部存储的是redis在某个时间点的数据快照,非常适合用于数据备份,全量复制等场景
    • RDB恢复数据的速度要比AOF很多
    • 应用:服务器中每X小时执行bgsave备份,并将RDB文件拷贝到远程机器中,用于灾难恢复
  • 缺点
    • RDB方式无论是执行指令还是利用配置,无法做到实时持久化,具有较大的可能性丢失数据
    • bgsave指令每次运行要执行fork操作创建子进程,要牺牲掉一些性能
    • Redis的众多版本中未进行RDB文件格式的版本统一,有可能出现各版本服务之间数据格式无法兼容现象
    • RDB,当存储数据量较大的时候,效率较低,基于快照思想,每次读写全部数据。

AOF

基于RDB的缺点,提出解决方法

1、不写全数据,仅记录部分数据。

2、改记录数据未记录操作过程

3、对所有操作均进行记录,排除丢失数据的风险

AOF概念

  • AOF(append only file)持久化:以独立日志的方式记录每次写命令,重启时再重新执行AOF文件中命令,以达到恢复数据的目的。与RDB相比可以简单描述为改 记录数据为记录数据产生的过程
  • AOF的主要作用是解决了数据持久化的实时性,目前已经是Redis持久化的主流方式

AOF写数据过程

捕获24

AOF写数据的三种策略

  • always(每次)

每次写入操作均同步到AOF中,数据零误差,性能低

  • everysec(每秒)

每秒将缓冲区的指令同步到AOF中,数据的准确性较高,性能较高,

  • no(系统控制)

有操作系统控制,每次同步到AOF文件周期不可控。

AOF配置

--是否开启AOF持久化功能,默认为不开启状态
appendonly yes|no

--指定策略
appendfsync always|everysec|no

--AOF持久化文件名
appendfilename filename

--配置存储路径
dir

持久化后会在data文件夹中出现.aof文件。

AOF重写机制(压缩指令)

概念:

随着命令不断写入AOF,文件会越来越大,为了解决这个问题,Redis引入了AOF重写机制压缩文件体积。AOF文件重 写是将Redis进程内的数据转化为写命令同步到新AOF文件的过程。简单说就是将对同一个数据的若干个条命令执行结 果转化成最终结果数据对应的指令进行记录。

作用

  • 降低磁盘占用量,提高磁盘利用率
  • 提高持久化效率,降低持久化写时间,提高IO性能
  • 降低数据恢复用时,提高数据恢复效率

规则

  • 进程内已超时的数据不再写入文件

  • 忽略

    无效指令

    ,重写时使用进程内数据直接生成,这样新的AOF文件

    只保留最终数据的写入命令

    • 如del key1、 hdel key2、srem key3、set key4 111、set key4 222等
  • 对同一数据的多条写命令合并为一条命令

    • 如lpush list1 a、lpush list1 b、 lpush list1 c 可以转化为:lpush list1 a b c
    • 为防止数据量过大造成客户端缓冲区溢出,对list、set、hash、zset等类型,每条指令最多写入64个元素

如何使用

--手动重写 
bgrewriteaof 

--自动重写 
--//aof文件至少要达到64M才会自动重写,文件太小恢复速度本来就 很快,重写的意义不大
auto-aof-rewrite-min-size size    
-- //aof文件自上一次重写后文件大小增长了100%则再次触发重写
auto-aof-rewrite-percentage percentage

 

缓冲策略

AOF缓冲区同步文件策略,由参数appendfsync控制

  • write操作会触发延迟写(delayed write)机制,Linux在内核提供页缓冲区用 来提高硬盘IO性能。write操作在写入系统缓冲区后直接返回。同步硬盘操作依 赖于系统调度机制,列如:缓冲区页空间写满或达到特定时间周期。同步文件之 前,如果此时系统故障宕机,缓冲区内数据将丢失。
  • fsync针对单个文件操作(比如AOF文件),做强制硬盘同步,fsync将阻塞知道 写入硬盘完成后返回,保证了数据持久化

RDB和AOF对比

RDB与AOF的选择策略

 1、对数据非常敏感,建议使用默认的AOF持久化方案

  • AOF持久化策略使用everysecond,每秒钟fsync一次。该策略redis仍可以保持很好的处理性能,当出现问题时,最多丢失0-1秒内的数据。
  • 注意:由于AOF文件存储体积较大,且恢复速度较慢

2、数据呈现阶段有效性,建议使用RDB持久化方案

  • 数据可以良好的做到阶段内无丢失(该阶段是开发者或运维人员手工维护的),且恢复速度较快,阶段点数据恢复通常采用RDB方案
  • 注意:利用RDB实现紧凑的数据持久化会使Redis降的很低,慎重总结:

3、 综合比对

  • RDB与AOF的选择实际上是在做一种权衡,每种都有利有弊
  • 如不能承受数分钟以内的数据丢失,对业务数据非常敏感,选用AOF
  • 如能承受数分钟以内的数据丢失,且追求大数据集的恢复速度,选用RDB
  • 灾难恢复选用RDB
  • 双保险策略,同时开启 RDB 和 AOF,重启后,Redis优先使用 AOF 来恢复数据,降低丢失数据的量

持久化场景

这些场景,视频中大部分都分散在每个数据类型中的应用场景中,用以熟练理解数据类型。视频传送门见顶部。

Redis事务

Redis事务的定义

redis事务就是一个命令执行的队列,将一系列预定义命令包装成一个整体(一个队列)。当执行时,一次性按照添加顺序依次执行,中间不会被打断或者干扰

事务的基本操作

--  开启事务 设定事务的开启位置,此指令执行后,后续的所有指令均加入到事务中
multi

-- 执行事务  设定事务的结束位置,同时执行事务。与multi成对出现,成对使用
exec

-- 取消事务  终止当前事务的定义,发生在multi之后,exec之前
discard 

事务操作的基本流程

事务操作的注意事项

定义事务的过程中,命令格式输入错误怎么办?

  • 语法错误
    • 指命令书写格式有误 例如执行了一条不存在的指令
  • 处理结果
    • 如果定义的事务中所包含的命令存在语法错误,整体事务中所有命令均不会执行。包括那些语法正确的命令

定义事务的过程中,命令执行出现错误怎么办?

  • 运行错误
    • 指命令格式正确,但是无法正确的执行。例如对list进行incr操作
  • 处理结果
    • 能够正确运行的命令会执行,运行错误的命令不会被执行

注意:已经执行完毕的命令对应的数据不会自动回滚,需要程序员自己在代码中实现回滚。

业务场景1

天猫双11热卖过程中,对已经售罄的货物追加补货,4个业务员都有权限进行补货。补货的操作可能是一系 列的操作,牵扯到多个连续操作,如何保障不会重复操作?

业务分析

多个客户端有可能同时操作同一组数据,并且该数据一旦被操作修改后,将不适用于继续操作

在操作之前锁定要操作的数据,一旦发生变化,终止当前操作

解决方案

-- 对 key 添加监视锁,在执行exec前如果key发生了变化,终止事务执行
watch key1 [key2......]

-- 取消对所有 key 的监视 
unwatch
 

业务场景2

天猫双11热卖过程中,对已经售罄的货物追加补货,且补货完成。客户购买热情高涨,3秒内将所有商品购 买完毕。本次补货已经将库存全部清空,如何避免最后一件商品不被多人同时购买?【超卖问题】

业务分析

使用watch监控一个key有没有改变已经不能解决问题,此处要监控的是具体数据
虽然redis是单线程的,但是多个客户端对同一数据同时进行操作时,如何避免不被同时修改?

解决方案

分布式锁

-- 使用 setnx 设置一个公共锁
setnx lock-key value

利用setnx命令的返回值特征,有值则返回设置失败,无值则返回设置成功
    对于返回设置成功的,拥有控制权,进行下一步的具体业务操作
    对于返回设置失败的,不具有控制权,排队或等待
操作完毕通过del操作释放锁 
注意:上述解决方案是一种设计概念,依赖规范保障,具有风险性
  • 注意:上述解决方案是一种设计概念,依赖规范保障,具有风险性

业务场景3

依赖分布式锁的机制,某个用户操作时对应客户端宕机,且此时已经获取到锁。如何解决?

业务分析

  • 由于锁操作由用户控制加锁解锁,必定会存在加锁后未解锁的风险
  •  需要解锁操作不能仅依赖用户控制,系统级别要给出对应的保底处理方案

分布式锁加强

  • 使用 expire 为锁key添加时间限定,到时不释放,放弃锁
expire lock-key seconds
pexpire lock-key milliseconds

由于操作通常都是微秒或毫秒级,因此该锁定时间不宜设置过大。具体时间需要业务测试后确认。

  • 例如:持有锁的操作最长执行时间127ms,最短执行时间7ms。
  • 测试百万次最长执行时间对应命令的最大耗时,测试百万次网络延迟平均耗时
  • 锁时间设定推荐:最大耗时120%+平均网络延迟110%
  • 如果业务最大耗时<<网络平均延迟,通常为2个数量级,取其中单个耗时较长即可

删除策略

数据删除策略

  • 定时删除
  • 惰性删除
  • 定期删除

时效性数据的存储结构

捕获32

在内存占用和cpu占用找一个平衡。

定时删除

创建一个定时器,当key设置有过期时间,且过期时间到达时,由定时器任务立即执行对键的删除操作

捕获33

优点:节约内存

缺点:可能cpu压力大,要删除数据时,无论此时cpu的负载多高,均占用用cpu换内存

惰性删除

数据到达过期时间,不做处理,等下次访问数据时,如果未过期,返回数据,如果已过期,删除返回不存在,

捕获34

优点:节约cpu,发现必须删除才会删除

缺点:内存压力比较大,出现长期占用内存的数据

拿空间换cpu性能

定期删除

特点1:cpu性能占用设置有峰值,检测频度可以自定义设置

特点2:内存压力不是很大,长期占用内存的冷数据将被清除

逐出算法

当新数据进入redis时,内存不足怎么办

redis在执行每个命令前,会调用freeMemoryIfNeeded()检测内存是否充足,如果内存不满足新加入数据的最低要求,redis要临时删除一些数据为当前指令清理存储空间,清理数据的策略称为逐出算法。

注意:逐出数据的过程不是100%能够清理出足够可使用的内存空间,如果不成功则反复执行,反复执行不成功,则报错

--最大可使用内存配置 0不限制,生产环境通常50%以上
maxmemory

--每次选取待删除的个数,随机获取数据的方式
maxmemory-samples

--删除策略  达到最大内存后删除方法
maxmemory-policy

LRU:最长时间没被使用的数据

LFU:一段时间内使用次数最少的数据

数据逐出策略配置依据

使用INFO命令输出监控信息,查询缓存 hit 和 miss 的次数,根据业务需求调优Redis配置

捕获35

服务器基础配置

--设置服务器以守护进程的方式运行
daemonize yes|no
--绑定主机地址
bind 127.0.0.1
--设置服务器端口号
port 6379
--设置数据库数量
databases 16
--设置服务器以指定日志记录级别
loglevel debug|verbose|notice|warning
-- 日志记录文件名
logfile 端口号.log

--设置同一时间最大客户端连接数,默认 0无限制。当客户端连接到达上限,Redis会关闭新的连接
maxclients 0
--客户端闲置等待最大时长,达到最大值后关闭连接。如需关闭该功能,设置为 0
timeout 300
--导入并加载指定配置文件信息,用于快速创建redis公共配置较多的redis实例配置文件,便于维护
include /path/server-端口号.conf

注意:日志级别开发期设置为verbose即可,生产环境中配置为notice,简化日志输出量,降低写日志IO的频度

主从复制

背景

单机redis的风险与问题

  • 问题1.机器故障
  1. 现象:硬盘故障、系统崩溃
  2. 本质:数据丢失,很可能对业务造成灾难性打击  结论:基本上会放弃使用redis.
  •  问题2.容量瓶颈
  1.  现象:内存不足,从16G升级到64G,从64G升级到128G,无限升级内存
  2. 本质:穷,硬件条件跟不上
  3. 结论:放弃使用redis
  • 结论:
  1. 为了避免单点Redis服务器故障,准备多台服务器,互相连通。将数据复制多个副本保存在不同的服 务器上,连接在一起,并保证数据是同步的。即使有其中一台服务器宕机,其他服务器依然可以继续 提供服务,实现Redis的高可用,同时实现数据冗余备份。

多台服务器连接方案

  • 提供数据方:master

主服务器,主节点,主库

主客户端

  • 接收数据方:slave

从服务器,从节点,从库

从客户端

  • 需要解决的问题:

数据同步

  • 核心工作

master的数据复制到slave中

主从模式

主从复制即将master中的数据即时、有效的复制到slave中

特征:一个master可以拥有多个slave,一个slave只对应一个master

职责:

  • master:
  1. 写数据
  2. 执行写操作时,将出现变化的数据自动同步到slave
  3. 读数据(可忽略)
  • slave:
  1. 读数据
  2. 写数据(禁止)

主从模式作用

  • 读写分离:master写、slave读,提高服务器的读写负载能力
  • 负载均衡:基于主从结构,配合读写分离,由slave分担master负载,并根据需求的变化,改变slave的数量,通过多个从节点分担数据读取负载,大大提高Redis服务器并发量与数据吞吐量
  • 故障恢复:当master出现问题时,由slave提供服务,实现快速的故障恢复
  • 数据冗余:实现数据热备份,是持久化之外的一种数据冗余方式
  • 高可用基石:基于主从复制,构建哨兵模式与集群,实现Redis的高可用方案

工作流程

主从复制过程大体可以分为3个阶段

  • 建立连接阶段(即准备阶段)
  • 数据同步阶段
  • 命令传播阶段

阶段一:建立连接阶段

  • 建立slave到master的连接,使master能够识别slave,并保存slave端口号

主从连接(slave连接master)

  • 方式一:客户端发送命令

slaveof <masterip> <masterport>

  • 方式二:启动服务器参数

redis-server -slaveof <masterip> <masterport>

  • 方式三:服务器配置

slaveof <masterip> <masterport>

键入info命令,可以看到

主从断开连接

  • 客户端发送命令

slaveof no one

说明:slave断开连接后,不会删除已有数据,只是不再接受master发送的数据

授权访问

阶段二:数据同步阶段工作流程

  • 在slave初次连接master后,复制master中的所有数据到slave

  • 将slave的数据库状态更新成master当前的数据库状态

数据同步阶段master说明

  • 如果master数据量巨大,数据同步阶段应避开流量高峰期,避免造成master阻塞,影响业务正常执行
  •  复制缓冲区大小设定不合理,会导致数据溢出。如进行全量复制周期太长,进行部分复制时发现数据已经存在丢失的情况,必须进行第二次全量复制,致使slave陷入死循环状态。
repl-backlog-size 1mb

3. master单机内存占用主机内存的比例不应过大,建议使用50%-70%的内存,留下30%-50%的内存用于执 行bgsave命令和创建复制缓冲区

数据同步阶段slave说明

1. 为避免slave进行全量复制、部分复制时服务器响应阻塞或数据不同步,建议关闭此期间的对外服务

slave-serve-stale-data yes|no

2. 数据同步阶段,master发送给slave信息可以理解master是slave的一个客户端,主动向slave发送 命令

3. 多个slave同时对master请求数据同步,master发送的RDB文件增多,会对带宽造成巨大冲击,如果 master带宽不足,因此数据同步需要根据业务需求,适量错峰

4. slave过多时,建议调整拓扑结构,由一主多从结构变为树状结构,中间的节点既是master,也是 slave。注意使用树状结构时,由于层级深度,导致深度越高的slave与最顶层master间数据同步延迟 较大,数据一致性变差,应谨慎选择

阶段三:命令传播阶段

  • 当master数据库状态被修改后,导致主从服务器数据库状态不一致,此时需要让主从数据同步到一致的状态,同步的动作称为命令传播

  • master将接收到的数据变更命令发送给slave,slave接收命令后执行命令
  • 主从复制过程大体可以分为3个阶段
    • 建立连接阶段(即准备阶段)
    • 数据同步阶段
    • 命令传播阶段

命令传播阶段的部分复制

  • 命令传播阶段出现了断网现象
    • 网络闪断闪连
    • 短时间网络中断
    • 长时间网络中断
  • 部分复制的三个核心要素

    • 服务器的运行 id(run id)

    • 主服务器的复制积压缓冲区

    • 主从服务器的复制偏移量

服务器运行ID(runid)

  • 概念:服务器运行ID是每一台服务器每次运行的身份识别码,一台服务器多次运行可以生成多个运行id

  • 组成:运行id由40位字符组成,是一个随机的十六进制字符 例如- -

    • fdc9ff13b9bbaab28db42b3d50f852bb5e3fcdce
  • 作用:运行id被用于在服务器间进行传输,识别身份

    • 如果想两次操作均对同一台服务器进行,必须每次操作携带对应的运行id,用于对方识别
  • 实现方式:运行id在每台服务器启动时自动生成的,master在首次连接slave时,会将自己的运行ID发送给slave,slave保存此ID,通过info Server命令,可以查看节点的runid

复制缓冲区

  • 概念:复制缓冲区,又名复制积压缓冲区,是一个先进先出(FIFO)的队列,用于存储服务器执行过的命 令,每次传播命令,master都会将传播的命令记录下来,并存储在复制缓冲区

  • 由来:每台服务器启动时,如果开启有AOF或被连接成为master节点,即创建复制缓冲区

  • 作用:用于保存master收到的所有指令(仅影响数据变更的指令,例如set,select)

  • 数据来源:当master接收到主客户端的指令时,除了将指令执行,会将该指令存储到缓冲区中

复制缓冲区内部工作原理

  • 组成

  1. 偏移量
  2. 字节值
  • 工作原理
  1. 通过offset区分不同的slave当前数据传播的差异
  2. master记录已发送的信息对应的offset
  3. slave记录已接收的信息对应的offset

主从服务器复制偏移量(offset)

  • 概念:一个数字,描述复制缓冲区中的指令字节位置

  • 分类:

    • master复制偏移量:记录发送给所有slave的指令字节对应的位置(多个)
    • slave复制偏移量:记录slave接收master发送过来的指令字节对应的位置(一个)
  • 数据来源: master端:发送一次记录一次 slave端:接收一次记录一次

  • 作用:同步信息,比对master与slave的差异,当slave断线后,恢复数据使用

数据同步+命令传播阶段工作流程

心跳机制

  • 进入命令传播阶段候,master与slave间需要进行信息交换,使用心跳机制进行维护,实现双方连接保持在线

  • master心跳:

    • 指令:PING
    • 周期:由repl-ping-slave-period决定,默认10秒
    • 作用:判断slave是否在线
    • 查询:INFO replication 获取slave最后一次连接时间间隔,lag项维持在0或1视为正常
  • slave心跳任务

    • 指令:REPLCONF ACK {offset}
    • 周期:1秒
    • 作用1:汇报slave自己的复制偏移量,获取最新的数据变更指令
    • 作用2:判断master是否在线

心跳阶段注意事项

  • 当slave多数掉线,或延迟过高时,master为保障数据稳定性,将拒绝所有信息同步操作

    min-slaves-to-write 2 
    min-slaves-max-lag 8

注意:slave数量少于2个,或者所有slave的延迟都大于等于10秒时,强制关闭master写功能,停止数据同步

  • slave数量由slave发送REPLCONF ACK命令做确认

  • slave延迟由slave发送REPLCONF ACK命令做确认

完整流程

常见问题

频繁的网络中断

数据不一致

 

哨兵模式

简介

哨兵(sentinel) 是一个分布式系统,用于对主从结构中的每台服务器进行监控,当出现故障时通过投票机制选择新的 master并将所有slave连接到新的master。

作用

  • 监控
    • 不断的检查master和slave是否正常运行。 master存活检测、master与slave运行情况检测
  • 通知(提醒)
    • 当被监控的服务器出现问题时,向其他(哨兵间,客户端)发送通知。
  • 自动故障转移
    • 断开master与slave连接,选取一个slave作为master,将其他slave连接到新的master,并告知客户端新的服务器地址

注意:
哨兵也是一台redis服务器,只是不提供数据服务 通常哨兵配置数量为单数

配置哨兵

  • 配置一拖二的主从结构
  • 配置三个哨兵(配置相同,端口不同)

         参看sentinel.conf

  • 启动哨兵

redis-sentinel sentinel-端口号.conf

工作原理

监控阶段

  • 用于同步各个节点的状态信息
    • 获取各个sentinel的状态(是否在线)
  • 获取master的状态
    • master属性
      • runid
      • role:master
      • 各个slave的详细信息
  • 获取所有slave的状态(根据master中的slave信息)
    • slave属性
      • runid
      • role:slave
      • master_host、master_port
      • offset

通知阶段

  • 各个哨兵将得到的信息相互同步(信息对称)

故障转移

确认master下线

  • 当某个哨兵发现主服务器挂掉了,会将master中的SentinelRedistance中的master改为SRI_S_DOWN(主观下线),并通知其他哨兵,告诉他们发现master挂掉了。
  • 其他哨兵在接收到该哨兵发送的信息后,也会尝试去连接master,如果超过半数(配置文件中设置的)确认master挂掉后,会将master中的SentinelRedistance中的master改为SRI_O_DOWN(客观下线)

推选哨兵进行处理

  • 在确认master挂掉以后,会推选出一个哨兵来进行故障转移工作(由该哨兵来指定哪个slave来做新的master)。
  • 筛选方式是哨兵互相发送消息,并且参与投票,票多者当选。

具体过程

  • 服务器列表中挑选备选master
  1. 在线的
  2. 响应慢的
  3. 与原master断开时间久的
  4. 优先原则
    • 优先级
    • offset
    • runid
  • 发送指令( sentinel )
    1. 向新的master发送slaveof no one(断开与原master的连接)
    2. 向其他slave发送slaveof 新masterIP端口(让其他slave与新的master相连)

集群模式

集群架构

集群就是使用网络将若干台计算机联通起来,并提供统一的管理方式,使其对外呈现单机的服务效果

集群的作用

  • 分散单台服务器的访问压力,实现负载均衡
  •  分散单台服务器的存储压力,实现可扩展性
  • 降低单台服务器宕机带来的业务灾难

Redis集群结构设计

数据存储设计

  • 通过算法设计,计算出key应该保存的位置
  • 将所有的存储空间计划切割成16384份,每台主机保存一部分 每份代表的是一个存储空间,不是一个key的保存空间
  • 将key按照计算出的结果放到对应的存储空间

 

  • 增强可扩展性 ——槽

集群内部通讯设计

  • 各个数据库互相连通,保存各个库中槽的编号数据
  • 一次命中,直接返回
  • 一次未命中,告知具体的位置,key再直接去找对应的库保存数据

参考地址:https://www.bilibili.com/video/BV1CJ411m7Gc?p=107

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值