高德:Redis深度实践,助力实现“现实与互联网世界的底图梦”

  • 时间:
  • 浏览:0



Cache场景主要偏向机房和机房之间整个应用的部署。当业务做到一定规模的本来我,可靠性就这麼做到,时需依赖这个这个环境。例如阿里云的这个技术在下层会有这个这个链路、机房、甚至说这个技术提供商的劫持问题图片,在做服务时,也相应地诞生非常多的为社 让性。

未来,高德会同阿里云一道设计就近接入的方案,该业务和地理位置角度相关,把用户数据放进去去离他比较近的地方。我我人太好本来我把用户的数据按照对应纬度或所属地区的纬度切分到对应的机房去,用干预的方式尽量选到所属的主节点,在主节点没了问题图片的情况下,希望用户的数据从哪里写就从哪里读。这个机房会作为他异步传输的同步。

先从最简单的同城双机房开始英文英文英文。当业务达到一定程度时,时需部署双机房,通常会选在同有有一个 城市,将应用成本降到最低。将其中有有一个 机房当做Cache用,通常是把它直接落到有有一个 地方,这就至少有有有一个 机房,为社 让Redis只在有有一个 机房里。这是最简单的,也是业务方面极为常见的有有一个 场景。在做有有一个 新业务的时,都时需先用这个方式过渡,当业务量不大时,这是最快的这个方式。这个点也说明了服务化还有很长的路要走;为社 让服务化做得好,会直接达到非常完美的情况。

下面来看一下机房之间的Redis应用。

下面这个步这个这其他人都会遇到,当数据热了要重新分布就会有Proxy的改造方案,至少把数据的分布策略和动态的重新平衡策略做进DB,不再拿给业务做。这是为社 让当只有有有一个 主流业务,都时需全身心关注;为社 让为社 让有20个业务,每天有的是不同的出问题图片,这有的是了Proxy的方案,希望把整个发现这个这个这个这个放进去去Redis底下,业务前会Care。典型的逻辑是把服务的发现和Hash这个这个这个这个放进去去有有一个 Proxy层底下,为社 让通过有有一个 额外配置的底下管理去Client,使其知道应该读哪个Proxy。



高德主营地图业务,会有这个数据更新的场景,比如今天通过数据挖掘发现有一家加油站不营业,那为社 发现呢。本来我说本来我在9点钟的本来我,用户的定位点这里会有50辆车,今天发现只有一千公里或都这麼了,本来我持续了一定时间后,就知道出问题图片了,再去查证,这个这个就会有数据的更新。最土的方式本来我不把一批量的数据更新,而以A/B集群的方式更新,本来我都时需处置这个这个写入本来我的延迟对整个性能的影响问题图片。这时写入是有有一个 持续的操作,当写入完成的本来我会有有有一个 校验的流程,当一切确认的本来我,会切换进去(这里有有有一个 冷集群和有有一个 热集群)。这是地图行业比较讨巧的有有一个 做法,在纯线上业务为社 让不太会这麼做,但在这个集中性的数据发布时就比较常见。

顺便提一下分片混合部署,现在高德前会有较大的抖动,数据自动地分布到不同的机房和节点,都时需保证有有一个 小分片同都会有有有一个 副本,且没了同有有一个 机器上。这也使得数据向下切割成有有一个 分片时保证存储可靠,为社 让它始终会有有有一个 Primary的主写入节点。

上图左下角表达的是业务监控系统监控机房,当压力比较大都会有这个抖动,这时需判断需不时需响应。目前,架构中存在两套业务监控系统:一套是性能层面;一套是语义层面。即有有有一个 监测内存、CPU等;有有有一个 负责业务。



计费集群也是Redis的上层应用。在跨机房之间有ZK的全职,底下的Redis互相不同步,只有本机房的信息,计费集群跨机房择主,这麼这个线程就会向被选为主的集群写入信息来归总这份数据,底下为社 让涉及到无法选则或无法连接的情况,(为社 让是Snapshot场景)它会听候可用。本来我说你规定了15秒的快照时间,有为社 让为社 让推迟会变成50秒或40秒,这麼在计费集群的HBase下面会有有有一个 Open TSDB做真正的存储。上层的Redis会保留一段时间,为社 让出现这个计算错误或用户投诉,就反查回来看一下是有的是有问题图片,但本质上是以最终落地的那份数据为主。但这个例子有的是实时,计费报表并有的是马上出,为社 让第5天或过5天才出。这个这个这里在业务上做了这个选则,会把实时牺牲掉来保证正确性或性能。

高德在Codis方面起步较晚。目前,高德所有的主流业务有的是自家的平台上;还有这个业务依赖Redis。利用Codis部署将上层流量分下来,再通过业务化Hash将其分到不同的分组去,也为社 让是同城有有一个 机房的某个地方;图中的ZK既用作Master接入点的发现,也用来做分组信息的维护。在此类场景中,有有一个 实例上或多个实例上会有不同的GROUP,通过分组信息,找到这个GROUP,再把数据写进去为社 让读出来,整体的读取或写入流量是由上层通过业务负载进行转发。





谈到同步,上图我我人太好是Albiter的图,但在Redis里也相同。当在同城之间时需判断主和从否是 要时需提升时,我我人太好只有依赖有有一个 节点的判断来做。这是为社 让:一是两者之间这麼方式判断谁是活的、谁是死的,亲戚亲戚他们都我人太好被委托人是活的;还有有有一个 原困是网络抖动很有为社 让在很短的时间存在并在很短的时间内恢复,比如说抖动了5秒或6秒,这时对持久化数据库的简单主从的提升操作会加剧数据的不一致,这个这个会引入第有有一个 机房来帮助判断。

为社 让Cache场景都时需简单粗暴的处置这个问题图片,尽为社 让拿到98%、99%的收益。采用这个方式的好处是:读和写非常稳定。这里时需注意的是同城之间,为社 让同城之间的风险本来我在双写的那一刻,有的是写失败的问题图片,本来我我不知道有这麼写成功。同城双机房缓存双写的情况是只读被委托人的,放弃写入到A或B,它会像当前逻辑上的Master去做写入,这个这个这个本来我是跨机房的。

第二种也很简单:在业务层面做这个选则。例如有有一个 机房,并希望读取的次数高时,都时需做有有一个 双写。这有的是有有一个 正统和学术的方式,它会原困一致性的问题图片:为社 让双写时本机房的写好了但超时了,这时就我不知道写没写进去。

目前用户使用的高德地图,我我人太好是C端地图,另外还有有有一个 出口:有有一个 是车机地图;另外有有一个 是开放平台。开放平台本来我行业企业公司合作 ,比如说使用打车应用或社交应用会请求高德的API,简单地说,本来我SDK和API的业务。

在2016杭州云栖大会的“开源数据库之Redis专场”上,高德开放平台总经理童遥带来了题为《高德经典数据库实践案例分享》精彩演讲。演讲中,他主要介绍了高德业务下的经典数据库实践案例。

最后简单分享一下真正的挑战,本来我讲的这个这个场景有的是选则。读完马上就要写的业务,这个场景最难。





以下内容根据演讲PPT及现场分享架构设计 。

持久化场景

这其中除了涉及到数据搬迁,还有最上层的流量分配(怎样保证把用户架构设计 到正确的地方去)。高大上的答案是都时需通过地域化的DNS,但都会有百分之几比例的用户会发错,这个情况下就通过7层把流量转发过去,此都会有50毫秒的IT开销甚至数以倍计的可靠性的下降,这本来我有有一个 短暂的方式,将来会通过Channel的建设,DNS的解析等尽量去提高架构设计 的比例,这也是高德正在做的有有一个 事情。

作为互联网世界底图,目前10部手机中有的是9部在使用高德的位置服务,简单介绍下有有一个 行业的案例:高德开放平台为国内85%的车行App提供地图、导航和路径规划服务;为市场中超过50%的外卖App提供地图和定位服务;为50%的主流社交应用提供精准位置和搜索功能,如发微博时的地点定位。目前,至少有50万款应用正在使用高德开放平台业务。

异地单元化&就近接入

接下来到高德真正利用到Redis原生机制做双机房同步的本来我了:为了缓存同步的一致性,将数据化打开,采用持久化去做同步。但实际在这个情况下,有有有一个 机制判断当前谁是主、谁是从、哪里是写入点,把它写入到对应的Master底下,为社 让这个节点会依照Redis把它拷贝过去。

在跨城的场景下,以计费为例。计费是流量的统计,本来我说有有一个 开放平台,发流量配额给这个企业公司合作 伙伴,你还还里能 一分钟50万的配额,那你的请求实际上是落到全国各地阿里云的机房,那怎样快速有效地统计哪些流量,在超量的本来我及时告诉你呢?





高德经典数据库应用场景

Codis集群部署

Cache场景



现在描述数据更新业务的本来我,实际上在更新本来我会有有有一个 ZK的机制做切换,业务会自动地通过信息知道现在存在哪个集群。当新集群上线本来我,旧集群会听候下一次数据更新。

高德的经典数据库应用场景底下怎样一并为C端和B端用户提供全量服务的呢?实际上两者模式完整版不一样,C端有高峰,对于高德,为社 让十一的第一天本来我C端的高峰;对于微博来讲,女排夺冠那天为社 让本来我高峰;但B端很坑,它的高峰每天有的是,50万个应用每天有的是被委托人的业务高峰,它们其他人的高峰本来我B端的高峰。

这是有有一个 核心问题图片,我我人太好是有有一个 跨机房汇总问题图片。也本来我说,为社 让每个流量收一毛钱,那用户设置的本来我,我只你还还里能 50万流量,超过就停掉,那跨机房统计费用的及时性就直接原困了控制否是 准确。但为社 让为社 让数据的不同步,在外地多跑了6万,那这6万就收只有钱。本质上这是有有一个 时效性问题图片,为社 让接入点在多个机房,为社 让机房距离比较远,那为社 保证时效的正确性?基本做法是在所有机房的接入层把所有流量原封不动地写入到缓存集群;为社 让缓存集群会分带宽单位做出有有一个 Snapshot,带宽单位随着业务压力大小而变化,并直接影响到计费统计的反应能力。本来我超量就会发现,带宽单位会保证流量及时地记录下来。记下来本来我会通过阶段性的Snapshot,专门有有有一个 线程往计费集群中写。