干货 | 携程Redis海外机房数据同步实践
mhr18 2024-11-06 10:59 31 浏览 0 评论
作者简介
孟文超,携程技术中心框架研发部高级经理。2016年加入携程,目前负责框架数据(数据库,缓存)及相关项目。此前曾在大众点评工作,任基础架构部门通信团队负责人。
一、背景
随着携程国际化业务的发展,为了给海外用户提供更好的服务,公司开始在欧洲部署业务(使用Amazon云),欧洲的用户访问欧洲的本地服务。携程机票业务重依赖于Redis,同时目前的数据产生大部分都在上海,这样就对Redis数据同步至欧洲产生了极大的需求,部署在欧洲的业务只需读取Redis数据即可。
数据传输如果走专线,将会产生高昂的专线费用(1MB的带宽,每月约1万RMB),如果能够通过公网,基本可以将数据传输费用降低到忽略不计。这样产生了第二个需求:数据传输走公网。
XPipe(https://github.com/ctripcorp/x-pipe)是携程内部开源的一套Redis多机房系统,现有的功能在以往的基础上继续扩展,可以参考公众号的另外一篇文章《携程Redis多数据中心解决方案-XPipe》。
二、系统分析设计
在这样的需求背景下,产生了下面几个问题:
- 公网数据网络传输性能不可靠,Redis内存缓存的增量数据有限,是否会产生频繁的全量同步?
- 数据如何从上海内网传输至公网,再传输至Amazon内网?
- 公网传输的性能能满足业务需求吗,会不会导致延时过高,甚至无法追上上海的数据产生速度?
2.1 Redis全量同步问题
Redis数据复制本身的工作原理可以参考一下官方手册:
https://redis.io/topics/replication。
本质上是说在Redis Master内存里面会以RingBuffer的数据结构缓存一段增量数据;如果网络瞬断的话,slave将会继续从自上一次中断的位置同步数据,如果续不上,就会进行一次全量同步。
因为数据在内存中缓存,而内存有限且昂贵,一个思路就是将数据缓存在磁盘里面。
在我们的具体方案中,设计了一个Keeper节点,作为Redis Slave向Master同步数据,同时将同步后的数据存入本地磁盘,海外数据同步通过Keeper进行数据传输,这样就产生了下面的结构:
关于Keeper的高可用及其相关的设计,可以参考前文所述的公众号文章。
2.2 数据从上海内网传输到公网问题
公网到内网调用可以使用反向代理软件,因为Redis协议为基于TCP自定义的文本协议,因此我们要使用支持TCP的反向代理工具。
Http的反向代理可以通过域名、URL等信息进行路由,定位到目标服务器;TCP协议的反向代理通过暴漏的端口来路由到不同的服务器集群。
公司内部的的Redis集群非常多,如果使用目前的反向代理软件,就意味着要在公网开多个端口,不同的端口路由到不同的Redis集群,单个IP支持的端口有限,过多端口也会带来更多的安全以及管理问题。
基于此,我们设计了支持动态路由的TCP Proxy,假设有四个点:S(Source) P1(Proxy) P2(Proxy) D(Destination),A需要通过Proxy建立到D的连接,整个过程如下:
- S建立到P1的TCP连接
- S发送路由信息:proxy route P2 D
- P1收到信息后建立到P2的tcp连接
- P1发送路由信息:proxy route D
- P2收到路由信息后建立到D的tcp连接
整体架构图如下:
如上图所示,上述箭头方向为数据传输方向,TCP连接建立方向正好相反。Pxory本身无状态,所以天然可以做到高可用;Proxy本身支持数据加密、压缩等功能。
用户可能会产生疑问,为什么欧洲还需要一组Proxy集群,而不是Keeper直接连接上海的Proxy?
这个主要是基于功能隔离的考虑,Proxy专注处理好加密、压缩等传输层需要考虑的问题,Keeper只需要考虑业务相关的功能。加密、压缩算法的优化和变更不会影响Keeper 。
2.3 公网传输性能问题
一般考虑网络问题时,需要考虑带宽、延时、丢包三组要素,公网传输是高带宽,高延时,高丢包。网络上有很多关于Long Fat Network以及网络性能调优的文章,具体不赘述,这里主要描述一下整个实践过程。
首先我们调整了TCP的发送接收窗口:
net.core.wmem_max=50485760 net.core.rmem_max=50485760 net.ipv4.tcp_rmem=4096 87380 50485760 net.ipv4.tcp_wmem=4096 87380 50485760 |
上海到欧洲的网络延时在200ms左右,调整完成之后发现在24小时的稳定性测试中,会有多个时间点带宽无法打上去,导致数据同步延时过高。仔细观察了一下当时TCP连接的状态(通过ss命令),发现发送数据时,TCP发送窗口(cwnd)因为时不时的丢包,导致一直很小,问题主要出在数据发送方。
据此,我们在测试环境比较了多种发送端的拥塞控制(CongestionControl)算法:Cubic, Reno, Htcp. BBR,下面是在1%丢包率下不同算法带宽比较:
算法 | 平均带宽 |
Cubic | 0.15 MBytes/sec |
Htcp | 0.11 MBytes/sec |
Reno | 0.09 MBytes/sec· |
BBR | 13.6 MBytes/sec· |
在测试Case下,BBR算法的带宽比其他算法提升了几乎100倍,其他丢包率的情况下,也有更好的表现。关于BBR算法的更多资料可以参考:
https://netdevconf.org/1.2/papers/bbr-netdev-1.2.new.new.pdf
因为我们的场景中数据发送方是在上海,所以在上海端的服务器部署了BBR算法,下面是在10MB数据传输速率下,公网24小时延时测试数据(单位为纳秒),数据最大延迟为88S。
公网和专线比较:
公网 | 专线 | |
丢包 | 高(约1%) | 低(约0.05%) |
带宽 | 高 | 低 |
延时 | 中 | 中 |
价格 | 非常低 | 高,1W RMB/MByte/月 |
2.4 监控、报警
整个系统中最重要的指标是数据从上海到欧洲的延时是多少。根据此数据可以判定系统是否健康。系统延时监控架构如下图所示:
测试Client Publish一个时间戳数据给Master,然后将这个数据从Slave这边订阅收回,整个延时测试时间为:T1+T2+T3+T4。将数据收回计算延时时间主要是为了避免不同服务器时钟不一致产生的影响。
为什么数据订阅走专线?
- 监控系统两秒Publish一个时间戳,数据量足够小,不会占用过大专线带宽
- 我们关注的延时其实主要是T1+T2的时间。专线比较稳定,如果数据传输到欧洲走公网,订阅回来也走公网,可能会导致延时测试数据不准确
为什么数据订阅通过Proxy转发?
这个主要是公司安全策略问题,欧洲的服务器只暴漏出了有限的端口供上海访问,而Redis服务器可能部署在很多的端口上面,这样可以通过Proxy进行转发代理。
2.5 整体系统架构
整体系统架构如上图所示。Console用来管理多机房的元信息数据,同时提供用户界面,供用户进行配置和DR切换等操作。Keeper负责缓存Redis操作日志。Proxy主要解决公网传输问题。Meta Server管理单机房内的所有Keeper状态,并对异常状态进行纠正。Zookeer用来供Meta Server和Keeper进行Leader选举。
三、实践结果
整个系统目前从2018年7月上线,稳定运行至今。下图是某一业务集群的一个分片30天延时监控数据(单位为微秒)。平均延时180ms左右,最大可能波动到1-2min。
同时,整个系统已开源:
XPipe:https://github.com/ctripcorp/x-pipe(点击阅读原文直达)
【推荐阅读】
携程一次Redis迁移容器后Slowlog"异常"分析
携程国际站点Trip.com的无线异步启动框架
携程数据库高可用和容灾架构演进
携程Hybrid代码评审服务
携程机票日志追踪系统架构演进
相关推荐
- 【推荐】一个开源免费、AI 驱动的智能数据管理系统,支持多数据库
-
如果您对源码&技术感兴趣,请点赞+收藏+转发+关注,大家的支持是我分享最大的动力!!!.前言在当今数据驱动的时代,高效、智能地管理数据已成为企业和个人不可或缺的能力。为了满足这一需求,我们推出了这款开...
- Pure Storage推出统一数据管理云平台及新闪存阵列
-
PureStorage公司今日推出企业数据云(EnterpriseDataCloud),称其为组织在混合环境中存储、管理和使用数据方式的全面架构升级。该公司表示,EDC使组织能够在本地、云端和混...
- 对Java学习的10条建议(对java课程的建议)
-
不少Java的初学者一开始都是信心满满准备迎接挑战,但是经过一段时间的学习之后,多少都会碰到各种挫败,以下北风网就总结一些对于初学者非常有用的建议,希望能够给他们解决现实中的问题。Java编程的准备:...
- SQLShift 重大更新:Oracle→PostgreSQL 存储过程转换功能上线!
-
官网:https://sqlshift.cn/6月,SQLShift迎来重大版本更新!作为国内首个支持Oracle->OceanBase存储过程智能转换的工具,SQLShift在过去一...
- JDK21有没有什么稳定、简单又强势的特性?
-
佳未阿里云开发者2025年03月05日08:30浙江阿里妹导读这篇文章主要介绍了Java虚拟线程的发展及其在AJDK中的实现和优化。阅前声明:本文介绍的内容基于AJDK21.0.5[1]以及以上...
- 「松勤软件测试」网站总出现404 bug?总结8个原因,不信解决不了
-
在进行网站测试的时候,有没有碰到过网站崩溃,打不开,出现404错误等各种现象,如果你碰到了,那么恭喜你,你的网站出问题了,是什么原因导致网站出问题呢,根据松勤软件测试的总结如下:01数据库中的表空间不...
- Java面试题及答案最全总结(2025版)
-
大家好,我是Java面试陪考员最近很多小伙伴在忙着找工作,给大家整理了一份非常全面的Java面试题及答案。涉及的内容非常全面,包含:Spring、MySQL、JVM、Redis、Linux、Sprin...
- 数据库日常运维工作内容(数据库日常运维 工作内容)
-
#数据库日常运维工作包括哪些内容?#数据库日常运维工作是一个涵盖多个层面的综合性任务,以下是详细的分类和内容说明:一、数据库运维核心工作监控与告警性能监控:实时监控CPU、内存、I/O、连接数、锁等待...
- 分布式之系统底层原理(上)(底层分布式技术)
-
作者:allanpan,腾讯IEG高级后台工程师导言分布式事务是分布式系统必不可少的组成部分,基本上只要实现一个分布式系统就逃不开对分布式事务的支持。本文从分布式事务这个概念切入,尝试对分布式事务...
- oracle 死锁了怎么办?kill 进程 直接上干货
-
1、查看死锁是否存在selectusername,lockwait,status,machine,programfromv$sessionwheresidin(selectsession...
- SpringBoot 各种分页查询方式详解(全网最全)
-
一、分页查询基础概念与原理1.1什么是分页查询分页查询是指将大量数据分割成多个小块(页)进行展示的技术,它是现代Web应用中必不可少的功能。想象一下你去图书馆找书,如果所有书都堆在一张桌子上,你很难...
- 《战场兄弟》全事件攻略 一般事件合同事件红装及隐藏职业攻略
-
《战场兄弟》全事件攻略,一般事件合同事件红装及隐藏职业攻略。《战场兄弟》事件奖励,事件条件。《战场兄弟》是OverhypeStudios制作发行的一款由xcom和桌游为灵感来源,以中世纪、低魔奇幻为...
- LoadRunner(loadrunner录制不到脚本)
-
一、核心组件与工作流程LoadRunner性能测试工具-并发测试-正版软件下载-使用教程-价格-官方代理商的架构围绕三大核心组件构建,形成完整测试闭环:VirtualUserGenerator(...
- Redis数据类型介绍(redis 数据类型)
-
介绍Redis支持五种数据类型:String(字符串),Hash(哈希),List(列表),Set(集合)及Zset(sortedset:有序集合)。1、字符串类型概述1.1、数据类型Redis支持...
- RMAN备份监控及优化总结(rman备份原理)
-
今天主要介绍一下如何对RMAN备份监控及优化,这里就不讲rman备份的一些原理了,仅供参考。一、监控RMAN备份1、确定备份源与备份设备的最大速度从磁盘读的速度和磁带写的带度、备份的速度不可能超出这两...
你 发表评论:
欢迎- 一周热门
- 最近发表
- 标签列表
-
- oracle位图索引 (63)
- oracle批量插入数据 (62)
- oracle事务隔离级别 (53)
- oracle 空为0 (50)
- oracle主从同步 (55)
- oracle 乐观锁 (51)
- redis 命令 (78)
- php redis (88)
- redis 存储 (66)
- redis 锁 (69)
- 启动 redis (66)
- redis 时间 (56)
- redis 删除 (67)
- redis内存 (57)
- redis并发 (52)
- redis 主从 (69)
- redis 订阅 (51)
- redis 登录 (54)
- redis 面试 (58)
- 阿里 redis (59)
- redis 搭建 (53)
- redis的缓存 (55)
- lua redis (58)
- redis 连接池 (61)
- redis 限流 (51)