版权声明:本文由陈龙原创文章,转载请注明出处: 
文章原文链接: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. xss 防止攻击,恶意用户将输入的信息当成html或js代码执行,办法是将用户输入的信息改为text格式,或特殊符号转义

    xss 防止攻击,恶意用户将输入的信息当成html或js代码执行,办法是将用户输入的信息改为text格式,或特殊符号转义 XSS攻击的防范 XSS攻击造成的危害之所以会发生,是因为用户的输入变成了可执 ...

  2. spring boot 自学笔记(四) Redis集成—Jedis

    上一篇笔记Reddis集成,操作Redis使用的是RedisTemplate,但实际中还是有一大部分人习惯使用JedisPool和Jedis来操作Redis, 下面使用Jedis集成示例. 修改Red ...

  3. StarRTC , AndroidThings , 树莓派小车,公网环境,视频遥控(三)手机端

    原文地址:http://blog.starrtc.com/?p=111 这篇来介绍一下整个项目的手机端部分.在上一篇里我们已经将sdk导入到项目中了,下边直接用即可. 1 登录StarRTC的服务跟小 ...

  4. Python if-else and while

    if-elif语法 if condition: [tab键] command elif condition: [tab键] command elif condition: [tab键] command ...

  5. 【转】Microsoft .Net Remoting 之.Net Remoting基础篇

    .Net Remoting基础篇 一.Remoting基础 什么是Remoting,简而言之,我们可以将其看作是一种分布式处理方式.从微软的产品角度来看,可以说Remoting就是DCOM的一种升级, ...

  6. 初识EseNt

    转自:http://www.cnblogs.com/goosao/archive/2011/09/23/2186412.html 一.什么是EseNtEseNt(Extensible Storage ...

  7. MongoDB C Driver Building on Windows

    一.编译mongodb c driver: 需要先安装OpenSSL:(参见:http://bbs.aircheng.com/read-2222-1) 步骤:(MongoDB步) 1.下载Active ...

  8. e683. 设置打印的方向

    PrinterJob pjob = PrinterJob.getPrinterJob(); PageFormat pf = pjob.defaultPage(); if (portrait) { pf ...

  9. 3D游戏与计算机图形学中的数学方法-四元数

    说实话关于四元数这一节真的是不好懂,因为里面涉及到好多数学知识,单说推出来的公式就有很多.不怕大家笑话,对于四元数的学习我足足花了两天的时间,包括整理出这篇文章.在前面一章我写到了“变换”,这也是总结 ...

  10. c++ list reverse_iterator

    #pragma warning(disable:4786) #include <set> #include <iostream> using namespace std ; t ...