Redis搭建一主二从三哨兵实现服务高可用

一、准备环境

node1 192.168.0.114(2核4G)
node2 192.168.0.115(2核4G)
node3 192.168.0.116(2核4G)
Redis 6.2.6

二、配置一主二从 (配置文件)

redis.conf (master)

bind 0.0.0.0
port 6379
daemonize yes
​
requirepass "123456"
​
logfile "/usr/local/redis/log/redis.log"
dbfilename "test.rdb"
dir "/usr/local/redis/data"
appendonly yes
appendfilename "appendonly.aof"
masterauth "123456"

redis.conf (slave)

bind 0.0.0.0
port 6379
daemonize yes
requirepass "123456"
logfile "/usr/local/redis/log/redis.log"
dbfilename "test.rdb"
dir "/usr/local/redis/data"
appendonly yes
appendfilename "appendonly.aof"
replicaof  192.168.0.114 6379
masterauth "123456"

记得关闭防火墙。云服务器需要开放对应的安全组端口

主从复制分两种(主从刚连接的时候,进行全量同步;全同步结束后,进行增量同步)

2.1 全量复制

master服务器会开启一个后台进程用于将redis中的数据生成一个rdb文件
主服务器会缓存所有接收到的来自客户端的写命令,当后台保存进程 处理完毕后,会将该rdb文件传递给slave服务器
slave服务器会将rdb文件保存在磁盘并通过读取该文件将数据加载到内存
在此之后master服务器会将在此期间缓存的命令通过redis传输协议发送给slave服务器
然后slave服务器将这些命令依次作用于自己本地的数据集上最终达到数据的一致性

2.2 增量复制

Slave初始化后开始正常工作时主服务器发生的写操作同步到从服务器的过程
服务器每执行一个写命令就会向从服务器发送相同的写命令,从服务器接收并执行收到的写命令

特点

主从复制对于 主/从 redis服务器来说是非阻塞的,所以同步期间都可以正常处理外界请求

一个主redis可以含有多个从redis,每个从redis可以接收来自其他从redis服务器的连接

从节点不会让key过期,而是主节点的key过期删除后,成为del命令传输到从节点进行删除

从节点开启 sync 看日志

2.3 加速复制

完全重新同步需要在磁盘上创建一个RDB文件,然后加载这个文件以便为从服务器发送数据
在比较低速的磁盘,这种操作会给主服务器带来较大的压力
新版支持无磁盘的复制,子进程直接将RDB通过网络发送给从服务器,不使用磁盘作为中间存储
repl-diskless-sync yes (默认是no)

2.4 主从断开重连

如果遭遇连接断开,重新连接之后可以从中断处继续进行复制,而不必重新同步
2.8版本后 部分重新同步这个新特性内部使用PSYNC命令,旧的实现中使用SYNC命令

三、 添加哨兵节点

背景

前面搭建了主从,当主服务器宕机后,需要手动把一台从服务器切换为主服务器,人工干预费事费力,还会造成一段时间内服务不可用

哨兵模式介绍

Redis提供了哨兵的命令,是一个独立的进程
原理 哨兵通过发送命令给多个节点,等待Redis服务器响应,从而监控运行的多个Redis实例的运行情况
当哨兵监测到master宕机,会自动将slave切换成master,通过通知其他的从服务器,修改配置文件切换主机
Sentinel三大工作任务

监控(Monitoring)

Sentinel 会不断地检查你的主服务器和从服务器是否运作正常

提醒(Notification)

当被监控的某个 Redis 服务器出现问题时, Sentinel 可以通过 API 向管理员或者其他应用程序发送通知

自动故障迁移(Automatic failover)

当一个主服务器不能正常工作时, Sentinel 会开始一次自动故障迁移操作, 它会将失效主服务器的其中一个从服务器升级为新的主服务器, 并让失效主服务器的其他从服务器改为复制新的主服务器
当客户端试图连接失效的主服务器时, 集群也会向客户端返回新主服务器的地址, 使得集群可以使用新主服务器代替失效服务器

问题

一个哨兵进程对Redis服务器进行监控,可能会出现问题
一般是使用多个哨兵进行监控,各个哨兵之间还会进行监控,形成多哨兵模式

多哨兵模式下线名称介绍

主观下线(Subjectively Down, 简称 SDOWN)

是单个 Sentinel 实例对服务器做出的下线判断,比如网络问题接收不到通知等
一个服务器没有在 down-after-milliseconds 选项所指定的时间内, 对向它发送 PING 命令的 Sentinel 返回一个有效回复(valid reply), 那么 Sentinel 就会将这个服务器标记为主观下线

客观下线(Objectively Down, 简称 ODOWN)

指的是多个 Sentinel 实例在对同一个服务器做出 SDOWN 判断, 并且通过 SENTINEL is-master-down-by-addr 命令互相交流之后, 得出的服务器下线判断
一个 Sentinel 可以通过向另一个 Sentinel 发送 SENTINEL is-master-down-by-addr 命令来询问对方是否认为给定的服务器已下线
客观下线条件只适用于主服务器

仲裁 qurum

  • Sentinel 在给定的时间范围内, 从其他 Sentinel 那里接收到了【足够数量】的主服务器下线报告, 那么 Sentinel 就会将主服务器的状态从主观下线改变为客观下线
  • 这个【足够数量】就是配置文件里面的值,一般是Sentinel个数的一半加1,比如3个Sentinel则就设置为2
  • down-after-milliseconds 是一个哨兵在超过规定时间依旧没有得到响应后,会自己认为主机不可用
    当拥有认为主观下线的哨兵达到sentinel monitor所配置的数量时,就会发起一次投票,进行failover

环境准备

配置3个哨兵,每个哨兵的配置都是一样的
启动顺序 先启动主再启动从,最后启动3个哨兵
哨兵端口是 【26379】记得开放
sentinel.conf

#不限制ip
bind 0.0.0.0
​
# 让sentinel服务后台运行
daemonize yes
​
# 配置监听的主服务器,mymaster代表服务器的名称,自定义,192.168.0.114 代表监控的主服务器,6379代表端口,
#2代表只有两个或两个以上的哨兵认为主服务器不可用的时候,才会进行failover操作。
sentinel monitor mymaster 192.168.0.114 6379 2
​
# sentinel auth-pass定义服务的密码,mymaster是服务名称,123456是Redis服务器密码
sentinel auth-pass mymaster 123456
​
#超过5秒master还没有连接上,则认为master已经停止
sentinel down-after-milliseconds mymaster 5000
​
#如果该时间内没完成failover操作,则认为本次failover失败
sentinel failover-timeout mymaster 30000

记得创建 /var/log/redis 文件夹

启动哨兵节点 (在三台机器挨个执行)
./redis-server /usr/local/redis/conf/sentinel.conf --sentinel

一主二从三哨兵的优缺点

优点

主从可以自动切换,可用性更高

缺点

主从切换会丢失短暂数据
主节点的写能力和存储能力受限

四、SpringBoot整合Redis主从+Sentinel哨兵

spring:
  cache:
    type: redis
  redis:
    password: 123456
    client-type: lettuce
    lettuce:
      pool:
        max-active: 10
        max-idle: 10
        min-idle: 0
        max-wait: -1ms
    sentinel:
    ## 这里的master就是哨兵节点配置文件监控服务名称
      master: mymaster
      nodes: 192.168.0.114:26379,192.168.0.115:26379,192.168.0.116:26379

おすすめ

転載: blog.csdn.net/luomo0203/article/details/120957150