redis高可用 - Master&Slave
Master&Slave也就是我们所说的主从复制,即主机数据更新后根据配置和策略,自动同步到备机的机制。其中Master以写为主,Slave以读为主。
Master&Slave的作用主要有两个:
- 读写分离;
- 容灾恢复。
redis replication核心机制
- redis采用异步的形式复制数据到slave,从redis 2.8开始,slave会周期性地确认自己每次复制的数据量
- 一个master node可以连接多个slave node
- slave node 也可以连接其他slave node
- slave node复制数据时不会block master node的正常工作
- slave node 复制数时也不会block 自己的查询操作,它会用旧的数据对外提供服务,但复制完成后,需要删除旧的数据,加载新数据,这个时候会暂停对外服务
- slave node主要用来进行横向扩容,扩容可以提高更高的读的吞吐量
主从复制的流程
主要流程:
- 当启动一个slave node的时候,它会发送一个PSYNC命令给master
- 如果这是slave node重现链接master,master会将缺少的数据发送给slave,即增量复制;如果是第一次链接master,则会触发一次full resynchronization,即全量复制。
- 开始全量复制的时候,master启动一个后台线程执行bgsave,基于现有数据在本地生成一份rdb快照文件
- 生成文件后,master会将这个rdb文件发送给slave,如果rdb复制超过60秒(repl-timeout参数可以配置),那么slave就会认为复制失败,可以适当调节这个参数
- slave收到rdb文件后,会先把这个rdb文件存放到本地磁盘,然后再加载到内存,
- 然后master会将生成rdb这段时间内接收到的在内存中的数据发送给slave,slave也会接收这份数据。
- 如果slave开启了aof(即Append Only File持久化,将Redis执行的每次写命令记录到单独的日志文件中),那么会立即执行berewriteaof,重写aof
增量复制子流程:
如果全量复制过程中,master-slave网络连接断掉,salve重新连接master时,会触发增量复制。
master直接从自己的backlog中获取部分丢失的数据,发送给slave node,默认backlog就是1MB;master就是根据slave发送的psync中的offset来从backlog中获取数据的。
断点续传
从redis 2.8开始,就支持主从复制的断点续传,如果主从复制过程中,网络连接断掉了,那么可以接着上次复制的地方,继续复制下去,而不是从头开始复制一份。
master node会在内存中创建一个backlog,master和slave都会保存一个replica offset还有一个master id,offset就是保存在backlog中的。如果master和slave网络连接断掉了,slave会让master从上次的replica offset开始继续复制;如果没有找到对应的offset,那么就会执行一次全量复制。
过期key处理
slave不会过期key,只会等待master过期key。如果master过期了一个key,或者通过LRU淘汰了一个key,那么会模拟一条del命令发送给slave。
其他概念
heartbeat:主从节点互相都会发送heartbeat信息,master默认每隔10秒发送一次heartbeat,salve node每隔1秒发送一个heartbeat。master每次接收到写命令之后,现在内部写入数据,然后异步发送给slave node
offset :master会在自身不断累加offset,slave也会在自身不断累加offset。
slave每秒都会上报自己的offset给master,同时master也会保存每个slave的offset。主要是master和slave都要知道各自的数据的offset,才能知道互相之间的数据不一致的情况
backlog:master node有一个backlog,默认是1MB大小;master node给slave node复制数据时,也会将数据在backlog中同步写一份;主要是用来做全量复制中断后的增量复制的。
master run id :info server可以看到master run id 。如果根据host+ip定位master node,是不靠谱的,如果master node重启或者数据出现了变化,那么slave node应该根据不同的run id区分,run id不同就做全量复制 ;如果需要不更改run id重启redis,可以使用redis-cli debug reload命令
psync :从节点使用psync从master node进行复制,psync runid offset
master node会根据自身的情况返回响应信息,可能是FULLRESYNC runid offset触发全量复制,可能是CONTINUE触发增量复制
redis高可用 - Master&Slave的更多相关文章
- Keepalived+Redis高可用部署(第二版)
更新 20150625 脚本由5个减少为4个,sh脚本指令做了精简. 修改了另外3个脚本,在日志里增加了日期显示. 新增redis数据类型,持久化,主从同步简介. 新增hiredis简介. 新增c语言 ...
- Redis 高可用集群
Redis 高可用集群 Redis 的集群主从模型是一种高可用的集群架构.本章主要内容有:高可用集群的搭建,Jedis连接集群,新增集群节点,删除集群节点,其他配置补充说明. 高可用集群搭建 集群(c ...
- sentinel监控redis高可用集群(一)
一.首先配置redis的主从同步集群. 1.主库的配置文件不用修改,从库的配置文件只需增加一行,说明主库的IP端口.如果需要验证的,也要加多一行,认证密码. slaveof 192.168.20.26 ...
- Redis高可用方案----Redis主从+Sentinel+Haproxy
安装环境 这里使用三台服务器,每台服务器上开启一个redis-server和redis-sentinel服务,redis-server端口为6379,redis-sentinel的端口为26379. ...
- Windows版本redis高可用方案探究
目录 Windows版本redis高可用方案探究 前言 搭建redis主从 配置主redis-28380 配置从redis-23381 配置从redis-23382 将redis部署为服务 启动red ...
- Redis高可用详解:持久化技术及方案选择
文章摘自:https://www.cnblogs.com/kismetv/p/9137897.html 前言 在上一篇文章中,介绍了Redis的内存模型,从这篇文章开始,将依次介绍Redis高可用相关 ...
- 如何构建 Redis 高可用架构?
温国兵 民工哥技术之路 今天 1 .题记 Redis 是一个开源的使用 ANSI C 语言编写.支持网络.可基于内存亦可持久化的日志型.Key-Value 数据库,并提供多种语言的 API. 如今,互 ...
- Redis高可用集群-哨兵模式(Redis-Sentinel)搭建配置教程【Windows环境】
No cross,no crown . 不经历风雨,怎么见彩虹. Redis哨兵模式,用现在流行的话可以说就是一个"哨兵机器人",给"哨兵机器人"进行相应的配置 ...
- Redis高可用之集群配置(六)
0.Redis目录结构 1)Redis介绍及部署在CentOS7上(一) 2)Redis指令与数据结构(二) 3)Redis客户端连接以及持久化数据(三) 4)Redis高可用之主从复制实践(四) 5 ...
随机推荐
- pta 习题集5-17 家谱处理
人类学研究对于家族很感兴趣,于是研究人员搜集了一些家族的家谱进行研究.实验中,使用计算机处理家谱.为了实现这个目的,研究人员将家谱转换为文本文件.下面为家谱文本文件的实例: John Robert F ...
- Code Forces 18D Seller Bob(简单DP)
D. Seller Bob time limit per test 2 seconds memory limit per test 128 megabytes input standard input ...
- DNS named. bind linux (ACL/View)---dnsmasq-with docker,hosts in docker.
[bind--named.conf] https://blog.csdn.net/z_yttt/article/details/53020814 [Docker搭建dnsmasq] https://b ...
- talib 中文文档(三):talib 方法大全
Function API Examples Similar to TA-Lib, the function interface provides a lightweight wrapper of th ...
- socketserver源码解析和协程版socketserver
来,贴上一段代码让你仰慕一下欧socketserver的魅力,看欧怎么完美实现多并发的魅力 client import socket ip_port = ('127.0.0.1',8009) sk = ...
- centos LAMP第一部分-环境搭建 Linux软件删除方式,mysql安装,apache,PHP,apache和php结合,phpinfo页面,ldd命令 第十九节课
centos LAMP第一部分-环境搭建 Linux软件删除方式,mysql安装,apache,PHP,apache和php结合,phpinfo页面,ldd命令 第十九节课 打命令之后可以输入: e ...
- python + unittest 做单元测试之学习笔记
单元测试在保证开发效率.可维护性和软件质量等方面有很重要的地位,所谓的单元测试,就是对一个类,一个模块或者一个函数进行正确性检测的一种测试方式. 这里主要是就应用 python + unitest 做 ...
- Java基础知识陷阱(九)
本文发表于本人博客. 今天我来说说关于JAVA多线程知识,有错误请指出.大家都知道JAVA在服务端上处理也有很大优势,很多公司也有在服务器跑JAVA进程,这说明JAVA在处理这个多线程以及并发下也有一 ...
- FFmpeg 入门(6):音频同步
本文转自:FFmpeg 入门(6):音频同步 | www.samirchen.com 音频同步 上一节我们做了将视频同步到音频时钟,这一节我们反过来,将音频同步到视频.首先,我们要实现一个视频时钟来跟 ...
- 【运维技术】node项目使用strongloop进行部署相关教程
node项目使用strongloop进行部署相关教程 安装strongloop 下载安装node 解压到路径完成安装 使用软链方式配置环境变量 添加cnpm的淘宝镜像源 安装node-gyp的模块依赖 ...