百度知道上云与架构演进

news2024/12/22 19:16:22

在这里插入图片描述

作者 | 百度知道研发组

导读

百度知道作为上线十多年的老产品线,业务场景多、架构老旧、代码风格不统一,同时业务迭代较快,整体承载流量大,稳定性要求高,给业务全面上云带来不小的挑战。本文基于实践,介绍知道如何进行上云方案的选型和落地,并同步进行架构演进,提升线上服务稳定性和容灾能力。

全文5302字,预计阅读时间16分钟。

01 背景与挑战

1.1 背景

随着集团PaaS化战略和云上百度战略推进,当前在线运行平台ORP已正式进入维稳阶段,不再进行功能更新和安全修复;同时ORP接入层在稳定性、变更效率等方面也无法满足云上部署要求。OXP逐渐成为业务发展和迭代的瓶颈。为了解决这一问题,同时增强资源弹性,降低业务资源成本,接入各类云原生能力,提升部署效率,保障线上服务稳定性,知道启动去OXP专项,将逐步完成整体上云及架构演进工作。

1.2 挑战

1、知道产品线老旧,历史债务多。 百度知道是一个已有十八年历史的老产品线,业务模式繁杂,上下游依赖较多,不同时期的重点方向不一样,架构老旧,代码风格不统一,改造成本高;

2、知道业务发展快,迭代变化快。 虽然产品线历史久远,为了适应新变化,业务迭代敏捷,核心场景更新换代频繁,年均上线业务需求780+个,需在保证业务目标达成前提下完成上云迁移,使业务全程无感;

3、知道流量大,商业收入多,稳定性要求高。 作为知识类流量收入双TOP产品线,知道日均pv过亿,迁移过程中不能影响任何流量和商业收益,核心服务稳定性目标需在四个9以上;

4、上云同时架构合理演进。 上云迁移作为知道历史上一次重大技术变革,除了能给老产品线带来先进的云原生能力,优化IT成本以外,还希望借此推动知道整体架构优化演进,提升容灾能力及线上服务稳定性。

1.3 收益

1、全部流量上云,为知道带来先进的资源弹性供给能力,大幅提升扩缩容效率,避免流量波动带来的线上容量风险,提升在线服务稳定性;

2、引入容器弹性售卖能力,按需使用、按量付费、动态调整,优化线上服务整体资源量级;腾退大批量OXP机器,大幅降低知道IT成本;

3、知道架构随上云持续演进,将0到1实现核心流量三地四机房云上部署,降低核心页端到端耗时,使核心页面具备N+1冗余灾备能力,提升业务抗风险能力。

02 概念介绍

2.1 知道业务简介

知道是传统的图文知识类内容生产业务。首先通过用户自发提问,或者对搜索每日query筛选挖掘,获取到待解决问题;其次引导各类生产者,在不同页面、后台对问题进行解答,生产回答内容;再次将生产好的问答对推送至搜索、Feed等场景供用户浏览消费,用户点击进入问答页后获得解答,同时靠广告点展为知道带来商业收入。

知道经过多年经营,积累了海量问答资源,在搜索生态中稳定覆盖了众多长尾需求;同时通过识别用户需求,挖掘高价值线索,引入机构或MCN账号,建设了多垂类优质内容,逐渐形成了相对稳定的多层次内容生态和品牌认知。

图片

2.2 业务架构

知道整体业务架构如下图所示:

图片

2.3 流量架构

上云前知道整体流量架构如下图所示:

图片

03 上云设计与实践

3.1 上云方案选型

知识垂类内php模块广泛使用的PaaS平台orp已公告于2022年底停止维护,同时现有的orp系统在容器编排管理层面存在一些问题,预算资源管理也和现有公司的机制流程不通。知道的现有架构基于odp原生实现,更多体现成一个大型大单体应用,通过本次升级,知道需迁移至更加接近云原生环境的PaaS平台上,进行新一轮的架构迭代,打造符合业务现状的架构理想态。

虽然管理容器化应用程序的开源系统Kubernetes作为社区和未来发展趋势,但综合考虑改造成本、时间节点、开发人力等因素,知道本次上云与其他知识垂类产品线迁移最终选型保持一致:底层使用pandora,资源管理及上线使用“知云平台”。

3.1.1 why pandora

主要有几个方面考虑:

1、pandora适应公司内主要的C端业务,如大搜、feed、手百、百家号、视频(好看)等,这些业务在场景上与知识体系更加接近,详细调研和评估可支持现有变更方案;

2、pandora在现有PaaS内唯一能够支持较多模块同时部署(最大支持2K),而无需业务过多改造合并,更适应现odp大单体的架构;

3、易用性层面pandora暂时不及opera,但已通过知云解决;同时知云会提供orp的包括接入、静态资源、代理、数据配送等服务,故不影响最终选型结论。

3.1.2 why 知云

知识垂类及其他oxp-based业务有个比较明显的架构:大单体模式下的多APP同构,这部分需求在现有的PaaS平台均无支持。同时,因为pandora底层对打包和服务的规范,业务线需要针对性的进行代码改造和回归,这部分工作存在明显的重复性。知云平台旨在提供一套更符合知识业务(及oxp-based)的上云解决方案,主要具备以下几类优势:

1、上线变更:除基础上线、配置管理及回滚等外,核心支持多APP同构的模式,及支持多模块部署。可以做到oxp项目迁移至知云成本降低,理想情况下无需合并/拆分代码库,可以平移支持;

2、平台服务:对标oxp现有服务,提供包括日志切分、定时任务、接入层、静态资源、飞线、中控等的支持和解决方案,同时基于云原生思想开放服务模式,支持业务部署自定义服务;

3、业务运行时环境:odp基础运行环境快速部署和定制;

4、基础环境(容器):整合入口,在日常运维时提供更方便的操作方案。

3.2 切流与扩量实践

3.2.1 上云前改造

对各流量集群,在迁移Pandora之前,主要涉及以下几方面工作:

1、知云创建产品线及应用。 需在知云平台搭建知道产品线基础环境,创建APP基础信息,申请ECI各机房资源2及实例配置,添加ODP基础运行环境及数据配送容器相关信息,创建容器组件相应配置,添加静态文件存储地址,修改部署路径及配置派生conf,创建上线模板等;

2、接入层改造及授权。 接入层创建对应新APP的BNS变量,并针对新的BNS进行各类DB、redis授权,涉及新机房,还需要对各mysql及redis配置进行升级适配;

3、业务层改造及测试。 知道本次上云会同步完成后端语言HHVM->PHP7升级改造,语言版本更新会带来安全及性能方面的进一步提升,同时PHP7还提供了众多新的语法特型,老旧版本无法使用。需完成对应模块PHP7兼容性问题改造,并完成线下测试;

4、添加监控及日志采集。 需添加对应APP的各级noah、sia监控,对各监控项进行调整,对监控阈值进行优化;修改相应日志采集路径,合并各服务组,并离线进行入库效果验证。

3.2.2 切流方案

  • 小流量实验方案如下图所示:

图片

  • 接入层改造:

可借助接入层的lua脚本实现小流量切流,脚本实现了以下规则:

['strategy_1_1_98']   = {1, 1, 98},
['strategy_5_5_90']   = {5, 5, 90},
['strategy_10_10_80'] = {10, 10, 80},
['strategy_20_20_60'] = {20, 20, 60},
.....,
['strategy_80_20_0']  = {80, 20, 0},
['strategy_95_5_0']   = {95, 5, 0},
['strategy_100_0_0']  = {100, 0, 0}

返回值有三种结果:“opera”, “abtest”, “orp”,从左到右分别对应三段数字,即每种结果出现的概率,从而可以根据返回的结果实现流量控制;

使用新增变量$upstream_target来标记最终proxy值,四种取值分别对应pc端和移动端实验组/对照组流量:

#设置最终proxy的值:pc_orp、pc_pandora、wap_orp、wap_pandora
set $upstream_target "${terminal_target}_${target_cluster}";
#知道上云切流实验配置结束

新增给业务传递标记,取值为"pandora"、“abtest”、“orp”,分别用来标识实验组、对照组、无关组流量。

  • 业务层改造

业务层捕获上述流量标记,分别创建并使用新的Eid发起商业请求,即可获得当前实验组/对照组各页面商业流量数据。

if ($_SERVER['HTTP_X_BD_TARGET'] == 'pandora') {
    $adsEids = array(
        'asp'  => array(50001),
    );
} else if ($_SERVER['HTTP_X_BD_TARGET'] == 'abtest') {
    $adsEids = array(
        'asp'  => array(50002),
    );
}

3.2.3 扩量相关

以知道核心问答页为例,扩量的每个阶段都有该阶段需重点关注的工作内容,及进入下一个阶段的准入list,需要list内容全部达标,才可开启下一阶段扩量实验。具体说明如下:

图片

3.2.4 云上网关切换

在业务层上云后,网关下游由原本几乎不发生迁移的orp环境,变成了迁移频繁的云上环境,原orp接入层对频繁的下游变化无法做到灵敏感知,因此需对原orp接入层进行上云切换。Janus网关已经广泛使用在了如手百、百科、问一问、经验、百家号等产品线中,与原inrouter对比具有以下优势,同时经过了大量的实践验证,因此知道上云选择了知云体系中的Janus来进行网关切换。

图片

知道经历了18年的迭代,网关的路由转发规则已经臃肿不堪,逻辑繁琐,维护成本非常高,稍有不慎就会引发严重线上事故。网关作为对流量转发控制的服务,应当尽可能地简单、清晰,具备较好的可读性和可维护性。因此在网关上云切换时,应当同步进行路由的深度重构治理,而不是简单的平迁。迁移重构核心流程如下:

图片

最终达到的效果:

1、下游感知灵敏:新网关对下游实例漂移感知灵敏,叠加重试策略,实例漂移对业务SLA几乎无影响;

2、大大增强可维护性:将预览、内网、外网三类域名隔离建设,划分清晰,使用和维护都一目了然。将原nginx转发规则2768行conf文件整合收敛至18条规则,清理了18年来的历史包袱;

3、安全性得到进一步增强:上线细化至每个服务、每条路由、每条转发规则,影响面可控。除了分级发布,叠加checker、上线巡检、测试用例等手段,大大增强了网关上线变更的安全性。

3.3 架构演进

3.3.1 现状&问题

知道长久以来95%以上主体流量集中在北方,核心流量打到tc+jx机房,非核心流量打到yq机房。从外网接入点,到实际业务层,到底层依赖基础服务,再到重要的第三方依赖服务,均没有搭建其他地域资源和服务。这就造成一个非常明显的安全隐患,一旦华北地域出现故障,无法进行彻底的切流来规避线上损失。

3.3.2 演进方案

1.知道三端QB页核心流量,占知道总体流量80%以上,是知道99%以上商业收入来源,自然流量大,用户交互多,对线上事故敏感,稳定性要求四个9以上。这部分是知道的生命线,本次伴随上云迁移,会同步建设三地四机房,使QB页具备单地域故障快速切流其他两地能力,提升系统整体可靠性;

2.除QB页以外非核心流量,由于时间久,涉及模块多,底层资源类型繁杂,同时又基本不贡献商业收入,各子系统流量占比较低,考虑改造成本及性价比,本次上云迁移将非核心流量迁至华北双机房,具备同地域不同机房冗余灾备能力,暂不建设其他地域;

3.针对核心流量,需进行“外网接入点->BFE->接入层->业务层->依赖自身服务->依赖三方服务->依赖底层存储”全链路三地资源建设,并进行连通性测试;

4.针对核心流量,各级服务资源到位后,需进行全方位压测及灾备演练,确保新地域机房流量承压能力,并达到单地域故障时可自由切换至其他两地域状态。针对重要的、且无法线上压测演练的三方服务例如商业广告请求,协同对方OP、RD、QA等角色共同制定切流观察方案,以免流量分布改变后造成线上安全隐患;

5.针对核心流量,设计切流方案并建立各三方服务同步机制,切流期间共同观察,上下游各子系统是否符合预期。

3.3.3 具体实现

知道核心流量三地域建设完成后流量架构演进如下所示:

图片

04 总结与收益

1.截至23年3月31日,知道云上流量占比已达100%,知道业务已全面上云。

图片

2.2022年Q3知道开始切流上云,连续三个季度SLA满足四个9,由上云引入线上问题数0。

图片

3.知道核心页已完成三地四机房建设,知道线上核心流量分布比例为华北:华中:华南=4:3:3,知道历史上首次具备了N+1跨地域冗余灾备能力。

图片

4.小程序QB核心接口端到端耗时均值下降12%,FMP80分位稳定1S内,不需要其他技术优化即达成秒开。

图片

图片

5.完成GTC接入点三地调整,公网IP均摊费用自2023年以来逐月下降,同时批量交付下线OXP机器,节省了大量研发成本。

——END——

推荐阅读:

百度APP iOS端包体积50M优化实践(四)代码优化

百度App启动性能优化实践篇

扫光动效在移动端应用实践

Android SDK安全加固问题与分析

搜索语义模型的大规模量化实践

如何设计一个高效的分布式日志服务平台

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/777795.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Nginx配置访问密码

使用得场景 因为想将skywalking对外提供访问,但是skywalking又没有认证功能,所以使用nginx来做。 安装htpasswd 因为需要使用到htpasswd,htpasswd是Apache服务器中生成用户认证的一个工具,如果未安装,则使用如下命令…

Linux底层

一. arm基础知识 基础:c语言 具有一定硬件基础 特点---》前后联系 arm目标: 看懂简单的汇编代码 会看电路图、芯片手册 学会如何用软件控制硬件思想 解决问题的办法 谈谈对嵌入式的理解? 以计算应用为中心,软硬件可裁剪的…

Vue 双重v-for渲染表单,再复制表单编辑之深拷贝

文章目录 前言问题背景实现拷贝表单如何实现深拷贝Object.assignJSON实现的深拷贝递归实现解决循环引用的递归实现require(lodash).cloneDeep() 前言 在做复杂的动态表单,实现业务动态变动,比如有一条需要动态添加的el-form-item中包含了多个输入框&…

Tomcat服务器下载安装及配置教程(IDEA中使用Tomcat)

目录 友情提醒第一章、Tomcat下载与安装1.1)Tomcat介绍1.2)官网下载 第二章、Tomcat配置环境变量2.1)windows环境变量配置2.2)验证Tomcat配置是否成功2.3)报错解决 第三章、IDEA整合Tomcat3.1)打开IDEA开发…

【OAuth2】OAuth2概述及使用GitHub登录第三方网站

【OAuth2】OAuth2概述及使用GitHub登录第三方网站 文章目录 【OAuth2】OAuth2概述及使用GitHub登录第三方网站0. 导言1. OAuth2 简介2. OAuth2 认证授权总体流程3. OAuth2 标准接口4. OAuth2 四种授权模式4.1 授权码模式4.2 简化模式4.3 密码模式4.4 客户端模式 5. GitHub授权登…

2023河南萌新联赛第一场(河南农业大学)

目录 A.你也喜欢数学吗​编辑 E.动物朋友 F.松鼠排序 G.Reverse J.合唱比赛 K.以撒和隐藏房间 L.中位数 A.你也喜欢数学吗 输入描述 第一行一个正整数k(1<k<1e12) 输出描述 输出一行一个整数表示答案 示例1 输入 1 输出 1 示例2 输入 3 输出 10 思路 是等于,将整个…

【itext7】itext7操作PDF文档之添加段落文本内容、添加List列表、添加Image图片、添加Table表格

这篇文章&#xff0c;主要介绍itext7操作PDF文档之添加段落文本内容、添加List列表、添加Image图片、添加Table表格。 目录 一、itext7操作PDF内容 1.1、添加段落文本内容 1.2、添加列表内容 1.3、添加图片 1.4、添加表格 &#xff08;1&#xff09;列宽采用点单位&#…

MySQL之索引(入门级讲解)

目录 一.索引的概念 1.1索引的简介 1.2.索引的优缺点 二.MySQL索引语法 2.1查看索引 2.2创建索引 2.2.1 创建表时创建索引 2.2.2存在的表上创建索引 2.3删除索引 三.索引的数据结构 3.1Btree索引 3.2Hash索引 3.4Hash索引和Btree索引的对比 &#x1f381;个…

基于Kitti数据集的智能驾驶目标检测系统(PyTorch+Pyside6+YOLOv5模型)

摘要&#xff1a;基于Kitti数据集的智能驾驶目标检测系统可用于日常生活中检测与定位行人&#xff08;Pedestrian&#xff09;、面包车&#xff08;Van&#xff09;、坐着的人&#xff08;Person Sitting&#xff09;、汽车&#xff08;Car&#xff09;、卡车&#xff08;Truck…

[2023新教程]M2 Mac安装Anaconda和Pytorch

本文首发于我的学习之路&#xff1a;https://liguang.wang/index.php/archives/80/ 1 背景 最近使用起了Mac Mini&#xff0c;需要安装Anaconda和Pytorch。网上的教程非常老旧&#xff0c;可读性较差&#xff0c;于是记录下自己的安装过程&#xff0c;分享给大家。 2 详细过…

二十三章:Gated-SCNN:Gated Shape CNNs for Semantic Segmentation ——用于语义分割的门控形状卷积神经网络

0.摘要 当前图像分割的最先进方法通过一个密集的图像表示来处理颜色、形状和纹理信息&#xff0c;这些信息都在深度卷积神经网络内部进行处理。然而&#xff0c;这种方法可能不太理想&#xff0c;因为它们包含了与识别相关的非常不同类型的信息。在这里&#xff0c;我们提出了一…

百度文心一言文心千帆大模型 ERNIE-Bot-turbo调用示例(golang版本)

百度的文心一言推出来也有一段时间了&#xff0c;但是接口部分一直没有公开&#xff0c;需要进行申请 最近&#xff0c;有朋友提供了文心千帆大模型的api权限&#xff0c;拿到了必须的参数&#xff0c;现在就来测试一下 下面是使用golang封装的文心千帆 ERNIE-Bot-turbo模型的调…

2023.7新版Pycharm没有Manager Repository(消失)下载镜像源问题

一、旧版本操作无法找到Manager Repository 二、解决方法---点击左侧键 三、点击添加设置小按钮 四、点击号复制进去镜像源网站即可 五、给大家推荐的镜像源网站 这里清华大学的镜像速度是最快的 https://pypi.tuna.tsinghua.edu.cn/simple/ 清华大学镜像http://pypi.douban…

天然气管道压力监测系统:管网安全守护者

随着我国工业的不断发展和能源需求的日益紧缺&#xff0c;天然气作为一种清洁能源正被广泛地开发和利用。然而。每年因天然气泄漏爆炸而造成的事故层出不穷&#xff0c;不仅威胁着人民的生命安全&#xff0c;还会对环境造成严重污染。面对这样的安全隐患&#xff0c;及时采取措…

Orangepi docker Home Assistant部署

手册上多数应用在树莓派用过&#xff0c;发现一个Home Assistant之前没搞过 按照手册先安装docker&#xff0c;使用enable_docker.sh 然后使用 docker run hello-world 来测试docker是否成功&#xff0c;如果hello from docker&#xff0c;即正常 通过以下docker命令搜索hom…

css - display属性

display属性有四个取值&#xff1a;block inline inline-block none 1、block display是类似于h和p标签在网页中默认显示方式&#xff0c;占据整整一行&#xff0c;所以不会与其他元素共同显示在一行之内。常见的block-display元素还有div、ol ul li、form等。如果想对某个blo…

【PHP面试题80】Redis消息发布与订阅功能怎么用的?

文章目录 &#x1f680;一、前言&#x1f680;二、PHP中安装Redis扩展&#x1f680;三、Redis消息发布与订阅&#x1f50e;3.1 创建发布者&#x1f50e;3.2 创建订阅者&#xff1a;&#x1f50e;3.3 运行发布者和订阅者&#xff1a; &#x1f680;四、总结 &#x1f680;一、前…

tomcat 使用部署

--烛光照亮了晚餐&#xff0c;照不出个答案。 不BB。 --部署web项目&#xff08;无 maven 纯web项目&#xff09; 直接把整个项目放到tomcat的webapps目录的下面然后重启tomcat即可 --部署html静态项目 直接把静态html放到tomcat的webapps目录下面即可&#xff0c;不要重命…

spring中bean实例化的三种方式 -- Spring入门(二)

文章目录 前言1.Bean实例化简介2.bean的实例化 -- 构造方法3.bean的实例化 -- 静态工厂实例化4.bean实例化 -- 实例工厂和FactoryBean5.三种bean实例化方式的区别 总结 前言 为了巩固所学的知识&#xff0c;作者尝试着开始发布一些学习笔记类的博客&#xff0c;方便日后回顾。…

JDBC之用IDEA连接SQLServer数据库实用教程

目录 前言 一、数据库准备 1.通过SQLServer配置管理器打开TCP/IP协议&#xff0c;设置状态为已启用 2.数据库登录模式设置为身份验证登录&#xff08;如果已经设置可忽略此步骤&#xff09; 3.下载SQLServer驱动jar包 二、IDEA准备 1.导入SQLServer驱动jar包 2.编写测试代…