开源 | 携程Redis多数据中心解决方案-XPipe

Redis在携程内部得到了广泛的使用,根据客户端数据统计,整个携程全部Redis的读写请求在200W QPS/s,其中写请求约10W QPS/S,很多业务甚至会将Redis当成内存数据库使用。

这样,就对Redis多数据中心提出了很大的需求,一是为了提升可用性,解决数据中心DR(DisasterRecovery)问题;二是提升访问性能,每个数据中心可以读取当前数据中心的数据,无需跨机房读数据。在这样的需求下,XPipe应运而生 。

从实现的角度来说,XPipe主要需要解决三个方面的问题,一是数据复制,同时在复制的过程中保证数据的一致性;二是高可用,xpipe本身的高可用和Redis系统的高可用;三是如何在机房异常时,进行DR切换。

下文将会从这三个方面对问题进行详细阐述。最后,将会对测试结果和系统在生产环境运行情况进行说明。

为了方便描述,后面的行文中用DC代表数据中心(Data Center)。

一、数据复制问题

多数据中心首先要解决的是数据复制问题,即数据如何从一个DC传输到另外一个DC,通常有如下方案:

 

客户端双写

从客户端的角度来解决问题,单个客户端双写两个DC的服务器。初看没有什么问题。但是深入看下去,如果写入一个IDC成功,另外一个IDC失败,那数据可能会不一致,为了保证一致,可能需要先写入一个队列,然后再将队列的数据发送到两个IDC。 如果队列是本地队列,那当前服务器挂掉,数据可能会丢失;如果队列是远程队列,又给整体的方案带来了很大的复杂度。

目前的应用一般都是集群部署,会有多个客户端同时操作。在多个客户端的前提下,又带来了新的问题。比如两个客户端ClientA和ClientB:

ClientA:  set key value1

ClientB:  set key value2

由于两个客户端独立操作,到达服务器的顺序不可控,所以可能会导致两个DC的服务器对于同一个key,value不一致,如下:

Server1: setkey value1; set key value2;

Server2: setkey value2; set key value1;

在Server1,最终值为value2,在Server2,最终值为value1。

 

服务器代理

proxy模式解决了多客户端写可能会导致数据不一致的问题。proxy类似于一个client,和单个client双写的问题类似,需要一个数据队列保数据一致性。

为了提升系统的利用率,单个proxy往往需要代理多个Redis server,如果proxy出问题,会导致大面积的系统故障。这样,就对系统的性能和可用性提出了极大的挑战,带来实现的复杂度。

此外,在特殊的情况下,仍然会可能带来数据的不一致,比如value和时间相关,或者是随机数,两个Redis服务器所在系统的不一致带来了数据的不一致。

考虑到以上情况,为了解决复制问题,我们决定采用伪slave的方案,即实现Redis协议,伪装成为Redis slave,让Redis master推送数据至伪slave。这个伪slave,我们把它称为keeper,如下图所示:

有了keeper之后,多数据中心之间的数据传输,可以通过keeper进行。keeper将Redis日志数据缓存到磁盘,这样,可以缓存大量的日志数据(Redis将数据缓存到内存ring buffer,容量有限),当数据中心之间的网络出现较长时间异常时仍然可以续传日志数据。

Redis协议不可更改,而keeper之间的数据传输协议却可以自定义。这样就可以进行压缩,以提升系统性能,节约传输成本;多个机房之间的数据传输往往需要通过公网进行,这样数据的安全性变得极为重要,keeper之间的数据传输也可以加密,提升安全性。

二、高可用

任何系统都可能会挂掉,如果keeper挂掉,多数据中心之间的数据传输可能会中断,为了解决这个问题,需要保证keeper的高可用。我们的方案中,keeper有主备两个节点,备节点实时从主节点复制数据,当主节点挂掉后,备节点会被提升为主节点,代替主节点进行服务。

提升的操作需要通过第三方节点进行,我们把它称之为MetaServer,主要负责keeper状态的转化以及机房内部元信息的存储。同时MetaServer也要做到高可用:每个MetaServer负责特定的Redis集群,当有MetaServer节点挂掉时,其负责的Redis集群将由其它节点接替;如果整个集群中有新的节点接入,则会自动进行一次负载均衡,将部分集群移交到此新节点。

Redis也可能会挂,Redis本身提供哨兵(Sentinel)机制保证集群的高可用。但是在Redis4.0版本之前,提升新的master后,其它节点连到此节点后都会进行全量同步,全量同步时,slave会处于不可用状态;master将会导出rdb,降低master的可用性;同时由于集群中有大量数据(RDB)传输,将会导致整体系统的不稳定。

截止当前文章书写之时,4.0仍然没有发布release版本,而且携程内部使用的Redis版本为2.8.19,如果升到4.0,版本跨度太大,基于此,我们在Redis3.0.7的版本基础上进行优化,实现了psync2.0协议,实现了增量同步。下面是Redis作者对协议的介绍:https://gist.github.com/antirez/ae068f95c0d084891305

三、DR切换

DR切换分为两种可能,一种是机房真的挂了或者出异常,需要进行切换,另外一种是机房仍然健康,但是由于演练、业务要求等原因仍然需要切换到另外的机房。XPipe处理机房切换的流程如下:

  • 检查是否可以进行DR切换

    类似于2PC协议,首先进行prepare,保证流程能顺利进行。

  • 原主机房master禁止写入

    此步骤,保证在迁移的过程中,只有一个master,解决在迁移过程中可能存在的数据丢失情况。

  • 提升新主机房master
  • 其它机房向新主机房同步

当然了,即使做了检查,也无法绝对保证整个迁移过程肯定能够成功,为此,我们提供回滚和重试功能。回滚功能可以回滚到初始的状态,重试功能可以在DBA人工介入的前提下,修复异常条件,继续进行切换。

根据以上分析,XPipe系统的整体架构如下所示:

Console用来管理多机房的元信息数据,同时提供用户界面,供用户进行配置和DR切换等操作。Keeper负责缓存Redis操作日志,并对跨机房传输进行压缩、加密等处理。Meta Server管理单机房内的所有keeper状态,并对异常状态进行纠正。

四、测试数据

我们关注的重点在于增加keeper后,平均延时的增加。测试方式如下图所示。从client发送数据至master,并且slave通过keyspacenotification的方式通知到client,整个测试延时时间为t1+t2+t3。

首先我们测试Redis master直接复制到slave的延时,为0.2ms。然后在master和slave之间增加一层keeper,整体延时增加0.1ms,到0.3ms。相较于多个DC之间几毫秒,几十毫秒的延时,增加一层keeper带来的延时是完全没问题的。

在携程生产环境进行了测试,生产环境两个机房之间的ping TTL约为0.61ms,经过跨数据中心的两层keeper后,测试得到的平均延时约为0.8ms,延时99.9线为2ms。

综上所述:XPipe主要解决Redis多数据中心数据同步以及DR切换问题,同时,由于XPipe增强后的Redis版本优化了psync协议,会极大的提升Redis集群的稳定性。

同时,整个系统已经开源,欢迎大家一起参与优化整个系统:

时间: 2024-10-12 04:29:36

开源 | 携程Redis多数据中心解决方案-XPipe的相关文章

携程 Apollo 配置中心传统 .NET 项目集成实践

官方文档存在的问题 可能由于 Apollo 配置中心的客户端源码一直处于更新中,导致其相关文档有些跟不上节奏,部分文档写的不规范,很容易给做对接的新手朋友造成误导. 比如,我在参考如下两个文档使用传统 .NET 客户端做接入的时候就发现了些问题. ctripcorp/apollo - .Net客户端使用指南 ctripcorp/apollo.net - .Net客户端之与 System.Configuration.ConfigurationManager 集成 两个文档关于标识应用身份的AppI

明晚直播!揭秘携程应用路由生态系统

携程每天要处理大量的请求,这些请求从发起至到达服务器之间,除了经过大量网络硬件外,还要经过多个应用层中间件框架. 这些中间件框架包括ApiGateway,SLB软负载,SOA服务调用框架,RPC调用框架等.这些请求种类繁多,有来自用户的,也有来自各种合作伙伴的:有HTTP的,也有TCP的:有要求易于调用的,也有要求高性能的:还有对安全及权限要求不同的. 如何为这些请求设计出合适的请求路径,需要这些中间件有机高效的协作.携程用了近3年时间打造出了现在的应用路由生态系统.我们将为大家首次揭秘这一生态

从携程事件给我们警示

从携程事件给我们警示 你准备好了吗? 如果携程事件发生在你身上,这个问题怎么处理?有无应对方案?怎样快速找出攻击的方式,方法? 有句话说的好,常在河边走,哪有不湿鞋. 程序是一波人一波人开发的 国内软件行业人员流动还是很频繁的,程序是一波人一波人开发的,有如击鼓传球,谁最后接手烂在谁手里谁倒霉. 我们发现国内的软件业在重复做着同样的工作,一次一次推倒重来,自己开发的,心里才有底,对于上一波人开发的系统,谁也不能保证安全性. 我看到很多QQ群在转发携程事件,还有携程内部聊天纪录以及电子邮件,都在幸

携程阿波罗(Apollo)配置中心

携程阿波罗(Apollo) https://www.cnblogs.com/xiaxiaolu/p/10025597.html 一.瞎扯点什么 1.1 阿波罗 ? 阿波罗是希腊神话中的光明之神.文艺之神,同时也是罗马神话中的太阳神:他是光明之神,从不说谎,光明磊落,在其身上找不到黑暗,也被称作真理之神.他非常聪明,通晓世事,是预言之神. 后世各种各样的项目都喜欢以阿波罗命名,比如著名的美国登月计划:阿波罗计划: 既然携程以阿波罗(Apollo)命名项目,那我们我们接下来看看,携程阿波罗能给我们程

分布式配置中心 携程 apollo

1.传统配置文件与分布式配置文件区别 传统配置文件:如果修改了配置文件,需要重新打包发布,重新发布服务,而且每个环境的变更配置文件,比较繁琐. 分布式配置文件:将配置文件注册到配置中心上去,可以使用分布式配置中心实时更新配置文件,统一管理配置文件,不需要重新打包发布. 2.常用的分布式配置中心框架有哪些 disconf(依赖于Zookeeper).Zookeeper(通过Watch事件监听实现).diamond(阿里产品).携程(apollo).Redis.xxl-config. 3.携程apo

携程呼叫中心异地双活——座席服务的高可用

携程呼叫中心异地双活--座席服务的高可用

CentOS 7 搭建基于携程Apollo(阿波罗)配置中心单机模式

Apollo(阿波罗)是携程框架部门研发的配置管理平台,能够集中化管理应用不同环境.不同集群的配置,配置修改后能够实时推送到应用端,并且具备规范的权限.流程治理等特性.服务端基于Spring Boot和Spring Cloud开发,打包后可以直接运行,不需要额外安装Tomcat等应用容器.Java客户端不依赖任何框架,能够运行于所有Java运行时环境,同时对Spring环境也有较好的支持..Net客户端不依赖任何框架,能够运行于所有.Net运行时环境,而且已经支持.NET Core. 官网:ht

携程框架团队对于应用监控系统的探索与思考

https://mp.weixin.qq.com/s/I6KDloBiQOfqWthDckKbGg 干货 | 携程框架团队对于应用监控系统的探索与思考 原创: 鄞劭涵 携程技术中心 昨天 作者简介 鄞劭涵,携程框架架构研发部高级软件工程师,爱丁堡大学高性能计算专业硕士.目前主要从事应用监控系统以及消息队列相关基础框架的研发. 一.为什么需要应用监控系统 随着市场环境的变化以及国际化的进程,企业的各种对内.对外需求也日益增长.服务化的架构以及容器化的应用加速了各种功能.产品的迭代与更新.随之而来,

携程第四代架构探秘之运维基础架构升级

作为国内最大的OTA公司,携程为数以亿计的海内外用户提供优质的旅游产品及服务.2014年底携程技术中心的框架.系统和运维团队共同启动了架构改造项目,历时2年,涉及所有业务线.本文回顾了携程在整个技术架构改造过程中的一些实践和收获. 一.写在前面 随着携程业务量迅速增长.业务变化越来越敏捷,对于应用交付的效率也提出了更高的要求.根据统计,截止2014年底携程总应用数在5000个左右,平均每周约有3000次以上的发布需求.所以作为整体交付环节中极为重要的一环,应用的部署和发布是提高交付效率的关键,然