Redis集成高可用

单节点下的Redis隐患

一、单节点的情况下,由于Redis是基于内存进行数据存储在业务量大数据量多的情况下内存开销大,成本高。
二、如果redis故障宕机后,所有的请求击穿到服务器,有可能会导致数据库压力过大
三、在单节点的情况下,如果每秒钟有10w个请求到redis中,那么会造成redis的压力过大

上述的每一种情况都是项目中不可容忍的现象,所以基于种种问题,我们需要引入redis的主从复制、读写分离的机制。

主从复制

一、Redis的主从复制运行依靠三个主要的机制

1.当一个master实例和一个slave实例连接正常时,master会发送一连串的命令流来保持对slave的更新
  以便于将自身数据集的改变复制给slave
  
2.当master和slave之间的连接断开之后,因为网络问题、或者是主从意识到连接超时,salve重新连接上
  master并会尝试进行部分重同步:意味着它会尝试只获取在断开连接期间内丢失的命令流
  
3.当无法进行部分重同步时,slave会请求全量重同步.master会创建所有数据的快照,将之发送给slave
之后再数据集更改时发送命令流到slave,之后在数据集更改时持续发送命令流到slave

二、主从复制原理图

在这里插入图片描述

三、主从复制是如何工作的

1.每个 Redis 的master都有一只replication ID:这是一个较大的伪字符串,标记了一个给定的数据集
  每个master也持有一个偏移量,我们默认可以打开rdb文件中找到

在这里插入图片描述

2.master将自己产生的复制流发送给slave时,发送多少个字节的数据,自身的偏移量就会增加多少
  这么做的目的是当有新的操作修改自己的数据集时,它可以根据偏移量来更新salve的状态
  复制的偏移量即使没有一个slave连接到mster时,也会自增

3.当从服务器连接到主服务器时,会使用PSYNC命令告诉主服务器他们记录就得master replication ID以及至今
  为止的偏移量。通过这种方式,master能够仅发送slave所需的增量部分。但是如果master中没有足够的命令积
  压缓冲记录,或者如果slave引用了不再知道的历史记录(replication ID),则会转而进行一个全量重同步

4.重同步的工作细节:
	4.1 master 开启一个后台进程,产生一个RDB文件,并缓冲所有从此刻开始客户端接收到的新的写入命令
	4.2 master 将数据集文件传输给slave并保存在磁盘上,加载文件到内存
	3.4 master 发送所有缓冲的命令发给slave,以保持数据的一致性

在这里插入图片描述

四、复制工作流程图

案例:
	在某个时间点的时候,slave1、slave2都与master断开了连接,并且存储的数据不一致。
	此时slave1和slave2恢复了连接到mstaer时

	此时master的偏移量是在k2与k3之间。slave1连接到mster时,使用PSYN告诉master它们记得的
	replication ID 和偏移量(图一)。master则会只发送只需要的偏移量部分数据(图二)

在这里插入图片描述

在这里插入图片描述

五、Redis实现主从复制

在这里插入图片描述

1.根据部署环境安装好redis集群环境
[参考文献:Redis从零到进阶知识总结]     
(https://blog.csdn.net/weixin_35570213/article/details/115370442)

2.从机配置文件
[root@VM-0-2-centos conf]# vi ./redis.conf

bind 127.0.0.1 本机eth0的ip // 配置监听的网卡

replicaof 主机ip 端口号 

masterauth "主机redis的密码"

3.退出并保存
:wq

4.注意:多台服务器集群的端口号防火墙一定要放行!

5.启动一主二从并查看主机情况
127.0.0.1:6321> info

在这里插入图片描述
可以看到,当前主机下有两台备机正在连接。主从复制完成!

六、Sentinel实现Redis故障转移

监控(Monitoring): Sentinel 会不断地检查你的主服务器和从服务器是否运作正常。
提醒(Notification): 当被监控的某个 Redis 服务器出现问题时。Sentinel 可以通过 API 向管理员或者其他应用程序发送通知。
自动故障迁移(Automatic failover): 当一个主服务器不能正常工作时, Sentinel 会开始一次自动故障迁移操作, 它会将失效主服务器的其中一个从服务器升级为新的主服务器, 并让失效主服务器的其他从服务器改为复制新的主服务器; 当客户端试图连接失效的主服务器时, 集群也会向客户端返回新主服务器的地址, 使得集群可以使用新主服务器代替失效服务器。

1.集成步骤

1.编写 sentinel.conf 配置文件
在redis的安装目录中我们会找到sentinel.conf的示例配置文件,我们按照示例配置文件自己写一份

# 配置sentinel暴露的ip与端口,如果不设置,多台服务器的sentinel将无法进行通讯
sentinel announce-ip 本机ip
sentinel announce-port sentinel端口号

# sentinel 端口号
port sentinel端口号

# 监听的主机  
# 将这个主服务器判断为失效至少需要 2 个 Sentinel 同意 
#(只要同意 Sentinel 的数量不达标,自动故障迁移就不会执行)
sentinel monitor 主机名称 主机ip 主机端口 2
daemonize yes

# 主机的redis授权密码
sentinel auth-pass mastername password

2.创建三个哨兵并启动
redis-server /opt/redis/6327/conf/sentinel.conf --sentinel
redis-server /opt/redis/6328/conf/sentinel.conf --sentinel 
redis-server /opt/redis/6329/conf/sentinel.conf --sentinel

2.监控原理

通过集成了哨兵机制,有一些监控的流程我们需要清楚知道,比如
1、多个哨兵都监控着主机,他们是怎么知道有多少备机和怎么发现另外的哨兵的呢?
2、如果在主机不可用的情况下,他们怎么去判断是需要进行故障转移并且是如何实现的呢?

2.1 sentinel通讯机制(自动发现Sentinel和从服务器)
 一个Sntinel可以与其他多个Sentinel进行链接
 各个Sentinel之间可以互相检查对方的可用性并进行信息交换
 
 因为Sentinel可以通过发布订阅功能来自动发现正在监视相同主服务器的其他Sentinel
 
 这一功能是通过向频道 sentinel:hello 发送信息来实现的

在这里插入图片描述

每个Sentinel都需要定期执行的任务

1.每个Sentinel以每一秒钟一次的频率向它所知的主服务器和从服务器以及其他Sentinel实例发送一个PING命令 。

2.如果一个主服务器被标记未主观下线,那么正在监视这个主服务器的所有Sentinel要以每秒一次的频率确认主服务器进入了主观下线的状态

3.如果一个主服务器被标记为主观下线,并且有足够数量的Sentinel(至少达到配置文件制定的数量)在制定的时间范围内同意这一判断,那么这个主服务器被标记为客观下线

4.当没有足够数量的Sentinel同意主服务器已经下线,主服务器的客观下线状态就会被移除。当主服务器重新向Sentinel的PING命令返回有效回复时,主服务器的主观下线状态就会移除

2.2 sentinel 故障转移流程

当一个主服务器不能正常工作时,Sentinel会开始一次自动故障转移
它会将失效主服务器中的一个从服务器升级为新的主服务器
并让失效的其他从服务器改为复制新的主服务器;

当客户端试图连接失效时,集群也会向客户端返回新的主服务器的地址
使得集群可以使用新的主服务器代替失效服务器
在这里插入图片描述

七、集成Predixy客户端

当完成Redis高可用后。需要将Redis集群集成到我们的应用程序中此时会有两个问题产生:
1.如何在我们对redis读的时候,获取备机的连接,在写入的时候,获取主机的连接?
2.在Redis做完一次故障转移后,如果实时追踪新的主从集群状态?

在这里插入图片描述

1.Predixy介绍

Predixy 是一款高性能全特征redis代理,支持redis-sentinel和redis-cluster
Predixy Github 地址

特性

高性能并轻量级
支持多线程
多平台支持:Linux、OSX、BSD、Windows(Cygwin)
支持Redis Sentinel,可配置一组或者多组redis
支持Redis Cluster
支持redis阻塞型命令,包括blpop、brpop、brpoplpush
支持scan命令,无论是单个redis还是多个redis实例都支持
多key命令支持: mset/msetnx/mget/del/unlink/touch/exists
支持redis的多数据库,即可以使用select命令
支持事务,当前仅限于Redis Sentinel下单一redis组可用
支持脚本,包括命令:script load、eval、evalsha
支持发布订阅机制,也即Pub/Sub系列命令
多数据中心支持,读写分离支持
扩展的AUTH命令,强大的读、写、管理权限控制机制,健空间限制机制
日志可按级别采样输出,异步日志记录避免线程被io阻塞
日志文件可以按时间、大小自动切分
丰富的统计信息,包括CPU、内存、请求、响应等信息
延迟监控信息,可以看到整体延迟,分后端redis实例延迟


2.集成Predixy

集成Predixy后,程序客户端只需要关心对代理的连接,从而客户端不再需要监控和集成对Redis集群模式
在这里插入图片描述

2.1 下载Predixy

Predixy目录结构
在这里插入图片描述
predixy下载包地址

2.2 predixy.conf
// 进入conf目录后我们可以看到predixy.conf配置文件,这是predixy的主要配置文件
// 我们先将配置文件配好

// 代理的predixy应用名称
Name my-predixy

// 绑定监听的端口号
Bind 0.0.0.0:6320

// 工作的线程数(predixy支持多线程)
WorkerThreads 1

// 引入sentinel配置文件
Include sentinel.conf

// 其他配置可根据自己项目需求进行自定义配置
2.3 sentinel.conf
// 配置一个sentinel集群
SentinelServerPool {
    Password root // 指定连接redis实例默认的密码,不指定的情况下表示redis不需要密码
    Databases 16 // 指定redis db数量,不指定的情况下为1
    Hash crc16 // 指定对key算哈希的方法,当前只支持atol和crc16
    HashTag "{}" // 指定哈希标签,不指定的话为{}
    Distribution modula // 指定分布key的方法,当前只支持modula和random
    MasterReadPriority 0 // 读写分离功能,从redis master节点执行读请求的优先级,为0则禁止读redis master,不指定的话为50
    StaticSlaveReadPriority 50 // 读写分离功能,从静态redis slave节点执行读请求的优先级,所谓静态节点,是指在本配置文件中显示列出的redis节点,不指定的话为0
    DynamicSlaveReadPriority 50 // 功能见上,所谓动态节点是指在本配置文件中没有列出,但是通过redis sentinel动态发现的节点,不指定的话为0
    RefreshInterval 1 // predixy会周期性的请求redis sentinel以获取最新的集群信息,该参数以秒为单位指定刷新周期,不指定的话为1秒
    ServerTimeout 1 // 请求在predixy中最长的处理/等待时间,如果超过该时间redis还没有响应的话,那么predixy会关闭同redis的连接,并给客户端一个错误响应,对于blpop这种阻塞式命令,该选项不起作用,为0则禁止此功能,即如果redis不返回就一直等待,不指定的话为0
    ServerFailureLimit 10 // 一个redis实例出现多少次才错误以后将其标记为失效,不指定的话为10
    ServerRetryTimeout 1 // 一个redis实例失效后多久后去检查其是否恢复正常,不指定的话为1秒
    KeepAlive 120 // predixy与redis的连接tcp keepalive时间,为0则禁止此功能,不指定的话为0
    Sentinels {
        + master ip:port
        + slave1 ip:port
        + slave2 ip:port
    }
    // 注意:名称一定要与 predixy 中的Name保持一致
    Group my-master {
    }
}

2.4 auth.conf

predixy扩展了redis中AUTH命令的功能,支持定义多个认证密码,可以为每个密码指定权限,权限包括读权限、写权限和管理权限,其中写权限包括读权限,管理权限又包括写权限。还可以指定每个密码所能读写的健空间,健空间的定义是指健具有某个前缀。

Mode: 必须指定,只能是read、write、admin三者之一,分别表示读、写、管理权限
KeyPrefix: 可选项,可以定义健空间,多个健空间用空格隔开
ReadKeyPrefix: 可选项,可以定义可读的健空间,多个健空间用空格隔开
WriteKeyPrefix: 可选项,可以定义可写的健空间,多个健空间用空格隔开

// 配置一组权限
Authority {
	// redis密码为root登录
	// Mode指定为 admin 管理权限
    Auth "root" {
        Mode admin
    }
}


##### 2.5 启动predixy
// 进入bin目录下的 predixy 可执行文件
[root@iZwz96z2vnzc6vywj2tdaiZ bin]# ./predixy ../conf/predixy.conf 

在这里插入图片描述

2.6 测试

此时已经使用predixy集成了redis集成,predixy端口号为6320。登入predixy尝试对redis读写操作

[root@iZwz96z2vnzc6vywj2tdaiZ ~]# redis-cli -p 6320 -a root
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.

127.0.0.1:6320> get k1 
"v1"

127.0.0.1:6320> set k3 v3
OK

总结

本次笔记主要讲解:
1.Redis的运行机制
2.Redis如何集成高可用
3.集成第三方代理类

若有错误笔记积极接受大家指导或私聊作者,欢迎技术上的讨论与进步,谢谢!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值