Redis全方位讲解--主从复制(转载)
前言
前面介绍了redis持久化和容灾备份,这篇会介绍redis主从复制和redis持久化在主从复制中的一些应用。因为本人没有那么多服务器或机器,所以这里主要介绍下如何在docker容器中搭建主从复制以及搭建过程中遇到的一些问题。关于redis的深入讲解,这边博客《深入学习Redis(3):主从复制》介绍的非常详细,有兴趣的可以学习一下。
主从复制运行的机制
- 当一个 master 实例和一个 slave 实例连接正常时, master 会发送一连串的命令流来保持对 slave 的更新,以便于将自身数据集的改变复制给 slave :包括客户端的写入、key 的过期或被逐出等等。
- 当 master 和 slave 之间的连接断开之后,因为网络问题、或者是主从意识到连接超时, slave 重新连接上 master 并会尝试进行部分重同步:这意味着它会尝试只获取在断开连接期间内丢失的命令流。
- 当无法进行部分重同步时, slave 会请求进行全量重同步。这会涉及到一个更复杂的过程,例如 master 需要创建所有数据的快照,将之发送给 slave ,之后在数据集更改时持续发送命令流到 slave 。
关于全量重同步和部分重同步,在文章开头介绍的那篇博客中都有详细的介绍。在搭建之前,让我们先了解关于redis的几个重要的事实。
- Redis 使用异步复制,slave 和 master 之间异步地确认处理的数据量。也正是因为异步复制,所以有可能会造成数据延迟或不同步。
- 一个 master 可以拥有多个 slave,slave也可以有sub-slave,但从 Redis 4.0 起,所有的 sub-slave 将会从 master 收到完全一样的复制流。
- Redis 复制在 master 侧是非阻塞的。这意味着 master 在一个或多个 slave 进行初次同步或者是部分重同步时,可以继续处理查询请求。
- 复制在 slave 侧大部分也是非阻塞的。当 slave 进行初次同步时,它可以使用旧数据集处理查询请求,假设你在 redis.conf 中配置了让 Redis 这样做的话。否则,你可以配置如果复制流断开, Redis slave 会返回一个 error 给客户端。但是,在初次同步之后,旧数据集必须被删除,同时加载新的数据集。 slave 在这个短暂的时间窗口内(如果数据集很大,会持续较长时间),会阻塞到来的连接请求。自 Redis 4.0 开始,可以配置 Redis 使删除旧数据集的操作在另一个不同的线程中进行,但是,加载新数据集的操作依然需要在主线程中进行并且会阻塞 slave 。
- 复制既可以被用在可伸缩性,以便只读查询可以有多个 slave 进行(例如 O(N) 复杂度的慢操作可以被下放到 slave ),或者仅用于数据安全。
- 可以使用复制来避免 master 将全部数据集写入磁盘造成的开销:一种典型的技术是配置你的 master Redis.conf 以避免对磁盘进行持久化,然后连接一个 slave ,其配置为不定期保存或是启用 AOF。但是,这个设置必须小心处理,因为重新启动的 master 程序将从一个空数据集开始:如果一个 slave 试图与它同步,那么这个 slave 也会被清空。
关于最后一点,一般主从复制一般会采用读写分离,master都用来接受所有的写操作,这样为了减少master的压力,就不会开启数据持久化,而是在slave中开启数据持久化。
redis主从复制在docker中搭建
redis.conf文件配置
这里需要注意的一点是,最好所有的主从redis要么没有设置密码,要么设置的密码都一样。
- master:https://github.com/Johnson19900110/johnsondock/blob/master/redis/config/redis-master.conf 这里需要注意的是,如果你的redis设有密码,那么 masterauth yourpassword 这个配置一定要配置,因为在哨兵模式下,如果master出现宕机,当它重启后就变成slave了。
- slave1:https://github.com/Johnson19900110/johnsondock/blob/master/redis/config/redis-slave1.conf
- slave2:https://github.com/Johnson19900110/johnsondock/blob/master/redis/config/redis-slave2.conf
两个slave需要配置的是

################################# REPLICATION ################################# # Master-Slave replication. Use slaveof to make a Redis instance a copy of
# another Redis server. A few things to understand ASAP about Redis replication.
#
# 1) Redis replication is asynchronous, but you can configure a master to
# stop accepting writes if it appears to be not connected with at least
# a given number of slaves.
# 2) Redis slaves are able to perform a partial resynchronization with the
# master if the replication link is lost for a relatively small amount of
# time. You may want to configure the replication backlog size (see the next
# sections of this file) with a sensible value depending on your needs.
# 3) Replication is automatic and does not need user intervention. After a
# network partition slaves automatically try to reconnect to masters
# and resynchronize with them.
#
slaveof redis 6379 # redis是master的容器名 # If the master is password protected (using the "requirepass" configuration
# directive below) it is possible to tell the slave to authenticate before
# starting the replication synchronization process, otherwise the master will
# refuse the slave request.
#
masterauth 123455 slave-read-only yes # slave只读

三个配置文件配置好后,就可以配置docker-composer.yml文件了

version: "3.7" networks:
backend:
driver: bridge services: ### Redis ################################################
# master
redis:
image: johnson19900110/redis:latest
restart: always
volumes:
- ${DATA_PATH_HOST}/redis/master:/data
- ./redis/config/redis-master.conf:/usr/local/etc/redis/redis.conf
ports:
- 6379:6379
networks:
- backend # slave 1
redis-slave1:
image: johnson19900110/redis:latest
restart: always
volumes:
- ${DATA_PATH_HOST}/redis/slave1:/data
- ./redis/config/redis-slave1.conf:/usr/local/etc/redis/redis.conf
ports:
- 6380:6379
networks:
- backend
depends_on:
- redis # slave 2
redis-slave2:
image: johnson19900110/redis:latest
restart: always
volumes:
- ${DATA_PATH_HOST}/redis/slave2:/data
- ./redis/config/redis-slave2.conf:/usr/local/etc/redis/redis.conf
ports:
- 6381:6379
networks:
- backend
depends_on:
- redis
- redis-slave1

然后就可以启动redis容器了
docker-composer up -d redis-slave2
这时候3个redis就已经启动起来了

这是我们进入master容器。在redis-cli命令下执行 info replication ,就可以看到如下信息。

从上面信息可以看到,这个是master角色,有两个从slave,并且可以看到slave的状态和同步的offset。然后再进入slave容器,可以看到。

可以看到它的角色是slave和一些master的信息。因为我们设置了slave是只读模式。所以当我们想在slave下进行写入操作时会报错。

所以只能去master里进行写操作。

这时我们可以去slave看下slave是否复制成功。

这就表明我们这次redis的主从复制在docker中搭建成功了。
notice:这里还要重申一遍的是,1、如果你的redis设置了密码,那么所有的都设置成一样。2、如果你的rendis设置了密码,那么master配置文件中的masterauth 这一项一定要配置。不然在后面搭建redis哨兵模式的时候,肯定会有一些你意想不到我的问题。
作者:JohnsonChung
Redis全方位讲解--主从复制(转载)的更多相关文章
- Redis全方位讲解--主从复制
前言 前面介绍了redis持久化和容灾备份,这篇会介绍redis主从复制和redis持久化在主从复制中的一些应用.因为本人没有那么多服务器或机器,所以这里主要介绍下如何在docker容器中搭建主从复制 ...
- Redis全方位讲解--哨兵模式(Sentinel模式)(转载)
前言 当按照上一篇<redis主从复制>部署好之后,我们会想,一旦redis的master出现了宕机,并且我们并没有及时发现,这时候就可能会出现数据丢失或程序无法运行.此时,redis的哨 ...
- Redis全方位讲解--哨兵模式(Sentinel模式)
前言 当按照上一篇<redis主从复制>部署好之后,我们会想,一旦redis的master出现了宕机,并且我们并没有及时发现,这时候就可能会出现数据丢失或程序无法运行.此时,redis的哨 ...
- Redis集群主从复制(一主两从)搭建配置教程【Windows环境】
如何学会在合适的场景使用合适的技术方案,这值得思考. 由于本地环境的使用,所以搭建一个本地的Redis集群,本篇讲解Redis主从复制集群的搭建,使用的平台是Windows,搭建的思路和Linux上基 ...
- 物联网应用中实时定位与轨迹回放的解决方案 – Redis的典型运用(转载)
物联网应用中实时定位与轨迹回放的解决方案 – Redis的典型运用(转载) 2015年11月14日| by: nbboy| Category: 系统设计, 缓存设计, 高性能系统 摘要 ...
- 【中间件】Redis 实战之主从复制、高可用、分布式
目录 简介 持久化 主从复制 高可用 Redis-Sentinel .NET Core开发 分布式 Redis-Cluster 配置说明 常见问题 简介 本节内容基于 CentOS 7.4.1708, ...
- Redis基本讲解
Redis基本讲解 首先我们要了解redis的使用试用范围,redis不像数据库能建立关系型的数据结构,除了有序集合能关联一个double类型的分数其它的几种都是单一存储的,所以他的局限性就比较高了, ...
- 小D课堂 - 零基础入门SpringBoot2.X到实战_第9节 SpringBoot2.x整合Redis实战_39、SpringBoot2.x整合redis实战讲解
笔记 3.SpringBoot2.x整合redis实战讲解 简介:使用springboot-starter整合reids实战 1.官网:https://docs.spring.io/spring-bo ...
- ICEM rpl文件简要讲解【转载】
转载自:http://blog.sina.com.cn/s/blog_90affd9801016xti.html 很多人问ICEM的rpl怎样录制的问题,为什么CFX调用时老是报错,这里开个帖子简单讲 ...
随机推荐
- ios/object-c中的UIColor一些比较偏的颜色展示/示例
UIColor blackColor]; [UIColor darkGrayColor]; [UIColor lightGrayColor]; [UIColor grayColor]; [UIColo ...
- d3.js 实现立体柱图
前言 随着大数据时代的来临,数据可视化的重要性也越来越凸显,那么今天就基于d3.js今天给大家带来可视化基础图表柱图进阶:立体柱图 关于d3.js d3.js是一个操作svg的图表库,d3封装了图表的 ...
- TSL / SSL
参考: http://www.ruanyifeng.com/blog/2014/09/illustration-ssl.html http://www.tuicool.com/articles/IJ3 ...
- 【mybatis】mysql级联更新两个表或多张表的数据
例如 info表和relation表有关联,现在要在一个sql语句中同时级联更新两张表的数据 update security_code_info info LEFT JOIN security_cod ...
- debian下安装mysql
apt-get install mysql-client mysql-server 中间会要你设置password,设置后后就自己主动启动mysql了 能够用ps -ef|grep mysql 这样能 ...
- 分享开源 Markdown 编辑器 Mditor 的「桌面版」
简单说明 Mditor 最早只有「组件版」,随着「桌面版」的发布,Mditor 目前有两个版本: 可嵌入到任意 Web 应用的 Embed 版本,这是一桌面版的基础,Repo: https://git ...
- 突破技术管理,IT人中年危机变契机
突破技术管理,IT人中年危机变契机 中生代技术 Yesterday 作为一个老技术人,今天不聊技术,就聊点技术人员职业发展的事情:对技术管理岗位的认知,比如技术总监. 先贴一张技术人员职业发展路线图, ...
- sqlalchemy: TimeoutError: QueuePool limit of size 5 overflow 10 reached, connection timed out, timeout 30
mysql建立的连接要及时删除,不然连接池资源耗尽 相关文章参考: http://blog.csdn.net/robinson1988/article/details/4713294 http://b ...
- ASP.Net生成静态HTML页
动态网页开发技术中,为了降低网站维护的工作量,常常用到动态页面技术.目前因特网上流行的做法是将网站中需要经常更新的数据存放到数据库中,当客户端浏览器向服务器发出HTTP请求时,服务器通过执行.解释某个 ...
- Tapable 0.2.8 入门
[原文:Tapable 0.2.8 入门] tapable是webpack的核心框架(4.0以上版本的API已经发生了变化),是一个基于事件流的框架,或者叫做发布订阅模式,或观察者模式,webpack ...