主从
  1. 从机使用slaveof 命令来复制主机的缓存数据,包括同步sync与命令传播两个操作;
  2. 从机同步sync命令给主机,主机收到后执行需要耗费大量cpu、内存和磁盘IO资源的bgsave命令来生成rdb文件,并发送给从服务器,期间会耗费大量网络资源,因此,同步的代价是很大的;
  3. 从机载入rdb文件后,主机再把执行bgsave后记录在缓冲区里的所有写命令发送给从服务器实现主从当前状态的同步;
  4. redis 2.8之前的版本在复制是如果出现了断网,则会重新全部重新复制,效率低,2.8版以后使用psync <runid> <offset>命令,根据主机维护的复制积压缓冲区以及主从间各自维护的偏移量来确定是完整重同步还是部分重同步;
  5. 每个运行的redis服务器都有一个唯一识别的运行ID,初次复制从机会记录主机的运行ID,当断线重连是会先检测记录的主机ID与当前连接的主机ID是否一致,如果不一致则说明主机重启过,此时将执行完整重同步;
  6. 复制实现过程:
    • 从机保存主机的ip、port到redisServer数据结构里;
    • 主从建立套接字进行连接;
    • 从机发送ping命令给主机对主机进行状态监测;
    • 主机对从机进行身份密码验证;
    • 从机给主机发送监听的端口号;
    • 从机向主机发送psync同步;
    • 命名传播
  7. 从机默认每一秒向主机发送replconf ACK <replication_offset>,用于检测主从服务器网络连接状态、辅助实现最小从机数配置、根据偏移量检测命令丢失并进行适当重发。

以上文字来自Dimmacro,转载请说明来源:http://www.cnblogs.com/dimmacro/

哨兵
  1. sentinel由一个或多个sentinel实例组成系统监视多个主服务器以及所属的从服务器;
  2. sentinel本质是一个运行在特殊模式下的redis服务器,只支持ping、sentinel、info、subscribe、unsubscribe、psubscribe、punsubscribe共7个命令;
  3. 每个sentinelRedisInstance结构里可以是主服务器、从服务器或另一个sentinel的信息;
  4. 每个sentinel会分别于主服务器以及每个从服务器建立命令连接与订阅连接,通过命令连接分别向主从服务器发送info信息以获得主从机状态信息,同时,通过命令连接向服务器的sentinel_:hello频道发送sentinel自身信息以及主从及信息以便其他sentinel可以共享;
  5. 通过订阅连接获取sentinel_:hello频道信息,这些信息可能来自自己,也可能来自其他sentinel;
  6. sentinel与其他sentinel之间只创建命令连接进行通讯,共享信息通过sentinel_:hello频道即可;
  7. 每个sentinel会向主从机以及其他sentinel发送ping命令,如果在一定的时间内没有得到有效回复,则会被认为其已主观下线,如果是主服务器被判断为主观下线,则sentinel会向其他sentinel进行询问,如果达到了设置的认为下线的sentinel数,则判断主服务器下线;
  8. 所有sentinel根据raft算法选举出一个leader sentinel对已下线的主服务器进行故障转移操作,包括在从服务器中选取某个为主服务器(依据从的优先级、复制偏移量、最小运行ID),让其他从改为复制新的主,让旧的主变为从;

以上文字来自Dimmacro,转载请说明来源:http://www.cnblogs.com/dimmacro/

集群
    1. 多个redis节点可以组成一个集群,每个节点都存储了集群里自身及其他节点的信息,使用cluster meet将某个节点加到集群中;
    2. 在各自节点上使用命令cluster addlots 指派负责的槽号,每个节点都会记录自己及集群内其他节点的对应负责的槽号,所有槽号都被指派到具体节点后,整个集群进入上线状态;
    3. redis集群将数据库分为8个字节共16384个slot槽,每个键key的crc-16&16384得到该key所在的槽号;
    4. 如果key对应的槽号不在当前节点内,会向客户端返回moved key ip:port,引导客户端去找正确的节点;
    5. 扩展节点并指派槽后整个集群会进行重新分片,分片按单个槽依次进行,如果在槽的分片迁移过程中请求到槽所在的节点,会发生ask重定向;
    6. 当集群内的某个节点发生故障后,其他正常的节点会从该故障节点所属的从节点中选取一个主节点,选取的算法同样基于raft领头选举算法;
    7. 被选中为从节点先执行slaveof no one命令成为主节点,然后撤销所有对已下线主节点的槽指派,并指派给自己,然后在集群内广播PONG消息通知其他主节点;
    8. 集群内节点通讯的5中消息:
      • meet消息:请求接受者加入到发送者当前所处的集群里;
      • ping消息:集群内节点探测其他节点是否在线的消息,这种消息不是每两两发送,而且随机选出5个或者超过一定时间没有返回pong消息的节点;
      • pong消息:回复meet或ping消息,或者通知其他节点刷新对本节点的认识;
      • fall消息:当节点a判断节点b进入fall状态,会发送此消息给集群内的其他节点;
      • publish消息:当节点收到publish命令会执行此命令并向集群内广播一条publish消息,所有接收到这条publish消息的节点都会执行相同的publish命令

以上文字来自Dimmacro,转载请说明来源:http://www.cnblogs.com/dimmacro/

Redis设计与实现-主从、哨兵与集群的更多相关文章

  1. Redis主从哨兵和集群搭建

    主从配置 哨兵配置 集群配置 1.主从: 国王和丞相,国王权力大(读写),丞相权利小(读) 2.哨兵: 国王和王子,国王死了(主服务挂掉),王子继位(从服务变主服务) 3.集群: 国王和国王,一个国王 ...

  2. Redis设计与实现3.3:集群

    集群 这是<Redis设计与实现>系列的文章,系列导航:Redis设计与实现笔记 集群中的节点 创建集群 通过 CLUSTER NODE 命令可以查看当前集群中的节点.刚启动时,默认每一台 ...

  3. Redis主从配置,哨兵,集群的设计原理

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

  4. 关于redis的主从、哨兵、集群

    关于redis主从.哨兵.集群的介绍网上很多,这里就不赘述了. 一.主从 通过持久化功能,Redis保证了即使在服务器重启的情况下也不会损失(或少量损失)数据,因为持久化会把内存中数据保存到硬盘上,重 ...

  5. 关于redis主从|哨兵|集群模式

    关于redis主从.哨兵.集群的介绍网上很多,这里就不赘述了. 一.主从 通过持久化功能,Redis保证了即使在服务器重启的情况下也不会损失(或少量损失)数据,因为持久化会把内存中数据保存到硬盘上,重 ...

  6. redis主从|哨兵|集群模式

    关于redis主从.哨兵.集群的介绍网上很多,这里就不赘述了. 一.主从 通过持久化功能,Redis保证了即使在服务器重启的情况下也不会损失(或少量损失)数据,因为持久化会把内存中数据保存到硬盘上,重 ...

  7. 关于redis的主从、哨兵、集群(转)

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明.本文链接:https://blog.csdn.net/c295477887/article/de ...

  8. Redis主从同步、哨兵、集群

    什么是主从同步(复制) 主从复制,是指将一台Redis服务器的数据,复制到其他的Redis服务器.前者称为主节点(master),后者称为从节点(slave),数据的复制是单向的,只能由主节点到从节点 ...

  9. docker+redis安装与配置,主从+哨兵模式

    docker+redis安装与配置 docker安装redis并且使用redis挂载的配置启动 1.拉取镜像 docker pull redis:3.2 2.准备准备挂载的目录和配置文件 首先在/do ...

  10. kubernetes部署redis主从高可用集群

    1.redis主从高可用集群结构 2.k8s部署有状态的服务选择 对于K8S集群有状态的服务,我们可以选择deployment和statefulset statefulset service& ...

随机推荐

  1. 奇怪吸引子---Rucklidge

    奇怪吸引子是混沌学的重要组成理论,用于演化过程的终极状态,具有如下特征:终极性.稳定性.吸引性.吸引子是一个数学概念,描写运动的收敛类型.它是指这样的一个集合,当时间趋于无穷大时,在任何一个有界集上出 ...

  2. Andriod Studio 开发环境安装和配置

    Android Studio安装配置详细步骤(图文):http://www.2cto.com/kf/201604/500642.html第一次使用Android Studio时你应该知道的一切配置 : ...

  3. Codeforces Round #384 (Div. 2) A. Vladik and flights 水题

    A. Vladik and flights 题目链接 http://codeforces.com/contest/743/problem/A 题面 Vladik is a competitive pr ...

  4. [转]移动端web页面使用字体的思考

    一直不知道手机端用的什么字体,只是觉得类似雅黑,直到有一次设计师问到设计移动web页面该用什么字体才严肃地想起这个问题. 前人已栽树,后人我就直接转来吧…… 回想2年前刚开始接触手机项目,接到PSD稿 ...

  5. 【网络编程】——windows socket 编程

    测试demo #include <winsock2.h> #include <stdio.h> #include <string.h> #include <s ...

  6. java后台进程和线程优先级

    1. 后台线程:处于后台运行,任务是为其他线程提供服务.也称为“守护线程”或“精灵线程”.JVM的垃圾回收就是典型的后台线程. 特点:若所有的前台线程都死亡,后台线程自动死亡. 设置后台线程:Thre ...

  7. 旧文—冬日感怀

    冬日感怀   下雪了,虽不大,可那雪花落在手上,融在心里,便泛起淡淡的温柔,因为这是冬日的馈赠啊,是上苍的礼物,是往昔记忆的灰烬化作天地间的精灵装点纷繁琐碎的世界.于是,透过汽车上雾气氤氲的玻璃窗,人 ...

  8. ubuntu tomcat 部署java web

    1,安装jdk apt-get install openjdk-7-jdk 2,下载tomcat.解压到对应的文件夹 3,将xxx.war放入到 tomcat下的  webapp目录下(此目录下不要有 ...

  9. 刨根问底U3D---从Profile中窥探Unity的内存管理

    这篇文章包含哪些内容 这篇文章从Unity的Profile组件入手,来探讨一下Unity在开发环境和正式环境中的内存使用发面的一些区别, 并且给出了最好控制内存的方法(我想你已经知道了...Prefa ...

  10. Spark1.0新特性-->Spark SQL

    Spark1.0出来了,变化还是挺大的,文档比以前齐全了,RDD支持的操作比以前多了一些,Spark on yarn功能我居然跑通了.但是最最重要的就是多了一个Spark SQL的功能,它能对RDD进 ...