分布式缓存技术-redis分布式篇 (redis主从复制,哨兵机制,集群搭建)

一、为什么Redis需要集群

与大多数中间件一样 当单一节点时 系统出现瓶颈

主要下面这几个触发点

分布式缓存技术-redis分布式篇 (redis主从复制,哨兵机制,集群搭建)_第1张图片

二、Redis主从复制

master就是正在使用的节点 slave 是 备用的当master出现问题时随时替代的节点

当然这俩词 西方现在有些敏感 有歧视意味 可能后面不能用了

设置主从的方式

2.1.配置文件2.

比如我当前机器是 186 我在 187与 188中如下操作就好了 取消注释 改配置

分布式缓存技术-redis分布式篇 (redis主从复制,哨兵机制,集群搭建)_第2张图片

2.2 启动时添加参数 

还可以在节点启动时 后面加参数 --slaveof ip:port 这样来配置主从

2.3 命令

 

 查看当前节点的状态

分布式缓存技术-redis分布式篇 (redis主从复制,哨兵机制,集群搭建)_第3张图片

 只有主节点能写入数据

从节点只能读 

 怎样脱离主从关系呢?slaveof no one 可以看到 它的角色已经重新变成了master

分布式缓存技术-redis分布式篇 (redis主从复制,哨兵机制,集群搭建)_第4张图片

 并且主从是可以嵌套的 一个节点的从节点可能成为别的节点的主节点

主从复制又分为两种:全量同步 与 增量同步(这个有兴趣可自行了解

全量同步:

一个节点启动的时候,会根据它的配置文件和它保存的主从的信息 看它是不是其他节点的从节点,如果是的话,后台有个线程 每隔一秒跑一次 然后 是 如果自己有数据先把自己数据全删了,然后得到主节点生成的一个RDB快照从快照中把数据同步过来,如果这个时候主节点有数据新增 会把新增的放到缓冲区中,稍后同步到从节点

分布式缓存技术-redis分布式篇 (redis主从复制,哨兵机制,集群搭建)_第5张图片

2.4 故障处理

 如果同步过程中 从节点宕机或者断电咋办,这个

时候配置文件中会有个同步位置的记录 

slave_repl_offset 如果比 master_repl_offset 小 说明 同步出现滞后 后续重启时 继续同步

分布式缓存技术-redis分布式篇 (redis主从复制,哨兵机制,集群搭建)_第6张图片

主从复制的不足 

分布式缓存技术-redis分布式篇 (redis主从复制,哨兵机制,集群搭建)_第7张图片

 这个时候 就需要一种高可用的方案 -哨兵

三、Sentinel(哨兵)

3.1哨兵简介

分布式缓存技术-redis分布式篇 (redis主从复制,哨兵机制,集群搭建)_第8张图片

3.2哨兵集群 如何配置 及启动

分布式缓存技术-redis分布式篇 (redis主从复制,哨兵机制,集群搭建)_第9张图片

 分布式缓存技术-redis分布式篇 (redis主从复制,哨兵机制,集群搭建)_第10张图片

 分布式缓存技术-redis分布式篇 (redis主从复制,哨兵机制,集群搭建)_第11张图片

 3.3 Redis的Sentinel集群中各节点是怎么互相发现的呢?

我们知道sentinel通过监视redis的master节点来获取master和slave的信息,从而来达到监控的目的,只要在sentinel.conf里面配置“sentinel monitor redis-master 127.0.0.1 6379 2”就可以了(这里用本机地址和默认端口来举例)。为了保证sentinel的高可用,也需要对sentinel做一个集群,然后问题来了:sentinel集群的各节点怎么知道彼此的存在呢?比如sentinel集群中有三个节点,s1、s2、s3,s1是怎么知道s2和s3的存在的?配置文件里面好像没有配置其它sentinel节点的信息

Sentinel之间需要相互监控,才能实现Leader选举,和最终的故障转移
问题:所有的sentinel.conf都只配置了一个相同的master,并没有配置其他的哨兵节点,他们是怎么知道彼此的存在的?

既然哨兵之间不直接配置地址,那肯定是通过master来感知对方,怎么做到呢?
实际是sentinel利用了master的发布/订阅机制,去自动发现其它也监控了同一个master的sentinel节点。

因为Sentinel是一个特殊状态的Redis节点,它也有发布订阅的功能。
哨兵上线时,给所有的Reids节点(master/slave)的名字为__sentinel__:hello的channle发送消息。
每个哨兵都订阅了所有Reids节点名字为__sentinel__:hello的channle,所以能互相感知对方的存在,而进行监控。

 3.4 主观下线与客观下线

前面有个这配置 如下,但是仅凭这个还不够 一个哨兵主观认为master下线还要问问其他哨兵,

因为可能这台哨兵的网络有问题 如果大半哨兵都认为它挂了,那么客观上就认为它下线了

 3.5 master挂了之后如何选举新的master ?

 3.4.1 leader选举

首先 选举新的master是由 哨兵做的,然后哨兵选举的话需要一个 选举代表 leader 这个leader是由 raft算法选举 出来的 选举委员会主席

raft算法:某种共识算法,先到先得,少数服从多数

RAFT算法动态演示

 

 3.4.2 master选举

分布式缓存技术-redis分布式篇 (redis主从复制,哨兵机制,集群搭建)_第12张图片

master 挂掉后 然后哨兵的leader选举出来新的master之后 我们要怎样设置新的 master呢?

还记得我们前面的俩命令么 就俩 每个节点都执行 slaveof no one  然后在除了新的master节点上都执行

 新的master就设置好了

3.4.3 sentinel小结

 官网介绍了有四个作用 分别是 

1.做监控,检查 主节点 与 应用是否正常工作

2.如果 某个redis节点出问题了通知系统管理员

3.自动选举 当主节点出问题时 自动选举leader然后 由 leader去 选出新的master并且 新的master地址在连接时会通知给应用程序

4.配置提供者 有了 sentinel后客户端每次连接 redis服务 需要经过sentinel 相当于个路由  

分布式缓存技术-redis分布式篇 (redis主从复制,哨兵机制,集群搭建)_第13张图片

 不足

分布式缓存技术-redis分布式篇 (redis主从复制,哨兵机制,集群搭建)_第14张图片

 不足咋办呢?继续看下节

四、分片

什么叫分片?简单来讲 就是把 数据拆为几份 放在不同的地方 每个地方 可以说是一组 也可以说是一片 如下

分布式缓存技术-redis分布式篇 (redis主从复制,哨兵机制,集群搭建)_第15张图片

 分片有三种方式

4.1 客户端分片 

思路是用的一致性hash算法 + 虚节点 了解下就好 不会用这个

一致性hash:简单来说就是 比如 我有5个节点 这五个节点的名称 获得hash值 对2^32 取个模

然后 就把 这几个节点给放上去  至于放的位置不均匀 会导致 数据存放到各个节点不会均匀分布,咋办呢? 又整了虚节点这么个玩意  虚节点相当于 原本节点的小弟 这样hash环上就有了一堆节点 虚节点与真实的redis服务的节点 然后数据存放时对key hash取模 然后得到hash环上的一个位置,这个位置的

相挨着的下一个节点就是它要存放的节点,如果这个节点是虚节点 那么 把它存放到 这个虚节点

所属的真实redis的节点  可能描述不太清楚,我自己能懂 哈哈 不懂这概念的可以自己去看看好文章的解释

 分布式缓存技术-redis分布式篇 (redis主从复制,哨兵机制,集群搭建)_第16张图片

4.2 中间服务分片

上面那种写在客户端的分片 缺陷挺大,要自己写代码麻烦不说 各语言平台还不兼容 代码不能复用

那么抽取成一个中间层的服务咋样?

如下两种有兴趣的可以去了解下

分布式缓存技术-redis分布式篇 (redis主从复制,哨兵机制,集群搭建)_第17张图片

 分布式缓存技术-redis分布式篇 (redis主从复制,哨兵机制,集群搭建)_第18张图片

 分布式缓存技术-redis分布式篇 (redis主从复制,哨兵机制,集群搭建)_第19张图片

  

4.3 redis cluster

单机搭建伪集群教程

 分布式缓存技术-redis分布式篇 (redis主从复制,哨兵机制,集群搭建)_第20张图片

 分布式缓存技术-redis分布式篇 (redis主从复制,哨兵机制,集群搭建)_第21张图片

 它的分片原理:挺简单的

取到redis数据的key值 经过CRC16算法(hash然后对16384取模) 确定 槽点 每个槽点都有所属的redis的片 (这个片里可能一主二从啥的) 这样能实现均匀的分片了,但是,由于我们不确定数据放在哪一个片上,可能出现数据存放失败,提示 连接redis服务不对,所以 slot各个槽段 与 各redis分片对应关系会在 本地中 然后 建立连接前 通过 键值 确定对应的连接才进行数据的保存与修改

分布式缓存技术-redis分布式篇 (redis主从复制,哨兵机制,集群搭建)_第22张图片

 添加 redis片 咋整 

先把新的redis 片加入集群 然后 重新分配 槽  

 master故障了咋整?分布式缓存技术-redis分布式篇 (redis主从复制,哨兵机制,集群搭建)_第23张图片

 生产环境上 直接用 redis cluster就够了 它包含了主从复制 与 sentinel 哨兵  

它的好处很多,现在企业也基本采用这一方案

分布式缓存技术-redis分布式篇 (redis主从复制,哨兵机制,集群搭建)_第24张图片

如果能看到这里 你是真滴秀 欢迎关注 B站 请叫我觉哥 我会定期在B站直播陪伴学习

你可能感兴趣的:(架构师技术栈,redis,集群,redis,缓存)