热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

redis正常停掉_并发编程之Redis:Redis主从架构及哨兵架构

思考如何让Redis能够带来更高的QPS?十万?百万?亿并发?一个系统、一个软件的并发数,很难给他一个具体的值

38fef28d4ba6b41da139f74f162b7580.gif

6faf218655b07be104dc3d07dd46b719.png

思考

  • 如何让Redis能够带来更高的QPS? 十万+?百万+?亿并发?一个系统、一个软件的并发数,很难给他一个具体的值,因为有很多的因素会影响到;比如Redis,你存的单Key的数据量,保存数据的数据结构,CPU的性能,磁盘的性能等等...当我们需要承载更高访问量的时候,很容易想到的就以下的方式

redis扩容方式

  • 搞更好的机器(垂直扩容)

    • 优点:简单,只需要花钱配置一台更好的机器就可以了

    • 缺点:成本高,性能越好,机器越贵;很容易达到瓶颈,假如最好的单机能承载20万QPS,那我现在要达到40万,怎么办?;

  • 搞更多的机器(水平扩容)

    • 优点:成本低,很容易水平扩展,随便搞台机器,加上去就好了,按需添加;

    • 缺点:使用,维护成本更高,需要管理一个大的集群,需要维护更多的机器。

  • Redis针对扩展提供的方案

    • 方案一:主从架构(master slave)

    • 方案二:集群架构(cluster)

主从架构(master slave)

  • 基本结构图0f0fda188a23734cc5e5132d003c5ae8.png

  • 作用

    • 实现读写分离,降低单点服务的压力;

    • 方便水平扩展,带来更高的吞吐量;

    • 为Redis的高可用打好基础;就单纯的主从架构是没法做到高可用的;

  • 特点

  1. master处理完消息之后,就立马对客户端进行响应

  2. 数据是通过异步的方式从master同步到slave

  3. slave复制数据的时候,不会阻塞master的服务

  4. slave复制数据的时候,也不会阻塞自己的读服务

  5. slave复制完成之后,将新的数据加载到内存期间,会将对外服务暂停

主从架构Redis的搭建

  • Redis安装(单机版) https://lupf.cn/articles/2020/04/06/1586153137483.html 当主从所有机器都按上面的方式安装好Redis,且保证Redis本机下能正常启动之后,就可以按以下当时做主从配置了

  • 主节点配置调整(6379.conf)

    // 1. 第一个参数 bind 就是redis绑定的ip,默认为127.0.0.1;意味着只能本机访问,其他机器访问不了
    // 将本机的ip添加进去
    bind 192.168.1.140 127.0.0.1

    // 2. 第二个参数,从节点只读,默认就是打开的,确认一下
    slave-read-only yes

    // 3. redis的认证密码
    requirepass 123456789
    // 设置之后,客户端可以通过-a参数指定密码连接:redis-cli -a 123456789
    // 或者进去之后通过指令:auth 123456789 进行认证

    // 4. redis的master节点的连接口令
    masterauth 123456789

  • 从节点配置调整

    // 从节点添加以上主节点的所有配置

    // 额外添加项
    // 设置主节点的ip端口
    // slaveof
    slaveof 192.168.1.140 6379

  • 检查防火墙

    // 第一种方式,将防火墙关了

    // 第二种方式,添加端口开放;如果防火墙开着,又不配置端口开放,从节点将无法连接主节点
    iptables -A INPUT -ptcp --dport 6379 -j ACCEPT

  • 启动服务;优先启动主节点,再次依次启动从节点7bf18569cd18a6d7e27a35f594cdf2df.png

  • 主备状态查看

    info replication

    c144e482bb65fd41a4175c0b2d72b69e.png

  • 主备测试

    // 主节点修改,从节点查询

    d2b54bff1499231ea4721caed6366e5f.png

  • 压测

    // redis自带提供了压测工具,位于:redis-4.0.1/src 下
    redis-benchmark -h 192.168.1.140

主从架构存在的问题

  • 问题分析 是不是我们做到上面这种架构之后,咱就可以应对基于redis的高并发、高可用了呢?其实不然!上面的这种架构只是解决了高并发的问题,一旦不够了,水平加上机器(slave)就可以了,但是还是会存在以下的问题:

    • 如果是海量数据的Redis存储,那就只能使用后面要说的Redis集群(Redis Cluster)

    • 如何解决呢?能不能master挂了之后,某个slave来接管呢?当然是可以的,这就是下面要说的 哨兵模式

    • 问题一,高可用 上面的架构并没有解决高可用的问题,假如说Master挂了,整个Redis等于是不可能了;虽然说还有从节点在,但是从节点只能读数据,没办法写数据;redis既然主要是用来做缓存的,缓存却没法更新了,那就等于是没法正常使用了;

    • 问题二,无法应对海量数据 从上面的测试来看,master和slave的数据是一样的,slave保存的是master的一个备份;这样也就意味着,master能存储多少数据,整个主从架构也就只能存储多少数据?无法满足大数据量的要求。

哨兵(sentinal)架构

  • 哨兵的功能

  1. 集群监控;负责监控master和slave是否健康存在

  2. 消息通知;当存在节点不可用时,哨兵将消息通知给管理员

  3. 故障迁移;当master挂了之后,哨兵会选举一个slave替代master,实现故障迁移

  4. 配置中心;当slave提升为master,会将迁移之后的master节点地址通知给客户端(client)

哨兵部署
  • 创建配置

    // 创建用于保存哨兵配置文件的目录
    mkdir -p /etc/sentinal
    mkdir -p /var/sentinal/26379

    // 拷贝哨兵
    cp /usr/local/redis-4.0.1/sentinel.conf /etc/sentinal/26379.conf

    vim /etc/sentinal/26379.conf

    // 修改一下配置
    // 以守护进程允许
    daemonize yes
    # 绑定的端口
    port 26379
    # 绑定的ip 本机IP
    bind 192.168.1.140
    # 持久化的目录
    dir /var/sentinal/26379/
    # 这里需要注意的是 所有哨兵节点的IP都是填master的地址
    sentinel monitor mymaster 192.168.1.142 6379 2
    sentinel down-after-milliseconds mymaster 30000
    sentinel failover-timeout mymaster 60000
    sentinel parallel-syncs mymaster 1
    sentinel auth-pass mymaster 123456789
    // 在其他两台机器上采用以上相同的方式配置,除了IP配置成本机

    • monitor 参数说明

      mymaster 给监控的master设置一个别名;一个哨兵可以监控多个master
      192.168.1.142 标识当前主节点
      quorum
      1. 至少达到多少个哨兵达成一致,认为master挂了,才做故障迁移
      2. quorum只是作为一个故障识别,最终的选举还是有哨兵集群一起完成的

    • down-after-milliseconds

      超过多久没连上master,哨兵就主观认为他挂了

    • failover-timeout

      故障迁移,切换新的master的超时时间

    • parallel-syncs

      当新的master选出来之后,每次有多少个slaves去连接master做同步

  • 启动

    redis-sentinel /etc/sentinal/26379.conf
    // 或者
    redis-server /etc/sentinal/26379.conf --sentinel

    81c51651769884ca21dcf23b9b57f812.png

  • Sentinel命令

    • PING sentinel回复PONG

    • SENTINEL masters 显示被监控的所有master以及它们的状态.

    • SENTINEL master  显示指定master的信息和状态

    • SENTINEL slaves  显示指定master的所有slave以及它们的状态

    • SENTINEL get-master-addr-by-name  返回指定master的ip和端口,如果正在进行failover或者failover已经完成,将会显示被提升为master的slave的ip和端口

    • SENTINEL reset  重置名字匹配该正则表达式的所有的master的状态信息,清楚其之前的状态信息,以及slaves信息

    • SENTINEL failover  强制sentinel执行failover,并且不需要得到其他sentinel的同意。但是failover后会将最新的配置发送给其他sentinel

故障演练

当前192.168.1.142为master节点,现在我们将其手动停掉,用来测试故障迁移

redis-cli -h 192.168.1.142 -a 123456789 shutdown

  • 故障迁移的步骤

    • 第一步,单个哨兵主观认为Master挂了(sdown);不排除因为网络抖动导致误认为挂了

    • 第二步,当达到quorum数量的哨兵都认为Master挂了之后,哨兵集群客观认为Master挂了

    • 第三步,准备开始做故障迁移

    • 第四步,哨兵集群开始投票选举新的Master

    • 第五步,故障迁移至新的Master

    • 第六步,根据parallel-syncs开始做从节点挂载,故障迁移完成d6f79feac42b7ce579815669c7407939.png可以看到,master已经成功迁移到了新的节点;

主备切换带来的数据丢失问题

异步复制

fa97ec189acf0a72e14e0a7c453dcae2.png

  • 当客户端想master写了一条数据

  • 异步同步还没有做,master挂了

  • 当哨兵集群发现并做了故障迁移

  • 新的master中因为异步同步的原因,导致了部分数据的丢失

脑裂问题

727a81ae3f76ac8d796a7355b35ddf7d.png

解决方式

min-slaves-to-write 1
min-slaves-max-lag 10
// 表示,至少有一个salve,数据复制和同步的延迟不能超过10s,一旦超过,master就停止接受任何写请求

码字不易,感谢您的点赞!关注!评论!!!

2e05c148c516c3f57815e3afe255ccaf.png




推荐阅读
  • vue使用
    关键词: ... [详细]
  • eclipse学习(第三章:ssh中的Hibernate)——11.Hibernate的缓存(2级缓存,get和load)
    本文介绍了eclipse学习中的第三章内容,主要讲解了ssh中的Hibernate的缓存,包括2级缓存和get方法、load方法的区别。文章还涉及了项目实践和相关知识点的讲解。 ... [详细]
  • 本文介绍了计算机网络的定义和通信流程,包括客户端编译文件、二进制转换、三层路由设备等。同时,还介绍了计算机网络中常用的关键词,如MAC地址和IP地址。 ... [详细]
  • 个人学习使用:谨慎参考1Client类importcom.thoughtworks.gauge.Step;importcom.thoughtworks.gauge.T ... [详细]
  • 本文介绍了南邮ctf-web的writeup,包括签到题和md5 collision。在CTF比赛和渗透测试中,可以通过查看源代码、代码注释、页面隐藏元素、超链接和HTTP响应头部来寻找flag或提示信息。利用PHP弱类型,可以发现md5('QNKCDZO')='0e830400451993494058024219903391'和md5('240610708')='0e462097431906509019562988736854'。 ... [详细]
  • 使用正则表达式爬取36Kr网站首页新闻的操作步骤和代码示例
    本文介绍了使用正则表达式来爬取36Kr网站首页所有新闻的操作步骤和代码示例。通过访问网站、查找关键词、编写代码等步骤,可以获取到网站首页的新闻数据。代码示例使用Python编写,并使用正则表达式来提取所需的数据。详细的操作步骤和代码示例可以参考本文内容。 ... [详细]
  • Windows7 64位系统安装PLSQL Developer的步骤和注意事项
    本文介绍了在Windows7 64位系统上安装PLSQL Developer的步骤和注意事项。首先下载并安装PLSQL Developer,注意不要安装在默认目录下。然后下载Windows 32位的oracle instant client,并解压到指定路径。最后,按照自己的喜好对解压后的文件进行命名和压缩。 ... [详细]
  • 一句话解决高并发的核心原则
    本文介绍了解决高并发的核心原则,即将用户访问请求尽量往前推,避免访问CDN、静态服务器、动态服务器、数据库和存储,从而实现高性能、高并发、高可扩展的网站架构。同时提到了Google的成功案例,以及适用于千万级别PV站和亿级PV网站的架构层次。 ... [详细]
  • 本文介绍了绕过WAF的XSS检测机制的方法,包括确定payload结构、测试和混淆。同时提出了一种构建XSS payload的方法,该payload与安全机制使用的正则表达式不匹配。通过清理用户输入、转义输出、使用文档对象模型(DOM)接收器和源、实施适当的跨域资源共享(CORS)策略和其他安全策略,可以有效阻止XSS漏洞。但是,WAF或自定义过滤器仍然被广泛使用来增加安全性。本文的方法可以绕过这种安全机制,构建与正则表达式不匹配的XSS payload。 ... [详细]
  • 本文介绍了一个适用于PHP应用快速接入TRX和TRC20数字资产的开发包,该开发包支持使用自有Tron区块链节点的应用场景,也支持基于Tron官方公共API服务的轻量级部署场景。提供的功能包括生成地址、验证地址、查询余额、交易转账、查询最新区块和查询交易信息等。详细信息可参考tron-php的Github地址:https://github.com/Fenguoz/tron-php。 ... [详细]
  • 本文介绍了九度OnlineJudge中的1002题目“Grading”的解决方法。该题目要求设计一个公平的评分过程,将每个考题分配给3个独立的专家,如果他们的评分不一致,则需要请一位裁判做出最终决定。文章详细描述了评分规则,并给出了解决该问题的程序。 ... [详细]
  • baresip android编译、运行教程1语音通话
    本文介绍了如何在安卓平台上编译和运行baresip android,包括下载相关的sdk和ndk,修改ndk路径和输出目录,以及创建一个c++的安卓工程并将目录考到cpp下。详细步骤可参考给出的链接和文档。 ... [详细]
  • CF:3D City Model(小思维)问题解析和代码实现
    本文通过解析CF:3D City Model问题,介绍了问题的背景和要求,并给出了相应的代码实现。该问题涉及到在一个矩形的网格上建造城市的情景,每个网格单元可以作为建筑的基础,建筑由多个立方体叠加而成。文章详细讲解了问题的解决思路,并给出了相应的代码实现供读者参考。 ... [详细]
  • PHPMailer邮件类邮件发送功能的使用教学及注意事项
    本文介绍了使用国外开源码PHPMailer邮件类实现邮件发送功能的简单教学,同时提供了一些注意事项。文章涵盖了字符集设置、发送HTML格式邮件、群发邮件以及避免类的重定义等方面的内容。此外,还提供了一些与PHP相关的资源和服务,如传奇手游游戏源码下载、vscode字体调整、数据恢复、Ubuntu实验环境搭建、北京爬虫市场、进阶PHP和SEO人员需注意的内容。 ... [详细]
  • 本文介绍了如何清除Eclipse中SVN用户的设置。首先需要查看使用的SVN接口,然后根据接口类型找到相应的目录并删除相关文件。最后使用SVN更新或提交来应用更改。 ... [详细]
author-avatar
最棒的寒冬腊月_531
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有