Redis设计与实现-主从、哨兵与集群
- 从机使用slaveof 命令来复制主机的缓存数据,包括同步sync与命令传播两个操作;
- 从机同步sync命令给主机,主机收到后执行需要耗费大量cpu、内存和磁盘IO资源的bgsave命令来生成rdb文件,并发送给从服务器,期间会耗费大量网络资源,因此,同步的代价是很大的;
- 从机载入rdb文件后,主机再把执行bgsave后记录在缓冲区里的所有写命令发送给从服务器实现主从当前状态的同步;
- redis 2.8之前的版本在复制是如果出现了断网,则会重新全部重新复制,效率低,2.8版以后使用psync <runid> <offset>命令,根据主机维护的复制积压缓冲区以及主从间各自维护的偏移量来确定是完整重同步还是部分重同步;
- 每个运行的redis服务器都有一个唯一识别的运行ID,初次复制从机会记录主机的运行ID,当断线重连是会先检测记录的主机ID与当前连接的主机ID是否一致,如果不一致则说明主机重启过,此时将执行完整重同步;
- 复制实现过程:
- 从机保存主机的ip、port到redisServer数据结构里;
- 主从建立套接字进行连接;
- 从机发送ping命令给主机对主机进行状态监测;
- 主机对从机进行身份密码验证;
- 从机给主机发送监听的端口号;
- 从机向主机发送psync同步;
- 命名传播
- 从机默认每一秒向主机发送replconf ACK <replication_offset>,用于检测主从服务器网络连接状态、辅助实现最小从机数配置、根据偏移量检测命令丢失并进行适当重发。
以上文字来自Dimmacro,转载请说明来源:http://www.cnblogs.com/dimmacro/
- sentinel由一个或多个sentinel实例组成系统监视多个主服务器以及所属的从服务器;
- sentinel本质是一个运行在特殊模式下的redis服务器,只支持ping、sentinel、info、subscribe、unsubscribe、psubscribe、punsubscribe共7个命令;
- 每个sentinelRedisInstance结构里可以是主服务器、从服务器或另一个sentinel的信息;
- 每个sentinel会分别于主服务器以及每个从服务器建立命令连接与订阅连接,通过命令连接分别向主从服务器发送info信息以获得主从机状态信息,同时,通过命令连接向服务器的sentinel_:hello频道发送sentinel自身信息以及主从及信息以便其他sentinel可以共享;
- 通过订阅连接获取sentinel_:hello频道信息,这些信息可能来自自己,也可能来自其他sentinel;
- sentinel与其他sentinel之间只创建命令连接进行通讯,共享信息通过sentinel_:hello频道即可;
- 每个sentinel会向主从机以及其他sentinel发送ping命令,如果在一定的时间内没有得到有效回复,则会被认为其已主观下线,如果是主服务器被判断为主观下线,则sentinel会向其他sentinel进行询问,如果达到了设置的认为下线的sentinel数,则判断主服务器下线;
- 所有sentinel根据raft算法选举出一个leader sentinel对已下线的主服务器进行故障转移操作,包括在从服务器中选取某个为主服务器(依据从的优先级、复制偏移量、最小运行ID),让其他从改为复制新的主,让旧的主变为从;
以上文字来自Dimmacro,转载请说明来源:http://www.cnblogs.com/dimmacro/
- 多个redis节点可以组成一个集群,每个节点都存储了集群里自身及其他节点的信息,使用cluster meet将某个节点加到集群中;
- 在各自节点上使用命令cluster addlots 指派负责的槽号,每个节点都会记录自己及集群内其他节点的对应负责的槽号,所有槽号都被指派到具体节点后,整个集群进入上线状态;
- redis集群将数据库分为8个字节共16384个slot槽,每个键key的crc-16&16384得到该key所在的槽号;
- 如果key对应的槽号不在当前节点内,会向客户端返回moved key ip:port,引导客户端去找正确的节点;
- 扩展节点并指派槽后整个集群会进行重新分片,分片按单个槽依次进行,如果在槽的分片迁移过程中请求到槽所在的节点,会发生ask重定向;
- 当集群内的某个节点发生故障后,其他正常的节点会从该故障节点所属的从节点中选取一个主节点,选取的算法同样基于raft领头选举算法;
- 被选中为从节点先执行slaveof no one命令成为主节点,然后撤销所有对已下线主节点的槽指派,并指派给自己,然后在集群内广播PONG消息通知其他主节点;
- 集群内节点通讯的5中消息:
- meet消息:请求接受者加入到发送者当前所处的集群里;
- ping消息:集群内节点探测其他节点是否在线的消息,这种消息不是每两两发送,而且随机选出5个或者超过一定时间没有返回pong消息的节点;
- pong消息:回复meet或ping消息,或者通知其他节点刷新对本节点的认识;
- fall消息:当节点a判断节点b进入fall状态,会发送此消息给集群内的其他节点;
- publish消息:当节点收到publish命令会执行此命令并向集群内广播一条publish消息,所有接收到这条publish消息的节点都会执行相同的publish命令
以上文字来自Dimmacro,转载请说明来源:http://www.cnblogs.com/dimmacro/
Redis设计与实现-主从、哨兵与集群的更多相关文章
- Redis主从哨兵和集群搭建
主从配置 哨兵配置 集群配置 1.主从: 国王和丞相,国王权力大(读写),丞相权利小(读) 2.哨兵: 国王和王子,国王死了(主服务挂掉),王子继位(从服务变主服务) 3.集群: 国王和国王,一个国王 ...
- Redis设计与实现3.3:集群
集群 这是<Redis设计与实现>系列的文章,系列导航:Redis设计与实现笔记 集群中的节点 创建集群 通过 CLUSTER NODE 命令可以查看当前集群中的节点.刚启动时,默认每一台 ...
- Redis主从配置,哨兵,集群的设计原理
一 前言 谈到Redis服务器的高可用,如何保证备份的机器是原始服务器的完整备份呢?这时候就需要哨兵和复制. 哨兵(Sentinel):可以管理多个Redis服务器,它提供了监控,提醒以及自动的故障转 ...
- 关于redis的主从、哨兵、集群
关于redis主从.哨兵.集群的介绍网上很多,这里就不赘述了. 一.主从 通过持久化功能,Redis保证了即使在服务器重启的情况下也不会损失(或少量损失)数据,因为持久化会把内存中数据保存到硬盘上,重 ...
- 关于redis主从|哨兵|集群模式
关于redis主从.哨兵.集群的介绍网上很多,这里就不赘述了. 一.主从 通过持久化功能,Redis保证了即使在服务器重启的情况下也不会损失(或少量损失)数据,因为持久化会把内存中数据保存到硬盘上,重 ...
- redis主从|哨兵|集群模式
关于redis主从.哨兵.集群的介绍网上很多,这里就不赘述了. 一.主从 通过持久化功能,Redis保证了即使在服务器重启的情况下也不会损失(或少量损失)数据,因为持久化会把内存中数据保存到硬盘上,重 ...
- 关于redis的主从、哨兵、集群(转)
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明.本文链接:https://blog.csdn.net/c295477887/article/de ...
- Redis主从同步、哨兵、集群
什么是主从同步(复制) 主从复制,是指将一台Redis服务器的数据,复制到其他的Redis服务器.前者称为主节点(master),后者称为从节点(slave),数据的复制是单向的,只能由主节点到从节点 ...
- docker+redis安装与配置,主从+哨兵模式
docker+redis安装与配置 docker安装redis并且使用redis挂载的配置启动 1.拉取镜像 docker pull redis:3.2 2.准备准备挂载的目录和配置文件 首先在/do ...
- kubernetes部署redis主从高可用集群
1.redis主从高可用集群结构 2.k8s部署有状态的服务选择 对于K8S集群有状态的服务,我们可以选择deployment和statefulset statefulset service& ...
随机推荐
- Dalvik VM (DVM) 与Java VM (JVM)之间有哪些区别?
Dalvik虚拟机存在于Android系统,JVM是java虚拟机,两者都是虚拟机,本文就对两者进行比较,讲述它们的不同. Dalvik虚拟机是Google等厂商合作开发的Android移动设备平台的 ...
- 15个最好的PDF转word的在线转换器,将PDF文件转换成doc文件
PDF是一种文件格式,包含文本,图像,数据等,这是独立于操作系统的文件类型.它是一个开放的标准,压缩,另一方面DOC文件和矢量图形是由微软文字处理文件.该文件格式将纯文本格式转换为格式化文档.它支持几 ...
- Test Tex
\begin{equation}\label{exampleone}r = r_F+ \beta (r_M - r_F) + \epsilon\end{equation}
- Scala 深入浅出实战经典 第64讲:Scala中隐式对象代码实战详解
王家林亲授<DT大数据梦工厂>大数据实战视频 Scala 深入浅出实战经典(1-87讲)完整视频.PPT.代码下载:百度云盘:http://pan.baidu.com/s/1c0noOt6 ...
- android 抓包 使用 tcpdmp + Wireshark
下载地址tcpdump: http://www.androidtcpdump.com/ 使用su用户, 给/system/可写的权限 mount -o remount,rw -t ...
- 关于mvc、webapi中get、post、put、delete的参数
webapi中post提交的数据必须是一个类,get提交的数量无所谓 多种参数get时,参数名不能相同: 在能通过c#的校验的前提下,参数名.参数数量不能全完相同 public string Get( ...
- OllyICE 调试的程序无法处理异常 解决方法
问题描述 在用OllyICE打开可执行文件时出现如下图所示错误 解决方法 1. 选项 -> 调试设置 , 打开调试选项 2. 切换到 异常 页签 3. 取消勾选 忽略(传递给程序)以下异常: 单 ...
- C# 调用百度地图Web服务API
最近公司项目中需要根据两个地点的交通路径和距离做一些数据推荐,为了程序的稳定和用户体验所以想从百度地图 API 采集数据保存到数据库中,经过一翻研究之后选定了百度地图 Web 服务 API 中的 Di ...
- saiku、mondrian前奏之——立方体、维度、Schema的基本概念
以前介绍了几个基本工具:saiku 和 Schema Workbench,算是入门级别的了解多维报表,如果要继续深入,需要深入了解如下几个概念: 1.OLAP 联机分析处理,和他对应的是OLTP(联机 ...
- Android Studio配置和使用OpenCV3.x,不需要OpencvManager
转载声明,本文转自CSDN:http://blog.csdn.net/qq_22033759/article/details/51156121 ps:本来在贴吧上有人问,想自己写的,但时间有限,当初自 ...