文档章节

redis(6)、redis复制

haoran_10
 haoran_10
发布于 2016/07/15 16:38
字数 2164
阅读 22
收藏 0
点赞 0
评论 0

 

一、redis复制介绍 

(1)什么是redis复制

redis复制即redis replication,主要用于主从(master-slave)数据复制异步备份,或者读写(read-write)分离。使用和配置起来非常简单,从redis服务器会复制并且保存主redis服务器的数据,从而达到备份需求或者同步数据之后,其他客户端读分离的需求。

 

而常用的redis复制使用方案

a)、读写分离简要图示:



 

适用场景:适用于数据量不是非常大,单机的数据复制到相同的多台服务器,多台的服务器数据相同,从而达到读写分离,负债均衡的作用。事实上,稍微性能强悍点的物理单机,足以应对大部分的系统了,我们需要做的要主从备份,防止数据意外丢失。

缺点:有可能从服务器的数据会稍微延迟于主redis。

 

b)、主从备份、自动切换的简要图示



 

适用场景:如果主redis服务器崩溃或则其他原因不可用,要求服务不可停用,从而需要redis自动切换。如果不需要自动切换,主redis挂了之后,手动切换到从redis也是较为保险的方案。

缺点:同读写分类一样,也是从服务器的数据会稍微延迟于主redis。

 

二、使用redis 复制

(1)、配置很简单,主服务器上不需要任何额外配置,正常启动

(2)、从服务器需要添加一行命令(仅此一行)slaveof <masterip> <masterport>

(3)、如果主服务器上开启了密码验证(主服务器不要bind 127.0.0.1,否则其他服务器怎么也不能复制数据,就算绑定,把从服务器的ip也绑定了),

那就在从服务器上在加一行masterauth <master-password>。收工。

 

当然了,关于redis复制配置命令,还有一些额外的命令:

slave-serve-stale-data yes|no

 当slave和master之间的连接断开或slave正在于master同步时,如果有slave请求,当slave-serve-stale-data配置为yes时,slave可以相应客户端请求;当为no时,slave将要响应错误,默认是yes

slave-read-only yes|no

从服务器是否只读。设置为no时,可以接受客户端写命令,事实上从服务器写指令之后并不会同步到主服务器,而从服务器会周期性的同步主服务器的数据,很有可能这个写的数据会丢失。因为redis设置复制时,就没有考虑master-master这种架构。这个命令纯属鸡肋,并没有什么卵用。默认是yes

repl-diskless-sync yes|no

复制集同步策略:磁盘或者socket

当新slave连接或者老slave重新连接时候不能只接收不同,得做一个全同步。需要一个新的RDB文件dump出来,然后从master传到slave。可以有两种情况:

(1)、基于硬盘(disk-backed):master创建一个新进程dump RDB,然后由父进程(即主进程)增量传给slaves。 

 

(2)、基于socket(diskless):master创建一个新进程直接dump RDB到slave的socket,不经过主进程,不经过硬盘。

 

使用建议:

(1)、基于硬盘的话,RDB文件创建后,一旦创建完毕,可以同时服务更多的

slave。基于socket的话, 新slave来了后,得排队(如果超出了repl-diskless-sync-delay还没来),结束一个再进行下一个。如果一个主多个从,强烈建议使用基于硬盘的方案。

 (2)、当用diskless的时候,master等待一个repl-diskless-sync-delay的秒数,如果没slave来的话,就直接传,后来的得排队等了。否则就可以一起传。

(3)、disk较慢,并且网络较快的时候,可以用diskless。(默认用disk-based)

 

ps:配置高性能的硬盘,使用默认基于硬盘即可,这样节省网络。

默认为no

repl-diskless-sync-delay 5

设置成0的话,传输开始立马进行下一个。 默认为5。

repl-ping-slave-period 10

Slave发送ping给master。默认10s

repl-timeout 60

超时时间,包括从master看slave,从slave看master,要大于上边的repl-ping-slave-period

repl-disable-tcp-nodelay no

SYNC完毕后,在slave的socket里关闭TCP_NODELAY。

如果是yes,reids发送少量的TCP包给slave,但可能导致最高40ms的数据延迟。

 如果是no,那可能在复制的时候,会消耗 少量带宽。

 默认我们是为了低延迟优化而设置成no,如果主从之间有很多网络跳跃。那设置成yes吧。

repl-backlog-size 1mb

复制集后台backlog大小,越大,slave可以丢失的时间就越长。

repl-backlog-ttl 3600

多久释放backlog,当确认master不再需要slave的时候,多久释放。0是永远不释放。

slave-priority 100

当master不可用,Sentinel会根据slave的优先级选举一个master。最低的优先级的slave,当选master。而配置成0,永远不会被选举。(必须≥0)。默认是100。可以在配置集群时使用。

min-slaves-to-write 3

min-slaves-max-lag 10

slave小于几个,网络lag大于几秒的时候,master停止接受write请求。默认对slave数目无限制,给0。网络延迟给10s

 

 


三、redis特性

(1)、Redis采用异步复制。从Redis 2.8开始,从服务器会每隔一段时间循环复制流(主服务器待复制的数据)的数据,从而进行复制处理。
(2)、一个主服务器可以连接多个从服务器。
(3)、从服务器可以接受其他从服务器的连接。
(4)、Redis的复制在主服务器上是非阻塞的。redis 主服务器会fork出一个子进程去处理复制业务,这样正是因为redis服务器不能设置maxmemory为服务器的全部内存的原因之一。

            也意味着,当一个或多个从服务器执行初始化同步(initial synchronization)时,主服务器能继续处理请求。
(5)、Redis的复制在从服务器上也是非阻塞的。
(6)、复制可以用来支持可伸缩性,用多个从服务器处理只读查询(例如,繁重的SORT操作可以分配到从服务器上),也可以仅仅作为数据冗余。
 

四、redis复制原理

 

(1)、当你建立一个从服务器,连接时就会发送一个SYNC命令。不管是第一次连接上还是重连接上。 然后主服务器开始在后台保存,并且开始缓冲所有新收到的会修改数据集的命令。当后台保存完成以后,主服务器传输数据库文件给从服务器,从服务器将其保存到磁盘上,然后加载到内存中。然后主服务器开始发送缓冲的命令给从服务器。这是通过命令流完成的,和Redis的协议是一样的格式。

(2)、当主从链路由于某些原因断开时,从服务器可以自动重连。如果主服务器收到多个并发的从服务器的同步请求,只会执行一个后台保存来服务所有从服务器。 

    当主服务器和从服务器断开后重连上,总是执行一次完整重同步(full resynchronization)。然而,从Redis 2.8以后,可以选择执行部分重同步(partial resynchronization)。

(3)、从Redis 2.8开始,在复制链接断开后,主服务器和从服务器通常可以继续复制过程,而不需要一次完整的重同步。 

    这是通过在主服务器上创建一个复制流的内存缓冲区(in-memory backlog)实现的。主服务器和所有从服务器都记录一个复制偏移量(offset)和一个主服务器运行ID(run id),当链接断掉时,从服务器会重连接,并且请求主服务器继续复制。假设主服务器的运行ID还是一样的,并且指定的偏移量在复制缓冲区中可用,复制会从中断的点继续。如果这两个条件之一不满足,将会执行完整重同步(2.8版之前的正常行为)。 
新的部分重同步特性使用的是内部PSYNC命令,老的实现采用的是SYNC命令。注意,Redis 2.8的从服务器可以检测主服务器是否不支持PSYNC,然后使用SYNC代替。

 

复制原理简图:

 

 

五、小结

在实际生产中,多数系统使用主从配置即可达到大部分的系统性能要求,如果要求主从自动切换,使用类似keepalived就足以满足需求了。

© 著作权归作者所有

共有 人打赏支持
haoran_10
粉丝 25
博文 88
码字总数 80846
作品 0
杭州
程序员
Redis的主从复制详解

什么是主从复制 持久化保证了即使redis服务重启也会丢失数据,因为redis服务重启后会将硬盘上持久化的数据恢复到内存中,但是当redis服务器的硬盘损坏了可能会导致数据丢失,如果通过redis的...

刘大磊的博客
2017/12/19
0
0
【redis】redis安装教程

一、redis的安装 redis是c语言开发的,安装redis需要C语言的编译环境。如果没有gcc。安装gcc命令 yum install gcc-c++ 1、下载redis到/usr/local/src目录下 wget http://download.redis.io/...

qq_26545305
04/29
0
0
Linux——搭建Redis集群

上一篇文章介绍到redis的安装和配置,有时候我们需要考虑负载均衡或者容灾机制,在某台机器宕机的时候不能影响程序的正常工作,因此今天和大家共同搭建一些redis集群。 首先声明这篇文章紧密...

邵鸿鑫
2016/05/23
0
0
Sentinel-Redis高可用方案(一):主从复制

引言 大概是因为Redis是个人开发的产品,所以Redis的高可用方案是被分成了几块来实现:主从复制、主从切换以及虚拟IP或客户端方案。 从Redis 2.8开始加入对Sentinel机制从而实现了服务器端的...

epiclight
2015/05/04
0
0
转 redis服务启动和停止(NOAUTH Authentication required)

redis服务启动和停止(NOAUTH Authentication required) 2017年05月02日 10:50:51 阅读数:8581 Redis安装配置完成后,启动过程非常简单,执行命令/usr/local/redis/bin/redis-server /usr/lo...

rootliu
05/28
0
0
redis简单介绍

1、启动redis-server # redis-server redis.conf 2、linux查看redis-server是否启动 # netstat -tunpl | grep 6376 3、redis-server在后台启动,编辑redis.conf daemonize yes 3、安全性启动......

wanghuayuan22
2016/04/13
40
0
阿里云ECS centos7 安装Redis4.0

先去官网下合适的版本 我下载的是redis-4.0.8.tar.gz 官网地址:https://redis.io/download, 连接到远程服务器上,创建文件夹mkdir /usr/local/redis 将redis资源包拷贝到对应文件夹下,并解...

我是卖报得小行家
03/12
1
0
为什么要开发kedis-server

1. Kedis-Server是什么 kedis-server是一个以RocksDB为存储引擎,支持Redis协议,并且支持大部分常用的Redis命令的一个持久化kv存储服务器 项目地址:kedis-server 2. Redis有什么问题 总的来...

Adu杜建庆
2017/11/25
0
0
持久化大容量 kv 存储服务器--kedis

Kedis-Server是什么 kedis-server是一个以RocksDB为存储引擎,支持Redis协议,并且支持大部分常用的Redis命令的一个持久化大容量kv存储服务器 2. Redis有什么问题 总的来说,Redis是一个非常...

Adu-杜建庆
2017/12/01
2.1K
6
服务器(2)--搭建Redis服务器和集群

背景:最近在学习Redis服务器,搭建的步骤记录一下吧~~~ 一、Redis REmote DIctionary Server(Redis) 是一个由Salvatore Sanfilippo写的key-value存储系统。 Redis是一个开源的使用ANSI C语言...

u013043341
2017/05/12
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

CoreText进阶(五)- 文字排版样式和效果

CoreText进阶(五)- 文字排版样式和效果 效果 以下是三个设置了不同属性的效果图 第一个设置了文字颜色为红色,字体为16号 第二个设置了文字颜色为灰色,字体为16号,对其为居中 第三个设置...

aron1992
25分钟前
1
0
10.23 linux任务计划cron~10.27 target介绍

crontab命令被用来提交和管理用户的需要周期性执行的任务,与windows下的计划任务类似,当安装完成操作系统后,默认会安装此服务工具,并且会自动启动crond进程,crond进程每分钟会定期检查是...

洗香香
36分钟前
0
0
告警系统主脚本、告警系统配置文件、告警系统监控项目

20.20 告警系统主脚本 告警系统主脚本 main.sh内容 #!/bin/bash#Written by aming.# 是否发送邮件的开关export send=1# 过滤ip地址export addr=`/sbin/ifconfig |grep -A1 "en...

lyy549745
39分钟前
0
0
Don’t Repeat Yourself

在软件工程中,Don’t Repeat Yourself(DRY)是软件开发的原则,旨在减少重复,用抽象代替它,使用数据规范化来避免冗余。 这个原则在维基百科上是说是由Andy Hunt和Dave Thomas《The Pragmat...

woshixin
41分钟前
0
0
搭建webpack项目框架

作者:汪娇娇 时间:2018年6月4日 一、说明 随着业务发展和前端人员的增加,搭建一个通用框架以及制定统一规范就成了必然。对于选型这方面,一开始好像就没考虑其他框架,直接选了webpack。w...

娇娇jojojo
48分钟前
0
0
Java基础——面向对象(内部类)

声明:本栏目所使用的素材都是凯哥学堂VIP学员所写,学员有权匿名,对文章有最终解释权;凯哥学堂旨在促进VIP学员互相学习的基础上公开笔记。 内部类: 1.有名内部类 2.无名内部类 内部类申请...

凯哥学堂
56分钟前
0
0
HttpClient内部三个超时时间的区别

RequestConfig requestConfig = RequestConfig.custom() .setConnectionRequestTimeout(config.connReqTimeout) //从连接池中获取连接的超时时间 ......

1713716445
今天
0
0
每天一个命令SCP

每天一个命令:SCP scp是secure copy的简写,用于在Linux下进行远程拷贝文件的命令,和它类似的命令有cp,不过cp只是在本机进行拷贝不能跨服务器,而且scp传输是加密的。可能会稍微影响一下速...

河图再现
今天
0
0
cron/chkconfig/systemd/unit/target

linux任务计划 : cron工具 任务计划在运维工作中用到的比较多,大部分系统管理工作都是通过定期自动执行某个脚本来完成。 查看linux中任务计划的配置文件: /etc/crontab [root@yolks-001 ~]...

Hi_Yolks
今天
1
0
ftp攻略

Vsftpd完全攻略(一)ftp原理与vsftp安装:https://www.iyunv.com/thread-44698-1-1.html Vsftpd完全攻略(二)设置匿名用户也支持下载和上传与创建目录:https://www.iyunv.com/forum.php?mo...

寰宇01
今天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部