一、为什么Redis需要集群
与大多数中间件一样 当单一节点时 系统出现瓶颈
主要下面这几个触发点
二、Redis主从复制
master就是正在使用的节点 slave 是 备用的当master出现问题时随时替代的节点
当然这俩词 西方现在有些敏感 有歧视意味 可能后面不能用了
设置主从的方式
2.1.配置文件2.
比如我当前机器是 186 我在 187与 188中如下操作就好了 取消注释 改配置
2.2 启动时添加参数
还可以在节点启动时 后面加参数 --slaveof ip:port 这样来配置主从
2.3 命令
查看当前节点的状态
只有主节点能写入数据
从节点只能读
怎样脱离主从关系呢?slaveof no one 可以看到 它的角色已经重新变成了master
并且主从是可以嵌套的 一个节点的从节点可能成为别的节点的主节点
主从复制又分为两种:全量同步 与 增量同步(这个有兴趣可自行了解)
全量同步:
一个节点启动的时候,会根据它的配置文件和它保存的主从的信息 看它是不是其他节点的从节点,如果是的话,后台有个线程 每隔一秒跑一次 然后 是 如果自己有数据先把自己数据全删了,然后得到主节点生成的一个RDB快照从快照中把数据同步过来,如果这个时候主节点有数据新增 会把新增的放到缓冲区中,稍后同步到从节点
2.4 故障处理
如果同步过程中 从节点宕机或者断电咋办,这个
时候配置文件中会有个同步位置的记录
slave_repl_offset 如果比 master_repl_offset 小 说明 同步出现滞后 后续重启时 继续同步
主从复制的不足
这个时候 就需要一种高可用的方案 -哨兵
三、Sentinel(哨兵)
3.1哨兵简介
3.2哨兵集群 如何配置 及启动
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选举
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 相当于个路由
不足
不足咋办呢?继续看下节
四、分片
什么叫分片?简单来讲 就是把 数据拆为几份 放在不同的地方 每个地方 可以说是一组 也可以说是一片 如下
分片有三种方式
4.1 客户端分片
思路是用的一致性hash算法 + 虚节点 了解下就好 不会用这个
一致性hash:简单来说就是 比如 我有5个节点 这五个节点的名称 获得hash值 对2^32 取个模
然后 就把 这几个节点给放上去 至于放的位置不均匀 会导致 数据存放到各个节点不会均匀分布,咋办呢? 又整了虚节点这么个玩意 虚节点相当于 原本节点的小弟 这样hash环上就有了一堆节点 虚节点与真实的redis服务的节点 然后数据存放时对key hash取模 然后得到hash环上的一个位置,这个位置的
相挨着的下一个节点就是它要存放的节点,如果这个节点是虚节点 那么 把它存放到 这个虚节点
所属的真实redis的节点 可能描述不太清楚,我自己能懂 哈哈 不懂这概念的可以自己去看看好文章的解释
4.2 中间服务分片
上面那种写在客户端的分片 缺陷挺大,要自己写代码麻烦不说 各语言平台还不兼容 代码不能复用
那么抽取成一个中间层的服务咋样?
如下两种有兴趣的可以去了解下
4.3 redis cluster
它的分片原理:挺简单的
取到redis数据的key值 经过CRC16算法(hash然后对16384取模) 确定 槽点 每个槽点都有所属的redis的片 (这个片里可能一主二从啥的) 这样能实现均匀的分片了,但是,由于我们不确定数据放在哪一个片上,可能出现数据存放失败,提示 连接redis服务不对,所以 slot各个槽段 与 各redis分片对应关系会在 本地中 然后 建立连接前 通过 键值 确定对应的连接才进行数据的保存与修改
添加 redis片 咋整
先把新的redis 片加入集群 然后 重新分配 槽
master故障了咋整?
生产环境上 直接用 redis cluster就够了 它包含了主从复制 与 sentinel 哨兵
它的好处很多,现在企业也基本采用这一方案
如果能看到这里 你是真滴秀 欢迎关注 B站 请叫我觉哥 我会定期在B站直播陪伴学习