写点什么

程序:我从哪里来?

  • 2019-09-10
  • 本文字数:2680 字

    阅读完需:约 9 分钟

程序:我从哪里来?

耶稣曾说过:“我虽然为自己作见证,我的见证还是真的,因我知道我从哪里来,往哪里去”。我是谁?我从哪里来?该往哪里去?一直到现在,这三个问题依然困扰着我们。在计算机程序的世界里,对于一个服务,同样存在这样的疑惑。那么,在百度的运维实践中,我们怎么去回答这几个问题呢?


在计算机程序或者服务的层次上,我们来试着分析前面提到的几个问题。

问题

1.我是谁?


服务叫什么,服务包含了哪些实例,服务规模、部署情况、实例运行状况如何?


2.我从哪里来?


服务的上游有哪些,不同的上游流量如何分配?


3.我往哪里去?


服务的下游有哪些,不同的下游流量如何分配?


面对这样的问题,我们的答案是什么呢?


在百度的运维实践中,我们只需“BNS”就可以获得想要的答案。


BNS(Baidu Naming Service,百度名字服务)是百度云智能运维团队研发的一套分布式的名字服务系统,是百度云 Noah 智能运维产品中的一个重要基础服务系统。它为每一个服务赋予一个独一无二的名字,根据这个名字,我们就可以获取到这个服务的相关信息 ,这些信息包括:服务在机器上部署信息(机器 IP,部署路径,服务配置,端口信息),服务的实例运行状况等其他重要信息。简单来讲,它提供了一个服务名到资源信息的一个映射关系。


在 BNS 系统中,服务单元表示一个服务的实例集合,一般以三段式的结构表示,比如:server.noah.all,server 表示服务名,noah 表示产品线,all 表示机房名称,服务单元的名字在系统中是唯一的。

使用场景

在程序员的日常工作,常常面临以下的场景:

场景

场景一:我是一名 OP 工程师,负责几十个系统模块的运维,我常常需要登录部署服务的机器排查问题,但是只知道服务名,记不住那么多部署信息,怎么办?


场景二:我是一名 RD 工程师,我负责的服务需要扩容,我的服务是很多下游服务的依赖,服务的扩容怎么通知给下游模块?


场景三:我的服务部署实例有一个出现故障了,我想对下游服务屏蔽该故障实例,怎么办?


下面以一个简单的例子来说明,假设一个模块名是 Server,它的上游是 Proxy 服务,下游是 Redis 服务,当出现变更或者故障时,如何让上游感知到呢?



当新增上线实例、下线摘除实例或者实例发生故障时,BNS 系统通过部署在机器上的客户端实时感知到实例的状态变化,同时新增和删除实例的变更情况会立即同步到分布式的缓存系统中,这样用户通过一个 BNS 名字就可以感知到下游的实例变化。


对应上面几个场景,BNS 提供了以下的解决方案:


场景一:用户想登录 Proxy 模块的第一个实例,可以通过 ssh 1.proxy.noah.all.serv 方式登录。


我们基于 BNS 开发了 nsswitch 的扩展,并且修改了/etc/nsswtich 的配置文件:


hosts files dns bns
复制代码


在主机需要解析 1.proxy.noah.all.serv 的时候,一般会直接或者间接的调用 glibc 提供的 gethostbyname_r 函数,而 glibc 在实现 gethostbyname_r 时,会按照 nsswitch 里配置的顺序 files->dns->bns 顺序进行处理,这样就实现了通过 BNS 登录机器。


场景二:Server 模块扩容,希望上游及时感知到下游模块的变更。


用户在 BNS 上进行 Server 模块的扩容,模块实例变化信息会立即同步到 BNS 系统中的分布式缓存,在全网任意一台机器上,通过查询就能实时获取到实例变化的详情。


场景三:Redis 模块 3.redis.noah.all 实例故障了,希望对上游屏蔽该实例。


通过部署在机器上的客户端感知到实例的状态变化(比如实例状态由 0 变成-1,即正常变成非正常),并将数据同步到系统中的分布式缓存,上游模块可以通过查询 redis.noah.all 的实例状态结果,主动过滤非正常的实例,也可以在 BNS 系统中发起屏蔽故障实例的操作,在查询过程中会自动过滤该故障实例。


在下一节中将具体介绍 BNS 系统的整体架构。

基本架构

BNS 系统主要包含几个部分:流量接入层,Web Server,存储层,代理客户端。



作为一个底层的基础服务,BNS 系统每天的访问量近千亿次,这对系统的可用性提出了很高的要求,因而系统需要在各个层面有完善的容灾能力和流量管控能力。

1 流量接入层

系统通过 HTTP 接口对外提供变更服务,用户通过 Web 页面或者接口进行服务或实例信息注册。为了保证平台稳定和安全的运行,需要对非法和异常请求进行拒绝,在流量接入层(Proxy)端提供了以下两个功能:


  • 流量鉴权:每一个服务组、服务单元、实例的注册都需要进行权限验证,用户只有申请了合法的 Token 才能允许访问,另外系统还提供了白名单等其他的鉴权方式。

  • 配额限流:针对产品线、用户、IP 提供一定的配额,当请求的数量超过配额,就会拒绝响应的请求,并提示用户 Quota 超限。

2Web Server

Web Server 提供用户进行各类 BNS 变更的接口,承担了 BNS 系统的大部分写入流量,采用分布式多地域的部署方式,可以避免单实例、单机房的故障对可用性造成的影响。

3 存储层

这里主要包含数据库和 Cache 层两个部分。


  • 数据库:采用 MySQL 存储,采用主从集群部署、读写分离的方式。

  • Cache 层:是 BNS 系统自研的一个缓存模块,缓存了全量的 BNS 系统数据,采用多地域部署的方式,它主要功能是降低数据库的查询压力。

4 客户端

BNS 系统主要包含两个客户端:查询客户端和健康检查客户端,我们分别用 Naming Agent 和 Check Agent 来代指两个。


客户端部署在所有的机器上,并提供命令行工具和丰富的 SDK 以及各类插件,方便用户在各个场景使用。


  • Naming Agent:提供 BNS 的查询功能,用户可以根据一个名字(服务组、服务单元、实例)就能得到详细的服务信息。Naming Agent 与 Cache 层的数据交互,采用推拉结合的方式,Naming Agent 主动拉取数据和 Cache 模块推送变更数据,同时 Naming Agent 客户端会将查询过的数据置于本地缓存中,以此降低 Cache 层的查询压力。

  • Check Agent:提供 BNS 实例的健康检查功能,用户通过在 Web 页面对每一个实例配置健康检查的方式,机器上的 Check Agent 会主动探测所有实例的运行状况,并将健康检查的结果上报给 Cache 层,同时更新数据库内容。

总结

BNS 系统满足服务间交互中常见的的资源定位、IP 白名单维护等需求,也可以用于机器列表查询,使用场景包括机器列表查询、服务定位、白名单维护、数据库智能授权等,解决了程序“我是谁?我从哪里来?该往哪里去?”的问题。


今天我们一起聊了百度云 Noah 智能运维产品中的 BNS 系统,目前系统还在持续迭代和优化中,若您想进一步了解 BNS 问题,欢迎大家积极留言。


作者介绍:


将问,百度云高级研发工程师,负责百度云 Noah 智能运维产品中名字服务和运维元数据的设计和研发,在分布式缓存、服务发现等方向有广泛的实践经验。


本文转载自公众号 AIOps 智能运维(ID:AI_Ops)。


原文链接:


https://mp.weixin.qq.com/s/vSblkaim9Fq_N7rO5TsIAA


2019-09-10 16:411775

评论

发布
暂无评论
发现更多内容

运维审计安全注意事项讲解一二

行云管家

运维审计 IT运维安全

嘉为蓝鲸2025OpsPilot智能运维支撑平台V3.7:分块界面可视化,重构问答对关联提升运维知识效率

嘉为蓝鲸

知识管理 智能运维 OpsPilot 一体化智能运维 智能运维支撑平台

JoyAgent-DataAgent可直接使用的智能问数和诊断分析智能体

京东科技开发者

邀您参加丨云栖大会中企出海技术分论坛

阿里巴巴云原生

阿里云 云原生

连续四年问鼎!嘉为蓝鲸携运营商、金融、能源、央国企等行业客户再获鼎新杯多项荣誉

嘉为蓝鲸

研发效能 智能运维 央国企数智化转型 一体化智能运维 数智化运维

超前探展!2025 云栖大会朋友圈晒图必备

阿里巴巴云原生

深入研究:京东图片搜索相似商品API详解

tbapi

京东图片搜索接口 京东拍立淘API 京东图片搜索API 京东图片API 京东图搜API

深入解析MS12-020关键漏洞CVE-2012-0002:远程桌面协议的安全风险与缓解方案

qife122

网络安全 系统加固

嘉为蓝鲸CPack制品管理平台:容量管控减少无效存储,让制品管理更轻松降本提效

嘉为蓝鲸

智能告警 存储管理 制品库 制品管理 制品仓库

告别数据越权烦恼,嘉为蓝鲸CMeas研发效能洞察平台靠数据行权限隔离,保障项目数据安全

嘉为蓝鲸

DevOps 研发效能 研发效能度量 数据管控 研发效能洞察平台

撒钱岛小游戏管理系统:私域流量变现新选择,趣味与收益双赢

微擎应用市场

第柒在线科技通过“2025国家科技型中小企业”认定

第七在线

对接文档:快递鸟取件码API,实现物流末端服务自动化

快递鸟

坐标山东青岛,12~20K面试强度

王中阳Go

Go 面试 后端

一场 MCP 生态的变革——详解 OpenTiny NEXT 逆向思维的技术创新

OpenTiny社区

AI 前端 OpenTiny MCP

嘉为蓝鲸2025应用发布中心V6.2:国产化数据库适配+Function-Call技术,赋能云原生

嘉为蓝鲸

云原生 应用发布 智能运维 应用发布中心 国产化适配

建筑行业能源管理破局:MyEMS 打造商业楼宇 “能耗可视化 + 智能调控” 方案

开源能源管理系统

开源 开源能源管理系统

喵喵估价回收管理系统:一站式闲置回收解决方案

微擎应用市场

MyEMS 进阶应用:从单厂能耗管理到集团跨区域能源数据协同分析

开源能源管理系统

开源 开源能源管理系统

告别“能源糊涂账”:MyEMS如何帮企业把能耗数据“算明白、用到位”

开源能源管理系统

开源 开源能源管理系统

Playwright极速UI自动化实战指南

测试人

人工智能 软件测试

多客云 Ai 短视频批量剪辑矩阵系统:高效创作与智能管理的一体化解决方案

微擎应用市场

海之心医院挂号系统:中小型医疗机构的智慧诊疗管理解决方案

微擎应用市场

连接两个战场:本土舆情监测与海外社交媒体监控的协同

沃观Wovision

社交媒体 沃观Wovision 舆情监测系统 海外舆情监测

深入研究:京东工业商品详情API详解

tbapi

京东工业平台API 京东工业数据采集 京东工业商品详情API 京东工业数据分析

Web自动化测试智能体详解

测试人

人工智能 软件测试

云上数据库实验室 —— 用 RDS 学 SQL 不花钱

掘金安东尼

从 AI 编程到小程序容器:外卖 App 开发实战之 App Builder 技术选型指南

xuyinyin

行稳、致远 | 技术驱动下的思考感悟

京东科技开发者

JDK从8升级到21的问题集

京东科技开发者

程序:我从哪里来?_文化 & 方法_将问_InfoQ精选文章