redis 部署方式及常见特性
单机部署
redis的单机部署
如何保证redis的高并发和高可用? redis的主从复制原理?redis的哨兵原理? redis单机能承载多高并发?如果单机扛不住如何扩容扛更多的并发? redis会不会挂?既然redis会挂如何保证高可用?
Redis主从架构(实现高并发)
单机的redis,能够承载的QPS大概在上万到几万不等。对于缓存来说,一般是用来支撑读高并发的,因此架构可以做成一主多从,主节点负责写,并且将数据复制到其他的从节点,而从节点负责读,即主从(master-slave)架构。这样也好实现水平扩容,支撑读高并发。
- redis采用异常方式复制数据到slave节点,从redis2.8开始,slave node 会周期性确认自己每次复制的数据量
- 一个master node 可以配置多个slave node
- slave node 依然可以链接其他slave node
- slave node 复制数据时不会block master node的正常工作
- slave node 复制数据时也不会 block 自己的查询操作,它会用旧的数据提供服务,但是完成复制后需要删除旧数据加载新数据,这时会暂停对外服务
- slave node 主要用来进行横向扩容做读写分离,提高读的吞吐量
另外,主从架构建议开启master node的持久化,避免master宕机重启后数据为空,然后一经复制,slave node的数据也丢失了。还有master的备份方案也需要考虑,可以在本地文件丢失后能有备份恢复master,确保master启动时是正常有数据,即使slave node可以自动接管master node,但也可能sentinel还没检测到master failure,master node就自动重启了,就还会发生复制到slave node数据全部丢失的情形。
主从复制的原理
当启动一个slave node的时候,它会发送一个PSYNC命令给master node。如果这是slave node初次连接到master node,会触发一次full resynchronization全量复制,此时master会启动一个后台线程,开始生成一份RDB快照文件,同时还会将从客户端新收到的所有写命令缓存在内存中。RDB文件生成文件后,master会将这个RDB发送给slave,slave会写入本地磁盘,然后再从本地磁盘加载到内存中,接着master会将内存中缓存的写命令发送到slave,slave也会同步这些数据。slave node如果跟master node有网络故障断开连接会自动重连,此时master node只会复制slave缺少的那部分数据。
主从复制的断点续传
从redis2.8开始支持主从复制的断点续传,如果主从复制过程中网络断开,那么可以接着上次复制的地方继续复制下去,而不是从头复制一份。
master node 会在内存中维护一个backlog ,master 和 salve 都会保存一个 replica offset 还有一个master run id ,offset就是保存再backlog中的。如果 master 和 slave 网络连接断了,salve 会让 master 从上次 replica offset 开始继续复制,如果没有找到对应的 offset ,那么会执行一次 resynchronization 全量复制。
如果根据 host + ip 定位 master node 是不知道是否复制过的,如果 master node 重启或者数据发生了变化,那么 slave node 应该根据不同的 run id 区分。
无磁盘化复制
master 再内存中直接创建RDB,然后发送给 salve ,不会再自己本地落地磁盘了,只需要再配置文件中开启 repl - diskless -sync yes
repl - diskless - sync yes
过期key处理
slave 不会过期 key,只会等待 master 过期 key。 如果 master 过期了一个key,或者通过LRU淘汰了一个key,那么会模拟一条 del 命令发送给slave
复制的流程
slave node 启动时,会在本地保存master node 的信息,包括 master node 的 host 和 IP ,但是复制流程还没开始。
slave node 内部有个定时任务,每秒检查是否有新的 master node 要连接和复制,如果发现,就跟 master node 建立 socket 网络连接。然后 slave node 发送 ping 命令给 master node 。如果master设置了requirepass,那么slave node 必须发送 masterauth 的口令过去进行认证,master 第一次执行全量复制,后续持续将写命令异步复制给slave
全量复制
master 执行 bgsave ,在本地生成一份RDB快照文件。
master node 将RDB快照文件发送给salve node ,如果RDB复制时间超过60秒,slave node 会认为复制失败,当然这个参数可以适当调大
master node 在生成RDB时,会将所有新的命令缓存在内存中,在slave node保存了RDB之后,再将新的命令复制给slave node
如果在复制期间,内存缓冲区持续消耗超过64MB,或者一次性超过256MB,那么停止复制,复制失败
slave node 接收到RDB之后,清空自己的旧数据,然后重新加载RDB到自己的内存中,同时基于旧的数据版本对外提供服务
如果slave node 开启了AOF,那么会立即执行BGREWRITEAOF,重写AOF
增量复制
如果全量复制过程中断,slave 重新连接 master 时,会触发增量复制
master 直接从自己的backlog 中获取部分丢失的数据,发送给slave ,默认backlog是1MB
master 是根据slave 发送的psync 中的offset 来从 backlog 中获取数据的
异步复制
master 每次接收到写命令之后,先在内部写入数据,然后异步发送给salve node
主从节点互相都会发送heartbeat信息,master 默认每隔10秒发送一次heartbeat,slave 每隔一秒发送一个heartbeat
Redis哨兵集群(实现高可用)
如何高可用?
一个salve挂掉是不会影响可用性的,还有很多slave在提供相同数据下的相同读服务。但是mater挂掉之后,主从就全部失效了。redis的高可用架构,叫做failover故障转移,也叫主备切换。就是master在故障时,自动检测,并且将某个slave自动切换为master。这时就可以使用哨兵的机制进行监控、通知、故障转移、配置更新等操作了。
sentinel 哨兵,用于实现redis集群的高可用,本身也是分布式的,作为一个哨兵集群去运行,互相协同工作。
- 集群监控:监控redis 所有master和slave进程是否正常工作
- 消息通知:如果某个redis实例有故障,那么哨兵负责发送消息作为报警通知给管理员
- 故障转移:如果master挂掉了,会自动转移到slave上
- 配置中心:如果故障转移发送了,通知client客户端新的master地址
- 故障转移时,判断一个master是否宕机,需要大部分的哨兵都同意才行,涉及到了分布式选举的问题
- 即使部分哨兵也挂了,哨兵集群也是能正常工作的,保证了监控高可用机制的自身也是高可用的。
slave→master(如何选出新的master进行主备切换)
- 判断slave与master断开时间的长短,短的优先
- 断开时间相同的话 根据offset判断复制数据的多少,复制多的优先
- 复制相同的判断run id,小的优先
redis实现高并发主要依赖主从架构,同时需要缓存大量数据的话就需要redis集群了,此时再加上哨兵就可以实现任何一个实例宕机都能进行主备切换的高可用。
Redis的一些特性
RDB的优缺点
AOF的优缺点
REDIS的事务:放弃了回滚
一致性哈希算法原理(数据写入时选择节点,数据读取时找到所在节点)
redis 的单线程原子操作的设计
redis 部署方式及常见特性的更多相关文章
- Redis 部署方式(单点、master/slaver、sentinel、cluster) 概念与区别
转载自 https://blog.csdn.net/java_zyq/article/details/83818341 在K8S上部署Redis集群时突然遇到一个(sentinel哨兵模式)概念,感觉 ...
- Redis 的几种常见使用方式
常见使用方式 Redis 的几种常见使用方式包括: Redis 单副本 Redis 多副本(主从) Redis Sentinel(哨兵) Redis Cluster Redis 自研 各种使用方式的优 ...
- jedis操作redis的几种常见方式总结
Redis是一个著名的key-value存储系统,也是nosql中的最常见的一种,这篇文章主要给大家总结了关于在java中jedis操作redis的几种常见方式,文中给出了详细的示例代码供大家参考学习 ...
- RPA培训:RPA的核心三个组件常见部署方式(RPA学习天地)
整体架构 目前主流厂商的RPA平台就是由控制台.设计器和机器人这三个标准套件组成,这三个核心套件形成了RPA产品的基本要素.其它如AI平台.人机交互.流程挖掘.自动化中心等都是衍生出来的周边产品. 1 ...
- web工程常见部署方式总结
作为一个web测试工程师,对测试所属的平台架构,项目部署情况应该是有所了解的,下面在此基础上总结下web项目在各种场景下常用的部署方式: 第一种方法: 开发常用部署方法,直接在myeclipse里部署 ...
- FW/IDS/IPS/WAF等安全设备部署方式及优缺点
现在市场上的主流网络安全产品可以分为以下几个大类:1.基础防火墙FW/NGFW类 主要是可实现基本包过滤策略的防火墙,这类是有硬件处理.软件处理等,其主要功能实现是限制对IP:port的访问.基本上的 ...
- Redis 宝典 | 基础、高级特性与性能调优
转载:Redis 宝典 | 基础.高级特性与性能调优 本文由 DevOpsDays 本文由简书作者kelgon供稿,高效运维社区致力于陪伴您的职业生涯,与您一起愉快的成长. 作者:kelgon ...
- Redis的那些最常见面试问题(转)
Redis的那些最常见面试问题 1.什么是redis? Redis 是一个基于内存的高性能key-value数据库. 2.Reids的特点 Redis本质上是一个Key-Value类型 ...
- [原]Python Web部署方式总结
不要让服务器裸奔 学过PHP的都了解,php的正式环境部署非常简单,改几个文件就OK,用FastCgi方式也是分分钟的事情.相比起来,Python在web应用上的部署就繁杂的多,主要是工具繁多,主流服 ...
随机推荐
- 使用soapui进行webservice接口测试
一.web service(SOAP)与HTTP接口的区别 1.什么是web service WebService就是Web服务的意思,对应的应用层协议为SOAP(相当于HTTP协议),可理解为远 ...
- Oracle执行计划不走索引的原因总结
在Oracle数据库操作中,为什么有时一个表的某个字段明明有索引,当观察一些语的执行计划确不走索引呢?如何解决呢?本文我们主要就介绍这部分内容,接下来就让我们一起来了解一下. 不走索引大体有以下几个原 ...
- Python值正则表达式(RE)
要想在Python中使用正则表达式,首先要引入模块: import re . 匹配任意一个 + 匹配至少一个 * 匹配0个至多个 ? 1个或0个(可有可无) - 表范围 \ 转义 ^ 在首 $ ...
- c# PID算法入门
离开工控行业已经有一段时间了,最近回忆起以前的工作,又对 PID 算法有了兴趣.所以写了一个小项目,希望可以帮到需要的人,也算是对那段工作经历的一个总结. 这是一个 winform 的项目.负载是一个 ...
- fixture实战---通过fixure,解决方法依赖逻辑
import pytest@pytest.fixture()def login(): print('输入用户名密码登陆') def test_cart(login): print('用例1,登陆后执行 ...
- css图片文字
1.浏览器是把 html 和 css 一起下载并执行的,计算机里把两件事情同时做 异步加载.计算机中的同步异步和我们生活中的正好是相反的. 补充: 同步,是所有的操作都做完,才返回给用户结果.即写完 ...
- flex布局(弹性布局)
1. 传统布局与 flex 布局比较 传统布局 兼容性好 布局繁琐 局限性,不能在移动端很好的布局 flex 弹性布局 操作方便,布局极为简单,移动端应用很广泛 PC端浏览器支持较差 IE 11 或 ...
- 一文读懂MQTT协议
1 概述 MQTT(Message Queuing Telemetry Transport,消息队列遥测传输协议),是一种基于发布/订阅(publish/subscribe)模式的"轻量级 ...
- termios, tcgetattr, tcsetattr, tcsendbreak, tcdrain, tcflush, tcflow, cfmakeraw, cfgetospeed, cfgetispeed, cfsetispeed, cfsetospeed - 获取和设置终端属性,行控制,获取和设置波特率
SYNOPSIS 总览 #include <termios.h> #include <unistd.h> int tcgetattr(int fd, struct termio ...
- MySQL练习题--sqlzoo刷题2
SELECT from Nobel Tutorial 1.Change the query shown so that it displays Nobel prizes for 1950. SELEC ...