调研Redis高可用两种方案,第1张

导读:Redis是被广泛使用的基础软件之一。对于工程师和,架构师,运维人员来说,了解Redis的高可用方案和背后的原理,是必备的基础知识。本文作者深入分析了Redis高可用的方方面面,并且做了有效总结,相信对广大读者可以起到很好的领路作用。

作者 codedump codedumpinfo 博主,多年从事互联网服务器后台开发工作。可访问作者博客阅读 codedump 更多文章。

Redis中为了实现高可用(High Availability,简称HA),采用了如下两个方式:

Redis中主从节点复制数据有全量复制和部分复制之分。

全量复制使用snyc命令来实现,其流程是:

旧版本全量复制功能,其最大的问题是从服务器断线重连时,即便在从服务器上已经有一部分数据了,也需要进行全量复制,这样做的效率很低,于是新版本的Redis在这部分做了改进。

新版本Redis使用psync命令来代替sync命令,该命令既可以实现完整全同步也可以实现部分同步。

执行复制的双方,主从服务器,分别会维护一个复制偏移量:

主服务器内部维护了一个固定长度的先进先出队列做为复制积压缓冲区,其默认大小为1MB。

在主服务器进行命令传播时,不仅会将写命令同步到从服务器,还会将写命令写入复制积压缓冲区。

每个Redis服务器,都有其运行ID,运行ID由服务器在启动时自动生成,主服务器会将自己的运行ID发送给从服务器,而从服务器会将主服务器的运行ID保存起来。

从服务器Redis断线重连之后进行同步时,就是根据运行ID来判断同步的进度:

有了前面的准备,下面开始分析psync命令的流程:

前面两种情况主服务器收到psync命令之后,会出现以下三种可能:

Redis使用哨兵机制来实现高可用(HA),其大概工作原理是:

以上将Redis节点分为两类:

以上是大体的流程,这个流程需要解决以下几个问题:

以下来逐个回答这些问题。

哨兵节点通过三个定时监控任务监控Redis数据节点的服务可用性。

每隔10秒,每个哨兵节点都会向主、从Redis数据节点发送info命令,获取新的拓扑结构信息。

Redis拓扑结构信息包括了:

这样,哨兵节点就能从info命令中自动获取到从节点信息,因此那些后续才加入的从节点信息不需要显式配置就能自动感知。

这一操作实际上完成了两件事情: 发现新的哨兵节点:如果有新的哨兵节点加入,此时保存下来这个新哨兵节点的信息,后续与该哨兵节点建立连接。 交换主节点的状态信息,作为后续客观判断主节点下线的依据。

每隔1秒,每个哨兵节点向主、从数据节点以及其他sentinel节点发送ping命令做心跳探测,这个心跳探测是后续主观判断数据节点下线的依据。

上面三个监控任务中的第三个探测心跳任务,如果在配置的down-after-milliseconds之后没有收到有效回复,那么就认为该数据节点“主观下线(sdown)”。

为什么称为“主观下线”?因为在一个分布式系统中,有多个机器在一起联动工作,网络可能出现各种状况,仅凭一个节点的判断还不足以认为一个数据节点下线了,这就需要后面的“客观下线”。

当一个哨兵节点认为主节点主观下线时,该哨兵节点需要通过”sentinel is-master-down-by addr”命令向其他哨兵节点咨询该主节点是否下线了,如果有超过半数的哨兵节点都回答了下线,此时认为主节点“客观下线”。

当主节点客观下线时,需要选举出一个哨兵节点做为哨兵领导者,以完成后续选出新的主节点的工作。

这个选举的大体思路是:

可以看到,这个选举领导者的流程很像raft中选举leader的流程。

在剩下的Redis从节点中,按照以下顺序来选择新的主节点:

选择了新的主节点之后,还需要最后的流程让该节点成为新的主节点:

原文地址:

https://wwwcodedumpinfo/post/20190409-redis-sentinel/

参考阅读:

GIAC全球互联网架构大会深圳站将于2019年6月举行,掌阅资深架构师,畅销图书《Redis 深度历险:核心原理与应用实践》作者钱文品将作为数据库专场的讲师出席2019年GIAC深圳站,并做关于Redis高性能,高可用方面的的演讲。本届GIAC数据库专场邀请阿里云前数据库总负责人余峰作为出品人,议题如下。

参加 GIAC,盘点2019年最新技术,目前 购买75折优惠 ,多人购买有更多优惠。识别二维码 了解大会更多详情。

日志转移是这样一种处理过程,它能将某一数据库中的事务日志文件依次转存到备份的数据库中,进而为这一数据库创建一个“近乎”热备份。SQL Server 2000的数据库引擎中设置了日志转移功能,并在其中进行处理。所以它会自动完成复原到备份服务器的进程,而不需要数据库管理员手动操作。只有你的产品服务器操作失败,你才需手动完成到备份服务器的复原进程。(注释:尽管SQL Server 70和2005中均有日志转移功能,但本文主要针对SQL Server 2000。)

为何要使用日志转移

日志转移是一种解决高可用性的措施,并且十分有效。同样作为高可用性的措施方案,日志转移相对集群来说,的好处是它要便宜许多。这是因为,使用集群功能有硬件要求,而日志转移则不需要。

 日志转移在数据库与数据库而非服务器与服务器之间进行;因此才有可能将备份数据库存储在你已用作其他用途的服务器上。但如果转移失败则有可能会出现问题,这时你可换用备份数据库,这种选择是可用的。

 日志转移相对比较容易安装。SQL Server提供了非常完善的向导帮助你安装这个进程。

 日志转移允许你保存分布在不同地理位置中的冗余数据,SQL Server的集群功能则很难做到这一点。这一特点十分出众,因为,当你的数据中心遭到灾难时,你仍能在备份服务器中将其恢复过来。而在相同的数据中心,如果你使用的是集群功能,你就会陷入麻烦。

 日志转移的另一优点是你能将备份数据库作为报告数据库使用,这对许多公司来说是很不错的选择。但如果你决定了用这个备份数据库作报告使用,就必须注意它的局限性。使用原始数据库中的日志时,SQL Server 要求指定的通道,所以,当日志文件正在被应用时,报告则不能同时进行。

使用日志转移要考虑的相关因素

在将日志转移作为高可用性的方案来使用时,我们必须考虑以下几点因素。由于从原始数据库到备份数据库有一个潜伏期,对你的公司而言,它并非一定是可行的实现高可用性的一种解决方案。潜伏期由数据库管理员设置,时间也因需要而缩短, 但永远不能避免。

 日志转移中没有设置恢复功能,这就意味着在将日志转移到备份服务器上时,这些日志都暂时不可用。因此,数据库管理员必须在将备份数据库放到网上前完成一系列的操作,这些步骤包括:

 将已存储在备份数据服务器上原始数据库里的备份标签存储起来。一旦所有的标签被存储后,数据库就必须得到恢复,然后放到网上。

一旦所有的数据库都已放在网上,所有需要访问数据库的应用程序就需要改变自身的链接。如果你不能将应用程序尽快指向刚刚恢复的数据库,你就前功尽弃了。

 一个SQL Server的实例能用于监控日志转移。这个实例可以在原始数据库、备份数据库或单独的数据库中。任何一种版本的SQL Server都能用于SQL Server监控。

 注释:数据库登录必须在原始数据库与备份数据库之间同时进行

Redis数据量日益增大,而且使用的公司越来越多,不仅用于做缓存,同时趋向于存储这块,这样必促使集群的发展,各个公司也在收集适合自己的集群方案,目前行业用的比较多的是下面几种集群架构,大部分都是采用分片技术,解决单实例内存增大带来的一系列问题。

本篇文章简单介绍五种方案:

官方cluster方案

twemproxy代理方案

哨兵模式

codis

客户端分片

官方cluser方案

从redis 30版本开始支持redis-cluster集群,redis-cluster采用无中心结构,每个节点保存数据和整个集群状态,每个节点都和其他节点连接。redis-cluster是一种服务端分片技术。

redis-cluster架构图

redis-cluster特点:

每个节点都和n-1个节点通信,这被称为集群总线(cluster bus)。它们使用特殊的端口号,即对外服务端口号加10000。所以要维护好这个集群的每个节点信息,不然会导致整个集群不可用,其内部采用特殊的二进制协议优化传输速度和带宽。

redis-cluster把所有的物理节点映射到[0,16383]slot(槽)上,cluster负责维护node--slot--value。

集群预分好16384个桶,当需要在redis集群中插入数据时,根据CRC16(KEY) mod 16384的值,决定将一个key放到哪个桶中。

客户端与redis节点直连,不需要连接集群所有的节点,连接集群中任何一个可用节点即可。

redis-tribrb脚本(rub语言)为集群的管理工具,比如自动添加节点,规划槽位,迁移数据等一系列操作。

节点的fail是通过集群中超过半数的节点检测失效时才生效。

整个cluster被看做是一个整体,客户端可连接任意一个节点进行操作,当客户端操作的key没有分配在该节点上时,redis会返回转向指令,指向正确的节点。

为了增加集群的可访问性,官方推荐的方案是将node配置成主从结构,即一个master主节点,挂n个slave从节点。如果主节点失效,redis cluster会根据选举算法从slave节点中选择一个上升为master节点,整个集群继续对外提供服务。

twemproxy代理方案

twemproxy代理架构图:

Redis代理中间件twemproxy是一种利用中间件做分片的技术。twemproxy处于客户端和服务器的中间,将客户端发来的请求,进行一定的处理后(sharding),再转发给后端真正的redis服务器。也就是说,客户端不直接访问redis服务器,而是通过twemproxy代理中间件间接访问。降低了客户端直连后端服务器的连接数量,并且支持服务器集群水平扩展。

twemproxy中间件的内部处理是无状态的,它本身可以很轻松地集群,这样可以避免单点压力或故障。

twemproxy又称nutcracker,起源于推特系统中redis、memcached集群的轻量级代理。

Github源码地址(https://githubcom/twitter/twemproxy)

从上面架构图看到twemproxy是一个单点,很容易对其造成很大的压力,所以通常会结合keepalived来实现twemproy的高可用。这时,通常只有一台twemproxy在工作,另外一台处于备机,当一台挂掉以后,vip自动漂移,备机接替工作。关于keepalived的用法可自行网上查阅资料。

哨兵模式

Sentinel哨兵

Sentinel(哨兵)是Redis的高可用性解决方案:由一个或多个Sentinel实例组成的Sentinel系统可以监视任意多个主服务器以及这些主服务器下的所有从服务器,并在被监视的主服务器进入下线状态时,自动将下线主服务器属下的某个从服务器升级为新的主服务器。

例如:

在Server1掉线后:

升级Server2为新的主服务器:

Sentinel的工作方式

每个Sentinel以每秒钟一次的频率向它所知的Master、Slave以及其他Sentinel实例发送一个PING命令。

如果一个实例距离最后一次有效回复PING命令的时间超过down-after-milliseconds选项所指定的值,则这个实例会被Sentinel标记为主观下线。

如果一个Master被标记为主观下线,则正在监视这个Master的所有Sentinel要以每秒一次的频率确认Master的确进入了主观下线状态。

当有足够数量的Sentinel(大于等于配置文件指定的值)在指定的时间范围内确认Master的确进入了主观下线状态,则Master会被标记为客观下线。

在一般情况下,每个Sentinel会以每10秒一次的频率向它所知的所有Master、Slave发送INFO命令。

当Master被Sentinel标记为客观下线时,Sentinel向下线的Master的所有Slave发送INFO命令的频率会从10秒一次改为每秒一次。

若没有足够数量的Sentinel同意Master已经下线,Master的客观下线状态就会被移除。若Master重新向Sentinel的PING命令返回有效值,Master的主观下线状态就会被移除。

codis

codis是一个分布式的Redis解决方案,由豌豆荚开源,对于上层的应用来说,连接codis proxy和连接原生的redis server没什么明显的区别,上层应用可以像使用单机的redis一样使用,codis底层会处理请求的转发,不停机的数据迁移等工作,所有后边的事情,对于前面的客户端来说是透明的,可以简单的认为后边连接的是一个内存无限大的redis服务。

客户端分片

分区的逻辑在客户端实现,由客户端自己选择请求到哪个节点。方案可参考一致性哈希,这种方案通常适用于用户对客户端的行为有完全控制能力的场景。

总结:没有最好的方案,只有最合适的方案。

更多Redis相关技术文章,请访问Redis教程栏目进行学习!

Lync

Server 2013 的主要高可用性架构基于借助池实现的服务器冗余。如果运行特定服务器角色的服务器发生故障,则池中运行相同角色的其他服务器将承担该服务器的负载。这适用于前端服务器、边缘服务器、中介服务器和控制器。

Lync

Server 2013 通过支持位于两个数据中心的前端池配对添加了新的灾难恢复措施。如果其中一个配对池不可用,则管理员可将该池中的用户故障转移到配对中的其他池,以继续提供服务。此功能无需昂贵的网络或硬件解决方案,如存储网络或共享磁盘。

Lync

Server 2013 支持后端服务器高可用性。这是一个可选拓扑,可以在其中为前端池部署两台后端服务器,然后为在后端服务器上运行的所有

Lync 数据库设置同步 SQL 镜像。

DABAN RP主题是一个优秀的主题,极致后台体验,无插件,集成会员系统
网站模板库 » 调研Redis高可用两种方案

0条评论

发表评论

提供最优质的资源集合

立即查看 了解详情