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& ...
随机推荐
- http 请求类
1.httpclient请求类 代理demo:http://hc.apache.org/httpcomponents-client-4.3.x/httpclient/examples/org/apac ...
- .Net规则引擎介绍 - REngine
规则引擎 规则引擎由推理引擎发展而来,是一种嵌入在应用程序中的组件,实现了将业务决策从应用程序代码中分离出来,并使用预定义的语义模块编写业务决策.接受数据输入,解释业务规则,并根据业务规则做出业务决策 ...
- 面包板入门电子制作(class1)视频 全套30集高清
面包板入门电子制作(class1)套件(30集高清) 本套件以电子制作中最基础的元器件在面包板上搭建电路,用启发性的视频教学方式,使学习者熟悉电子电路基础.发挥想像力.在创新设计和制作中学会独立设计和 ...
- AWVS漏洞测试-03节-添加扫描项目
http://localhost:9660 我们要扫描这个页面 点击左上角的New Scan,在Scan Single哪里输入要扫描的网站地址,可以是本地地址 然后选择下一步 Next 这里我们可以配 ...
- mssql中sp_executesql的用法
上图:
- .net微信公众号开发——群发消息
作者:王先荣 本文将介绍微信公众号开发中用于群发消息的类MassMessage,包括:(1)MassMessage类:(2)群发:(3)删除:(4)预览:(5)查询发送状态:(6)接收推送群发结 ...
- 解决“com.android.dex.DexIndexOverflowException: method ID not in [0, 0xffff]: 65536”问题(l转)
同时在工程中引入了多个第三方jar包,导致调用的方法数超过了android设定的65536个(DEX 64K problem),进而导致dex无法生成,也就无法生成APK文件. 解决办法如下: 1.谷 ...
- TSPL学习笔记(3):排序算法练习
快速排序 快排的详细介绍见,简单的说就是取输入序列中的首元素m,然后将除首元素m以外的其它元素分成两组,小于等于m的一组和大于m的一组.将3组元素组合成输入队列:小于等于m + m + 大于m. 下面 ...
- 【汇总】涉及iOS&iPhone开发相关文章汇总
此文章汇总本博客中有涉及iPhone开发的相关文章,不定时更新中... 1.NSUserDefaults快速存储数据: http://www.cnblogs.com/ios-wmm/archive/2 ...
- css3 定义选择器
引言:CSS样式规则有两个主要部分.选择器决定将格式化应用到哪些元素.声明则定义要应用的格式化. 构造选择器 选择器可以定义五个不同的标准来选择要进行格式化的元素. 元素的类型或者名称.如下所示. h ...