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& ...
随机推荐
- [界面开发新秀]AYUI开发360领航版系列教程-AyWindow接入[1/40]
开发包DLL下载地址:请加入 466717219群,自己下载(已经发布ayui3.7,在群里,为了不让你作为收藏工具,也只有入群才能下载,喜欢你就进.不喜欢你还是不要来了) AYUI初衷:简单化商业软 ...
- JAVA中取子字符串的几种方式
有这样一串字符串:String s = "共 100 页, 1 2 3 4..."; 假如我想把"100"给取出来,该如何做? 方法一: 采用split的方式 ...
- 记录一下,如何配置nodejs nginx的反向代理
本文是在mac下配置nodejs 在nginx下的反向代理 1.安装nodejs,之前就安装了. 2.安装nginx ,我采用的直接源码安装 3.进入 /usr/local/nginx/conf 目录 ...
- .NET分布式事务--TransactionScop
一.开启DTC服务 方式一 计算机—管理—服务—Distributed Transaction Coordinator—属性—开启 方式二 CMD命令子界面输入:net start msdtc 二.设 ...
- C#删除字符串最后一个字符的几种方法
字符串:string s = "1,2,3,4,5,"目标:删除最后一个 "," 方法:1.用的最多的是Substring,这个也是我一直用的s = s.Sub ...
- Two classes have the same XML type name 排错【转】
今天遇到一个问题,webservice发布的时候报下面的错误: <strong>Caused by: com.sun.xml.bind.v2.runtime.IllegalAnnotati ...
- ubuntu系统中的VMware 安装win7 Ghost镜像的几个坑
1.ghost镜像安装时要先分区 2.分区后要激活 3.VM(虚拟机安装win7 提示 :units specified don't exist, SHSUCDX can't install)解决方法 ...
- 论一次iOS面试
最近觉得现在所在公司平台用户量太少,自身技术已经到了一个瓶颈,是时候需要换一个用户量多的平台,好好研究下iOS的性能优化.内存优化等问题了. 所面试的公司由于一些默认的规定,就不多说了,大致是面了一个 ...
- English Metric Units and Open XML
English Metric Units and Open XML 在Open XML里使用了English Metric Units(EMUs)来作为度量单位.比如 public class Ext ...
- JQuery 表格拖动调整列宽效果
类似于桌面程序中的表格拖动表头的效果,当鼠标停留在表头边框线上时,鼠标会变成表示左右拖动的形状,接着拖动鼠标,会在表格中出现一条随鼠标移动的竖线,最后放开鼠标,表格列宽会被调整.最近比较空闲,便自己动 ...