从零开始学Redis之半步神游(上)

本文涉及的产品
云数据库 Tair(兼容Redis),内存型 2GB
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
注册配置 MSE Nacos/ZooKeeper,118元/月
简介: 前言文本已收录至我的GitHub仓库,欢迎Star:github.com/bin39232820…种一棵树最好的时间是十年前,其次是现在

前言


文本已收录至我的GitHub仓库,欢迎Star:github.com/bin39232820…

种一棵树最好的时间是十年前,其次是现在


絮叨


半步神游,神游之下,天下无敌。一梦一游 便是天下。

Redis前面几篇的文章链接:

🔥从零开始学Redis之金刚凡境

🔥从零开始学Redis之自在地境

🔥从零开始学Redis之逍遥天境

上一篇的逍遥天境 讲的是Redis的内存淘汰策略 和持久化方式。那这半步神游就是带你们遨游Redis的主从HA,哨兵,和Lua脚本

Redis主从和哨兵模式


Redis 主从搭建(有兴趣的小伙伴自己用虚拟机搭一个玩玩)

1、环境说明

主机名称 IP地址 redis版本和角色说明
redis-master 192.168.56.11 redis 5.0.3(主)
redis-slave01 192.168.56.12 redis 5.0.3(从)
redis-slave02 192.168.56.13 redis 5.0.3(从)

2、修改主从的redis配置文件

[root@redis-master ~]# grep -Ev "^$|#" /usr/local/redis/redis.conf 
bind 192.168.56.11
protected-mode yes
port 6379
daemonize yes
pidfile /var/run/redis_6379.pid
logfile "/var/log/redis.log"
dir /var/redis/
[root@redis-slave01 ~]# grep -Ev "^$|#" /usr/local/redis/redis.conf
bind 192.168.56.12
protected-mode yes
port 6379
daemonize yes
pidfile /var/run/redis_6379.pid
logfile "/var/log/redis.log"
dir /var/redis/
replicaof 192.168.56.11 6379    #配置为master的从,如果master上有密码配置,还需要增加下面一项密码配置
masterauth 123456   #配置主的密码
[root@redis-slave02 ~]# grep -Ev "^$|#" /usr/local/redis/redis.conf
bind 192.168.56.13
protected-mode yes
port 6379
daemonize yes
pidfile /var/run/redis_6379.pid
logfile "/var/log/redis.log"
dir /var/redis/
replicaof 192.168.56.11 6379    #配置为master的从
masterauth 123456   #配置主的密码
复制代码


3、启动主从redis

这里需要注意的是:redis主从和mysql主从不一样,redis主从不用事先同步数据,它会自动同步过去

[root@redis-master ~]# systemctl start redis
[root@redis-slave01 ~]# systemctl start redis
[root@redis-slave02 ~]# systemctl start redis
[root@redis-master ~]# netstat -tulnp |grep redis
tcp        0      0 192.168.56.11:6379      0.0.0.0:*               LISTEN      1295/redis-server 1 
[root@redis-slave01 ~]# netstat -tulnp |grep redis
tcp        0      0 192.168.56.12:6379      0.0.0.0:*               LISTEN      1625/redis-server 1 
[root@redis-slave02 ~]# netstat -tulnp |grep redis
tcp        0      0 192.168.56.13:6379      0.0.0.0:*               LISTEN      1628/redis-server 1 
复制代码


4、数据同步验证

[root@redis-master ~]# redis-cli -h 192.168.56.11   #主上写入数据
192.168.56.11:6379> KEYS *
(empty list or set)
192.168.56.11:6379> set k1 123
OK
192.168.56.11:6379> set k2 456
OK
[root@redis-slave01 ~]# redis-cli -h 192.168.56.12  #slave01上查看是否数据同步
192.168.56.12:6379> KEYS *
1) "k2"
2) "k1"
192.168.56.12:6379> get k1
"123"
192.168.56.12:6379> get k2
"456"
[root@redis-slave02 ~]# redis-cli -h 192.168.56.13  #slave02上查看是否数据同步
192.168.56.13:6379> KEYS *
1) "k2"
2) "k1"
192.168.56.13:6379> get k1
"123"
192.168.56.13:6379> get k2
"456"
复制代码


主从架构


主从架构的特点

  • 主服务器负责接收写请求
  • 从服务器负责接收读请求
  • 从服务器的数据由主服务器复制过去。主从服务器的数据是一致的

主从架构的好处

  • 读写分离(主服务器负责写,从服务器负责读)
  • 高可用(某一台从服务器挂了,其他从服务器还能继续接收请求,不影响服务)
  • 处理更多的并发量(每台从服务器都可以接收读请求,读QPS就上去了)

主从同步

主从架构的特点之一:主服务器和从服务器的数据是一致的。

主从同步的2种情况

  • 同步(sync)
  • 将从服务器的数据库状态更新至主服务器的数据库状态
  • 命令传播(command propagate)
  • 主服务器的数据库状态被修改,导致主从服务器的数据库状态不一致,让主从服务器的数据库状态重新回到一致状态。

完整的同步

  • 从服务器向主服务器发送PSYNC命令
  • 收到PSYNC命令的主服务器执行BGSAVE命令,在后台生成一个RDB文件。并用一个缓冲区来记录从现在开始执行的所有写命令。
  • 当主服务器的BGSAVE命令执行完后,将生成的RDB文件发送给从服务器,从服务器接收和载入RBD文件。将自己的数据库状态更新至与主服务器执行BGSAVE命令时的状态。
  • 主服务器将所有缓冲区的写命令发送给从服务器,从服务器执行这些写命令,达到数据最终一致性。

部分重同步

  • 主从服务器的复制偏移量 主服务器每次传播N个字节,就将自己的复制偏移量加上N
  • 从服务器每次收到主服务器的N个字节,就将自己的复制偏移量加上N
  • 通过对比主从复制的偏移量,就很容易知道主从服务器的数据是否处于一致性的状态!


Redis HA 方案


HA(High Available,高可用性群集)机集群系统简称,是保证业务连续性的有效解决方案,一般有两个或两个以上的节点,且分为活动节点及备用节点。通常把正在执 行业务的称为活动节点,而作为活动节点的一个备份的则称为备用节点。当活动节点出现问题,导致正在运行的业务(任务)不能正常运行时,备用节点此时就会侦测到,并立即接续活动节点来执行业务。从而实现业务的不中断或短暂中断。

Redis 一般以主/从方式部署(这里讨论的应用从实例主要用于备份,主实例提供读写)该方式要实现 HA 主要有如下几种方案:

  • keepalived: 通过 keepalived 的虚拟 IP,提供主从的统一访问,在主出现问题时, 通过 keepalived 运行脚本将从提升为主,待主恢复后先同步后自动变为主,该方案的好处是主从切换后,应用程序不需要知道(因为访问的虚拟 IP 不变),坏处是引入 keepalived 增加部署复杂性,在有些情况下会导致数据丢失
  • zookeeper: 通过 zookeeper 来监控主从实例, 维护最新有效的 IP, 应用通过 zookeeper 取得 IP,对 Redis 进行访问,该方案需要编写大量的监控代码
  • sentinel: 通过 Sentinel 监控主从实例,自动进行故障恢复,该方案有个缺陷:因为主从实例地址( IP & PORT )是不同的,当故障发生进行主从切换后,应用程序无法知道新地址,故在 Jedis2.2.2 中新增了对 Sentinel 的支持,应用通过 redis.clients.jedis.JedisSentinelPool.getResource() 取得的 Jedis 实例会及时更新到新的主实例地址


Redis Sentinel


Redis Sentinel是官方推荐的高可用性解决方案。Sentinel是一个管理多个Redis实例的工具,它可以实现对Redis的监控、通知、自动故障转移。

Sentinel的主要功能包括主节点存活检测、主从运行情况检测、自动故障转移(failover)、主从切换。Redis的Sentinel最小配置是一主一从。 Redis的Sentinel系统可以用来管理多个Redis服务器,该系统可以执行以下四个任务:

  • 监控: Sentinel会不断的检查主服务器和从服务器是否正常运行。
  • 通知: 当被监控的某个Redis服务器出现问题,Sentinel通过API脚本向管理员或者其他的应用程序发送通知。
  • 自动故障转移: 当主节点不能正常工作时,Sentinel会开始一次自动的故障转移操作,它会将与失效主节点是主从关系的其中一个从节点升级为新的主节点, 并且将其他的从节点指向新的主节点。
  • 配置提供者: 在Redis Sentinel模式下,客户端应用在初始化时连接的是Sentinel节点集合,从中获取主节点的信息。


Redis Sentinel的工作流程


如图所示:由一个或多个Sentinel实例组成的Sentinel系统可以监视任意多个主服务器,以及所有从服务器,并在被监视的主服务器进入下线状态时,自动将下线主服务器属下的某个从服务器升级为新的主服务器,然后由新的主服务器代替已下线的主服务器继续处理命令请求

Sentinel负责监控集群中的所有主、从Redis,当发现主故障时,Sentinel会在所有的从中选一个成为新的主。并且会把其余的从变为新主的从。同时那台有问题的旧主也会变为新主的从,也就是说当旧的主即使恢复时,并不会恢复原来的主身份,而是作为新主的一个从。

在Redis高可用架构中,Sentinel往往不是只有一个,而是有3个或者以上。目的是为了让其更加可靠,毕竟主和从切换角色这个过程还是蛮复杂的。这个是所有分布式系统都要碰到的问题一个是崩溃恢复 一个是数据同步 下面我们就来聊聊


Redis HA方案的 崩溃恢复 和数据同步


崩溃恢复

这个是所有分布式系统的问题 什么就是崩溃恢复呢 就我们目前的方案来说 我们是用sentinel 来保证redis的高可用 同时 sentinel 本身自己也做了HA 假设一主俩从的情况下 如果主节点挂了 怎么办,这就能造成单点故障 让整个redis 集群不可用,所以 崩溃恢复就是类似于一个Zookeeper的ZAB 算法 从其他节点中选举一个主节点,具体怎么选举一个新的主节点,这边就不扩展了,再说下去,这篇就扯不完了。

数据同步

redis的主从复制

>依赖于redis依赖于RDB模式下的持久化存储;采用复制RDB文件的形式进行主从节点之间的数据同步     
>注意:  主从复制时不要开启AOF持久化模式,因为AOF优先级高于RDB模式   
复制代码


RDB文件两种传输方法

1.普通复制    
复制代码


将主节点已经到磁盘上的的ROB文件,复制到从节点上

2.无盘复制

master端直接将RDB file传到slave socket,不需要与disk进行交互

无磁盘diskless方式适合磁盘读写速度慢但网络带宽非常高的环境

相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore     ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
4月前
|
存储 NoSQL Redis
redis入门学习
redis入门学习
53 0
|
4月前
|
NoSQL 网络安全 Redis
Redis进阶-Redis使用建议一二事
Redis进阶-Redis使用建议一二事
30 0
|
存储 缓存 监控
redis入门笔记 3
redis入门笔记
145 0
redis入门笔记 3
|
存储 NoSQL Java
redis入门笔记 1
redis入门笔记
128 0
|
存储 NoSQL 算法
redis入门笔记 2
redis入门笔记
131 0
|
SQL 缓存 NoSQL
Redis学习记录
Redis学习记录
89 0
|
存储 JSON NoSQL
Redis 入门教程
Redis 入门教程
158 1
Redis 入门教程
|
存储 canal 缓存
从零开始学Redis之神游玄境
前言 文本已收录至我的GitHub仓库,欢迎Star:github.com/bin39232820… 种一棵树最好的时间是十年前,其次是现在
196 0
|
存储 监控 NoSQL
从零开始学Redis之逍遥天境
前言 文本已收录至我的GitHub仓库,欢迎Star:github.com/bin39232820… 种一棵树最好的时间是十年前,其次是现在
194 0
|
NoSQL Redis
从零开始学Redis之分布式锁
前言 文本已收录至我的GitHub仓库,欢迎Star:github.com/bin39232820… 种一棵树最好的时间是十年前,其次是现在
133 0