前言

  前面介绍了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要么没有设置密码,要么设置的密码都一样。

  两个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

转载URL:  https://www.cnblogs.com/johnson108178/p/9888482.html

Redis全方位讲解--主从复制(转载)的更多相关文章

  1. Redis全方位讲解--主从复制

    前言 前面介绍了redis持久化和容灾备份,这篇会介绍redis主从复制和redis持久化在主从复制中的一些应用.因为本人没有那么多服务器或机器,所以这里主要介绍下如何在docker容器中搭建主从复制 ...

  2. Redis全方位讲解--哨兵模式(Sentinel模式)(转载)

    前言 当按照上一篇<redis主从复制>部署好之后,我们会想,一旦redis的master出现了宕机,并且我们并没有及时发现,这时候就可能会出现数据丢失或程序无法运行.此时,redis的哨 ...

  3. Redis全方位讲解--哨兵模式(Sentinel模式)

    前言 当按照上一篇<redis主从复制>部署好之后,我们会想,一旦redis的master出现了宕机,并且我们并没有及时发现,这时候就可能会出现数据丢失或程序无法运行.此时,redis的哨 ...

  4. Redis集群主从复制(一主两从)搭建配置教程【Windows环境】

    如何学会在合适的场景使用合适的技术方案,这值得思考. 由于本地环境的使用,所以搭建一个本地的Redis集群,本篇讲解Redis主从复制集群的搭建,使用的平台是Windows,搭建的思路和Linux上基 ...

  5. 物联网应用中实时定位与轨迹回放的解决方案 – Redis的典型运用(转载)

    物联网应用中实时定位与轨迹回放的解决方案 – Redis的典型运用(转载)   2015年11月14日|    by: nbboy|    Category: 系统设计, 缓存设计, 高性能系统 摘要 ...

  6. 【中间件】Redis 实战之主从复制、高可用、分布式

    目录 简介 持久化 主从复制 高可用 Redis-Sentinel .NET Core开发 分布式 Redis-Cluster 配置说明 常见问题 简介 本节内容基于 CentOS 7.4.1708, ...

  7. Redis基本讲解

    Redis基本讲解 首先我们要了解redis的使用试用范围,redis不像数据库能建立关系型的数据结构,除了有序集合能关联一个double类型的分数其它的几种都是单一存储的,所以他的局限性就比较高了, ...

  8. 小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 ...

  9. ICEM rpl文件简要讲解【转载】

    转载自:http://blog.sina.com.cn/s/blog_90affd9801016xti.html 很多人问ICEM的rpl怎样录制的问题,为什么CFX调用时老是报错,这里开个帖子简单讲 ...

随机推荐

  1. ADC for programmable logic uses one capacitor

    Many electronic devices require user input for setting the application properties. Typical input dev ...

  2. Spring JdbcTemplate batchUpdate() 实例

    在某些情况下,可能需要将一批记录插入到数据库中.如果你对每条记录调用一个插件的方法,SQL语句将被重复编译,造成系统缓慢进行. 在上述情况下,你可以使用 JdbcTemplate BATCHUPDAT ...

  3. d3.js 实现立体柱图

    前言 随着大数据时代的来临,数据可视化的重要性也越来越凸显,那么今天就基于d3.js今天给大家带来可视化基础图表柱图进阶:立体柱图 关于d3.js d3.js是一个操作svg的图表库,d3封装了图表的 ...

  4. .Net4.0并行库介绍——Task

    Task和ThreadPool的功能类似,可以用来创建一些轻量级的并行任务.对于将一个任务放进线程池     ThreadPool.QueueUserWorkItem(A); 这段代码用Task来实现 ...

  5. Python pass 语句

    Python pass 语句 Python pass是空语句,是为了保持程序结构的完整性. pass 不做任何事情,一般用做占位语句. Python 语言 pass 语句语法格式如下: pass 实例 ...

  6. 嵌入式linux内核和根目录制作

    系统组成:Bootloader, Boot parameters, Kernel, Root filesystem嵌入式linux系统有linux内核与根文件系统两部分构成,两者缺一不可. 内核制作: ...

  7. js 操作select和option常用代码整理

    1.获取选中select的value和text,html代码如下: <select id="mySelect"> <option value="1&qu ...

  8. 循环链表的创建、插入、删除、逆序、显示(C++实现)

    对于单链表,因为每一个结点仅仅存储了向后的指针.到了尾标志就停止了向后链的操作,这样,其中某一结点就无法找到它的前驱结点了. 对于单链表的操作大家能够看我的这篇博客http://blog.csdn.n ...

  9. 第三章 consul服务注册与服务查询

    1.定义一个服务 https://www.consul.io/docs/agent/services.html 该方法是服务注册中提供服务的最常用的方法. 关于服务的定义:服务的属性我们会在后边每出现 ...

  10. 【转】四大机器学习降维算法:PCA、LDA、LLE、Laplacian Eigenmaps

    最近在找降维的解决方案中,发现了下面的思路,后面可以按照这思路进行尝试下: 链接:http://www.36dsj.com/archives/26723 引言 机器学习领域中所谓的降维就是指采用某种映 ...