非关系型数据库-----------Redis的主从复制、哨兵模式

目录

一、redis群集有三种模式

1.1主从复制、哨兵、集群的区别

1.1.1主从复制

1.1.2哨兵

1.1.3集群

二、主从复制

2.1主从复制概述

2.2主从复制的作用

①数据冗余

②故障恢复

③负载均衡

④高可用基石

2.3主从复制流程

2.4搭建redis主从复制

2.4.1环境准备

2.4.2三台机器都安装redis

[2.4.3修改 Redis 配置文件(Master节点操作)](#2.4.3修改 Redis 配置文件(Master节点操作))

2.4.4修改Redis配置文件(slave节点操作)

2.4.5验证主从效果

2.4.5.1在Master节点上看日志

2.4.5.2在Master节点上验证从节点

[2.4.5.3在master节点上添加数据 从节点查看](#2.4.5.3在master节点上添加数据 从节点查看)

三、Redis哨兵模式

3.1Redis哨兵模式概述

3.2哨兵模式原理

3.3哨兵模式的作用

3.3.1监控

3.3.2自动故障转移

3.3.3通知(提醒)

3.4哨兵结构由两部分组成,哨兵节点和数据节点:

3.5故障转移机制 (哨兵的原理)

1) 主观下线 主观下线)

2) 客观下线 客观下线)

3) 投票选举 投票选举)

3.5.1主节点的选举:

3.6搭建redis哨兵模式

[3.6.1修改 Redis 哨兵模式的配置文件(所有节点都要操作)](#3.6.1修改 Redis 哨兵模式的配置文件(所有节点都要操作))

3.6.2启动哨兵模式

3.6.3查看哨兵信息

3.6.4故障模拟

3.6.4.1去master查看进程号

[3.6.4.2杀死 Master 节点上redis-server的进程号](#3.6.4.2杀死 Master 节点上redis-server的进程号)

3.6.5验证结果


一、redis群集有三种模式

redis群集有三种模式,分别是主从同步/复制、哨兵模式、Cluster

1.1主从复制、哨兵、集群的区别

1.1.1主从复制

主从复制是高可用Redis的基础,哨兵和集群都是在主从复制基础上实现高可用的。

主从复制主要实现了数据的多机备份,以及对于读操作的负载均衡和简单的故障恢复。

缺陷:

  • 故障恢复无法自动化;
  • 写操作无法负载均衡;
  • 存储能力受到单机的限制。

1.1.2哨兵

哨兵:在主从复制的基础上,哨兵实现了自动化的故障恢复。

缺陷

  • 写操作无法负载均衡;
  • 存储能力受到单机的限制;
  • 哨兵无法对从节点进行自动故障转移,在读写分离场景下,从节点故障会导致读服务不可用,需要对从节点做额外的监控、切换操作。

1.1.3集群

集群:通过集群,Redis解决了写操作无法负载均衡,以及存储能力受到单机限制的问题,实现了较为完善的高可用方案

但是,成本比较高,通常至少三主三从,六台起步,成本比较高!!

二、主从复制

2.1主从复制概述

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

默认情况下,每台Redis服务器都是主节点;且一个主节点可以有多个从节点(或没有从节点),但一个从节点只能有一个主节点。

2.2主从复制的作用

①数据冗余

主从复制实现了数据的热备份,是持久化之外的一种数据冗余方式。

②故障恢复

当主节点出现问题时,可以由从节点提供服务,实现快速的故障恢复;实际上是一种服务的冗余

③负载均衡

在主从复制的基础上,配合读写分离,可以由主节点提供写服务,由从节点提供读服务(即写Redis数据时应用连接主节点,读Redis数据时应用连接从节点),分担服务器负载;

尤其是在写少读多的场景下,通过多个从节点分担读负载,可以大大提高Redis服务器的并发量。

④高可用基石

除了上述作用以外,主从复制还是哨兵和集群能够实施的基础,因此说主从复制是Redis高可用的基础。

2.3主从复制原理

(1)若启动一个Slave机器进程,则它会向Master机器发送一个"sync command"命令,请求同步连接。

(2)无论是第一次连接还是重新连接,Master机器都会启动一个后台进程,将数据快照保存到数据文件中(执行rdb操作),同时Master还会记录修改数据的所有命令并缓存在数据文件中。

(3)后台进程完成缓存操作之后,Master机器就会向Slave机器发送数据文件,Slave端机器将数据文件保存到硬盘上,然后将其加载到内存中,接着Master机器就会将修改数据的所有操作一并发送给Slave端机器。若Slave出现故障导致宕机,则恢复正常后会自动重新连接。

(4)Master机器收到Slave端机器的连接后,将其完整的数据文件发送给Slave端机器,如果Mater同时收到多个Slave发来的同步请求,则Master会在后台启动一个进程以保存数据文件,然后将其发送给所有的Slave端机器,确保所有的Slave端机器都正常。

1、从节点给主节点发送sync命令,主节点则通过bgsave命令生成RDB快照文件,然后将其文件传给从节点,之后的写操作都记录在缓冲区;
2、从节点收到快照文件后执行保存到数据集中,然后再次给主发送psync命令,获取缓冲区的数据;
3、主节点发送缓冲区的写操作,从节点执行同步到数据集中,此时完成主从数据一致;
4、后续从节点会持续监测主,主节点也会定时给从节点发送写操作,从节点同步执行,实现主从数据一致;
 
注意:从节点首次同步以及宕机恢复都需要执行一次全量数据加载,即全量备份

sync同步 RDB(完全备份文件)给从服务器

AOF(增量备份)给从服务器

主从复制过程/原理:

①从---->主发送sync同步数据请求

②主redis 会fork一个子进程,然后会产生RDB文件(完全备份的文件)的过程

2.1 客户端还在持续的写入redis

③rdb文件 持久化完成后,主redis会将RDB文件和缓存起来的命令推送给我们的从服务器

④复制、推送完后,主reids 会持续的同步操作命----->利用AOF(增备)主持久化功能

⑤在下一台redis 接入主从复制之前,会持续利用AOF的方式 同步数据给从服务器

2.4搭建redis主从复制

下载安装包的链接:

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

2.4.1环境准备

|------------|-------------|----------------|------------------------|
| 主机 | 操作系统 | IP地址 | 软件 / 安装包 / 工具 |
| Master | CentOS7 | 192.168.246.8 | redis-5.0.7.tar.gz |
| Slave1 | CentOS7 | 192.168.246.9 | redis-5.0.7.tar.gz |
| Slave2 | CentOS7 | 192.168.246.10 | redis-5.0.7.tar.gz |

关闭防火墙、防护

systemctl stop firewalld
setenforce 0

2.4.2三台机器都安装redis

[root@localhost ~]#systemctl stop firewalld
[root@localhost ~]#setenforce 0
[root@localhost ~]#yum install gcc gcc-c++ make -y
[root@localhost ~]#cd /opt
[root@localhost opt]#ls
rh
[root@localhost opt]#rz -E
rz waiting to receive.
[root@localhost opt]#ls
redis-5.0.7.tar.gz  rh
[root@localhost opt]#tar xf redis-5.0.7.tar.gz 
[root@localhost opt]#ls
redis-5.0.7  redis-5.0.7.tar.gz  rh
[root@localhost opt]#cd /opt/redis-5.0.7/
[root@localhost redis-5.0.7]#make -j 4
[root@localhost redis-5.0.7]#make prefix=/usr/local/redis install
[root@localhost redis-5.0.7]#cd /opt/redis-5.0.7/utils/
[root@localhost utils]#./install_server.sh

Please select the redis executable path [/usr/local/bin/redis-server] /usr/local/redis/bin/redis-server
[root@localhost utils]#ln -s /usr/local/redis/bin/* /usr/local/bin/
[root@localhost utils]#/etc/init.d/redis_6379 start
/var/run/redis_6379.pid exists, process is already running or crashed
[root@localhost utils]#netstat -natp|grep redis
tcp        0      0 127.0.0.1:6379          0.0.0.0:*               LISTEN      6447/redis-server 1 
[root@localhost utils]#netstat -natp|grep 6379
tcp        0      0 127.0.0.1:6379          0.0.0.0:*               LISTEN      6447/redis-server 1 
[root@localhost utils]#

​​​​​​​[root@localhost ~]#yum install gcc gcc-c++ make -y

修改下主机名,好区分

2.4.3修改 Redis 配置文件(Master节点操作)

​vim /etc/redis/6379.conf

bind 0.0.0.0                     #70行,修改监听地址为0.0.0.0
daemontze yes                    #137行,开启守护进程
logfile/var/log/redis_6379.1og   #172行,指定日志文件目录
dir/var/lib/redis/6379           #264行,指定工作目录
appendonly yes                   #700行,开启AOF持久化功能
----------------------------------------
/etc/init.d/redis_6379 restart

2.4.4修改Redis配置文件(slave节点操作)

vim /etc/redis/6379.conf

bind 0.0.0.0						#70行,修改监听地址为0.0.0.0
daemonize yes						#137行,开启守护进程
logfile /var/log/redis_6379.log		#172行,指定日志文件目录
dir /var/lib/redis/6379				#264行,指定工作目录		
replicaof 192.168.246.8 6379        #288行,指定要同步的Master节点IP和端口
appendonly yes						#700行,开启AOF持久化功能
------------------------------------

/etc/init.d/redis_6379 restart

slave2配置:

由于配置一样,我们先备份下slave2配置文件,从slave1直接远程拷贝过去到slave2,再去查看下,是否正确

2.4.5验证主从效果

2.4.5.1在Master节点上看日志
[root@master_redis ~]#tail -f /var/log/redis_6379.log

两个从同步成功

2.4.5.2在Master节点上验证从节点
redis-cli info replication
2.4.5.3在master节点上添加数据 从节点查看

三、Redis哨兵模式

3.1Redis哨兵模式概述

主从切换技术的方法是:当服务器宕机后,需要手动一台从机切换为主机,这需要人工干预,不仅费时费力而且还会造成一段时间内服务不可用。为了解决主从复制的缺点,就有了哨兵机制。

哨兵的核心功能:在主从复制的基础上,哨兵引入了主节点的自动故障转移

3.2哨兵模式原理

哨兵(sentinel):是一个分布式系统,用于对主从结构中的每台服务器进行监控,当出现故障时通过投票机制选择新的 Master并将所有slave连接到新的 Master

所以整个运行哨兵的集群的数量不得少于3个节点

3.3哨兵模式的作用

3.3.1监控

哨兵会不断地检查主节点和从节点是否运作正常、还有哨兵节点是否运作正常。

3.3.2自动故障转移

当主节点不能正常工作时,哨兵会开始自动故障转移操作,它会将失效主节点的其中一个从节点升级为新的主节点,并让其它从节点改为复制新的主节点。

3.3.3通知(提醒)

哨兵可以将故障转移的结果发送给客户端。

3.4哨兵结构由两部分组成,哨兵节点和数据节点:

  • 哨兵节点:哨兵系统由一个或多个哨兵节点组成,哨兵节点是特殊的redis节点,不存储数据。
  • 数据节点:主节点和从节点都是数据节点。

3.5故障转移机制 (哨兵的原理)

1.由哨兵节点定期监控发现主节点是否出现了故障

每个哨兵节点每隔1秒会向主节点、从节点及其它哨兵节点发送一次ping命令做一次心跳检测。

如果主节点在一定时间范围内不回复或者是回复一个错误消息,那么这个哨兵就会认为这个主节点主观下线了(单方面的)。当超过半数哨兵节点认为该主节点主观下线了,这样就客观下线了。

2.当主节点出现故障,此时哨兵节点会通过Raft算法(选举算法)实现选举机制共同选举出一个哨兵节点为leader,来负责处理主节点的故障转移和通知。

所以整个运行哨兵的集群的数量不得少于3个节点。

3.由leader哨兵节点执行故障转移,过程如下:

  • 将某一个从节点升级为新的主节点,让其它从节点指向新的主节点;
  • 若原主节点恢复也变成从节点,并指向新的主节点;
  • 通知客户端主节点已经更换。

需要特别注意的是,客观下线是主节点才有的概念;

如果从节点和哨兵节点发生故障,被哨兵主观下线后,不会再有后续的客观下线和故障转移操作。

​​​​​​​

上图所示,多个哨兵之间也存在互相监控,这就形成了多哨兵模式,现在对该模式的工作过程进行讲解,介绍如下:

1) 主观下线

主观下线,适用于主服务器和从服务器。如果在规定的时间内(配置参数:down-after-milliseconds),Sentinel 节点没有收到目标服务器的有效回复,则判定该服务器为"主观下线"。比如 Sentinel1 向主服务发送了 PING命令,在规定时间内没收到主服务器 PONG回复,则 Sentinel1 判定主服务器为"主观下线"。

2) 客观下线

客观下线,只适用于主服务器。 Sentinel1 发现主服务器出现了故障,它会通过相应的命令,询问其它 Sentinel 节点对主服务器的状态判断。如果超过半数以上的 Sentinel 节点认为主服务器 down 掉,则 Sentinel1 节点判定主服务为"客观下线"。

3) 投票选举

投票选举,所有 Sentinel 节点会通过投票机制,按照谁发现谁去处理的原则,选举 Sentinel1 为领头节点去做 Failover(故障转移)操作。Sentinel1 节点则按照一定的规则在所有从节点中选择一个最优的作为主服务器,然后通过发布订功能通知其余的从节点(slave)更改配置文件,跟随新上任的主服务器(master)。至此就完成了主从切换的操作。

对上对述过程做简单总结:

Sentinel 负责监控主从节点的"健康"状态。当主节点挂掉时,自动选择一个最优的从节点切换为主节点。客户端来连接 Redis 集群时,会首先连接 Sentinel,通过 Sentinel 来查询主节点的地址,然后再去连接主节点进行数据交互。当主节点发生故障时,客户端会重新向 Sentinel 要地址,Sentinel 会将最新的主节点地址告诉客户端。因此应用程序无需重启即可自动完成主从节点切换

①哨兵对主从复制集群进行监控 监控对象"所有redis数据节点"

②哨兵与哨兵之间进行相互监控 监控的对象: 哨兵彼此

③监控目的

3.1 哨兵与哨兵之间的监控目的:检测彼此的存活状态

3.2 哨兵监控所有的redis数据库的目的:为了实现故障自动故障切换
故障切换原理

① 当master 挂掉,哨兵会及时发现,发现之后 进行投票机制,选举出一个新的master服务器一定是奇数)

② 完成salve----->master的 从向主 进行切换

③ 完成其他的从服务器对新的master配置

3.5.1主节点的选举:
  • 过滤掉不健康的(已下线的),没有回复哨兵 ping 响应的从节点。
  • 选择配置文件中从节点优先级配置最高的(replica-priority,默认值为100)
  • 选择复制偏移量最大,也就是复制最完整的从节点。

哨兵的启动依赖于主从模式,所以须把主从模式安装好的情况下再去做哨兵模式

3.6搭建redis哨兵模式

环境准备:

|----------------------|-------------|----------------|------------------------|
| 主机 | 操作系统 | IP地址 | 软件 / 安装包 / 工具 |
| Master、sentinel1 | CentOS7 | 192.168.246.8 | redis-5.0.7.tar.gz |
| Slave1、sentinel2 | CentOS7 | 192.168.246.9 | redis-5.0.7.tar.gz |
| Slave2、sentinel3 | CentOS7 | 192.168.246.10 | redis-5.0.7.tar.gz |

哨兵的启动依赖于主从模式,所以须把主从模式安装好的情况下再去做哨兵模式

哨兵模式要在基于主从复制已搭建完成的前提下才可以做哦

3.6.1修改 Redis 哨兵模式的配置文件(所有节点都要操作)

vim /opt/redis-5.0.7/sentinel.conf
------------------------------------------
protected-mode no								#17行,关闭保护模式
port 26379										#21行,Redis哨兵默认的监听端口
daemonize yes									#26行,指定sentinel为后台启动
logfile "/var/log/sentinel.log"					#36行,指定日志存放路径
dir "/var/lib/redis/6379"						#65行,指定数据库存放路径
sentinel monitor mymaster 192.168.246.8 6379 2	#84行,修改 指定该哨兵节点监控192.168.10.23:6379这个主节点,该主节点的名称是mymaster,最后的2的含义与主节点的故障判定有关:至少需要2个哨兵节点同意,才能判定主节点故障并进行故障转移
sentinel down-after-milliseconds mymaster 30000	#113行,判定服务器down掉的时间周期,默认30000毫秒(30秒)
sentinel failover-timeout mymaster 180000		#146行,故障节点的最大超时时间为180000(180秒)

可以再所有主机添加ip地址加域名,这样远程拷贝可以快一点

其他两台主机配置:/opt/redis-5.0.7/sentinel.conf

scp /opt/redis-5.0.7/sentinel.conf 192.168.246.9:/opt/redis-5.0.7/sentinel.conf
scp /opt/redis-5.0.7/sentinel.conf 192.168.246.10:/opt/redis-5.0.7/sentinel.conf

3.6.2启动哨兵模式

先启master,再启slave

先启master,再启slave

cd /opt/redis-5.0.7/
redis-sentinel sentinel.conf &

3.6.3查看哨兵信息

redis-cli -p 26379 info sentinel

3.6.4故障模拟

3.6.4.1去master查看进程号
ps -ef|grep redis

ps aux|grep redis  #查看进程
3.6.4.2杀死 Master 节点上redis-server的进程号

3.6.5验证结果

①在哨兵节点上验证master是否转换至从服务器

tail -f /var/log/sentinel.log

再次查看哨兵信息:

②在哨兵节点上再次查看哨兵信息,查看是否转换成功

redis-cli -p 26379 info sentinel

总结

1、主从复制

redis主从复制 是为了数据冗余和读写分离

在这两种模式中,有两种角色主节点(master)和从节点(slave),主节点负责处理写的操作

并将数据更改复制到一个或多个从节点。

这样我们的主节点负载减轻,从节点可以提供数据读取服务,实现读写分离,如果主节点停止服务,从节点之一可以立即接管主节点的角色,再继续提供服务

具体流程如下:

1、从节点启动成功连接主节点后,发送一个sync命令

2、主节点接受到sync的命令后开始在后台保存快照,同时,它也开始记录接收到rsnc后所有执行写的命令,快照完成后会将这个快照文件发送给从节点。

3、从节点收到快照文件之后开始载入,并持续接受主节点发送过来的新的写命令执行

总的来说 通过主从复制,redis 能够实现数据的备份(master 产生的数据能slave备份),负责均衡(读操作可以分摊到slave上去)和高可用(master宕机后,可以由slave进行故障切换)

2、redis 哨兵机制

哨兵是一个高可用的行解决方案 官方认可 默认模式

1、监控:redis 哨兵 会持续监控master和slave实例是否正常运行

2、通知:如某个redis实例有问题,哨兵可以通过API向管理员或者其他应用发信通知

3、自动故障转移:如果master节点不工作,哨兵会开始故障转移的过程,选择一个slave节点晋升为新的master,其他剩余slave的节点会被重新配置为新的master节点的slave

4、配置提供服务:客户端可以使用哨兵来查询被认证的master节点该master节点的目录所有的slave节点

redis 哨兵是一个用于管理多个reids服务的系统,它提供监控、通知、自动故障转移、配置提供服务的功能,以实现redis高可用性

相关推荐
Channing Lewis1 小时前
salesforce case可以新建一个roll up 字段,统计出这个case下的email数量吗
数据库·salesforce
毕业设计制作和分享2 小时前
ssm《数据库系统原理》课程平台的设计与实现+vue
前端·数据库·vue.js·oracle·mybatis
ketil272 小时前
Redis - String 字符串
数据库·redis·缓存
Hsu_kk3 小时前
MySQL 批量删除海量数据的几种方法
数据库·mysql
编程学无止境3 小时前
第02章 MySQL环境搭建
数据库·mysql
knight-n3 小时前
MYSQL库的操作
数据库·mysql
包饭厅咸鱼4 小时前
QML----复制指定下标的ListModel数据
开发语言·数据库
王佑辉5 小时前
【redis】延迟双删策略
redis
生命几十年3万天5 小时前
redis时间优化
数据库·redis·缓存
Elastic 中国社区官方博客5 小时前
释放专利力量:Patently 如何利用向量搜索和 NLP 简化协作
大数据·数据库·人工智能·elasticsearch·搜索引擎·自然语言处理