Redis学习笔记:主从复制(未完成)

这是本人学习的总结,主要学习资料如下

  • B站狂神说,redis教程

目录

  • 1、主从复制概述
    • 1.2、主从赋值的用途
    • 1.3、redis主从复制的特点
  • 2、前期准备
    • 2.1、开启多个本地redis服务模拟集群
  • 3、哨兵模式
    • 3.1、哨兵模式详解
    • 3.2、启动哨兵服务
      • 3.2.1、编写哨兵配置文件
      • 3.2.2、启动哨兵
      • 3.2.3、测试

1、主从复制概述

主从复制是指将一台服务器的数据复制到其它服务器。前者称为主机,后者称为从机。只能从主机写到从机,不能反过来。主机以写为主,从机以读为主。

Redis学习笔记:主从复制(未完成)_第1张图片
因为大部分请求都是以读,所以会有这样的设计。

一般主从的最低配置是『一主二从』。其实『一主一从』也可以,但是后面会涉及到哨兵模式,至少需要两台从机。



1.2、主从赋值的用途

  • 数据冗余:从机相当于主机的数据的热备份,是持久化的另一种备份方式。
  • 故障修复:当主机发生严重问题时,就能用从机恢复数据。
  • 负载均衡:主机负责写,从机负责读,可大大提高并发量。

1.3、redis主从复制的特点

  • 全量复制和增量复制同时运行:全量复制是指,当一个主机开启一段时间以后,有一个从机突然关联这个主机,那主机会将现有的所有数据都复制给从机;增量复制是指,当一个主机会将增加的数据复制给从机。
  • 主机断线后从机不丢数据:我做了实验,当主机shutdown以后,从机中的数据不会被删除,依旧可以读。
  • 主机上线进行全量复制:当主机重新上线以后,会从持久化文件中备份数据,这时候会对从机进行一次全量复制。我做了实验,主机掉线,从机可以继续读。删除主机的dump.rdb文件,重启主机,从机的数据也没了。
  • 主从复制具有传递性:从机可以为别人的主机,当该从机的主机复制数据给该从机时,该从机也会作为主机将数据复制给它的从机。尽管具有传递性,只要某个redis机子是别人的从机,那就决不允许该从机直接接受写入指令。

2、前期准备

2.1、开启多个本地redis服务模拟集群

  1. 复制两份redis.conf文件,这两份文件分别是两个从机的启动配置文件。改写这两个文件的端口号,我是改成了6380和6381。
  2. 改写配置文件的日志文件名,持久化文件名,避免三个redis服务产生的记录混杂。我将日志文件名改成『端口号.log』,持久化文件名改成『dump+端口号.rdb』。
logfile "6379.log"
dbfilename "dump6379.rdb"
  1. 现有三份redis.conf文件,原文件我当做主机,后两个文件我当成从机。之后cd到redis安装目录下,使用命令```redis-server /*/redis.conf````指定指定配置文件开启redis服务即可。

Redis学习笔记:主从复制(未完成)_第2张图片

  1. 配置主从关系:所有的redis服务默认都是主机,配置主从都是在从机上配置。使用指令slaveof ip port,指定本机是谁的从机,或者启动前在配置文件中修改。另外我们可以使用info replication查看主从配置信息。配置好之后,主机写的数据从机就能立刻读到,同时从机的任何写操作都是禁止的,主机可以随意读写。



3、哨兵模式

现在有这样一个场景,如果主机挂掉了,而且短时间内有无法恢复,那就让redis服务只有读没有写吗?听起来有些浪费资源,也不太实际。事实上,当我们发现主机挂掉以后,可以指定一个新的节点为主机,继续维持redis的服务。

找到一个从机,执行指令slaveof no one,这时候该从机就可以变成主机,可以提供写服务,同时其他从机的主从关系维持不变。

这样的解决方式也带来一个问题,如果原本的主机抢救回来了,那也是一个光杆司令。系统就会变成有两个主机,各自有自己的端口号。要想回到最初的状态又要使用指令slaveof ip port,比较麻烦。所幸的是,redis提供了哨兵模式帮助我们自动完成这些事,服务更及时,更有效。

3.1、哨兵模式详解

首先,哨兵是指一个独立进程,他会监控指定的redis服务。当发现主机挂了以后,哨兵会通过一些条件选取一个从机,并将这个从机变成新的主机。

Redis学习笔记:主从复制(未完成)_第3张图片
上图是一个简单的模型,实际上一个哨兵还不够,因为这个哨兵也有挂掉的风险,所以我们还会增加监控哨兵的哨兵,保证系统的运行。一般情况下一个最简单的哨兵模型也应该有三哨兵三机子。

Redis学习笔记:主从复制(未完成)_第4张图片

三个哨兵各自监控所有的redis服务,同时也互相监控。

当哨兵1发现主机挂了,系统不会立刻处理。因为这个过程只是哨兵1的主观下线。等到其他的哨兵都发现主机挂了,当认为主机挂了的哨兵的数量足够多时,那系统才会开始处理。

首先,哨兵们开始投票,选出他们认为应该接替主机的从机,得票数最多的从机就会变成主机。之后通过订阅发布模式,哨兵们将监控的从机的主机对象切换成新的主机。这个过程叫客观下线。



3.2、启动哨兵服务

3.2.1、编写哨兵配置文件

文件名必须是sentinel.conf,放在安装目录下,或者等会启动的时候用指定配置文件的方式启动。

# sentinel monitor 主机名(自定义) ip port n; n表示至少要有n个哨兵认为这个监视对象失效,那这台主机才失效。
sentinel monitor master 127.0.0.1 6379 1
# 监控的主机在60000毫秒内没有反馈,那哨兵就认为这台机子挂了
sentinel down-after-milliseconds master 60000



3.2.2、启动哨兵

执行指令redis-sentinel /*/sentinel.conf

MacBook-Pro:etc fulanbin$ redis-sentinel sentinel.conf
63167:X 15 Oct 2020 15:12:26.492 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
63167:X 15 Oct 2020 15:12:26.492 # Redis version=5.0.6, bits=64, commit=00000000, modified=0, pid=63167, just started
63167:X 15 Oct 2020 15:12:26.492 # Configuration loaded
63167:X 15 Oct 2020 15:12:26.494 * Increased maximum number of open files to 10032 (it was originally set to 256).
                _._                                                  
           _.-``__ ''-._                                             
      _.-``    `.  `_.  ''-._           Redis 5.0.6 (00000000/0) 64 bit
  .-`` .-```.  ```\/    _.,_ ''-._                                   
 (    '      ,       .-`  | `,    )     Running in sentinel mode
 |`-._`-...-` __...-.``-._|'` _.-'|     Port: 26379
 |    `-._   `._    /     _.-'    |     PID: 63167
  `-._    `-._  `-./  _.-'    _.-'                                   
 |`-._`-._    `-.__.-'    _.-'_.-'|                                  
 |    `-._`-._        _.-'_.-'    |           http://redis.io        
  `-._    `-._`-.__.-'_.-'    _.-'                                   
 |`-._`-._    `-.__.-'    _.-'_.-'|                                  
 |    `-._`-._        _.-'_.-'    |                                  
  `-._    `-._`-.__.-'_.-'    _.-'                                   
      `-._    `-.__.-'    _.-'                                       
          `-._        _.-'                                           
              `-.__.-'                                

3.2.3、测试

你可能感兴趣的:(Redis)