关闭

Redis的主从复制

时间: 2019-01-07阅读: 624标签: redis

1.主从复制

Redis配置成主从模式,主库(Master)只负责写数据,从库(Slave)只负责读数据

注意:一个主库可以拥有多个从库,但一个从库只能隶属于一个主库。

将选为Slave的机器上配置:

# REPLICATION
slave of    <master ip> <port>
masterauth  <password>

开启主从关系后,数据会自动进行复制。


2.全量复制和部分复制

Redis的复制方式包括全量复制和部分复制。

2.1 全量复制

流程如下:

  1. Slave发出一个同步命令,要求Master同步数据;
  2. Master向Salve发送runid和offset;当Slave上没有offset记录时,执行全量复制;
  3. Slave执行save masterinfo,保存Master的基本信息;
  4. Master执行bgsave生成快照;
  5. Master执行send RDB将快照发送到Slave的缓冲区;
  6. Slave更新旧的RDB文件,并加载新的RDB;

由上述流程可以看到,全量复制的开销主要在:

  1. 生成RDB文件,即bgsave;
  2. RDB服务器间传输;
  3. 如果有AOF设置,达到重写阈值,会进行AOF重写;


2.2 部分复制

部分复制在Redis 2.8之后开始支持,可以减少全量复制的开销。

部分复制的原理:

  1. 每台机器启动后都会有一个与当前进程相关的 runid;
  2. 每个机器在写入数据后会有一个偏移量 master_repl_offset;
  3. 通过偏移量来判断Slave与Master直接的数据差多少;

部分复制常用在主从连接断开、Master抖动时。

流程如下:

  1. 主从连接断开;
  2. Slave尝试连接主机;Master写入复制缓冲区 repl_back_buffer;
  3. 恢复连接后,Slave将自己当前runid和偏移量传输给Master,并请求同步数据;
  4. Master检查偏移量是否在缓冲区范围内,如果是,则进行部分复制;如果不是,则进行全量复制;
优点:部分复制直接使用缓冲区的数据进行RDB同步,相比全量复制,减少了RDB的生成和传输开销;同时,也减少了AOF重写阈值达到的几率。


3.主从复制中的问题

3.1 读写分离的问题

  • 复制数据延迟:Slave 延迟导致读写不一致。

    • 监控偏移量 offset,如果超出范围就将读节点切换到 Master 上,并重新全量复制Slave节点。
  • 读到过期数据:Redis 采用懒惰性策略和采样式策略。

    • 懒惰性策略指 Redis 只有当操作 key时才去看数据是否过期;采样式策略指定期会去采样,如果是过期的,就自动删除。当过期数量非常多的时候,采样速度比不上逻辑数据变化的速度,Slave 没有写权限,只有 Master 可以删除,就会出现过期数据。
    • Redis 3.2 以上版本修复此问题。
  • Slave 节点故障

    • Slave 节点通过持久化数据与主节点进行部分复制同步;Redis2.8 实现 Slave 恢复后部分复制同步;
  • Master 节点故障

    • 需要手动切换主从关系;
    • 使用 Redis哨兵模式自动完成主从切换;


3.2 复制风暴

Master 重启,多个 Slave 会需要复制。这个时候需要更换复制拓扑,通过在 Slave 下再分从机,减少主机 Master 的压力。

clipboard.png


站长推荐

1.云服务推荐: 国内主流云服务商,各类云产品的最新活动,优惠券领取。地址:阿里云腾讯云华为云

2.广告联盟: 整理了目前主流的广告联盟平台,如果你有流量,可以作为参考选择适合你的平台点击进入

链接: http://www.fly63.com/article/detial/2275

关闭

Redis的正确使用姿势

说到分布式缓存,可能大多数人脑海浮现的就是redis了,为什么redis能够在竞争激烈的缓存大战中脱颖而出呢?原因无非有一下几点:性能好,丰富的特性跟数据结构,api操作简单。但是用的人多了,就会出现很多不规范或者疏忽的地方,严重的时候甚至会导致生产事故

Redis面试常问的知识点总汇

Redis 是一个基于内存的高性能key-value数据库。Redis本质上是一个Key-Value类型的内存数据库,很像memcached,整个数据库统统加载在内存当中进行操作,定期通过异步操作把数据库数据flush到硬盘上进行保存。

基于redis实现定时任务

业务中碰到的需求(抽象描述一下):针对不同的用户能够实现不同时间的间隔循环任务。比如在用户注册成功24小时后给用户推送相关短信等类似需求。使用crontab?太重,且基本不现实,不可能给每一个用户在服务器上生成一个定时任务。

PHP使用redis防止大并发下二次写入

php调用redis进去读写操作,大并发下会出现:读取key1,没有内容则写入内容,但是大并发下会出现同时多个php进程写入的情况,这个时候需要加一个锁,即获取锁的php进程有权限写。

在使用redis-cluster之前你需要知道这些事

前段时间基础架构组、DBA还有云盘团队一起推广了phpredis的RedisCluster的线上使用,目前线上业务已经稳定,单业务的规模水平是:Qps平均15W,数据量在700G左右。现对这段时间的工作和所遇到的一些常见问题进行简单总结

PHP操作Redis常用技巧总结

Redis连接与认证连接参数:ip、端口、连接超时时间,连接成功返回true,否则返回false,设置键值:成功返回true,否则返回false,获取键值:成功返回String类型键值

Redis为什么变慢了?

Redis作为内存数据库,拥有非常高的性能,单个实例的QPS能够达到10W左右。但我们在使用Redis时,经常时不时会出现访问延迟很大的情况,如果你不知道Redis的内部实现原理,在排查问题时就会一头雾水。

Redis分布式锁

redis:Redis是开源,内存存储的数据结构服务器,可用作数据库,高速缓存和消息队列代理.采用单进程单线程模型,并发能力强大,主流的分布式缓存工具。加锁通过setnx向特定的key值写入一个随机值,并且同时设置失效时间,写值成功即加锁成功.

docker搭建redis集群

从docker库获取ruby镜像;创建虚拟网卡;查看网卡信息;查看redis-net虚拟网卡网关ip;创建需要挂载的目录以及文件;在/docker/redis目录下创建一个sh脚本文件;执行脚本创建挂载目录以及配置文件

Redis 中 Lua 脚本的应用和实践

前段时间组内有个投票的产品,上线前考虑欠缺,导致被刷票严重。后来,通过研究,发现可以通过 redis lua 脚本实现限流,这里将 redis lua 脚本相关的知识分享出来,讲的不到位的地方还望斧正。

点击更多...

内容以共享、参考、研究为目的,不存在任何商业目的。其版权属原作者所有,如有侵权或违规,请与小编联系!情况属实本人将予以删除!