分布式系统技术难题--异地多活

640?wx_fmt=png

什么是异地多活?

为了保证系统能够对机房级别的故障进行容错,不会使系统不可用,这就需要在机房级别对系统进行冗余处理。而这就需要在架构上进行良好的设计。来面对多机房场景下的技术挑战。事实上,异地多活最大的挑战在于机房之间的物理距离更远,数据传输的延迟已经不能忽略。在网络普遍延迟的情况下,如何根据业务特性设计高可用的性能达标的分布式系统,将是最大的挑战。

640?wx_fmt=png

640?wx_fmt=png

异地多活常见的解决方案有哪些?

  1. 请求如何路由,如何实现会话保持?

对于请求路由问题,其设计目标在于,让特定用户访问特定的机房,并且可以实现流量分发策略控制,根据IP会话保持。而在于特定业务中,可以根据制定更加复杂的路由规则,利用前端传递来的标签,做路由策略转发。让特定的一些用户在同一个机房中,例如饿了吗,基于附近地区的业务场景,用户,骑手,商家都是在同一个地区。我们通过区分哪些用户在同一个地区,机房按地区进行业务划分。这样商家,用户,骑手的整个核心业务流程会在一个机房中完成,避免了跨机房调用造成延迟,用户下单几分钟,商家才接到订单,骑手接单到派送时间被延长。所以实现一个机房外的路由组件是很有必要的,在机房级别添加一个路由网关。常见的做法就是基于用户ID进行HASH的方式将用户固定在一个机房处理该用户相关的所有业务逻辑。

2. 数据存储服务如何同步?

对于数据存储问题是网络延迟造成最大影响的地方。在常见的解决方案中有多机房单集群,和多机房多集群部署两种.数据的同步可以分为,数据库,缓存,消息队列,session等。在多机房单集群中如何部署? 及整个系统中存储服务是唯一的一个集群,只有一个master节点.做读写分离设计,所有机房上的服务只能向数据存储集群上的master节点提交写请求,而在读数据时向自己机房上的salve节点提交请求。数据的同步委托给基础组件完成,可以利用数据本身的数据同步方案,但通常无法结合业务特性进行优化提高性能,redis 本身的数据同步在master同步salve时会导致salve不可用,mysql自身的同步方案性能和稳定性都比较差。这时需要团队亲自制定化数据同步组件。来保证多个机房上的数据全量同步。还可以基于消息队列来实现数据同步,但这会导致额外的带宽占用,更可以搭建专用网络线路解决。无论任何的同步方式,在业务端需要对访问数据库的客户端进行重构使其能够支持读写分离。并且为了防止网络延迟,我们可以在客户端做很多事情,第一,双写:多个机房下允许出现多个Master,那么客户端进行封装在底层将写请求发送给多个Master上。第二:双读或回源读,当读取本机房数据没有读到时,去主机房读取或者根据用户请求解析出数据源在哪个机房然后去读取。

3. 是否可以跨机房服务调用?延迟提高,占据更多的网络带宽怎么办?

内部RPC等禁止跨主机调用,这样可以防止数据被依赖。避免对专用网络占用更多的带宽。并且当一个机房不可用后不会影响可用机房的业务运行。

4. 当某个机房不可用时,需将该机房的流量切入另一个机房,那么每个机房要预留多少存储与计算资源?

一般经过测试评估,每个机房预留S级服务承载的流量资源。

5. 一些devops组件如何支持跨机房部署环境?

监控系统,部署系统等如何汇总所有机房的数据,还是将其区分开? 一般来说,devops组件需要对多机房部署进行升级,增加机房选项。在多机房部署中,日志数据可汇总到统一的数据区处理,日志记录通常异步进行即可。

6. 对于强一致性业务如何保证?

对于强一致数据,应建立多机房单集群的部署模式,使用双读策略。多机房多集群模式,采用双写策略。

7. 如何拆分业务,保证最大限度的避免跨机房延迟

将业务按照,流量大的业务,核心业务,产生收入的业务进行拆分,优先保证核心业务的多机房部署。将这些业务的整体流程逻辑放在一个机房内处理。列如饿了吗按照 地域信息进行流量切分,将用户下单,卖家接单,骑手接单配送这个核心流程尽量放在一台服务器处理。阿里就按用户ID路由,大型网游可能按照服务区对用户处理流程限定在某个特定机房中。

---------------------------------------------------------

老钱点评:双机房就好比人的左右脑,机房之间的网络就是胼胝体。现在胼胝体坏了,还必须保证这个人能正常的生活,吃喝拉撒睡都还能干,这确实是一件非常不容易的事。

640?wx_fmt=png

码洞历史文章

5. LevelDB 数据文件 SSTable 的结构

4. LevelDB 的整体架构

3. LevelDB 代码撸起来

2. 全面了解 LevelDB 的功能特性

1. 既生 Redis 何生 LevelDB ?

《快学 Go 语言》第 16 课 —— 包管理 GOPATH 和 Vendor

《快学 Go 语言》第 15 课 —— 反射

《快学 Go 语言》第 14 课 —— 魔术变性指针

《快学 Go 语言》第 13 课 —— 并发与安全

《快学 Go 语言》第 12 课 —— 通道

《快学 Go 语言》第 11 课 —— 协程

《快学 Go 语言》第 10 课 —— 错误与异常

《快学 Go 语言》第 9 课 —— 接口

《快学 Go 语言》第 8 课 —— 结构体

《快学 Go 语言》第 7 课 —— 字符串

《快学 Go 语言》第 6 课 —— 字典

《快学 Go 语言》第 5 课 —— 神奇的切片

《快学 Go 语言》第 4 课 —— 低调的数组

《快学 Go 语言》第 3 课 —— 分支与循环

《快学 Go 语言》第 2 课 —— 变量基础

《快学 Go 语言》第 1 课 —— Hello World

Go  语言切片的三种特殊状态

不安分的 Go 语言开始入侵 Web 前端领域了

Go 语言之父 Rob Pike

短小精悍之 Redis 命令行工具有趣的罕见用法

欲求不满之 Redis Lua 脚本的执行原理

自己动手实现 Shell多进程套套符

我们天天都在使用的管道命令,Shell 在里面到底动了什么手脚?

见微知著 —— Redis 字符串内部结构源码分析

RPC 服务器之【多进程描述符传递】高阶模型

老板们都应该学一学 Redis,它能管理上亿对象,你们呢?

见缝插针 —— 深入 Redis HyperLogLog 内部数据结构分析

跋山涉水 —— 深入 Redis 字典遍历

《Redis深度历险》《深入理解RPC》答读者问

如履薄冰 —— Redis懒惰删除的巨大牺牲

通俗易懂的Redis数据结构基础教程

Redis作者Antirez经历的「性别歧视」风波

我为Redis找到了一个新家——VMWare

让我来告诉你为什么做女程序媛很好

【动画】当我们在读写Socket时,我们究竟在读写什么?

跟着动画学习TCP三次握手和四次挥手

求不更学不动之Redis5.0新特性Stream尝鲜

深入Python多进程编程基础——图文版

深入Python多进程通信原理与实战——图文

Python最广为使用的并发库futures使用入门与内部原理

巧用Google Fire简化Python命令行程序

Github上最受欢迎的Python框架Flask入门

看完Java的动态代理技术——Pythoner笑了

知道Python语言的Google Fire项目么,我将它移植到了Java上

蚂蚁金服RPC框架结构分析

为什么阿里的员工要带着工牌逛街?

全栈虚拟机GraalVM初体验

基于Netty自己动手编写RPC框架

自己动手实现一个极简Web框架

核心技术靠化缘是要不来的——自己动手写ORM框架

200行Java代码实现依赖注入框架

一个Raft开源项目的结构分析

Raft协议精解

Raft只读操作实现要点

水塘抽样与阶层固化

深度解析某头条的一道面试题

基于Netty实现Redis协议的编码解码器

Shell文本处理编写单行指令的诀窍

天下无难试之Redis面试刁难大全

天下无难试之HTTP协议面试刁难大全

鲜为人知的HTTP协议头字段详解大全

HTTP协议冷知识大全

天下无难试之ArrayList面试刁难大全

天下无难试之HashMap面试刁难大全

人工稚能之sklearn线性回归

人工稚能之sklearn聚类

人工稚能之sklearn分类

人工稚能之sklearn数据降维

服务发现的基本原理

徒手教你使用zookeeper编写服务发现

以太坊合约分析之远程购买

以太坊合约分析之拍卖算法

面向程序猿的比特币教程之数据结构基础

深度学习Java之内存模型【译】

Java与CPU缓存的亲密接触之「伪共享」

你没读过的Jetty使用入门

Java高阶必备之Netty基础原理

轻量级框架Spark快速入门

Guice快速入门

如何解决Java线程池队列过饱问题

如何优雅的关闭Go Channel【译】

Channel最佳实践之基本规则【译】

依赖注入不是Java的专利,Golang也有

会玩Go!会玩Python!嘭!Go-Python!

GopherLua基础入门

有趣的Python开源库之Hashids

一种简单的Failover机制

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值