redis之主从复制、哨兵模式

一 redis群集有三种模式

主从复制:

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

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

缺陷:

故障恢复无法自动化;

写操作无法负载均衡;

存储能力受到单机的限制。

哨兵:

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

缺陷:

写操作无法负载均衡;存储能力受到单机的限制;

哨兵无法对从节点进行自动故障转移,

在读写分离场景下,从节点故障会导致读服务不可用,需要对从节点做额外的监控、切换操作。

集群:

通过集群,Redis解决了写操作无法负载均衡,以及存储能力受到单机限制的问题,实现了

较为完善的高可用方案。

缺陷:

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

二 Redis 主从复制

将一台Redis服务器的数据,复制到其他的Redis服务器。前者称为主服务器

(Master),后者称为从服务器(Slave);

数据的复制是单向的,只能由主服务器到从服务器。

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

1 主从复制的作用:

数据冗余:

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

故障恢复

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

服务的冗余。

负载均衡

在主从复制的基础上,配合读写分离,可以由主节点提供写服务,由从节点提供读服

务(即写Redis数据时应用连接主节点,读Redis数据时应用连接从节点),分担服务器负载;尤其

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

高可用基石

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

Redis高可用的基础。

2 主从复制流程:

(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端机器都正常。

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

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

主从复制过程/原理:

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

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

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

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

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

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

3 实验: 搭建Redis 主从复制

master:192.168.11.4

slave1:192.168.11.3

slave1:192.168.11.14

①关闭防火墙 防护
复制代码
[root@mcb-11-4 ~]# hostnamectl set-hostname master
[root@mcb-11-4 ~]# bash
[root@master ~]# systemctl stop firewalld
[root@master ~]# setenforce 0

[root@mcb-11-3 ~]# hostnamectl set-hostname slave1
[root@mcb-11-3 ~]# bash
[root@slave1 ~]# systemctl stop firewalld
[root@slave1 ~]# setenforce 0

[root@mcb-11-14 ~]# hostnamectl set-hostname slave2
[root@mcb-11-14 ~]# bash
[root@slave2 ~]# systemctl stop firewalld 
[root@slave2 ~]# setenforce 0

主从服务器三台服务器都要做以下步骤:

复制代码
-----安装 Redis-----
yum install -y gcc gcc-c++ make

tar zxvf redis-5.0.7.tar.gz -C /opt/


cd /opt/redis-5.0.7/
make
make PREFIX=/usr/local/redis install

cd /opt/redis-5.0.7/utils
./install_server.sh
......
Please select the redis executable path [/usr/local/bin/redis-server] /usr/local/redis/bin/redis-server  	

ln -s /usr/local/redis/bin/* /usr/local/bin/
②安装 Redis
复制代码
yum install -y gcc gcc-c++ make

两台从服务器与主服务器都要安装

master:vim /etc/hosts

复制代码
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.11.4 master
192.168.11.3 slave1
192.168.11.14 slave2

远程共享 :因为从与主文本相识

复制代码
[root@slave2 opt]# scp redis-5.0.7.tar.gz slave1:/opt
The authenticity of host 'slave1 (192.168.11.3)' can't be established.
ECDSA key fingerprint is SHA256:3V0GFEzP1uwGoV7NVYcUJgAu4RXc3zyAmrdK/23JPYQ.
ECDSA key fingerprint is MD5:e7:4d:a5:3d:11:8b:3b:cb:e9:81:b0:07:59:19:f7:60.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'slave1,192.168.11.3' (ECDSA) to the list of known hosts.
root@slave1's password: 
redis-5.0.7.tar.gz                                                                  100% 1938KB  39.6MB/s   00:00    
[root@slave2 opt]# 
④解压安装包
复制代码
tar zxvf redis-5.0.7.tar.gz -C /opt/
⑤切换 安装
复制代码
cd /opt/redis-5.0.7/
make

[root@master redis-5.0.7]# make
复制代码
make PREFIX=/usr/local/redis install

[root@slave2 redis-5.0.7]# make PREFIX=/usr/local/redis install
复制代码
./install_server.sh

复制代码
Please select the redis executable path [/usr/local/bin/redis-server] /usr/local/redis/bin/redis-server 
⑥ 建立软连接
复制代码
ln -s /usr/local/redis/bin/* /usr/local/bin/
⑦查看文件

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

复制代码
vim /etc/redis/6379.conf   redis.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行,指定工作目录
appendonly yes						#700行,开启AOF持久化功能

①检测一下:
复制代码
[root@slave2-redis utils]# vim /etc/redis/6379.conf
[root@slave2-redis utils]# /etc/init.d/redis_6379 restart
Stopping ...
Waiting for Redis to shutdown ...
Redis stopped
Starting Redis server...
[root@slave2-redis utils]# netstat -anpt|grep redis
tcp        0      0 127.0.0.1:6379          0.0.0.0:*               LISTEN      9933/redis-server 1 

[root@slave1-redis utils]# vim /etc/redis/6379.conf
[root@slave1-redis utils]# /etc/init.d/redis_6379 restart
Stopping ...
Waiting for Redis to shutdown ...
Redis stopped
Starting Redis server...
[root@slave1-redis utils]#  netstat -anpt|grep redis
tcp        0      0 0.0.0.0:6379            0.0.0.0:*               LISTEN      15694/redis-server  

[root@master ~]# /etc/init.d/redis_6379 restart
Stopping ...
Waiting for Redis to shutdown ...
Redis stopped
Starting Redis server...
[root@master ~]#  netstat -anpt|grep redis
tcp        0      0 0.0.0.0:6379            0.0.0.0:*               LISTEN      3178/redis-server 0 
tcp        0      0 192.168.11.4:6379       192.168.11.3:38993      ESTABLISHED 3178/redis-server 0 
tcp        0      0 192.168.11.4:6379       192.168.11.14:58450     ESTABLISHED 3178/redis-server 0 
[root@master ~]# 
②验证主从效果
③在主服务器输入文本

二 Redis 哨兵模式

主从切换:当服务器宕机后,需要人工手动一台从机切换为主机,为了解决主从复制的缺点,就有

了哨兵机制。

1 哨兵的核心功能:

在主从复制的基础上,哨兵引入了主服务器的自动故障转移。

2 哨兵模式原理:

哨兵(sentinel):是一个分布式系统,用于对主从结构中的每台服务器进行监控,当出现故障时通过

投票机制选择新的 Master并将所有slave连接到新的 Master。所以整个运行哨兵的集群的数量不得

少于3个节点。

3 哨兵模式的作用:

监控:哨兵会不断地检查主节点和从节点是否运作正常。

自动故障转移:当主节点不能正常工作时,哨兵会开始自动故障转移操作,它会将失效主节点的其

中一个从节点升级为新的主节点,并让其它从节点改为复制新的主节点。

通知(提醒):哨兵可以将故障转移的结果发送给客户端。

4 哨兵结构由两部分组成:

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

数据节点:主节点和从节点都是数据节点。

5 故障转移机制:

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

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

果主节点在一定时间范围内不回复或者是回复一个错误消息,那么这个哨兵就会认为这个主节点主

观下线了(单方面的)。当超过半数哨兵节点认为该主节点主观下线了,这样就客观下线了。

②当主节点出现故障,此时哨兵节点会通过Raft算法(选举算法)实现选举机制共同选举出一个哨

兵节点为leader,来负责处理主节点的故障转移和通知。所以整个运行哨兵的集群的数量不得少于

3个节点。

③由leader哨兵节点执行故障转移:

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

需要特别注意的是,客观下线是主节点才有的概念;如果从节点和哨兵节点发生故障,被哨兵主观下线后,不会再有后续的客观下线和故障转移操作。

6主节点的选举:

1.过滤掉不健康的(已下线的),没有回复哨兵 ping 响应的从节点。

2.选择配置文件中从节点优先级配置最高的。(replica-priority,默认值为100)

3.选择复制偏移量最大,也就是复制最完整的从节点。

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

7 实验操作

master:192.168.11.4

slave1:192.168.11.3

slave1:192.168.11.14

哨兵的启动是在主从复制之上,所以须把主从模式安装好的情况下再去做哨兵模式

①修改master主配置文件
复制代码
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.11.4 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秒)
②主服务器的配置文件后,scp 传给两个从服务器直接问覆盖
③启动哨兵模式

先启 master,再启 slave

复制代码
[root@master redis-5.0.7]# redis-sentinel sentinel.conf &
[1] 4901
[root@master redis-5.0.7]# redis-sentinel sentinel.conf &
[2] 4906
[1]   完成                  redis-sentinel sentinel.conf

[root@slave2-redis redis-5.0.7]# redis-sentinel sentinel.conf &
[1] 12001


[root@slave2-redis utils]# cd ..
[root@slave1-redis redis-5.0.7]# redis-sentinel sentinel.conf &
[1] 17818
④ 查看哨兵信息

方法1:redis-cli -p 26379 info Sentinel

方法2:查看master的哨兵日志 redis-cli -p 26379 info Sentinel

⑤查看日志并模拟 master 故障
1)查看redis-server进程号:ps -ef | grep redis
2)杀死 Master 节点上redis-server的进程号

kill -9 3178

3)验证结果

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

复制代码
tail -f /var/log/sentinel.log

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

复制代码
redis-cli -p 26379 info sentinel
相关推荐
一屉大大大花卷39 分钟前
初识Neo4j之入门介绍(一)
数据库·neo4j
周胡杰1 小时前
鸿蒙arkts使用关系型数据库,使用DB Browser for SQLite连接和查看数据库数据?使用TaskPool进行频繁数据库操作
前端·数据库·华为·harmonyos·鸿蒙·鸿蒙系统
wkj0011 小时前
navicate如何设置数据库引擎
数据库·mysql
赵渝强老师1 小时前
【赵渝强老师】Oracle RMAN的目录数据库
数据库·oracle
暖暖木头1 小时前
Oracle注释详解
数据库·oracle
御控工业物联网2 小时前
御控网关如何实现MQTT、MODBUS、OPCUA、SQL、HTTP之间协议转换
数据库·sql·http
夜斗小神社3 小时前
【黑马点评】(二)缓存
缓存
GJCTYU3 小时前
spring中@Transactional注解和事务的实战理解附代码
数据库·spring boot·后端·spring·oracle·mybatis
MicroTech20253 小时前
微算法科技(NASDAQ: MLGO)探索Grover量子搜索算法,利用量子叠加和干涉原理,实现在无序数据库中快速定位目标信息的效果。
数据库·科技·算法
Code季风3 小时前
SQL关键字快速入门:CASE 实现条件逻辑
javascript·数据库·sql