redis学习笔记06-主从复制和哨兵机制
1.主从复制
为了保证线上业务的持续运行,防止主节点因宕机而重启数据恢复消耗太长时间,通常会准备一个备用节点,备份主节点的数据,当主节点出问题时立马顶上。这种机制就叫做主从复制。在了解redis的主从复制之前,需要先了解一下现代分布式系统的理论基础--CAP原理。
1.1 CAP原理
- C(consistent) 一致性
- A(availability) 可用性
- P(partition tolerance) 分区容忍性
一致性:所有服务端,客户端的数据保持同步一致。
可用性:系统随时可用
分区容忍性:分布式系统的节点分布在不同的机器上,即意味着必然存在网络断开的风险,这种网络断开的场景叫做网络分区。
当允许网络分区发生时,分布式系统的两个节点之间无法通信,当一个节点数据发生改动时,另一个无法同步,即失去了一致性。如果强行保持一致就需要暂停分布式节点服务,这就丧失了可用性。其实这样看来,CAP原理就是:当网络分区发生时,一致性和可用性不可兼得。
redis主从数据是异步同步的,从节点一直在追赶着同步主节点的数据,最后总能保持一致,这叫做最终一致性。
1.2 主从复制使用
主从复制的配置只需要配置从机,语句如下:slaveof 主机ip 主机端口号 。默认从机只进行读操作,保证读写分离,增加效率,常用配置方式是一主二从。
使用时有如下特点:
- 当主节点宕机时,两个从节点会一直等待主节点重连,重连后依然是主节点的从节点,数据继续同步。
- 当主节点宕机后,从节点执行命令
slaveof no one可以成为一个主节点,摆脱从属关系。 - 可以再用一个节点设置成主节点的从节点的从节点,让数据一直传递下去,去中心化,减轻主机的负担。
1.3 主从复制的复制原理
① 增量同步
redis同步的是指令流,主节点会将那些对自己状态产生影响的指令记录在本地内存buffer中,然后异步将buffer中的指令同步到从节点,从节点一边执行同步的指令流,一边向主节点反馈同步的位置。内存中的buffer结构为一个定长的环形数组,如果环形数组满了就会从头开始覆盖之前的内容,如果网络状况差的时候,从节点与主节点长期未同步就有可能丢失数据,因此这时需要使用快照同步。
②快照同步
它需要先在主节点上执行bgsave命令存盘,然后将快照内容全部传送到从节点。从节点接受完,立即执行一次全量加载,加载前将内存数据清空。这个过程需要大量的时间,如果内存的buffer过小,在同步期间增量指令在复制buffer中被覆盖,就会再次执行快照复制,极有可能造成快照复制的死循环。
当新加入从节点时,会先执行一次快照同步,再执行增量同步。
③无盘复制
由于快照同步很耗费时间,影响主节点的服务效率,因此在redis2.8.18版本之后引入无盘复制,其操作流程为主服务器直接通过套接字将快照内容发送到从节点,主节点一边遍历内存,一边将序列化的快照内容发送的从节点,从节点还是将接收的内容先保留在磁盘上,再进行一次性加载。
1.4 补充内容
redis的复制是异步进行的,在redis3.0之后可以用wait指令将异步复制改为同步复制,确保系统的强一致性(不严格)。
wait有两个参数,第一个是从节点的数量N,第二个参数是时间t(毫秒),其作用为,等待wait指令之前的所有写操作同步到N个从节点,最多等待时间t,若t=0则表示一直等待,直到N个从节点都同步完成。
值得注意的是,假如在同步时发生了网络分区,而wait的参数t=0,这会导致主从同步无法执行,wait指令会永远阻塞,redis服务器将丧失可用性。
- 哨兵机制(Sentinel)
===
一主二从配置下,当主节点宕机时,从节点会一直等待主节点恢复,但是如果主节点长期未连接,而又需要继续执行业务怎么办?
这时候就需要在从节点中选出一个主节点,代替原来的主节点执行业务,这种机制就是Sentinel。相当于一个哨兵,检测主机状态,当主节点宕机一定的时间后,推选出新的主节点。
配置步骤如下:
主从复制集群搭建
新建sentinel.conf配置文件,文件内容:
sentinel monital 被监控的主机的名字(自己命名) 被监控的ip 被监控的端口号 1
最后的数字1,代表主机挂掉之后,从机得到的投票数高于1时,就可成为新的主机。启动sentinel.conf配置文件 redis-sentinel sentinel.conf路径
python客户端下的基本用法如下:>python客户端下的基本用法如下:
from redis.sentinel import Sentinel
sentinel = Sentinel([('localhost',26379)],socket_timeout=0.1)
sentinel.discover_master('mymaster') #查询主节点地址 mymaster指的是自己命名的主机名字
sentinel.discover_slaves('mymaster') #查询从节点地址
#通过 xxx_for方法从连接池中获取一个链接使用
master = sentinel.master_for('mymaster',socket_timeout=0.1)
slave = sentinel.slave_for('mymaster',socket_timeout=0.1)
master.set('foo','bar')
slave.get('foo')
当主节点变更后,连接池建立新的链接。建立连接时会去查询主节点地址,然后跟内存中的主节点地址进行比对,如果发生变更就断开所有连接,重新使用新地址建立链接。如果旧主节点挂掉了,所有正在使用的连接全部关闭,在重连时使用新地址。
如果进行主动主从切换,而旧的主节点并没有挂掉还在继续使用中时,会产生一个异常,redis捕捉这个异常后,将旧的连接全部关闭,重新连接时使用新地址进行连接。
主从切换后,之前的主节点变成从节点,它的所有的修改指令都会抛出异常。
redis学习笔记06-主从复制和哨兵机制的更多相关文章
- Redis学习笔记(二) - 主从复制
概述 指将一台redis服务器上的数据,复制到其他redis服务器上,前者称为主服务器(master),后者称为从服务器(slave). 默认情况下主从关系为一对多关系. 数据复制是单向的,只能从主服 ...
- Redis学习笔记(六、哨兵)
目录: 基本概念 环境部署 哨兵原理 哨兵命令 基本概念: 1.什么是哨兵 我们先从字面意思来了解哨兵,哨兵是对执行警戒任务的士兵的统称:在redis中哨兵也是一样,他监控着redis服务器的状态. ...
- Redis学习笔记10--Redis主从复制
redis主从复制配置和使用都非常简单.通过主从复制可以允许多个slave server拥有和master server相同的数据库副本.下面是关于redis主从复制的一些特点: 1.ma ...
- 四、redis系列之主从复制与哨兵机制
1. 绪言 在现实应用环境中,出于数据容量.容灾.性能等因素的考虑,往往不会只使用一台服务器,而是使用集群的方式.Redis 中也有类似的维持一主多从的方式提高 Redis 集群的高可用性的方案,而其 ...
- 《【面试突击】— Redis篇》-- Redis的主从复制?哨兵机制?
能坚持别人不能坚持的,才能拥有别人未曾拥有的.关注左上角编程大道公众号,让我们一同坚持心中所想,一起成长!! <[面试突击]— Redis篇>-- Redis的主从复制?哨兵机制? 在这个 ...
- redis如何实现高可用【主从复制、哨兵机制】
实现redis高可用机制的一些方法: 保证redis高可用机制需要redis主从复制.redis持久化机制.哨兵机制.keepalived等的支持. 主从复制的作用:数据备份.读写分离.分布式集群.实 ...
- redis主从复制和哨兵机制
redis主从复制和哨兵机制 技术标签: redis 1.redis主从复制(master/slave模式) 主数据库可以进行读写操作,当写操作导致数据发生变化时会自动将数据同步给从数据库.而一般情况 ...
- redis学习笔记(3)
redis学习笔记第三部分 --redis持久化介绍,事务,主从复制 三,redis的持久化 RDB(Redis DataBase)AOF(Append Only File) RDB:在指定的时间间隔 ...
- redis学习笔记(详细)——高级篇
redis学习笔记(详细)--初级篇 redis学习笔记(详细)--高级篇 redis配置文件介绍 linux环境下配置大于编程 redis 的配置文件位于 Redis 安装目录下,文件名为 redi ...
随机推荐
- Andriod Fragment 的作用和基本用法
1.什么是Fragment: Fragment (片段)在Google Android 开发指南中的解释是:片段是Activity中的一部分,一个Activity中可以有多个Fragment.一个Fr ...
- FHS 文件层次标准
FHS:文件层次标准 操作系统自身运行使用的 /bin: 存放可执行的二进制程序,管理员和普通用户都可以使用 /sbin:管理员才能执行的命令 运行正常功能的程序存放位置 /usr/bin /usr/ ...
- 第四周课堂笔记2th
2. 在函数中*对于形参的作用是聚合,对于实参的作用是打散 3. 加载顺序:内置——全局——局部空间 取值顺序:局部——全局——内置空间 左上角的答案: 123 666 888 777 右边的答案:7 ...
- loj6094 归乡迷途
题意:有一张n个点的无向图,点有标号.求满足下列性质的图有多少个. 1.任意节点到1的最短路唯一.2.i的最短路长度<=i+1的最短路长度.3.所有点的度数给定,为2或3. n<=400. ...
- Eclipse 常用快捷键 (动画讲解)【转】
Eclipse 常用快捷键 (动画讲解)[转] Eclipse有强大的编辑功能, 工欲善其事,必先利其器, 掌握Eclipse快捷键,可以大大提高工作效率. 小坦克我花了一整天时间, 精选了一些常用的 ...
- 2016.10.7初中部上午NOIP普及组比赛总结
2016.10.7初中部上午NOIP普及组比赛总结 这次的题还可以,重新入了比赛的前十. 进度: 比赛:90+10+70+30=200 改题:AC+AC+AC+AC=AK 找试场 这题很简单,但是被欺 ...
- 深入浅出 Java Concurrency (38): 并发总结 part 2 常见的并发场景[转]
常见的并发场景 线程池 并发最常见用于线程池,显然使用线程池可以有效的提高吞吐量. 最常见.比较复杂一个场景是Web容器的线程池.Web容器使用线程池同步或者异步处理HTTP请求,同时这也可以有效的复 ...
- System.Web.Mvc.FileStreamResult.cs
ylbtech-System.Web.Mvc.FileStreamResult.cs 1.程序集 System.Web.Mvc, Version=5.2.3.0, Culture=neutral, P ...
- iOS之CATiledLayer的属性简介和使用
1.CATiledLayer简介 CATiledLayer用于大型图片进行分割显示,需要显示的图片才会加载,直接上代码: - (void)viewDidLoad { [super viewDidLoa ...
- Spring MVC(四)--控制器接受pojo参数
以pojo的方式传递参数适用于参数较多的情况,或者是传递对象的这种情况,比如要创建一个用户,用户有十多个属性,此时就可以通过用户的pojo对象来传参数,需要注意的是前端各字段的名称和pojo对应的属性 ...