【Redis】高可用之一:复制(replica)

本文是Redis系列第4篇,前3篇欢迎移步

【Redis】不卡壳的 Redis 学习之路:从十大数据类型开始入手_AQin1012的博客-CSDN博客关于Redis的数据类型,各个文章总有些小不同,我们这里讨论的是Redis 7.0,为确保准确,我们直接看官网。https://blog.csdn.net/aqin1012/article/details/130365083

【Redis】持久化机制详解:从RDB到AOF,你需要知道的一切_AQin1012的博客-CSDN博客持久化其实就4个单词:加强数据安全Redis支持两种不同的持久化机制,RDB和AOF。https://blog.csdn.net/aqin1012/article/details/130481261

【Redis】不卡壳的 Redis 学习之路:事务_AQin1012的博客-CSDN博客数据库中的事务是指在一次与数据库连接的会话中,所有的SQL语句,要么都成功,要么都失败。在Redis中,事务是指可以一次执行多个命令,本质是一组命令的集合。一个事务中的所有命令都会被序列化,按顺序地串行执行而不会被其他命令插入开启:以MULTI开始一个事务入队:将多个命令入队到事务中,接到这些命令并不会立即执行,而是放到等待执行的事务队列里面执行:由EXEC命令触发事务。https://blog.csdn.net/aqin1012/article/details/131474273?csdn_share_tail=%7B%22type%22%3A%22blog%22%2C%22rType%22%3A%22article%22%2C%22rId%22%3A%22131474273%22%2C%22source%22%3A%22aqin1012%22%7D

本文目录

什么是Redis的复制

能解决的问题

实际操作

权限细节

主要命令

操作流程

准备阶段

下载镜像(本文用的docker,也可以使用虚拟机)

安装Redis

修改redis配置

如何获取docker镜像的IP呢?

启动测试

先主后从,依次启动

查看主从信息

查看日志

总结


什么是Redis的复制

官网地址: https://redis.io/docs/management/replication/

其实就是主从复制,master以写为主,slave以读为主

当master数据变化的时候,自动将新的数据异步同步到其它slave数据库

能解决的问题

  • 读写分离
  • 容灾备份
  • 数据备份
  • 水平扩容支撑高并发

实际操作

配从库不配主库

权限细节

  • 主机(master)如果配置了requirepass参数,需要密码登陆
  • 那么从机(slave)就要配置masterauth来设置校验密码,否则的话主机会拒绝从机的访问请求

主要命令

  • info replication
    • 可以查看复制节点的主从关系和配置信息
  • replicaof 主库IP 主库端口(主从复制)
    • 一般写入redis.conf配置文件内
  • slaveof 主库IP 主库端口(上面命令的手动配置版,手动指定做谁的小弟,可用于“改换门庭”)
    • 每次与masterl断开之后,都需要重新连接,除非你配置进redis.conf文件
    • 在运行期间修改slave节点的信息,如果该数据库已经是某个主数据库的从数据库,那么会停止和原主数据库的同步关系转而和新的主数据库同步,重新拜码头
  • slaveof no one(“自立为王”)
    • 使当前数据库停止与其他数据库的同步,转成主数据库,自立为王

操作流程

本文以Redis的一主二从(一台主机(master)两台从机(slave))为示例

准备阶段

下载镜像(本文用的docker,也可以使用虚拟机)

取一个centos的镜像(可以跟我用一样的,也可以用你自己的,前提是安装了docker)

docker pull bitnami/centos-base-buildpack:7-r9

【Redis】高可用之一:复制(replica)_第1张图片

安装Redis

1. 下载redis安装包并解压

wget https://download.redis.io/releases/redis-7.0.9.tar.gz

具体的版本参考地址(本文是用的是redis-7.0.9.tar.gz)

https://download.redis.io/releases/

2. 解压

tar -zxvf redis-7.0.9.tar.gz

3. 进入解压目录

cd redis-7.0.9

4. 编译

make

5. 指定安装目录并进行安装

make install PREFIX=/usr/local/redis

6. 添加软连接

ln -s /usr/local/redis/bin/redis-server /usr/bin/redis-server 
ln -s /usr/local/redis/bin/redis-cli /usr/bin/redis-cli

7. 复制配置文件

cp /root/redis-7.0.9/redis.conf /usr/local/redis/bin/

【Redis】高可用之一:复制(replica)_第2张图片

此时/usr/local/redis/bin/目录下就出现了redis的配置文件

修改redis配置

进入配置文件所在目录(按照上面的操作redis.conf文件复制了一份到/usr/local/redis/bin)

打开redis.conf文件

差不多长这样

【Redis】高可用之一:复制(replica)_第3张图片

使用:set nu可以显示行号,方便查找

【Redis】高可用之一:复制(replica)_第4张图片

:行号可以快速跳转到某一行

【Redis】高可用之一:复制(replica)_第5张图片

/搜索内容可以定位到包含“搜索内容”的行

【Redis】高可用之一:复制(replica)_第6张图片

  1. 开启daemonize yes

    【Redis】高可用之一:复制(replica)_第7张图片

  2. 注释掉bind127.0.0.1

    【Redis】高可用之一:复制(replica)_第8张图片

  3. protected-mode no

    【Redis】高可用之一:复制(replica)_第9张图片

4. 指定端口

主不用改

【Redis】高可用之一:复制(replica)_第10张图片

2个从需要换一下端口号

【Redis】高可用之一:复制(replica)_第11张图片

5. 指定当前工作目录,dir

【Redis】高可用之一:复制(replica)_第12张图片

6. pid文件名字,pidfile

主不用改

【Redis】高可用之一:复制(replica)_第13张图片

从需要对应上面port的设置修改

【Redis】高可用之一:复制(replica)_第14张图片

7. log文件名字,logfile

主不用改

【Redis】高可用之一:复制(replica)_第15张图片

从需要按照上面port的配置进行修改

【Redis】高可用之一:复制(replica)_第16张图片

8. requirepass

为主机(master)设设置密码,后面从机(slave)连接要使用

【Redis】高可用之一:复制(replica)_第17张图片

9. dump.rdb名字(建议添加端口号)

主机

【Redis】高可用之一:复制(replica)_第18张图片

从机

【Redis】高可用之一:复制(replica)_第19张图片

10. aof文件,appendfilename

appendonly yes 时配置

11. 从机(slave)访问主机(master)的通行密码masterauth,必须从机(slave)需要配置,此步骤主机(master)不用配置

【Redis】高可用之一:复制(replica)_第20张图片

从机(slave)需要做如下修改

  1. replicaof 主机(master)IP 主机(master)端口
  2. masterauth 就是主机(master)requirepass配置的密码

【Redis】高可用之一:复制(replica)_第21张图片

补充一下(我真体贴(。・ω・。))~

如何获取docker镜像的IP呢?

查看当前运行的容器信息

根据容器ID获取该容器的IP

【Redis】高可用之一:复制(replica)_第22张图片

在我们这个一主二从的案例中

  • 主机(master)
    • 172.17.0.2
  • 从机(slave)
    • 172.17.0.3
    • 172.17.0.4

在每个docker都完成上面的配置后,可以将配置文件复制一份到我们配置中用到的aqinredis文件夹下,并加上端口重命名下(方便管理非必需)

启动测试

先主后从,依次启动

主机(master)启动需要添加密码(requirepass中指定了的)

从机(slave)启动记得指定端口

【Redis】高可用之一:复制(replica)_第23张图片

【Redis】高可用之一:复制(replica)_第24张图片

在主里存入值,可以看到在两台从机(slave)中都可以获取到

但是从机(slave)是不能存值的(是只读的)

【Redis】高可用之一:复制(replica)_第25张图片

查看主从信息

主机(master)

【Redis】高可用之一:复制(replica)_第26张图片

从机(slave)

【Redis】高可用之一:复制(replica)_第27张图片

【Redis】高可用之一:复制(replica)_第28张图片

查看日志

我们查看下主机的日志(就是一开始配置文件redis.conf中设置的log文件),可以发现,已经记录了两台从机挂到主机上的日志了

【Redis】高可用之一:复制(replica)_第29张图片

可以再看下从机的日志,也可以看到相关信息

【Redis】高可用之一:复制(replica)_第30张图片

总结

  • 主机(master)能读能写,从机(slave)只能读
    • 无论主机已经写了多少数据,从机一旦启动,就会全部复制过来,后续主机写,从机跟
  • 配置文件命令配置
    • 使用配置文件进行主从配置时,如果主机挂了,从机不会变化,还可以提供读的功能,等待主机恢复(重启后主从关系仍在)
    • 使用命令配置时,主机A可以通过slaveof 主机B的IP 主机B的端口命令,动态的绑定成为主机B的从机,但只是单次生效,重启会失效
  • 主从属性可以传递
    • 上一个从机可以是下一个从机的主机,从机同样可以接收其他从机的连接和同步请求,那么该从机作为了链条中下一个的主机(但仍然是只读的),可以有效减轻主master(最开始的主机)的写压力
    • 使用命令slaveof 新主库IP 新主库端口可以中途变更绑定的主机
      • 会清除之前的数据,重新建立拷贝最新的
    • 使用命令slaveof no one可以解除绑定,自己成为主机
  • 复制原理和工作流程
    • 从机启动,同步初请
      • 从机启动成功连接到主机会发一个sync命令
      • 从机首次全新连接主机会自动一次性全量复制,原有数据会被覆盖
    • 首次连接,全量复制
      • 主机节点收到sync命令后会开始在后台保存快照(即RDB持久化,主从复制时会触发RDB),同时收集所有接收到的用于修改数据集命令缓存起来,主机节点执行RDB持久化完后,master将rdb快照文件和所有缓存的命令发送到所有从机,以完成一次完全同步
      • 而从机服务在接收到数据库文件数据后,将其存盘并加载到内存中,从而完成复制初始化
    • 心跳持续,保持通信
      • 默认10秒repl-ping-replica-period 10
    • 【Redis】高可用之一:复制(replica)_第31张图片

    • 进入平稳,增量复制
      • 主机持续将新的所有收集到的修改命令自动依次传给从机,完成同步
    • 从机下线,重连续传
      • 主机会检查backlog中的offset,主机和从机都会保存一个复制的offset(保存在backlog中),还有一个masterId,主机只会把已经复制的offset后面的数据复制给从机(类似断点续传)
  • 复制的缺点
    • 复制延时,信号衰弱(从机的增加会使这个问题更严重)
    • 主机挂了无法自动恢复
       

于是,有了后面要介绍的哨兵和集群( ̄∇ ̄)/

你可能感兴趣的:(Redis,redis,复制,集群,高可用)