Redis从入门到精通(六):Redis高可用原理

本文介绍了Redis的高可用性,包括主从复制、读写分离,详细阐述了主从架构的实践操作。进一步讨论了哨兵系统的工作原理和哨兵在故障转移中的作用,以及如何在SpringBoot中整合Sentinel实现高可用。最后,文章提到了Redis集群的基本概念和数据分片策略。

目录:
Redis从入门到精通(一):缓存
Redis从入门到精通(二):分布式锁以及缓存相关问题
Redis从入门到精通(三):Redis持久化算法以及内存淘汰策略
Redis从入门到精通(四):Redis常用数据结构以及指令
Redis从入门到精通(五):Redis6整合SpringBoot2.x+Mybatis+SpringCache
Redis从入门到精通(六):Redis高可用原理
Redis从入门到精通(七):跳跃表的简介与实现
Redis从入门到精通(八):Redis新特性

高可用

什么是高可用?

我们在第一章就提到了CAP原则,其中的A就是可用性,高可用自然就是high availability.

一般来说,高可用是指某个或者某些节点挂掉后,整个程序依然可以正常运行。也就是我们需要对系统进行集群处理,当然,实现高可用的途径不只是集群,比如这章会提到许多方法共同去保证一个系统的高可用。

Redis高可用

主从复制与读写分离

主从架构是高可用基础,以后的集群也往往是根据主从原理构建的。当然现在提出了无中心节点的架构,其实也是主从原理的延伸。

在这里插入图片描述
看过我之前翻译的谷歌论文:GFS的都清楚,主节点承担主要的写操作,读操作通过负载均衡方法选择主从节点。且从节点定期会复制主节点数据,这样一来,主节点宕机后,从节点依然可以工作。此时从节点可以开启写操作。

当然了,从节点会有很多,并非只有1个,这时候我们就会通过选举机制选择新的主节点。

主从复制方法有两种:

  • 全量复制
    • 在master开启后,会在后台生成rdb文件
    • 从节点连接时,会全量复制rdb文件
    • 从节点读取RDB文件
  • 增量复制
    • 全量复制结束后,主节点收到的数据会以增量的形式发给从节点,以达到同步效果(根据同步策略)。

同步特点:

  1. 非阻塞。同步期间,可以进行新命令的操作
  2. 从节点不主动对数据做删除处理,只有等到主节点key过期后,主节点会发送命令到从节点,从节点删除key
  3. 从节点间也可以收到其他从节点的信息

加速同步:有时候,在磁盘速度比较慢的情况下,我们可以开启配置文件,输入配置:repl-diskless-sync yes,这种方法不会讲RDB文件写入磁盘,而是在内存中直接向网络传送,不会经过磁盘。

加入某个节点挂了重连,之前同步过的数据不用再同步,使用PSYNC命令就可以进行未同步的命令复制。

Redis主从架构实战

  1. 新建目录
    mkdir -p /data/redis/master/data
    mkdir -p /data/redis/slave1/data
    mkdir -p /data/redis/slave2/data
    
  2. 对配置文件进行更改,我们首先修改主节点文件vim /data/redis/master/data/redis.conf
    bind 0.0.0.0
    daemonize yes
    requirepass 123456
    port 9000  #如果是本机部署多redis,必须修改端口号,否则端口只能绑定一个服务
    logfile "/usr/local/redis/log/redis_master.log"
    dbfilename test.rdb	
    dir /usr/local/redis/data
    save 10 1
    rdbcompression yes
    rdbchecksum yes
    appendonly yes
    appendfilename "appendonly_master.aof"
    appendfsync everysec
    no-appendfsync-on-rewrite no	
    auto-aof-rewrite-percentage 100
    auto-aof-rewrite-min-size 64mb
    aof-load-truncated yes
    masterauth 123456
    
    再对从节点配置文件进行修改。
    bind 0.0.0.0
    daemonize yes
    requirepass 123456
    port 9001
    logfile "/usr/local/redis/log/redis_slave1.log"
    dbfilename test.rdb	
    dir /usr/local/redis/data
    save 10 1
    rdbcompression yes
    rdbchecksum yes
    appendonly yes
    appendfilename "appendonly_master.aof"
    appendfsync everysec
    no-appendfsync-on-rewrite no	
    auto-aof-rewrite-percentage 100
    auto-aof-rewrite-min-size 64mb
    aof-load-truncated yes
    masterauth 123456
    replicaof 42.193.119.84 9000 ##主节点的地址和端口
    
    bind 0.0.0.0
    daemonize yes
    requirepass 123456
    port 9002
    logfile "/usr/local/redis/log/redis_slave2.log"
    dbfilename test.rdb	
    dir /usr/local/redis/data
    save 10 1
    rdbcompression yes
    rdbchecksum yes
    appendonly yes
    appendfilename "appendonly_master.aof"
    appendfsync everysec
    no-appendfsync-on-rewrite no	
    auto-aof-rewrite-percentage 100
    auto-aof-rewrite-min-size 64mb
    aof-load-truncated yes
    masterauth 123456
    replicaof 42.193.119.84 9000 ##主节点的地址和端口
    
  3. 开启服务,先主后从。
    cd /usr/local/redis/bin
    ./redis-server /data/redis/master/data/redis.conf
    ./redis-server /data/redis/slave1/data/redis.conf
    ./redis-server /data/redis/slave2/data/redis.conf
    
  4. 分别查看9000、9001、9002端口是否开启服务
    lsof -i:9000
    lsof -i:9001
    lsof -i:9002
    
    在这里插入图片描述在这里插入图片描述
    在这里插入图片描述
    也可以用ps -ef | grep redis查看
    在这里插入图片描述
  5. 进行登录访问redis,略。
  6. 查看信息info Replication
    在这里插入图片描述
  7. 测试。首先在主节点进行set操作
    在这里插入图片描述
    然后在从节点进行get
    在这里插入图片描述
    在从节点set操作
    在这里插入图片描述

Redis哨兵

我们在上一节配置成功了主从,但是当某一个节点挂掉后,需要我们人工设置新的主节点。假如夜里3点挂了,还要把程序猿叫起来改bug,程序猿是很懒的,就想出了办法,利用哨兵机制自动选举新的主节点。

实际上这些玩意都是人家google在2003年GFS里玩剩下的,别的技术拿来再用,计算机就是老一套,相互抄袭。在计算机某一领域有稍微的了解后,就会发现其他领域用的也是一样的内容。接下来我们详细谈谈哨兵机制。

哨兵工作原理

Redis利用一个独立的进程,去探测各个节点是否有响应。当然是通过网络传输的,既然是网络,就可能有一定的误判性,以后再说。在Redis里,这玩意叫做哨兵(Sentinel),在SpringCloud或者是GFS里,它叫做心跳机制。

当哨兵检测到主节点挂掉,会自动选举出新的主节点,并修改各个从节点的配置文件。

哨兵任务:

  • 监控状态(monitoring),心跳机制,PING
  • 汇报(Notification),告诉维护人员工作状态是否正常
  • 故障转移(Automatic Failover),选举新的主服务器,更改配置文件。

通常情况下,哨兵也是集群部署,并且相互检测。

多哨兵下线模式:

  • 主观下线(subjectively down,SDOWN)
    • 单个哨兵对服务器下线进行判断
    • 当服务器没有回应,哨兵会判断其下线
  • 客观下线(objectively down, ODOWN)
    • 多个哨兵进行交流判断
    • 当某一个哨兵发现一个服务断掉,会向其他哨兵询问,当得到的结果是都认为其下线,则客观下线形成
    • 一般指针对于主服务器
  • 仲裁
    • 一定数量的哨兵认为某个服务下线,即判断服务下线。数量一般取哨兵数量的一半+1。 n u m b e r = N s e n t i n e l 2 + 1 number = \frac{N_{sentinel}}{2}+1 number=2Nsentinel+1
    • 主节点下线后,进行选举得到新的主节点

你看,即使是高可用,他也是会短暂丢失数据的。

哨兵实战

  1. 新增文件touch /var/log/redis/sentinel_26379.log touch /var/log/redis/sentinel_26380.log touch /var/log/redis/sentinel_26381.log没有文件夹先创建文件夹。

  2. 新增配置文件:
    在这里插入图片描述

    port 26379
    bind 0.0.0.0
    daemonize yes
    pidfile "/var/run/redis-sentinel-1.pid"
    logfile "/var/log/redis/sentinel_26379.log"
    dir "/tmp"
    
    sentinel monitor mymaster 42.193.119.84 9000 2 #最后的2是指宕机时多少哨兵判断成立
    sentinel down-after-milliseconds mymaster 5000
    sentinel auth-pass mymaster 123456
    sentinel failover-timeout mymaster 30000
    
    port 26380
    bind 0.0.0.0
    daemonize yes
    pidfile "/var/run/redis-sentinel-2.pid"
    logfile "/var/log/redis/sentinel_26380.log"
    dir "/tmp"
    
    sentinel monitor mymaster 42.193.119.84 9000 2
    sentinel down-after-milliseconds mymaster 5000
    sentinel auth-pass mymaster 123456
    sentinel failover-timeout mymaster 30000
    
    port 26381
    bind 0.0.0.0
    daemonize yes
    pidfile "/var/run/redis-sentinel-3.pid"
    logfile "/var/log/redis/sentinel_26381.log"
    dir "/tmp"
    
    sentinel monitor mymaster 42.193.119.84 9000 2
    sentinel down-after-milliseconds mymaster 5000
    sentinel auth-pass mymaster 123456
    sentinel failover-timeout mymaster 30000
    
  3. 启动sentinel
    ./redis-server ../conf/sentinel-1.conf
    ./redis-server ../conf/sentinel-2.conf
    ./redis-server ../conf/sentinel-3.conf

  4. 登录sentinel
    在这里插入图片描述

  5. 模拟宕机并查看日志
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

  6. 重启原主节点
    在这里插入图片描述

Springboot整合Sentinel

这个很简单,就是在配置文件中添加:
在这里插入图片描述

Redis集群

什么是集群?

集群就是许多相同服务的节点通过高速网络集合在一起。

Redis集群可以解决单机Redis容量有限,或者单服务挂机问题。

Cluster数据分片与Hash槽

分区算法:

  • Hash取模:对数据进行Hashcode计算,取模后得到的就是该key的分区
  • 范围分片:确定key是否在某个范围来确定分区
  • 一致性Hash分区(略复杂,暂时不涉及)
  • 数据分片的hash槽(Redis用此方法)

Hash槽slot:

  • Redis集群预先分配好16384个桶,当新的key来临时,计算 C R C 16 ( k e y ) m o d 16384 CRC16(key)mod16384 CRC16(key)mod16384的值来判断新的key在哪个桶内。
  • 从节点无槽位,只有主节点有槽位。
  • 用户根据集群数量分配每个节点有多少桶,加入有3个节点,那么每个节点的槽位若以平分的方式计算,为0-5460, 5461-10922,10923-16384分别存储在节点一,节点二,节点三中。
  • 当加入新的节点,只需要重新分配槽即可。

集群原理以及搭建

一个集群一般是指多个节点,每个节点有一个主节点和一个或多个从节点。

在这里插入图片描述
首先,我们需要修改配置:
对于节点一:

bind 0.0.0.0
port 6381 #
daemonize yes
requirepass 123456
logfile "/usr/local/redis/log/redis-cluster-1.log"
dbfilename "redis_test.rdb"
dir "/usr/local/redis/data"
appendonly yes
appendfilename "appendonly1.aof"
masterauth 123456

cluster-enabled yes
cluster-config-file nodes-6381.conf
cluster-node-timeout 20000
cluster-announce-ip 42.193.119.84
cluster-announce-port 6381
cluster-announce-bus-port 16381

对于节点二:

bind 0.0.0.0
port 6382 
daemonize yes
requirepass 123456
logfile "/usr/local/redis/log/redis-cluster-2.log"
dbfilename "redis_test2.rdb"
dir "/usr/local/redis/data"
appendonly yes
appendfilename "appendonly2.aof"
masterauth 123456

cluster-enabled yes
cluster-config-file nodes-6382.conf
cluster-node-timeout 20000
cluster-announce-ip 42.193.119.84
cluster-announce-port 6382
cluster-announce-bus-port 16382

以此类推。

清除之前的日志文件和RDB文件,否则会创建文件失败。

然后启动各个配置文件:

./redis-server ../conf/cluster/cluster-1.conf
./redis-server ../conf/cluster/cluster-2.conf
./redis-server ../conf/cluster/cluster-3.conf
./redis-server ../conf/cluster/cluster-4.conf
./redis-server ../conf/cluster/cluster-5.conf
./redis-server ../conf/cluster/cluster-6.conf

在这里插入图片描述
当前只是启动了节点,还未加入集群。

./redis-cli -a 123456 --cluster create 42.193.119.84:6381 42.193.119.84:6382 42.193.119.84:6383 42.193.119.84:6384 42.193.119.84:6385 42.193.119.84:6386 --cluster-replicas 1

其中,最后一个参数是指主从以 1 : 1 1:1 1:1的方式建立集群。
在这里插入图片描述
划线部分是指槽位的分配。

在这里插入图片描述

我们登录进去,查看一些信息:

./redis-cli -c -a 123456 -p 6381
cluster info
cluster nodes

在这里插入图片描述
在这里插入图片描述
他会重新定向,根据我们前文讲的方法。

整合Springboot

配置文件修改成这样就可以了。

Redis入门高可用 分布式实战教程,共140多节课程、 掌握redis主从、哨兵、集群 ,参数调优 目录: 9-9 原生安装-1.准备节点.mp4 9-8 原生安装.mp4 9-7 基本架构.mp4 9-6 虚拟槽哈希分布.mp4 9-5 一致性哈希分区.mp4 9-4 节点取余分区.mp4 9-3 数据分布概论.mp4 9-2 呼唤集群.mp4 9-16 原生命令和redis-trib.rb对比.mp4 9-14 ruby环境准备-操作.mp4 9-13 ruby环境准备-说明.mp4 9-12 原生安装-4.分配主从.mp4 9-10 原生安装-2.节点握手.mp4 9-1 本章目录.mp4 8-9 实现原理-1-故障转移演练.mp4 8-8 python客户端.mp4 8-7 java客户端.mp4 8-6 redis sentinel安装演示-2.mp4 8-5 redis sentinel安装演示-1.mp4 8-4 redis sentinel安装与配置.mp4 8-3 redis sentinel架构.mp4 8-2 主从复制高可用?.mp4 8-19 本章总结.mp4 8-18 高可用读写分离.mp4 8-17 节点运维.mp4 8-16 常见开发运维问题-目录.mp4 8-15 故障转移.mp4 8-14 领导者选举.mp4 8-13 主观下线和客观下线.mp4 8-12 三个定时任务.mp4 8-11 实现原理-3.故障演练(日志分析).mp4 8-10 实现原理-2.故障转移演练(客户端).mp4 8-1 sentinel-目录.mp4 7-9 主从复制常见问题.mp4 7-8 故障处理.mp4 7-7 全量复制开销 + 部分复制.mp4 7-6 全量复制.mp4 7-5 runid和复制偏移量.mp4 7-4 主从复制配置-操作.mp4 7-3 主从复制配置-介绍.mp4 7-2 什么是主从复制.mp4 7-1 目录.mp4 6-4 AOF阻塞.mp4 6-3 子进程开销和优化.mp4 6-2 fork.mp4 6-1 常见问题目录.mp4 5-9 RDB和AOF抉择.mp4 5-8 AOF实验.mp4 5-7 AOF(2).mp4 5-6 AOF(1).mp4 5-5 RDB(3).mp4 5-4 RDB(2).mp4 5-3 RDB(1).mp4 5-2 持久化的作用.mp4 5-1 目录.mp4 4-7 geo.mp4 4-6 hyperloglog.mp4 4-5 bitmap.mp4 4-4 发布订阅.mp4 4-3 pipeline.mp4 4-2 慢查询.mp4 4-1 课程目录.mp4 3-4 Go客户端:redigo简介.mp4 3-3 Python客户端:redis-py.mp4 3-2 Java客户端:Jedis.mp4 3-1 课程目录.mp4 2-9 list(2).mp4 2-8 list(1).mp4 2-7 hash (2).mp4 2-6 hash (1).mp4 2-5 字符串.mp4 2-4 单线程.mp4 2-3 数据结构和内部编码.mp4 2-2通用命令.mp4 2-11 zset.mp4 2-10 set.mp4 13-1 _课程总结.mp4 12-7 运维功能.mp4 12-6 用户功能.mp4 12-5 应用接入.mp4 12-4 机器部署.mp4 12-3 _快速构建.mp4 12-2 _Redis规模化困扰.mp4 12-1 _目录.mp4 11-8 本章总结.mp4 11-7 热点key的重建优化.mp4 11-6 无底洞问题.mp4 11-5 缓存穿透问题.mp4 11-4 缓存粒度问题.mp4 11-3 缓存的更新策略.mp4 11-2 缓存的受益和成本.mp4 11-1 目录.mp4 10-9 集群缩容-操作.mp4 10-8 集群缩容-说明.mp4 10-7 集群扩容演示-2.mp4 10-6 集群扩容演示-1.mp4 10-5 扩展集群-3.迁移槽和数据.mp4 10-4 扩展集群-2.加入集群.mp4 10-35 本章总结.mp4 10-34 集群vs单机.mp4 10-33 数据迁移.mp4 10-32 读写分离.mp4 10-31 请求倾斜.mp4 10-30 数据倾斜.mp4 10-3 扩展集群-1.加入节点.mp4 10-29 集群倾斜-目录.mp4 10-28 PubSub广播.mp4 10-27 带宽消耗.mp4 10-26 集群完整性.mp4 10-25 Redis Cluster常见开发运维问题-目录.mp4 10-24 故障模拟.mp4 10-23 故障恢复.mp4 10-22 故障发现.mp4 10-21 故障转移-目录.mp4 10-20 批量操作优化.mp4 10-2 集群伸缩原理.mp4 10-19 多节点操作命令.mp4 10-18 整合spring-2.mp4 10-17 整合spring-1.mp4 10-16 JedisCluster基本使用.mp4 10-15 smart客户端JedisCluster-目录.mp4 10-14 JedisCluster执行源码分析.mp4 10-13 smart客户端实现原理.mp4 10-12 ask重定向.mp4 10-11 moved异常说明和操作.mp4 10-10 客户端路由-目录.mp4 10-1 集群伸缩目录.mp4 1-9 特性5-功能丰富.mp4 1-8 特性4-多语言客户端.mp4 1-7 特性3-数据结构.mp4 1-6 特性2-持久化.mp4 1-5 特性1-速度快.mp4 1-4 redis特性目录.mp4 1-3 谁在使用Redis.mp4 1-2 Redis初识.mp4 1-15 redis常用配置.mp4 1-14 redis三种启动方式介绍.mp4 1-13 redis典型使用场景.mp4 1-12 特性8-高可用分布式.mp4 1-11 特性7-复制.mp4 1-10 特性6-简单.mp4 1-1 导学.mp4
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值