Redis主从复制、哨兵模式、集群模式的搭建与springboot集成


前言

Redis有三种模式:分别是主从同步/复制、哨兵模式、Cluster

主从复制:主从复制是高可用Redis的基础,哨兵和群集都是在主从复制基础上实现高可用的。主从复制主要实现了数据的多机备份,以及对于读操作的负载均衡和简单故障恢复。

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

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

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

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

redis安装这里不在赘述,有需要的同学参考之前的文章【Centos7下安装与配置 Redis】

一、Redis主从复制(读写分离)

环境准备

HOSTNAME IP
redis(主) 192.168.92.100
redis(备) 192.168.92.101
redis(备) 192.168.92.102

1.主从复制概述

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

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

2.主从复制

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

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

负载均衡:在主从复制的基础上,配合读写分离,可以由主节点提供写服务,由从节点提供读服务 (即写 Redis 数据时应用连接主节点,读 Redis 数据时应用连接从节点),分担服务器负载;尤其是在写少读多的场景下,通过多个从节点分担读负载,可以大大提高Redis服务器的并发量。

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

3.Redis主从复制流程

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

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

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

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

4.搭建Redis主从复制

1. 三台虚拟机都进入Redis服务器
在这里插入图片描述

  • info replication 查看主从复制信息

role:master #当前机器的角色主还是从
connected)salaces:0 #代表从节点目前为0

在这里插入图片描述
2. 进入我们的从节点(101/102)修改配置
PS: 这是对从节点的配置, Master主节点中只需要开启以下配置中的主从配置的密码, masterauth XXX, 为后面哨兵搭建提前准备.

  1. 搜索Rep找到replicaof
    . 在这里插入图片描述

  2. 修改replocaofimasterauth

    在这里插入图片描述

  3. 从节点replica-read-only读操作改为yes.从而实现读写分离

    ![在这里插入图片描述](https://img-blog.csdnimg.cn/f5c0c227918f4e62947dc96dd7157a00.png

  4. 保存退出, 删除从节点机器上的备份文件,同上步骤配置我们的第二台从节点102

在这里插入图片描述

  1. 重新启动redis服务,同上步骤配置我们的第二台从节点102

在这里插入图片描述

  1. 查看101从节点的info replication
    在这里插入图片描述

  2. 查看100主节点的info replication
    在这里插入图片描述
    PS: 当主节点宕机后, 从节点不会变成主节点

二、Redis哨兵模式 (Sentinel)

  主从复制存在的问题:主节点挂了,如何保证可用性,实现继续读写?

  在Redis主从复制中, 由于我们的Redis Master节点宕机之后, 从节点Slave无法自动的变为主节点, 从而无法为用户提供写的请求, 只能进行读. 为了解决这个问题, 我们引入了Redis 哨兵机制.
  通过哨兵哨兵机制, 哨兵会监控所有节点, 当主节点宕机之后, 哨兵就会让其中的一个从节点来代替主节点, 接手它的写操作, 从而成为一个新的主从模式.
在这里插入图片描述

环境准备

HOSTNAME IP
redis(主) 192.168.92.100
redis(备) 192.168.92.101
redis(备) 192.168.92.102

1.配置Redis 哨兵机制

1.进入 Redis 安装目录
cd /usr/local/redis/redis-5.0.0
sentinel.conf 就是我们哨兵机制的核心配置文件.
在这里插入图片描述
2.将sentinel核心配置文件拷贝到我们的/usr/local/redis
cp sentinel.conf /usr/local/redis
在这里插入图片描述
3.编辑我们的哨兵核心配置文件
vim sentinel.conf
在这里插入图片描述
在这里插入图片描述在这里插入图片描述

具体配置信息如下:

  • 直接复制修改参数即可
# Base
#开启,方便其他节点器访问
protected-mode no  
#哨兵默认端口号
port 26379
#后台启动模式
daemonize yes
#哨兵机制默认进程号
pidfile /var/run/redis-sentinel.pid
#设置哨兵模式的日志文件路劲
logfile /usr/local/redis/sentinel/redis-sentinel.log
#哨兵模式的工作目录
dir /usr/local/redis/sentinel

# core  核心配置
# my-master:自定义名称           192.168.92.100 6379:主节点ip+端口    2:哨兵数量
sentinel monitor my-master 192.168.92.100 6379 2
#设置主节点密码
sentinel auth-pass my-master 123456
#被哨兵任务失效的毫秒时间段,默认为30秒,单位毫秒
sentinel down-after-milliseconds my-master 30000
#当从节点后变为主节点后,进行配置其他的,多少个从节点进行并行复制     1:一次接一个复制     2:一次复制2个
sentinel parallel-syncs my-master 1
#主备的切换时间,哨兵进行故障转移如果超时,则会交给哨兵集群的另一个节点处理进行故障转移
sentinel failover-timeout my-master 180000

2. 由于是哨兵集群, 所以3台redis节点的哨兵配置文件一模一样.

可以直接拷贝一份, 也可使用如下方式远程拷贝

PS: 将配置文件进行远程传输
scp sentinel.conf [email protected]:/usr/local/redis
scp sentinel.conf [email protected]:/usr/local/redis
在这里插入图片描述

3. 启动哨兵

启动命令:redis-sentinel sentinel.conf
其中sentinel.conf是哨兵核心配置文件路径
在这里插入图片描述

PS: 没有文件夹及文件, 因为我们是事先定义好的目录, 我们去创建即可, 然后再次启动
mkdir /usr/local/redis/sentinel -p
在这里插入图片描述
ps -ef|grep redis 查看redis进程
在这里插入图片描述
tail -f redis-sentinel.log 动态查看哨兵日志文件末尾
在这里插入图片描述
当出现这个说明配置成功了,,,
随后从节点服务器也都需要启动哨兵配置文件

4. 测试哨兵机制

  1. 开启所有的主从复制架构节点,当前100为主节点
    在这里插入图片描述
  2. 关闭主节点,查看日志
    在这里插入图片描述
    在这里插入图片描述
    可以看到101已经变味master,宕机的100节点也已经被剔除
    在这里插入图片描述
    3.启动原来的100 master节点
    在这里插入图片描述
    查看日志,100变成存活状态后,并不会恢复之前的master节点
    在这里插入图片描述
    在这里插入图片描述

5.解决原Master恢复后不同步问题

  相信细心的同学会发现原来的Master(100)恢复成Slave)后,他的同步状态不OK,状态为master_link_status:dowm,这是为什么呢?
修改redis.conf中的masterauth为自己密码即可,我的是123456。
在这里插入图片描述

一般master数据无法同步给slave的方案检查为如下:

  1. 网络通信问题,要保证互相ping通,内网互通。
  2. 关闭防火墙,对应的端口开发(虚拟机中建议永久关闭防火墙,云服务器的话需要保证内网互通)。
  3. 统一所有的密码,不要漏了某个节点没有设置。

6.SpringBoot集成 Redis哨兵

1.配置信息

在这里插入图片描述

server:
  port: 8088

spring:
  datasource:  # 数据源的相关配置
    url: jdbc:mysql://127.0.0.1:3306/smart?characterEncoding=UTF-8&serverTimezone=Asia/Shanghai
    password: 123456
  redis:
    # Redis 单机单实例
 #   database: 0
 #   host: 192.168.92.100
 #   port: 6379
 #   password: 123456
    # Redis 哨兵模式
    database: 1
    password: 123456
    sentinel:
      master: my-master
      nodes: 192.168.92.100:26379,192.168.92.101:26379,192.168.92.102:26379

mybatis:
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

2.测试结果:

在这里插入图片描述

三、Redis 集群模式 (Redis-Cluster)

  前面我们一起学习了主从复制以及哨兵,他们可以提高读的并发,但是单个master容量有限,数据达到一定程度会有瓶颈,这个时候可以通过水平扩展为多master-slave成为集群。
  那么这一节开始我们就一起来学习redis-cluster:他可以支撑多个master-.slave,支持海量数据,实现高可用与高并发。
  哨兵模式其实也是一种集群,他能够提高读请求的并发,但是容错方面可能会有一些问题,比如masterf同步数据给slave的时候,这其实是异步复制吧,这个时候masterf挂了,那么slave.上的数据就没有master新,数据同步需要时i间的,1-2秒的数据会丢失。master恢复并转换成slavel后,新数据则丢失。

特点

  1. 每个节点知道彼此之间的关系,也会知道自己的角色,当然他们也会知道自己存在与一个集群环境中,他们彼此之间可以交互和通信,比如ping pong。那么这些关系都会保存到某个配置文件中,每个节点都有,这个我们在搭建的时候会做配置的。
  2. 客户端要和集群建立连接的话,只需要和其中一个建立关系就行。
  3. 某个节点挂了,也是通过超过半数的节点来进行的检测,客观下线后主从切换,和我们之前在哨兵模式中提到的是一个道理。
  4. Redis中存在很多的插槽,又可以称之为槽节点,用于存储数据,这个先不管,后面再说。

集群容错
  构建Redis集群,需要至少3个节点作为master,以此组成一个高可用的集群,此外每个masteri都需要配备一个slave,所以整个集群需要6个节点,这也是最经典的Redis集群,也可以称之为三主三从,容错性更佳。所以在搭建的时候需要有6台虚拟机。请各自准备6台虚拟机,可以通过克隆去构建,使用单实例的Redis去克隆即可。

  • 集群也可以在单服务器构建,称之为伪集群,但是生产环境肯定是真的,所以建议用6台。
  • 克隆后务必关闭Redis。

在这里插入图片描述

环境准备

这里最好找一个没有配置过的redis,进行重头配置,不要复用前两节的配置文件
Vmware配置完一台后可以进行系统克隆

HOSTNAME IP
103 redis 192.168.92.103
104 redis 192.168.92.104
105 redis 192.168.92.105
106 redis 192.168.92.106
107 redis 192.168.92.107
108 redis 192.168.92.108

在这里插入图片描述

1. 操作我们第一台Cluster服务器 103

  1. 进入redis.conf目录下, 编辑该文件
cd /usr/local/redis/
vim redis.conf 
  1. 修改配置如下:
    在这里插入图片描述
    在这里插入图片描述
#开启集群模式
cluster-enabled yes
#每一个节点需要有一个配置文件,需要6份。每个节点处于集群的角色都需要告知其他所有节点,彼此知道,这个文件用于存储集群模式下的集群状态等信息,这个文件是由ris自己维护,我们不要处理
cluster-config-file nodes-6379.conf
#超时时间,超时则认为master?宕机,随后主备切换
cluster-node-timeout 15000
#开启AOF
appendonly yes
  1. 保存配置文件,重新启动redis,查看服务出现cluster说明配置成功
    /etc/init.d/redis_init_script start
    在这里插入图片描述

2.启动6个redis实例

  1. 启动其他5台台,按上述步骤依次进行
  2. 如果启动过程出错,把rdb等文件删除清空
    cd working/
    rm dump.rdb
  • 这里可以使用xhell多窗口同时操作
    在这里插入图片描述

3. 创建集群

(旧版本redis需要使用redis安装目录下的redis-trib.rb 脚本进行搭建)

1.操作我们的103(主)节点

#####
#集群命令说明
redis-cli --cluster help
#注意1:如果你使用的是redis3.x版本,需要使用redis-trib.rb来构建集群,最新版使用C语言来构建了,这个要注意
#注意2:以下为新版的redis构建方式
#####
#创建集群,主节点和从节点比例为1,1-3为主,4-6为从,1和4,2和5,3和6分别对应为主从关系,这也是最经典用的最多的集群模式
redis-cli --cluster create ip1:port1 ip2:port2 ip3:port3 ip4:port4 ip5:port5 ip6:port6 --cluster-replicas 1


##我的集群供参考---------------------------------------------------------------------------------------
#-a 为当前redis服务密码
redis-cli -a 123456 --cluster create 192.168.92.103:6379 192.168.92.104:6379 192.168.92.105:6379 192.168.92.106:6379 192.168.92.107:6379 192.168.92.108:6379 --cluster-replicas 1

##查看集群信息,任意一个节点都行 a 为当前redis服务密码
redis-cli -a 123456 --cluster 192.168.19.108:6379

在这里插入图片描述
当出现绿色区域部分,说明我们的三主三从搭建完成了。

Sots:槽,用于装数据,主节点有,从节点没有

2.查看集群信息

任意节点执行:
redis-cli -a 123456 --cluster 192.168.19.108:6379
在这里插入图片描述

4.slot槽节点 (遵循一致性hash原则)

slot 槽节点是存在于Redis集群的master节点中的, 而在slave从节点中是没有槽节点的.

  1. slot 槽节点是平均分配在master节点上的
    在这里插入图片描述
  2. slot 槽节点是用来保存数据的
    在这里插入图片描述

查看集群信息
在任意一台集群服务器节点上都可以查看.
redis-cli -c -a xxxx密码 -h 192.168.92.142 -p 6379
cluster info 查看集群配置信息
cluster nodes 查看节点信息
在这里插入图片描述
测试
在这里插入图片描述

5.springboot集成redis集群

1.配置信息

在这里插入图片描述

server:
  port: 8088

spring:
  datasource:                                           # 数据源的相关配置
    url: jdbc:mysql://127.0.0.1:3306/smart?characterEncoding=UTF-8&serverTimezone=Asia/Shanghai
    password: 123456
  redis:
    # Redis 单机单实例
    #database: 0
    #host: 192.168.92.100
    #port: 6379
    #password: 123456

    # Redis 哨兵模式
    #database: 1
    #password: 123456
    #sentinel:
    #  master: my-master
    #  nodes: 192.168.92.100:26379,192.168.92.101:26379,192.168.92.102:26379

    # Redis 集群模式
    password: 123456
    cluster:
      nodes: 192.168.92.103:6379,192.168.92.104:6379,192.168.92.105:6379,192.168.92.106:6379,192.168.92.107:6379,192.168.92.108:6379

mybatis:
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

2.测试结果

在这里插入图片描述
在这里插入图片描述
可以看到bbb没有在104节点,数据存储在了103节点当中

猜你喜欢

转载自blog.csdn.net/qq_38055805/article/details/128581067