Redis主从架构机制是什么,考考你对Redis理解深度

数据库 其他数据库 Redis
单机的redis,能够承载的QPS大概就在上万到几万不等。对于缓存来说,一般都是用来支撑读高并发的。因此架构做成主从架构,一主多从,主负责写,并且将数据复制到其它的奴隶节点,从节点负责读。所有的读请求全部走从节点。这样也可以很轻松实现水平扩容,支撑读高并发。

[[252874]]

Redis主从架构

单机的redis,能够承载的QPS大概就在上万到几万不等。对于缓存来说,一般都是用来支撑读高并发的。因此架构做成主从(master-slave)架构,一主多从,主负责写,并且将数据复制到其它的奴隶节点,从节点负责读。所有的读请求全部走从节点。这样也可以很轻松实现水平扩容,支撑读高并发。

 

 

redis replication - >主从架构 - >读写分离 - >水平扩容支撑读高并发

redis replication的核心机制

  • redis采用异步方式复制数据到slave节点,不过redis2.8开始,slave node会周期性地确认自己每次复制的数据量;
  • 一个主节点是可以配置多个slave node的;
  • slave node也可以连接其他的slave节点;
  • slave node做复制的时候,不会阻塞主节点的正常工作;
  • 奴隶节点在做复制的时候,也不会阻止对自己的查询操作,它会用旧的数据集来提供服务;但是复制完成的时候,需要删除旧数据集,加载新数据集,这个时候就会暂停对外服务了;
  • slave node主要用来进行横向扩容,做读写分离,扩展的slave node可以提高读的吞吐量。

注意,如果采用了主从架构,那么建议必须开启主节点的持久化,不建议用从节点作为主节点的数据热备,因为那样的话,如果你关掉master的持久化,可能在主宕机重启的时候数据是空的,然后可能一经过复制,slave node的数据也丢了。

另外,master的各种备份方案,也需要做。万一本地的所有文件丢失了,从备份中挑选一份rdb去恢复master,这样才能确保启动的时候,是有数据的,即使采用了后续讲解的高可用机制,slave node可以自动接管master node,但也可能sentinel还没检测到master failure,master node就自动重启了,还是可能导致上面所有的slave node数据被清空。

redis主从复制的核心原理

当启动一个slave node的时候,它会发送一个PSYNC命令给主节点。

如果这是奴隶节点初次连接到主节点,那么会触发一次full resynchronization全量复制。此时主会启动一个后台线程,开始生成RDB一份快照文件,同时还会将从客户端客户端新收到的所有写命令缓存在内存中。RDB文件生成完毕后,master会将这个RDB发送给slave,slave会先写入本地磁盘,然后再从本地磁盘加载到内存中,接着master会将内存中缓存的写命令发送到slave,slave也会同步这些数据.slave node如果跟主节点有网络故障,断开了连接,会自动重连,连接之后主节点仅会复制给奴隶部分缺少的数据。

 

 

主从复制的断点续传

从redis2.8开始,就支持主从复制的断点续传,如果主从复制过程中,网络连接断掉了,那么可以接着上次复制的地方,继续复制下去,而不是从头开始复制一份。

主节点会在内存中维护一个backlog,master和slave都会保存一个副本偏移还有一个主运行id,offset就是保存在backlog中的。如果master和slave网络连接断掉了,slave会让master从上次replica offset开始继续复制,如果没有找到对应的offset,那么就会执行一次resynchronization。

如果根据host + ip定位主节点,是不靠谱的,如果主节点重启或者数据出现了变化,那么slave node应该根据不同的运行id区分。

无磁盘化复制

master在内存中直接创建RDB,然后发送给slave,不会在自己本地落地磁盘了。只需要在配置文件中开启repl-diskless-sync yes即可。

repl-diskless-sync yes#等待5s后再开始复制,因为要等更多slave重新连接过来 repl-diskless-sync-delay 5

过期关键处理

slave不会过期密钥,只会等待master过期密钥。如果master过期了一个密钥,或者通过LRU淘汰了一个密钥,那么会模拟一条del命令发送给slave。

复制的完整流程

slave node启动时,会在自己本地保存master node的信息,包括主节点的host和ip,但是复制流程没开始。

slave node内部有个定时任务,每秒检查是否有新的主节点要连接和复制,如果发现,就跟主节点建立socket网络连接。然后slave节点发送ping命令给主节点。如果master设置了requirepass,那么slave node必须发送masterauth的口令过去进行认证.master node ***次执行全量复制,将所有数据发给slave node。而在后续,master node持续将写命令,异步复制给slave node。

 

 

全量复制

master执行bgsave,在本地生成一份rdb快照文件。

主节点将rdb快照文件发送给从节点,如果rdb复制时间超过60秒(repl-timeout),那么slave节点就会认为复制失败,可以适当调大这个参数(对于千兆网卡的机器,一般每秒传输100MB,6G文件,很可能超过60s)

主节点在生成rdb时,会将所有新的写命令缓存在内存中,在从节点保存了rdb之后,再将新的写命令复制给从节点。

如果在复制期间,内存缓冲区持续消耗超过64MB,或者一次性超过256MB,那么停止复制,复制失败。

client-output-buffer-limit slave 256MB 64MB 60

slave node接收到rdb之后,清空自己的旧数据,然后重新加载rdb到自己的内存中,同时基于旧的数据版本对外提供服务。

如果slave node开启了AOF,那么会立即执行BGREWRITEAOF,重写AOF。

增量复制

如果全量复制过程中,master-slave网络连接断掉,那么奴隶重新连接master时,会触发增量复制。

master直接从自己的backlog中获取部分丢失的数据,发送给slave node,默认backlog就是1MB。

msater就是根据slave发送的psync中的offset来自backlog中获取数据的。

心跳

主从节点互相都会发送心跳信息。

master默认每隔10秒发送一次heartbeat,slave node每隔1秒发送一个heartbeat。

异步复制

master每次接收到写命令之后,先在内部写入数据,然后异步发送给从属节点。

redis如何才能做到高可用

如果系统在365天内,有99.99%的时间,都是可以哗哗对外提供服务的,那么就说系统是高可用的。

一个奴隶挂掉了,是不会影响可用性的,还有其它的奴隶在提供相同数据下的相同的对外的查询服务。

但是,如果主节点死掉了,会怎么样?没法写数据了,写缓存的时候,全部失效了.slave node还有什么用呢,没有master给它们复制数据了,系统相当于不可用了。

redis的高可用架构,叫做failover 故障转移,也可以叫做主备切换。

主节点在故障时,自动检测,并且将某个从节点自动切换位主节点的过程,叫做主备切换。这个过程,实现了redis的主从架构下的高可用。

后面会详细说明redis 基于哨兵的高可用性。 

责任编辑:庞桂玉 来源: 快资讯
相关推荐

2015-12-18 10:51:52

2013-05-27 15:57:36

逻辑思维

2015-11-26 09:47:22

WiFiWiFi技术

2024-03-12 12:57:07

Redis主从架构

2023-03-15 08:30:37

2015-12-09 11:16:24

网络·安全技术周刊

2015-07-23 16:38:56

Redis

2019-12-26 08:59:20

Redis主从架构

2020-12-30 07:26:20

RedisSortedSet内存包

2013-08-28 10:11:37

RedisRedis主键失效NoSQL

2014-06-13 11:08:52

Redis主键失效

2014-06-17 10:27:39

Redis缓存

2022-02-06 10:58:37

Redis主从模式

2023-09-26 01:07:34

2023-09-24 14:32:15

2023-09-05 09:41:22

服务器Redis

2019-11-12 14:15:07

Redis内存持久化

2021-03-11 11:01:22

Redis架构数据

2020-09-23 10:00:26

Redis数据库命令

2020-03-03 14:15:49

Redis持久化数据库
点赞
收藏

51CTO技术栈公众号