• Redis高可用之持久化、主从复制(附配置实例)


    一、Redis高可用

    1.1 简介

    在web服务器中,高可用是指服务器可以正常访问的时间,衡量的标准是在多长时间内可以提供正常服务(99.9%、99.99%、99.999%等等)。
    但是在Redis语境中,高可用的含义似乎要宽泛一些,除了保证提供正常服务(如主从分离、快速容灾技术),还需要考虑数据容量的扩展、数据安全不会丢失等。

    1.2 高可用策略

    策略概述
    持久化持久化是最简单的高可用方法,主要作用是数据备份,即将数据存储在硬盘,保证数据不会因进程退出而丢失。
    主从复制主从复制是高可用Redis的基础,主要实现了数据的多机备份,以及对于读操作的负载均衡和简单的故障恢复
    哨兵在主从复制的基础上,哨兵实现了自动化的故障恢复。缺陷:写操作无法负载均衡,存储能力受到单机的限制。
    集群通过集群,Redis解决了写操作无法负载均衡,以及存储能力受到单机限制的问题,实现了较为完善的高可用方案。

    二、Redis 持久化

    2.1 简介

    Redis是内存数据库,数据都是存储在内存中,为了避免服务器断电等原因导致Redis进程异常退出后数据的永久丢失,需要定期将Redis中的数据以某种形式(数据或命令)从内存保存到硬盘;

    当下次Redis重启时,利用持久化文件实现数据恢复

    除此之外,为了进行灾难备份,可以将持久化文件拷贝到一个远程位置。

    2.2 Redis 的 两种持久化方式

    2.2.1 RDB持久化

    定时把redis内存中的数据进行快照并压缩保存到硬盘;

    RDB持久化保存的文件占用空间小,网络传输快,恢复速度也比AOF快,性能影响比AOF更小;

    实时性不如AOF,兼容性较差,持久化期间在fork子进程时会阻塞reids父进程。

    2.2.2 AOF持久化

    追加的方式将Redis写操作的命令记录到文件中;

    实时性比RDB好,支持秒级持久化,兼容性较好;

    持久化保存的文件占用磁盘空间更大,恢复速度更慢,性能影响更大,AOF文件重写期间在fork子进程时会阻塞reids父进程;

    两者区别可通过 *工作方式、实时性、磁盘占用、恢复速度、兼容性、IO性能影响等方面进行阐述。

    三、Redis主从复制

    3.1 什么是主从复制?

    在这里插入图片描述

    Redis主从复制是一种常见的数据复制机制,用于在不同的Redis服务器之间同步数据

    在主从复制中,一个Redis服务器充当主服务器(master),负责接收和处理写入操作,而其他的Redis服务器充当从服务器(slave),通过复制主服务器的数据来保持与主服务器的数据同步。

    Redis主从复制是实现读写分离、Redis高可用等的基础

    3.2 为什么要用主从复制?

    1)产生Redis单机故障时,可用通过从服务器上进行恢复数据;

    2)Redis要实现高可用、高并发,单个Redis也就只能支持几万的QPS,必须以集群的形式提供服务,而集群中又以多个主从组成。

    3)主从是以多个redis集合在一起,以一个master多个slave为模式对外提供服务,master主要以写为主,slave提供读,即是读写分离的情况,以读多写少为准。

    3.3 主从复制的特性

    1)一个master可以有多个slave;

    2)一个slave只能有一个master;

    3) 数据流是单向的,master到slave;

    4)主从复制底层依赖与RDB方式进行全量复制。

    3.4 主从复制工作原理

    Redis主从之间的复制分为两部分:全量复制和增量复制。

    3.4.1 全量复制

    Redis在第一次实现主从关系时会进行全量复制
    在这里插入图片描述

    1)Slave 通过 psync命令同步数据与Master建立socket长连接;

    2)Master 收到psync命令,执行bgsave语句生成RDB快照

    3)Master发送RDB数据;

    4)Slave清空数据并加载Master发来的RDB数据;

    5)Master将生成RDB文件过程中,修改的数据,repl buffer发送给Slave

    6)Slave执行接收到的修改命令;

    7)Master通过socket长连接持续把写命令发送给从接单,保证数据一致性。

    3.4.2 增量复制

    如果由于网络原因造成原因造成主从断开,期间有数据写入master,再次形成主从时,会形成增量复制
    在这里插入图片描述

    1)Slave连接断开

    2)Master最近数据的修改命令的缓存;

    3)Slave重新建立Socket长连接到master;

    4)Slave psync命令同步数据: offset偏移量控制;

    5)Master判断 Slave的offset。如果在repl backlog buffer中,Master会将缓存中从salve的offset之后数据一次性同步给salve节点,否则会全量同步;

    6)Master通过socket长连接持续把写命令发送给从节点,保证主从一致性

    3.5 Redis主从同步策略

    主从刚刚连接的时候,进行全量同步;全同步结束后,进行增量同步。

    当然,如果有需要,slave 在任何时候都可以发起全量同步。

    redis 策略是,无论如何,首先会尝试进行增量同步,如不成功,要求从机进行全量同步

    四、搭建Redis主从复制

    在这里插入图片描述

    节点服务器IP地址
    Master192.168.2.100
    Slave1192.168.2.102
    Slave2192.168.2.103
    #开机自动关闭防火墙
    systemctl  disable firewalld --now
    
    #永久关闭selinux
    sed -i 's/enforcing/disabled/' /etc/selinux/config
    
    • 1
    • 2
    • 3
    • 4
    • 5

    Step1 所有节点服务器安装Redis

    安装过程见 Redis安装部署和常用命令_白幽幽白的博客-CSDN博客

    Step2 Master节点修改 Redis 配置文件

    vim /usr/local/redis/conf/redis.conf
    
    bind 0.0.0.0							#87行,修改监听地址为0.0.0.0
    protected-mode no						#111行,将本机访问保护模式设置no
    port 6379								#138行,Redis默认的监听6379端口
    daemonize yes							#309行,设置为守护进程,后台启动
    pidfile /usr/local/redis/log/redis_6379.pid		#341行,指定 PID 文件
    logfile "/usr/local/redis/log/redis_6379.log"	#354行,指定日志文件
    dir /usr/local/redis/data				#504行,指定持久化文件所在目录
    #requirepass abc123						#1037行,可选,设置redis密码
    appendonly yes							#1380行,开启AOF
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述在这里插入图片描述
    在这里插入图片描述

    systemctl restart redis-server.service
    
    • 1

    Step3 Slave节点修改 Redis 配置文件

    Slave1

    vim /usr/local/redis/conf/redis.conf
    
    bind 0.0.0.0							
    #87行,修改监听地址为0.0.0.0
    
    protected-mode no						
    #111行,将本机访问保护模式设置no
    
    port 6379								
    #138行,Redis默认的监听6379端口
    
    daemonize yes							
    #309行,设置为守护进程,后台启动
    
    pidfile /usr/local/redis/log/redis_6379.pid		#341行,指定 PID 文件
    
    logfile "/usr/local/redis/log/redis_6379.log"	#354行,指定日志文件
    
    dir /usr/local/redis/data				
    #504行,指定持久化文件所在目录
    
    replicaof 192.168.2.100 6379			
    #528行,指定要同步的Master节点IP和端口
    
    masterauth abc123						
    #535行,可选,指定Master节点的密码,仅在Master节点设置了requirepass
    
    requirepass abc123						
    #1038行,可选,设置redis密码
    
    appendonly yes							
    #1380行,开启AOF
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32

    在这里插入图片描述

    systemctl restart redis-server.service
    
    • 1

    Slave2

    #远程传输
    scp 192.168.2.102:/usr/local/redis/conf/redis.conf /usr/local/redis/conf/redis.conf
    
    systemctl restart redis-server.service
    
    • 1
    • 2
    • 3
    • 4

    在这里插入图片描述

    Step4 主从效果验证

    #在Master节点上看日志:
    tail -f /usr/local/redis/log/redis_6379.log 
    
    • 1
    • 2

    在这里插入图片描述

    #在Master节点上验证从节点:
    redis-cli -a abc123 info replication -a
    
    • 1
    • 2

    在这里插入图片描述

  • 相关阅读:
    C:字符串函数(续)-学习笔记
    【ARM Trace32(劳特巴赫) 使用介绍 2.2 -- TRACE32 进阶命令之 DIAG 弹框命令】
    钓鱼攻击防不胜防,该如何预防网络钓鱼攻击?
    简单个人静态HTML网页设计作品 基于HTML+CSS+JavaScript仿小米手机网站 html静态在线购物商城网页制作
    学编程,为什么优先推荐学Python?
    计算机五大部件是指什么
    通俗讲解傅里叶变换
    镜像神经元现象是什么,镜像神经元的作用
    总结一下 vue2 组件之间的通信
    Spring扩展接口(2):BeanDefinitionRegistryPostProcessor
  • 原文地址:https://blog.csdn.net/q2524607033/article/details/133349321