最近在复盘redis的知识,所以本文开始希望介绍下redis的集群架构、原理以及部署;本文主要介绍redis的主从复制集群,包括其架构模型,原理,高可用等;

一、主从集群的介绍

  redis的主从复制集群为了提高效率降低客户端等待时长,主从间的数据同步采用的是弱一致性的策略,即客户端请求发到主机后,不论是否同步到备机,都认为此次请求是成功的,这样虽然效率上提高了,但是数据一致性却得不到保障;所以redis提供了一个min-replicas-to-write参数用来配置,至少有几台从机与主机保持连接时主机才能执行写入操作,一定程度上维护了数据的一致性;

  其次,使用redis主从复制集群主要是为了解决单点故障问题,从机相当于主机的备份,且只提供读不提供写入功能,为的是在主机故障导致不能对外提供服务时从机能快速接替从而实现集群的高可用;而集群间主从的切换显然不能通过人工来完成,所以redis提供了一个哨兵的概念,顾名思义,哨兵即负责监控放哨,当主机不可用时迅速从从机中选出一个主机来,而这又涉及到以下两个方面;

  • 1、如何判断redis集群的master不可用

    判断master不可用使用的是过半机制,即当哨兵集群中某一个哨兵发现master不可用时,会向集群其他哨兵发送is-master-down-by-addr指令询问master是否真的挂了,集群其他哨兵收到指令后会根据自身与master的连接情况判断是否真的挂了,然后给第一个哨兵作出响应,是否赞成master挂了;当超过集群数量一半加1的机器认为master挂了那么就投票通过,即认为redis集群的master真的挂了,需要进行选主操作;所以哨兵也应该是集群部署的,单个部署的话与主机是一对一的关系,不稳定性太大容易造成误判
  • 2、哨兵发现master挂了过后又是如何给redis集群做主从个切换的呢(哨兵的选主)

    当第一个发现master挂了的哨兵收到其他哨兵的响应确认master挂了后,会继续发送一个请求,希望自己成为哨兵的leader来进行redis集群的主从切换操作,此时该哨兵被称为候选者;集群中的所有哨兵都只有一次投票机会,投给自己或者别人,需要注意的是只有候选者才能将票投给自己;哨兵之间的选主使用的是Raft算法

注意:

1、一般最先发现master挂了的哨兵会作为哨兵集群选主的候选者,会自动投给自己一票

2、如果同一时点有两个哨兵同时发现master挂了,那么就会有两个候选者,他们都投给自己一票,需要注意的是集群中的每个哨兵只有一次投票机会,所以两个候选者之外的哨兵肯定只会给两个候选者中的一个投票

二、主从集群的安装部署

我在安装步骤里做了一些笔记,大概也囊括了主从复制的大部分特性,并且也贴上了关键命令执行的图片,所以我就不拎出来单独介绍了

1、环境准备

  • 1、先在linux下安装redis,这里我就不贴教程了,我安装的是redis-5.0.5版本
  • 2、进入redis安装目录下的utils文件夹,执行 ./install_server.sh命令然后无脑回车,自动安装redis服务,做集群的话则第一遍默认执行6379,第二遍第三遍可以把端口号换成6380和81,这样我们主机里就有三个redis服务了
  • 3、安装完后执行service redis_6379 stop、service redis_6380 stop和service redis_6381 stop分别停掉这三台主机,因为后续演示我们需要前台阻塞运行查看日志
  • 4、在任意目录下创建一个文件夹testRedis,然后把/etc下的redis的配置文件复制过来,因为我们集群测试会给一堆配置,所以另外复制一份,不动系统本身的配置,命令如下
    • mkdir testRedis
    • cd testRedis
    • cp /etc/redis/* ./
  • 5、编辑/testRedis下的三个配置文件,将
    • daemonize置为no,使redis服务前台运行,方便观察日志;
    • 注释掉 logfile /var/log/redis_6379.log使其前台打印
    • appendonly置为no,关闭aof使其只使用rdb,具体原因后面会分析

    上面的配置完成后,表示接下来启动的redis实例是会前台阻塞运行且不使用aof的持久化方式

  • 6、启动三个redis实例
    • redis-server ~/testRedis/6379.conf
    • redis-server ~/testRedis/6380.conf
    • redis-server ~/testRedis/6381.conf
  • 7、启动三个reids-cli连接三个实例
    • redis-cli -p 6379
    • redis-cli -p 6380
    • redis-cli -p 6381
  • 8、通过命令的方式使6380和6381作为slave追随6379
    • 老版本命令 slaveof 127.0.0.1 6379
    • 新版本(5.0)命令 replicaof 127.0.0.1 6379

    注意:

    1、主从集群搭建完毕后,在6379set数据后80和81就能同步过去了,但是默认情况下80、81是不能写入的,会报 READONLY You can't write against a read only slave的错误;并且从机第一次追随主机时是会flush掉本身所有数据的,会全量同步主机的数据过来;

  • 9、模拟从机下线
    • 6381下线重启仍追随6379,不开启aof,命令如下:

      redis-server ~/testRedis/6381.conf --replicaof 127.0.0.1 6379

    • 6381下线重启仍追随6379,同时开启aof,命令如下:

      redis-server ~/testRedis/6381.conf --replicaof 127.0.0.1 6379 --appendonly yes

1、由上面两个图可以看到,开启aof时从机(6381)是会先flush掉自身数据重新从master(6379)身上全量同步数据的,所以从效率上来说增量同步肯定优于全量同步的

2、从机下线重启后仍然追随原主机(即下线前做过主从同步)的话,如果从机重启时未开启aof,那么会做增量同步,否则则会进行全量同步;因为rdb中会记录原主机信息而aof不会;

  • 10、模拟主机下线

    直接终止6379的进程,那么此时6380和81会报Error condition on socket for SYNC: Connection refused错误,并且均只能提供读服务不能提供写入能力,所以此时可以人为的让6380或6381使自己作为master,命令如下

    • replicaof no one

      然后再使另一个实例追随新的matster,这样redis集群又可以对外提供服务了,但是这种靠人为选主并切换终究不靠谱,所以就要用到哨兵模式,用来监控,当master挂了的时候能快速的响应,重新选主,使集群快速可用
  • 11、集群相关的配置
    • replica-serve-stale-data yes 从机同步主机数据期间是否将自己原本的旧数据对外暴露,默认对外暴露
    • replica-read-only yes 从机是否开启只读模式,默认从机只读
    • repl-diskless-sync no 主机以何种方式将rdb文件同步给备机,yes表示主机生成rdb后直接通过网络IO将数据发给备机;no的话表示主机先将rdb通过磁盘IO落本机磁盘再通过网络传送给备机;默认为先落磁盘再发送给从机
    • repl-backlog-size 1mb

      增量复制的大小;即当从机同步完后主机会维护一个增量数据的队列,从机下次备份时可以拿着offset从队列里直接取增量数据;默认是1m,但是需要根据业务的写入量来确定该值大小;因为如果业务写入过多,从机下线恢复这段时间写入超过默认的1m的话,那么只使用增量同步的话就会丢失数据了
    • min-replicas-to-write 3

      可以理解成master能否执行写入操作的一个限制条件;当有指定个数的从机与主机保持连接时master才能执行写操作;默认为当有3个从机与master保持连接master才能执行写入操作,否则master不对外提供写入能力;这样虽然不能保证所有的从机都能同步到master的数据,但是可以保证至少有几个从机存活master才能执行写入操作,避免丢失过多数据;值为0表示关闭该限制
    • min-replicas-max-lag 10

      从机是否与主机保持连接的标准;默认为延迟小于10s的从机才被认为是健康的,是与主机保持连接的

三、哨兵集群搭建

  • 1、由于哨兵我们也搭建一个集群,所以创建三个哨兵的配置文件,在testRedis下执行以下命令

    • vi 26379.conf,按i输入:
    • port 26379
    • sentinel monitor mymaster 127.0.0.1 6379 2

    一个redis哨兵集群可以监控多个redis集群,所以mymaster表示redis集群的名称,后面跟redis集群master的ip和端口;最后一个数字2表示redis集群中几个实例通过后投票有效,即我们常说的过半加1后的那个值,因为我的redis集群只有三台机器,所以这个值为3/2+1=2

    • cp 26379.conf 26380.conf 复制26379的配置,修改26380.conf里的port为26380
    • cp 26379.conf 26381.conf 复制26379的配置,修改26381.conf里的port为26381
  • 2、启动redis集群中的各个实例,以6379为主6380和6381为slave追随6379
  • 3、启动哨兵集群
    • redis-server ./26379.conf --sentinel

    • redis-server ./26380.conf --sentinel

    • redis-server ./26381.conf --sentinel

    上图,哨兵配置文件只配置了redis集群的主机ip和端口,但是哨兵启动后却获取了整个redis集群所有实例的信息,是因为redis集群中从机追随主机时主机已经知道从机的信息了,所以哨兵通过获取主机信息既能获取从机的信息

    另外,哨兵又是如何获取其他哨兵的信息的呢?这是因为其使用了redis本身的发布订阅功能;即在redis集群的master上发布各哨兵信息,哨兵们自行订阅,可以通过在redis任意实例上执行PSUBSCRIBE * 来观察哨兵之间的交互信息,如图:

  • 4、当redis集群的master下线后哨兵集群是会自动修改自身的配置文件,将sentinel monitor mymaster后面换成最新的master的ip加端口,并且还会在配置文件后追加识别到的redis的其他从机和其他哨兵信息,如图



    至此,redis的主从复制集群介绍完毕,如有纰漏还望指正!后续会继续更新redis的分片集群......

redis集群之主从复制集群的原理和部署的更多相关文章

  1. Redis 集群_主从复制_哨兵模型

    1 redis集群简介 1.1 集群的概念 所谓的集群,就是通过添加服务器的数量,提供相同的服务,从而让服务器达到一个稳定.高效的状态. 1.1.1 使用redis集群的必要性 问题:我们已经部署好了 ...

  2. Redis三种模式——主从复制,哨兵模式,集群

    一.Redis主从复制作用 数据冗余:主从复制实现了数据的热备份,是持久化之外的一种数据冗余方式. 故障恢复:当主节点出现问题时,可以由从节点提供服务,实现快速的故障恢复:实际上是一种服务的冗余. 负 ...

  3. Redis复制与可扩展集群搭建

    抄自:http://www.infoq.com/cn/articles/tq-redis-copy-build-scalable-cluster 讨论了Redis的常用数据类型与存储机制,本文会讨论一 ...

  4. (转)Redis复制与可扩展集群搭建

    讨论了Redis的常用数据类型与存储机制,本文会讨论一下Redis的复制功能以及Redis复制机制本身的优缺点以及集群搭建问题. Redis复制流程概述 Redis的复制功能是完全建立在之前我们讨论过 ...

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

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

  6. 深入学习Redis(5):集群

    前言 在前面的文章中,已经介绍了Redis的几种高可用技术:持久化.主从复制和哨兵,但这些方案仍有不足,其中最主要的问题是存储能力受单机限制,以及无法实现写操作的负载均衡. Redis集群解决了上述问 ...

  7. Redis 实战篇之搭建集群

    Redis 集群简介# Redis Cluster 即 Redis 集群,是 Redis 官方在 3.0 版本推出的一套分布式存储方案.完全去中心化,由多个节点组成,所有节点彼此互联.Redis 客户 ...

  8. redis主从同步故障切换及集群配置

    一.redis是一中高性能的缓存数据库, 原理:1. 从服务器向主服务器发送 SYNC 命令.2. 接到 SYNC 命令的主服务器会调用BGSAVE 命令,创建一个 RDB 文件,并使用缓冲区记录接下 ...

  9. redis主从架构,分片集群详解

    写在前面:这篇笔记有点长,如果你认真看完,收获会不少,如果你只是忘记了相关命令,请翻到末尾. redis的简单介绍: 一个提供多种数据类类型储存,整个系统都在内存中运行的, 定期通过异步的方式把数据刷 ...

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

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

随机推荐

  1. SNI 路由和多协议端口的 TCP

    文章转载自:https://mp.weixin.qq.com/s/nMMN7hAJK6SFn1V1YyxvHA 下面是一个简单的示例配置 - 使用最新支持的 YAML 文件格式,将请求路由到一个数据库 ...

  2. 实用脚本:检查高 CPU / 内存消耗进程

    1 检查高 CPU 消耗进程在 Linux 上运行了多长时间的 Bash 脚本 该脚本将帮助你确定高 CPU 消耗进程在 Linux 上运行了多长时间. # vi /opt/scripts/long- ...

  3. Docker镜像仓库Harbor之Swagger REST API整合配置

    转载自:https://cloud.tencent.com/developer/article/1010618 1.Swagger 介绍 Swagger 是一个规范和完整的框架,用于生成.描述.调用和 ...

  4. (WebFlux)004、WebFilter踩坑记录

    一.背景 使用SpringWebFlux的WebFilter时,由于不熟悉或一些思考疏忽,容易出现未知的异常.记录一下排查与解决方案,给大家分享一下. 二.问题 2.1 问题描述 在测试接口方法时,出 ...

  5. PAT (Basic Level) Practice 1009 说反话 分数 20

    给定一句英语,要求你编写程序,将句中所有单词的顺序颠倒输出. 输入格式: 测试输入包含一个测试用例,在一行内给出总长度不超过 80 的字符串.字符串由若干单词和若干空格组成,其中单词是由英文字母(大小 ...

  6. 计算机三大硬件和操作系统以及python解释器

    今日分享内容概要 计算机五大组成部分详解 计算机三大核心硬件 操作系统 编程与编程语言 编程语言的发展历史 编程语言的分类 python解释器 python解释器多版本共存 分享详细 计算机五大组成部 ...

  7. Java问题之超过数值表示范围(例如64位)结果是什么 (阶乘)

    关于老师在课上所提及的这个问题 我做了验证 截图如下 只是一个简单的计算阶乘的代码 在运行时得到了如下结果 可以看到,对于部分数字如果超出范围会从64位处自动截断,而这时由于是二进制表示,首位默认是符 ...

  8. 关于Linux中使用bc命令计算圆周率

    Linux系统中,我们可以安装bc计算器用来计算pi值(π圆周率) 在玩的同时,这可以从某些方面反映出一个CPU的运算能力,在命令最前加上time即可 如果系统中没有bc命令,需要先进行安装:yum ...

  9. 220722 T4 求和 /P4587 [FJOI2016]神秘数 (主席树)

    好久没打主席树了,都忘了怎么用了...... 假设我们选了一些数能构成[0,x]范围内的所有值,下一个要加的数是k(k<=x+1),那么可以取到[0,x+k]内的所有取值,所以有一种做法: 对于 ...

  10. NOIP2011 提高组 聪明的质监员(二分+前缀和)

    看到这道题,应该都能想到用二分,那问题是怎么去判定呢? 我们考虑用前缀和(a1统计w,a2统计v),枚举每个矿石,,当前判定的值是x,如果该矿石的w>=x,a1[i]=a1[i-1]+1,a2[ ...