window.cnblogsConfig = { blogUser: 'MoYu', blogAvatar: 'https://gitee.com/MoYu-zc/picgo/raw/master/img/20210213094450.jpg', blogStartDate: '2020-02-09', webpageTitleOnblur: '(o゚v゚)ノ Hi,Back', webpageTitleOnblurTimeOut: 500, webpageTitleFocus: '(*´∇`*) 欢迎回来!', webpageTitleFocusTimeOut: 1000, webpageIcon: "https://gitee.com/MoYu-zc/picgo/raw/master/img/20210213094450.jpg", enable: true, // 是否开启日/夜间模式切换按钮 auto: { // 自动切换相关配置 enable: false, // 开启自动切换 dayHour: 7, // 日间模式开始时间,整数型,24小时制 nightHour: 20 // 夜间模式开始时间,整数型,24小时制 } switchDayNight: { enable: true, auto: { enable: true } }, progressBar: { id : 'top-progress-bar', // 请勿修改该值 color : '#77b6ff', height : '2px', duration: 0.2, }, loading: { rebound: { tension: 16, friction: 5, }, spinner: { id: 'spinner', radius: 90, sides: 3, depth: 4, colors: { background: '#f0f0f0', stroke: '#272633', base: null, child: '#272633', }, alwaysForward: true, // When false the spring will reverse normally. restAt: 0.5, // A number from 0.1 to 0.9 || null for full rotation renderBase: false, } }, homeTopAnimationRendered: true, homeTopAnimation: { radius: 15, density: 0.2, color: 'rgba(255,255,255, .2)', // 颜色设置,“random” 为随机颜色 clearOffset: 0.3, }, essayTopAnimationRendered: true, essayTopAnimation: { triW : 14, triH : 20, neighbours : ["side", "top", "bottom"], speedTrailAppear : .1, speedTrailDisappear : .1, speedTriOpen : 1, trailMaxLength : 30, trailIntervalCreation : 100, delayBeforeDisappear : 2, colorsRandom: false, // v1.2.4 是否开启随机颜色 colors: [ '#96EDA6', '#5BC6A9', '#38668C', '#374D84', '#BED5CB', '#62ADC6', '#8EE5DE', '#304E7B' ] }, homeTopImg: [ "https://cdn.jsdelivr.net/gh/BNDong/Cnblogs-Theme-SimpleMemory@master/img/webp/home_top_bg.webp", "https://cdn.jsdelivr.net/gh/BNDong/Cnblogs-Theme-SimpleMemory@master/img/webp/home_top_bg.webp" ], homeBannerTextType: "one", essayTopImg: [ "https://cdn.jsdelivr.net/gh/BNDong/Cnblogs-Theme-SimpleMemory@master/img/webp/nothome_top_bg.webp", "https://cdn.jsdelivr.net/gh/BNDong/Cnblogs-Theme-SimpleMemory@master/img/webp/nothome_top_bg.webp", "https://gitee.com/MoYu-zc/picgo/raw/master/img/20210208190902.jpg", "https://gitee.com/MoYu-zc/picgo/raw/master/img/20210208190954.jpg", ], codeMaxHeight: true, codeLineNumber: true, essayCode: { fontFamily: "'Ubuntu Mono',monospace", // 代码框字体 fontSize: "14px" // 代码框字体大小 }, }

Redis主从复制

Redis主从复制

概念

主从复制,是指将一台Redis服务器的数据,复制到其他的Redis服务器。前者称为主节点(master/leader),后者称为从节点(slave/follower);数据的复制是单向的,只能由主节点到从节点。Master以写为主,Slave以读为主

默认情况下,每台Redis服务器都是主节点;'

'且一个主节点可以有多个从节点(或没有从节点),但一个从节点只能有一个主节点主从复制的作用主要包括:

  1. 数据冗余:主从复制实现了数据的热备份,是持久化之外的一种数据冗余方式。
  2. 故障恢复:当主节点出现问题时,可以由从节点提供服务,实现快速的故障恢复;实际上是一种服务的冗余。
  3. 负载均衡:在主从复制的基础上,配合读写分离,可以由主节点提供写服务,由从节点提供读服务(即写Redis数据时应用连接主节点,读Redis数据时应用连接从节点),分担服务器负载;尤其是在写少读多的场景下,通过多个从节点分担读负载,可以大大提高Redis服务器的并发量。
  4. 高可用基石:除了上述作用以外,主从复制还是哨兵和集群能够实施的基础,因此说主从复制是Redis高可用的基础。

一般来说,要将Redis运用于工程项目中,只使用一台Redis是万万不能的,原因如下:

  1. 从结构上,单个Redis服务器会发生单点故障,并且一台服务器需要处理所有的请求负载,压力较大;
  2. 从容量上,单个Redis服务器内存容量有限,就算一台Redis服务器内存容量为256G,也不能将所有内存用作Redis存储内存一般来说,单台Redis最大使用内存不应该超过20G.

对于这种场景,我们可以使用如下这种架构:

5

主从复制,读写分离,80%的情况下都是在进行读操作,减缓服务器的压力,架构中经常使用 一主二从

环境配置

查看当前库信息

127.0.0.1:6379> info replication    #查看当前库信息
# Replication
role:master       #角色 master
connected_slaves:0   #当前没有从机
master_replid:61514856c42d15d54f537eafadc2597c453f24b9
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:0
second_repl_offset:-1
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0

开始配置

只配置从库,不用配置主库

先将配置文件复制,更改端口号

[root@localhost config]# ls
redis.conf
[root@localhost config]# cp redis.conf redis79.conf    #进行复制
[root@localhost config]# cp redis.conf redis80.conf
[root@localhost config]# cp redis.conf redis81.conf
[root@localhost config]# ls
redis79.conf  redis80.conf  redis81.conf  redis.conf

更改端口号

vim redis79.conf

需要修改的地方:

logfile "6379.log"    

dbfilename dump6379.rdb

对于 剩余两个文件,需要修改地方为:

port 6380 / 6381     #分别改为6380、6381

pidfile /var/run/redis_6380/6381.pid   #同上

logfile "6380.log/6381.log"     

dbfilename dump6380/6381.rdb

用不同的conf文件启动redis

redis-server config/redis79/80/81.conf

6

图中可以看出,三个redis服务器已经开启了

一主两从

默认情况下,每一个redis服务器都是主机 , 一般只需要配置从机

一主 ( 79 ) 两从 ( 80、81 )

启动三个客户端

redis-cli -p 6379/80/81

认主机

SLAVEOF 127.0.0.1 6379    #认79为主机

在6379主机查看信息

7

图中,可以看出主机已经有了 80、81 两个从机

解析

**主机可以写,从机不能写只能读 **

主机中的所有信息和数据,都会自动被从机保存

测试一:主机数据,从机同步;从机只可读、不可写

在主机中进行存入数据

8

在从机中,可以直接获取数据,但是在从机中无法保存数据:

9

测试二:主机突然断掉,从机还是从机 ; 主机重新连接,依旧获得从机

主机直接关闭

10

查看从机状态

11

12

上图可以看出,主机突然断掉,在这种情况下,从机依旧还是从机,并且保持着不可写的状态

恢复主机,并存入数据

13

测试从机是否可以获取主机数据

14

测试三:从机重启,恢复成主机 ; 重新成为从机,可以获取主机中已有的数据

从机重启,会成为主机

15

重新成为从机 ,主机数据直接可以获取

16

原理

Slave启动成功连接到master后会发送一个sync同步命令,Master接到命令,启动后台的存盘进程,同时收集所有接收到的用于修改数据集命令,在后台进程执行完毕之后,master将传送整个数据文件到slave,并完成一次完全同步

全量复制:而slave服务在接收到数据库文件数据后,将其存盘并加载到内存中 -----> 即为获取主机中已经有的全部数据

增量复制:Master继续将新的所有收集到的修改命令依次传给slave,完成同步 ------>即为每次主机新写入的数据,从机也会对应获得

但是只要是重新连接master,一次完全同步(全量复制)将被自动执行,我们的数据一定可以在从机中看到

层层关联

我们如果让 79 成为 80 的主机 、 而 80 成为 81 的主机

即80运行命令:

SLAVEOF 127.0.0.1 6379

81 运行命令

SLAVEOF 127.0.0.1 6380

这样三个端口号就关联起来了

怎么让一台从机 , 变成主机

SLAVEOF no one        #摆脱从机身份

在上面的操作中,如果任何一个主机断了,他的从机还是从机,只能等待主机重新连接,不然就什么都做不了

这显然是不可以的,所以需要实现,如果主机消失,可以自动在从机中找一个新的主机,也就是 哨兵模式

哨兵模式

概述

主从切换技术的方法是:当主服务器宕机后,需要手动把一台从服务器切换为主服务器,这就需要人工干预,费事费力,还会造成一段时间内服务不可用。这不是一种推荐的方式,更多时候,我们优先考虑哨兵模式。Redis从2.8开始正式提供了 Sentinel(哨兵)架构来解决这个问题。

自动选择一个新主机,能够后台监控主机是否故障,如果故障了根据投票数 自动将从库转换为主库

哨兵模式是一种特殊的模式,首先Redis提供了哨兵的命令,哨兵是一个独立的进程,作为进程,它会独立运行。其原理是:哨兵通过发送命令,等待Redis服务器响应,从而监控运行的多个Redis实例。

13

哨兵的作用:

  • 通过发送命令,让Redis服务器返回监控其运行状态,包括主服务器和从服务器。

  • 当哨兵监测到master宕机,会自动将slave切换成master,然后通过发布订阅模式通知其他的从服务器,修改配置文件,让它们切换主机。

但是只有一个哨兵的话,肯定是不安全的,所以可以使用多个哨兵进行监控。也就是多哨兵模式

14

工作原理

图中可以看出,每个哨兵都监控服务器并且哨兵之间也进行相互监控。

如果主服务器不可用, 但仅仅是哨兵1 检测到主服务器不可用时,并不会立刻进行选出新主机的行为,这只是哨兵1主观认为主机不可用,被称为 主观下线;而是需要等到其他的哨兵也检测到主服务器不可用,但数量达到一定值时,由其中一个哨兵发起投票,进行 failover(故障转移) 操作。成功之后,通过发布订阅模式,让各个哨兵将自己监控的从服务器切换为主机,过程成为 客观下线

测试

首先最低需要有 4 台机器,一主二从、一台哨兵

1.哨兵配置文件

config 文件夹下,创建新文件 sentinel.conf

vim sentinel.conf

内容为:

#sentinel monitor 被监控的名称 host port  1
sentinel monitor myredis 127.0.0.1 6379 1

最后 1 代表,如果主机挂了,进行哨兵投票,让从机选出主机

2.启动哨兵

redis-sentinel config/sentinel.conf

15

3.测试主机断开

现在的情况是,79主机,80、81为79的从机,一台哨兵监控他们

16

这时候,等待一会,哨兵检测到主机已经断开,进行投票,我这里是81成为了新主机 (可以查看最后一行)

17

18

4.测试主机恢复

主机恢复连接,哨兵还是会进行检测,但是并不会还是成为主机,而是成为新主机的从机

19

20

优缺点

优点:

  1. 哨兵集群,基于主从复制模式,所有的主从配置优点,它全有

  2. 主从可以切换,故障可以转移,系统的可用性就会更好3、哨兵模式就是主从模式的升级,手动到自动,更加健壮

缺点:

  1. Redis不好啊在线扩容的,集群容量一旦到达上限,在线扩容就十分麻烦
  2. 实现哨兵模式的配置其实是很麻烦的,里面有很多选择

个人博客为:
MoYu's HomePage

posted @ 2021-07-06 22:29  MoYu-zc  阅读(112)  评论(0编辑  收藏  举报