版权声明:本文由陈龙原创文章,转载请注明出处: 
文章原文链接:https://www.qcloud.com/community/article/127

来源:腾云阁 https://www.qcloud.com/community

redis是一款高性能的内存数据库,本文侧重描述redis在主从模式下遇到的一些问题以及如何调优,特别是在云环境下遇到的一些特殊问题,至于redis如何使用以及数据结构等,可以百度,网上有大量的资料。

主结点

在非集群环境的情况下,使用redis主从模式来保证业务的高可用性,因此在此种模式下,读写都在主机,要保证主机高性能必须在主机上尽量少的IO操作同时又要兼顾网络导致的主从断链而带来的频繁的fullsync,因此针对主机优化要点如下:

关闭主结点aof

关闭主aof比较简单,可以通过如下命令进行关闭,在主结点上执行

config set appendonly no

关闭主结点save

关闭主上的save原因是避免save的规则导致的bgsave而引起业务波动,bgsave是非常消耗性能的,redis的默认save规则为" 900 1 "," 300 10 ","," 60 10000 ",在此规则下写入量大的情况下会导致主机频繁的bgsave而导致性能急剧下降,可以通过命令config set save关闭主机上因写入而触发的bgsave,数据的完整性交给备机完成,即使这样也无法完全杜绝bgsave,在从机第一连上来或者从机断开过久的情况下还是会触发bgsave

主从同步后key数量不一致问题

因为redis只会在主上进行定期key淘汰并命令传播到从机,因此在key数量很多而且很多key又带有过期时间的情况下,因为淘汰机制问题会导致主从同步后从机的key数量和主机的key数量不一致(过期的key不会同步到从机),而最根本原因是主机在在serverCron函数中进行淘汰的时候一次默认只会淘汰20个key,默认值在redis.h#define ACTIVE_EXPIRE_CYCLE_LOOKUPS_PER_LOOP 20 /* Loopkups per loop. */定义,解决该问题的方式一是修改该数量重新编译,而是修改redis.conf中的hz属性,加快serverCron执行频率

发送缓冲区满导致主从断开频繁fullsync问题

redis为每一个链接的客户端维护了一个发送缓冲区,并限定了大小(有软硬之分),当发送缓冲区满后(超过了设定的值)redis即会断开该链接从而实现自我保护功能,但是问题也出现,当写入量非常大的时候而该值又设置的不合理会导致主从频繁断连,而且因为写入量巨大新连接上来的从机不能进行部分同步而触发全量同步,因此为了避免该问题可以根据redis实际的写入数据以及网络情况综合来修改参数client-output-buffer-limit,具体修改多大要结合实际写量和网络情况而定,设置方式为:
config set client-output-buffer-limit "slave 4295000768 4295000768 0"
slave 表示从机链接,普通客户端为normal,发布订阅客户端为:pubsub

复制积压缓冲区repl-backlog-size

复制积压缓冲区缓存了最近的写命令,在有从机链接的时候创建,该缓冲区大小默认为1M,改值决定了从机断开在重新链接上来后是全量同步还是部分同步,如果复制偏移量在复制积压缓冲区内为部分同步,小于或者大于复制积压缓冲区那么就行全量同步,可以根据实际情况通过config set 命令重新设定repl-backlog-size

节点死活判定

在高可用系统中,节点的死活检查非常重要,检测逻辑要快速发现问题并迅速切换,检测手段也是多重多样, redis检测节点死活采用了进程探测加服务ping的方式进行,进程探测是为了确认目标进程存在,但是目标进程存在也不一定确认服务可用,所以另加了去ping指定服务节点的方式,在实际使用过程中发现某些节点会奇怪的进行切换,而去看机器的内存、网络、以及IO都很低,除了某些CPU核在切换的时刻被跑满,然后分析切换节点的slowlog发现,用户在那个时间点提交了耗时高达几分钟的查询,因为redis是单线程处理,因为某一个耗时高的命令而导致了ping超时导致了切换,优化逻辑就是适当增加ping的耗时和增加ping的次数,这个过程中也要有所取舍,即要很快的发现问题,又不能因为高耗时命令而误判进行切换

从结点

从结点主要用来保证数据安全性,并在主结点死掉后快速恢复成主结点并提供服务,在作为从结点的时候需要打开rdb和aof,并按照一定的时间规则把用户的rdb放入到冷备中心,

在提升为主节点后,相关设置要立刻恢复到和主节点一样的配置

Redis单机主从高可用性优化的更多相关文章

  1. redis单机主从搭建

    tar zxvf redis-2.8.13.tar.gz cd redis-2.8.13 make 1.安装主库 mkdir /opt/redis/sbin -p mkdir    /opt/redi ...

  2. Redis 单机模式,主从模式,哨兵模式(sentinel),集群模式(cluster),第三方模式优缺点分析

    Redis 的几种常见使用方式包括: 单机模式 主从模式 哨兵模式(sentinel) 集群模式(cluster) 第三方模式 单机模式 Redis 单副本,采用单个 Redis 节点部署架构,没有备 ...

  3. redis 单机模拟 cluster集群

    一.redis-cluster设计 Redis集群搭建的方式有多种,例如使用zookeeper等,但从redis 3.0之后版本支持redis-cluster集群,Redis-Cluster采用无中心 ...

  4. Redis从出门到高可用--Redis复制原理与优化

    Redis从出门到高可用–Redis复制原理与优化 单机有什么问题? 1.单机故障; 2.单机容量有瓶颈 3.单机有QPS瓶颈 主从复制:主机数据更新后根据配置和策略,自动同步到备机的master/s ...

  5. Redis Sentinel主从高可用方案

    Redis Sentinel主从高可用方案 本文介绍一种通过Jed和Sentinel实现Redis集群(主从)的高可用方案,该方案需要使用Jedis2.2.2及以上版本(强制),Redis2.8及以上 ...

  6. redis的主从模式搭建及注意事项

    前言:本文先分享下如何搭建redis的主从模式配置,以及主从模式配置的注意事项.后续会继续分享如何实现一个高可用的redis服务,redis的Sentinel 哨兵模式及集群搭建. 安装: 1,yum ...

  7. Redis学习笔记之Redis单机,伪集群,Sentinel主从复制的安装和配置

    0x00 Redis简介 Redis是一款开源的.高性能的键-值存储(key-value store).它常被称作是一款数据结构服务器(data structure server). Redis的键值 ...

  8. Redis 的主从同步(复制)

    Redis 的主从同步(复制) Redis 的主从同步(复制) 什么是主从同步(复制) 假设有两个 redis 实例 ⇒ A 和 B B 实例的内容与 A 实例的内容保持同步 那么称 A 实例是主数据 ...

  9. scentos7安装redis,以及redis的主从配置

    redis的安装 下载redis安装包 wget http://download.redis.io/releases/redis-4.0.6.tar.gz 解压压缩包 tar -zxvf redis- ...

随机推荐

  1. linux下tree命令详解

    linux下tree命令详解linux下的tree就比较强大了,但一般系统并不自带这个命令,需要手动下载安装:sudo apt-get install tree .文件很小,只有31K,但功能可强大了 ...

  2. 也许,这样理解HTTPS更容易(今天看到的, 对https总结最好的一篇)

    摘要:本文尝试一步步还原HTTPS的设计过程,以理解为什么HTTPS最终会是这副模样.但是这并不代表HTTPS的真实设计过程.在阅读本文时,你可以尝试放下已有的对HTTPS的理解,这样更利于" ...

  3. python中time类型,datetime类型的关系与互相转换

    一.time模块 time模块提供各种操作时间的函数       一般有两种表示时间的方式:       第一种是时间戳的方式(相对于1970.1.1 00:00:00以秒计算的偏移量),时间戳是惟一 ...

  4. [R语言统计]频数表

    频数表在统计学中是一个非常基本并且重要的概念,我们这里就来讲解它的基本用法. 首先我们需要载入数据,并查看数据的基本信息 install.packages('vcd') #安装vcd包,其中有可以利用 ...

  5. HBase系统入门--整体介绍

    转自:http://www.aboutyun.com/thread-8957-1-2.html 问题导读:1.HBase查询与写入哪个更好一些?2.HBase面对复杂操作能否实现?3.Region服务 ...

  6. C++ 判断目录是否存在并新建目录

    http://blog.csdn.net/u012005313/article/details/50688257 #include <io.h> #include <string&g ...

  7. 【转】Hibernate系列学习之(二) 多对一、一对一、一对多、多对多的配置方法

    hihernate一对多关联映射(单向Classes----->Student) 一对多关联映射利用了多对一关联映射原理 多对一关联映射:在多的一端加入一个外键指向一的一端,它维护的关系是多指向 ...

  8. 第三百零五节,Django框架,Views(视图函数),也就是逻辑处理函数里的各种方法与属性

    Django框架,Views(视图函数),也就是逻辑处理函数里的各种方法与属性 Views(视图函数)逻辑处理,最终是围绕着两个对象实现的 http请求中产生两个核心对象: http请求:HttpRe ...

  9. R语言barplot绘图函数

    barplot 函数用于绘制柱状图,下面对其常用的参数进行一个详细的解释: 1)height : 高度,通过这个参数可以指定要画多少个柱子以及每个柱子的高度,其值有两种格式, 第一种 :向量 vect ...

  10. url传参错误的痛

    今天用一下方法给后台传参数: var url = 'patrolpoint!totalHistoryPage.action' +        '?patrolPoint.batchOnTime=' ...