Su的技术博客

  • 首页
  • 原创
  • 视频
  • Java
  • MySQL
  • DDD
  • 事故复盘
  • 架构方案
  • AI
  • Other
  • 工具
    • AI工具集
    • 工具清单
    • JSON在线格式化
    • JSON在线比较
    • SQL在线格式化
  • 打赏
  • 关于
路很长,又很短
  1. 首页
  2. 架构方案
  3. 正文
                           

【八戒】历经 16 年猪八戒网如何成功实现双活流量架构

2023-02-19 1610点热度 0人点赞 0条评论

猪八戒网随着业务访问量的直线增长,用户增长达到一定规模后,同时面临着高并发业务和海量数据的挑战,传统单机房在服务器容量上存在瓶颈,而且在一些不可预知场景下,导致整个网站出现故障,例如机房断电、火灾等这些不可抗拒因素都会导致所有服务器出现宕机从而导致业务瘫痪,即使有备份,恢复业务花费的时间也比较长。所以公司根据实际业务情况选择了同城双活流量高可用架构,当然还有两地三中心、异地多活等方案。本文主要基于同城双活流量叙述猪八戒网这 16 年的双活流量架构演进之路。

初期

2014 年前猪八戒网的服务器都是托管于传统 IDC 机房,虽然业务应用、基础组件、数据库等都设计了高可用模式,但是避免不了机房宕机导致整个网站出现故障的问题。如图 1:

    图 1:单点机房

直到 2015 年初的时候,由于机房人员日常维护的时候,不小心把我们的核心交换机网线碰松了,然后导致整个猪八戒网打不开,我们通过各种排错才定位到这个问题,经过此事件后,上层领导高度重视网站的可用性问题,为了解决机房不可控的因素,所以 2015 年中旬开始建设备用机房,解决机房单点问题。(注:当时基础组件及业务应用不具备双活条件,只支持主备架构模式)如图 2

优点:

·主机房发生故障时,通过 DNS 解析到备用机房,解决机房单点故障问题;

·主备架构模式简单,持久化数据异步同步到备用机房,不用考虑脑裂问题。

 缺点:

·由于备用机房平时处于空闲状态,造成大量资源浪费问题。

图 2:同城主备

中期

经过 1-2 年的迭代,大概在 2017 年的时候,随着基础组件的升级改造,例如:数据库、缓存、队列、对象存储、配置中心等都支持了双活流量架构模式,然后业务应用纷纷改造适配双活流量架构模式。终于我们可以把网站域名同时解析到 2 个机房了。如图 3:

图 3:同城双活(基于 DNS 的双活)

基于 DNS 切换流量模式还是有瑕疵的,在猪八戒网运行了 3 年左右,在此期间多次出现某机房不稳定事件进行全局流量切换,主要问题体现在某些 DNS 服务器不跟着协议走,导致切换流量生效时间慢,流量切换不彻底的问题。

提示:一般情况我们遇到的单个机房故障,主要体现在基础组件、业务大面积瘫痪等问题上,不涉及到入网流量的问题,假如真的是入网流量异常了,也只有等 DNS 解析生效了。

鉴于以上遇到的问题,我们换个思路解决如何快速切换流量,最终方案是在 HTTPS 层的 Nginx(ngx_lua)代理服务器实现快速动态分流的功能(项目为:Signpost),为什么采用 ngx_lua?因为 ngx_lua 在猪八戒网稳定运行 5 年+,不管是开发效率及性能,Lua 有着天然的优势,语言表达能力也更强,而且 ngx_lua 是同步非阻塞(100% non-blocking)的,再次感谢章亦春 (agentzh)大佬的开源作品 lua-nginx-module。如图 4:

图 4:HTTPS 代理层分流

如何基于 ngx_lua 设计动态分流功能呢?简单通俗一点就是如何快速动态切换 nginx 的 upstream 进行分流而不执行 nginx reload。关于 Upstream 是如何动态生成的?请查阅上篇:【技术分享】猪八戒网Nginx的动态服务发现演进之路

首先管理人员配置分流策略到 CMDB 系统中,然后 CMDB 同步到 Redis 缓存,当用户请求时,Nginx 接受到请求后,先从 worker 缓存获取分流策略,如果 worker 缓存没有,就到 lua_shared_dict 缓存获取,如果 lua_shared_dict 也没有,那就到 Redis 中读取,然后依次缓存,根据匹配的分流策略执行指令。假如没有获取到分流策略,那就按照默认策略分流。如图 5:

图 5:动态切换 Upstream 架构

为什么会有三级缓存?因为 worker 缓存支持数据结构缓存,而且没有锁竞争,lua_shared_dict 缓存有锁竞争,不支持数据结构存储,Redis 缓存需要 TCP 连接消耗,最终都是为了性能!

现在

经历了数月的开发及基础架构改造,终于在 2020 年 9 月初,基于 HTTPS 层的 Nginx(ngx_lua)快速动态分流的功能成功上线了,主要支持了全局模式、单域名模式的流量切换,还额外支持了域名动态 HTTP/HTTPS 协议切换。如图 6 - 9:

图 6:同城双活(基于 NGX_LUA 的 Signpost)

图 7:双活流量控制台

图 8:单域名切换功能

图 9:单域名切换日志

最后,关于 Signpost 软件的主要特性,支持多活流量管理,根据不同维度进行分流,例如:IP 段、地区、Cookie、浏览器、GET 参数等,流量切换可以精确到秒级,而且全程用户零感知。

希望以上内容能对有需要的人有所帮助

欢迎大家一起探讨交流

更多文章:

  1. 系统设计入门:成为高级软件工程师的指南
  2. 一次 Redis 事务使用不当引发的生产事故
  3. QQ音乐高可用架构体系
  4. 系统设计 | 应用系统缓存
  5. 你需要知道的后端软件工程师技术栈思维导图
  6. 分布式唯一 ID 生成方案浅谈
  7. 6种限流实现,附代码![通俗易懂]
  8. 9.包和命名空间(译)
  9. 2021.07.13 我们是这样崩的
  10. 系统设计 | 业务编号生成
标签: 八戒 双活 同城主备 灾备 架构
最后更新:2023-02-19

coder

分享干货文章,学习先进经验。

打赏 点赞
< 上一篇
下一篇 >
广告
最新 热点 推荐
最新 热点 推荐
干货 | 论Elasticsearch数据建模的重要性 马蜂窝消息总线——面向业务的消息服务设计 基于 MySQL Binlog 实现可配置的异构数据同步 视频笔记:Google发布Agent2Agent协议 视频笔记:什么是微服务,为什么是微服务? 视频笔记:什么是AI 智能体? 视频笔记:什么是Flink? 如何秒级实现接口间“幂等”补偿:一款轻量级仿幂等数据校正处理辅助工具
Elasticsearch 使用误区之六——富文本内容写入前不清洗基于 MySQL Binlog 实现可配置的异构数据同步马蜂窝消息总线——面向业务的消息服务设计干货 | 论Elasticsearch数据建模的重要性你可以不用RxJava,但必须得领悟它的思想!如何秒级实现接口间“幂等”补偿:一款轻量级仿幂等数据校正处理辅助工具视频笔记:什么是Flink?视频笔记:什么是AI 智能体?
设计模式在外卖营销业务中的实践 应用分层架构最佳实践:Alibaba COLA 4.0 Prompt之【翻译】 预测 2025 AI 详解微服务应用灰度发布最佳实践 企业4A架构:业务、应用、数据、技术的完美融合 一文看懂G1GC垃圾回收器 一文看懂”ParNew+CMS”组合垃圾回收器

CRUD (1) Event Sourcing (1) graphql (1) id (1) NoSQL (1) quarkus (1) rest (1) RocketMQ (2) Spring Boot (1) zk (1) zookeeper (1) 上下文 (1) 事务消息 (1) 二级缓存 (1) 值对象 (1) 关系数据库 (1) 分布式缓存 (1) 原子性 (1) 唯一ID (1) 商品 (1) 多对多 (1) 子域 (1) 字符集 (1) 客户端心跳 (1) 幂等 (2) 干货 (1) 并发 (1) 应用场景 (1) 应用架构图 (1) 康威定律 (2) 异步复制 (1) 微服务架构 (2) 总体方案 (1) 技术方案 (2) 技术架构 (2) 技术架构图 (1) 技能 (1) 持续集成 (1) 支撑域 (1) 故障恢复 (1) 数据架构图 (1) 方案选型 (1) 日记 (1) 服务发现 (1) 服务治理 (1) 服务注册 (2) 机房 (1) 核心域 (1) 泄漏 (1) 洋葱架构 (1) 消息队列 (5) 源码剖析 (1) 灰度发布 (1) 熔断 (1) 生态 (1) 画图工具 (1) 研发团队 (1) 线程 (2) 组织架构 (1) 缓存架构 (1) 编码 (1) 视频 (18) 读写分离 (1) 贵州 (1) 软件设计 (1) 迁移 (1) 通用域 (1) 集群化 (1) 雪花算法 (1) 顺序消息 (1)

推荐链接🔗
  • AI工具集
  • 工具箱🛠️

COPYRIGHT © 2014-2025 verysu.com . ALL RIGHTS RESERVED.

Theme Kratos Made By Seaton Jiang

粤ICP备15033072号-2

x