0
点赞
收藏
分享

微信扫一扫

Redis集群配置

东林梁 2022-08-04 阅读 81


复制(replication)

master slave
架构做成主从架构,一主多从,主负责写,并且将数据同步复制到其他的slave节点,从节点负责读。所有的读请求全部走从节点

master下面跟太多slave节点会影响性能,slave节点下面再跟slave节点
查看集群状态

info replication

redis replication -> redis主从架构 -> 读写分离架构 -> 可支持水平扩展的读高并发架构

redis replication的核心机制

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

实现原理

  1. slave第一次或者重连到master上以后,会向master发送一个SYNC的命令
  2. master收到SYNC的时候,会做两件事

a) 执行bgsave(rdb的快照文件)
b)master会把新收到的修改命令存到缓冲区

主从不一致,将主的rdb文件复制到从即可

缺点:没有办法对master进行动态选举

复制的方式

  1. 基于rdb文件的复制(第一次连接或者重连的时候)
  2. 无硬盘复制
  3. 增量复制

主从架构的核心原理
当启动一个slave node的时候,它会发送一个PSYNC命令给master node

如果这是slave node重新连接master node,那么master node 仅仅会复制给slave部分缺少的数据,如果是slave node第一次连接master node,开始full resynchronization的时候,master会启动一个后台线程,开始生成一份RDB快照文件,同时还会将从客户端收到的所有命令缓存在内存汇总,RDB文件生成完毕之后,master会建这个RDB发送给slave,slave会先写入本地磁盘,让后再从本地磁盘加载到内存中。然后master会建内存中缓存的写命令发送给slave,slave也会同步这些数据。

slave node如果跟master node有网络故障,断开了连接,会自动重连。master如果发现有多个slave node都来重新连接,仅仅会启动一个rdb save操作,用一份数据服务所有slave node
主从复制的断点续传
从redis2.8开始,就支持主从复制的断点续传,如果主从复制过程中,网络连接断掉了,那么可以接着上次复制的地方,继续复制下载区,而不是从头开始复制一份

无磁盘化复制
master在内存中直接创建rdb,然后发送给slave,不会再本地磁盘生成rdb文件
repl-diskless-sync
repl-diskless-sync-delay 等待一定时长再开始复制,因为要等更多slave重新连接过来

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

哨兵机制(sentinel)

这是一个高可用集群,不是一个高性能集群

哨兵之间可以互相监控

  1. 监控master和salve是否正常运行
  2. 如果master出现故障,那么会把其中一台salve升级为master

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

sentinel node

哨兵的介绍
sentinel ,中文名是哨兵

哨兵是redis集群架构中非常重要的一个组件,主要功能如下

  1. 集群监控,负责监控redis master和slave 进程是否正常工作
  2. 消息通知,如果某个redis实力有故障,那么哨兵负责发送消息作为警报通知给管理员
  3. 故障转移,如果master node 挂掉了,会自动转移到slave node上
  4. 配置中心,如果故障转移发生了,通知client客户端新的master地址

哨兵本身也是分布式的,作为一个哨兵集群去运行,互相协同工作

  1. 故障转移时,判断一个master node是宕机了,需要大部分的哨兵都同意才行,涉及到了分布式选举的问题
  2. 即使部分哨兵节点挂掉了,哨兵集群还是能正常工作的。

哨兵的核心知识

  1. 哨兵至少需要3个实例,来保证自己的健壮性
  2. 哨兵+redis主从的部署架构,是不会保证数据零丢失的,只能保证redis集群的高可用性

哨兵主备切换的数据丢失问题
异步复制
集群脑裂

集群(Redis Cluster)

redis3.0以后的功能
高性能集群

原来一致性hash,
根据key的hash值取模服务器的数量(应用层面)

slot(槽)的概念,在redis集群中一共会有16384个槽
根据key的CRC16算法,得到的结构再对16384进行取模。假如有3个节点16384/3=5000多

node1 0 5460
node2 5461 10922
node3 10923 16383

节点新增

删除节点

支撑N个redis master node,每个master node都可以挂载多个slave node
读写分离架构:对于每个master来说,写就写到master,然后读就从对应的slave去读
高可用:因为每个master都有slave节点,如果master挂掉,redis cluster这套机制,就会自动将某个slave切换成master
redist clust(多master + 读写分离 + 高可用)

我们只需要基于redis cluster去搭建redis集群即可,不需要手工去搭建replication复制+主从架构+读写分离+哨兵集群+高可用

市面上提供了集群方案

1.redis shardding 而且jedis客户端就支持shardding操作 sharddingJedis

增加和减少节点的问题,pre shardding
3台虚拟机redis,但我部署了9个节点,每一台部署3个redis增加cpu利用率
9个节点单独拆分到9台服务器

2.codis
3.twemproxy

以前redis如果要搞多个节点,每个节点存储一部分数据,得借助一些中间件来实现,如codis,twemproxy,读写redis中间件,redis中间件将数据分布式存储在多台机器上的redis示实例中

redis cluster vs replication + sentinel

如果数据量很少,主要是承载高并发高性能的场景,比如你的缓存一般就几个G,单机足够了
replication,一个master,多个slave,要多个slave跟你要求的吞吐量有关系,然后自己搭建一个sentinal集群,去保证redis主从架构的高可用,就可以了

redis cluster,主要是针对海量数据+高并发+高可用的场景,如果数据量很大,建议用redis cluster

redis高并发:主从架构,一主多从,单主用来写入数据,单机几万QPS,多从用来查询数据,多个从市里可以提供每秒10w的QPS

reids高可用:主从+哨兵

参考博客

[1]


举报

相关推荐

0 条评论