一 前言

谈到Redis服务器的高可用,如何保证备份的机器是原始服务器的完整备份呢?这时候就需要哨兵和复制。

  1. 哨兵(Sentinel):可以管理多个Redis服务器,它提供了监控,提醒以及自动的故障转移的功能。
  2. 复制(Replication):则是负责让一个Redis服务器可以配备多个备份的服务器。

Redis正是利用这两个功能来保证Redis的高可用

二 哨兵

哨兵是Redis集群架构中非常重要的一个组件,哨兵的出现主要是解决了主从复制出现故障时需要人为干预的问题。

1.Redis哨兵主要功能

(1)集群监控:负责监控Redis master和slave进程是否正常工作

(2)消息通知:如果某个Redis实例有故障,那么哨兵负责发送消息作为报警通知给管理员

(3)故障转移:如果master node挂掉了,会自动转移到slave node上

(4)配置中心:如果故障转移发生了,通知client客户端新的master地址

2.Redis哨兵的高可用

原理:当主节点出现故障时,由Redis Sentinel自动完成故障发现和转移,并通知应用方,实现高可用性。

  1. 哨兵机制建立了多个哨兵节点(进程),共同监控数据节点的运行状况。
  2. 同时哨兵节点之间也互相通信,交换对主从节点的监控状况。
  3. 每隔1秒每个哨兵会向整个集群:Master主服务器+Slave从服务器+其他Sentinel(哨兵)进程,发送一次ping命令做一次心跳检测。

这个就是哨兵用来判断节点是否正常的重要依据,涉及两个新的概念:主观下线和客观下线。

1. 主观下线:一个哨兵节点判定主节点down掉是主观下线。

2.客观下线:只有半数哨兵节点都主观判定主节点down掉,此时多个哨兵节点交换主观判定结果,才会判定主节点客观下线。

3.原理:基本上哪个哨兵节点最先判断出这个主节点客观下线,就会在各个哨兵节点中发起投票机制Raft算法(选举算法),最终被投为领导者的哨兵节点完成主从自动化切换的过程。

三 Redis 复制(Replication)

Redis为了解决单点数据库问题,会把数据复制多个副本部署到其他节点上,通过复制,实现Redis的高可用性,实现对数据的冗余备份,保证数据和服务的高度可靠性。

1.数据复制原理(执行步骤)

①从数据库向主数据库发送sync(数据同步)命令。

②主数据库接收同步命令后,会保存快照,创建一个RDB文件。

③当主数据库执行完保持快照后,会向从数据库发送RDB文件,而从数据库会接收并载入该文件。

④主数据库将缓冲区的所有写命令发给从服务器执行。

⑤以上处理完之后,之后主数据库每执行一个写命令,都会将被执行的写命令发送给从数据库。

注意:在Redis2.8之后,主从断开重连后会根据断开之前最新的命令偏移量进行增量复制

四 Redis 主从复制、哨兵和集群这三个有什么区别

主从复制是为了数据备份,哨兵是为了高可用,Redis主服务器挂了哨兵可以切换,集群则是因为单实例能力有限,搞多个分散压力,简短总结如下:

主从模式:备份数据、负载均衡,一个Master可以有多个Slaves。

sentinel发现master挂了后,就会从slave中重新选举一个master。

cluster是为了解决单机Redis容量有限的问题,将数据按一定的规则分配到多台机器。

sentinel着眼于高可用,Cluster提高并发量。

1.主从模式:读写分离,备份,一个Master可以有多个Slaves。

2.哨兵sentinel:监控,自动转移,哨兵发现主服务器挂了后,就会从slave中重新选举一个主服务器。

3.集群:为了解决单机Redis容量有限的问题,将数据按一定的规则分配到多台机器,内存/QPS不受限于单机,可受益于分布式集群高扩展性。

转载于:https://www.cnblogs.com/rianley/p/11411298.html

Redis主从配置,哨兵,集群的设计原理相关推荐

  1. Redis主从配置和集群配置

    Redis主从配置和集群配置 文章目录 Redis主从配置和集群配置 一.Redis主从配置 1.主从概念 2.主从配置 3.数据操作 二.Redis集群配置 1.简介 2.Redis 集群好处 3. ...

  2. Docker(7)Redis主从配置和集群配置

    文章目录 Redis 集群配置 新建6个redis容器 构建主从关系 Redis 集群配置 三主三从集群搭建 新建6个redis容器 单台创建命令 docker run -d --name redis ...

  3. 第一节 Redis 使用及哨兵集群 2022-1-2

    Java组件总目录 Redis 使用及哨兵集群 Java组件总目录 一 Redis基本数据类型使用场景 1 String 2 List 存储列表结构 3 Hash 4 Set 5 Zset 二级目录 ...

  4. C#两大知名Redis客户端连接哨兵集群的姿势

    前言 前面<Docker-Compose搭建Redis高可用哨兵集群>, 我的思路是将Redis.Sentinel.Redis Client App链接到同一个网桥网络,这个网桥内的Red ...

  5. redis安装、持久化、数据类型、常用操作、操作键值、安全设置、慢查询日志、存储session、主从配置、集群介绍、集群搭建配置、集群操作,php安装redis扩展...

    21.9 redis介绍 21.10 redis安装 21.11 redis持久化 21.12 redis数据类型 21.13/21.14/21.15 redis常用操作 21.16 redis操作键 ...

  6. redis 主从同步、集群、持久化

    持久化 redis有两种方式实现持久化:RDB和AOF AOF:类似数据库WAL 机制,但是redis是先执行命令,然后在记录AOF日志,是一种写后日志而不是咱们常说的写前日志(这样做主要是为了red ...

  7. Redis系列教程(五):Redis哨兵、复制、集群的设计原理,以及区别

    前一篇文章高并发架构系列:Redis为什么是单线程.及高并发快的3大原因详解谈了Redis高并发快的3个原因,本篇主要谈Redis的高可用,两篇合起来就可以把redis的高并发和高可用搞清楚了. 谈到 ...

  8. Redis的高可用详解:Redis哨兵、复制、集群的设计原理,以及区别

    谈到Redis服务器的高可用,如何保证备份的机器是原始服务器的完整备份呢?这时候就需要哨兵和复制. 哨兵(Sentinel):可以管理多个Redis服务器,它提供了监控,提醒以及自动的故障转移的功能. ...

  9. 哨兵模式原理_Redis哨兵、复制、集群的设计原理,以及区别

    谈到Redis服务器的高可用,如何保证备份的机器是原始服务器的完整备份呢?这时候就需要哨兵和复制. 哨兵(Sentinel):可以管理多个Redis服务器,它提供了监控,提醒以及自动的故障转移的功能. ...

  10. redis主从配置+哨兵模式

    1.搭建redis主从,一个master两个slave,加一个哨兵监听(sentinel),可以新建三个虚拟机,模拟环境,我的电脑没那么多虚拟机,就在一台虚拟机上弄的. 2.安装redis,如果是三台 ...

最新文章

  1. C# Aes CryptoStream Specified padding mode is not valid for this algorithm的解決方法
  2. Android调试相关的技术常识
  3. Java 遍历指定目录下的所有目录
  4. 图文并茂安装CentOS 6.7Linux系统
  5. 统计——假设检验与p值
  6. 打造自己的HelloDrone 无人机APP过程《3》
  7. 网页应该如何录屏呢?
  8. 在线阅读.epub文件的网站
  9. 【算法】剑指offer-删除链表中重复的节点最小栈
  10. office安装后无法打开 office 2016找不到VCRUNTIME 140.1
  11. 《大腕》对白之各类搞笑版
  12. 【I2C】通用驱动i2c-dev分析
  13. 最大回撤率MaxDawndown算法(Python3)
  14. Cucumber之五Cucumber Options详解
  15. 蓝桥杯软件类竞赛--Python的常用操作示例
  16. Google Play APK 上传其他国际应用商店
  17. 3.2存储器层次结构 -- 《深入理解计算机系统》☆☆☆☆☆
  18. 云南大学计算机科学与技术学科排名,2017中国大学计算机科学与技术学科排行榜...
  19. 从入门到实战,Netty多线程篇案例集锦
  20. 浙江师范大学网络改造总结(博达交换机网络安全防御技术应用)

热门文章

  1. 拓端tecdat|R语言多项式回归拟合非线性关系
  2. 拓端tecdat|R语言用Backfitting MCMC抽样算法进行贝叶斯推理案例
  3. 计算机网络-扩展路由器
  4. 银行排队问题之单队列多窗口服务 (25 分)(结构体排序)
  5. pyspark ml
  6. keras训练一个简单的模型
  7. 常用机器学习遥感与其他数据集
  8. 如何调试神经网络参数
  9. python基于PIL模块实现矩阵与图像数据互相转换
  10. torch.rand() 和 torch.randn() 有什么区别?