写点什么

京东物流系统自动化运维平台技术揭密

  • 2017-08-07
  • 本文字数:3350 字

    阅读完需:约 11 分钟

简单来理解,自动化运维就是要通过机器的方式来简化整体的运维过程,特别是优化重复类型的工作,以提高运维效率,减少因人工而引起的失误操作。随着运维管理的复杂度和难度增大,自动化运维也基本成为了运维平台演进的必经之路。但如何落地自动化运维平台,不同的企业因为运维发展阶段和业务体量的不同,都有不一样的实现路径。

以京东为例,它的物流系统有很多分支机构, 比如仓库、分拨中心、转运中心等, 业务复杂的分支机构可能会有自己的信息系统, 这些信息系统往往分布式地部署到全国各地,那如何基于自动化运维平台管理好这些分支机构的服务器、 信息系统, 降低因为地域分布造成的运维维护成本呢?京东资深架构师赵玉开向 InfoQ 记者深入介绍了他们在自动化运维平台方面的一些探索和实践。另外,赵玉开也将会在 9 月 10 日举行的 CNUTCon 全球运维技术大会上分享相关话题,欢迎关注。

InfoQ:可以先介绍下目前京东物流系统自动化运维平台的一些基本情况吗?

赵玉开:京东物流系统自动化运维平台从 2014 年开始启动到现在已经历了三个阶段,到目前管理了 MySQL、JMQ、 Redis 及自研应用等多种实例。

众所周知,京东业务发展迅猛,每周都需要开仓,数量多达十几个。最初开仓过程特别冗长和复杂,开仓过程中涉及到研发人员部署系统、运营人员手动填写多种申请、运维人员不仅要负责中间件安装,还要负责整个流程中每个环节的进展确认及协调,这直接导致了开仓慢,且涉及到的各部门都需要投入大量的人力成本。

基于此,2014 年初我们启动了一期自动化运维平台研发的项目,2014 年 10 月项目一期上线时,已基本解决了开仓慢和人力成本的问题,也减少了开仓过程中运维同学的重复性工作内容,制定标准化模板,解放了研发人员的重复性部署工作。运营人员可通过模板直接设置,将之前一些繁琐的密码、JMQ Token 等数据实现自动化配置,大大减少了流程耗费的时间。

一期上线后,得到了流程中各环节涉及部门的赞赏,而后,迅速进入到二期项目。二期项目完成后,数据的初始化问题和研发日常批量部署问题也得到了解决,系统的自动化程度已可以满足日常的工作需求。

今年初,为接入更多物流作业单位,如分拣中心, 亚洲一号自动化物流中心等,我们开启了三期项目,目前项目还在持续前行中。

InfoQ:谈谈你们的自动化运维架构?以及具体涉及到的技术栈?

赵玉开:我们的自动化运维的核心组件是 SaltStack, 我们基于 SaltStack 做了很多自定义的模块、Grains 和 Runner, 通过这些自定义的模块、Grains 以及 Runner 来支撑我们的开仓、部署、数据同步等功能。

如下图是一个指令执行过程图, 分为两个部分, 上面部分为部署在 IDC 的模块, 下半部分则是部署在库房机房的模块。

我们先逐个介绍部署在 IDC 部分的模块:

  1. Web 使用 Java 技术, 为用户提供操作界面, 控制操作权限, 使用 Activiti 工作流引擎驱动各种流程, 下发开仓过程中的自动化运维指令。
  2. Salt-API-Proxy 是 Salt-API 的代理层, 通过 Nginx 实现了反向代理, 在 Nginx 的配置中对发送指令的服务器 IP 做了限制, 另外可以通过配置指向工作的 Salt-API 服务器。
  3. Salt-API 负责和 Salt-Master 交互发送 SaltStack 的 Runner 与 Module 的 API 指令, Runner 指令是运行在 Salt-Master 服务器上的, 可以读取 master 配置, 也可以在一个 Runner 中协调执行多个 Module 运行结果。
  4. Salt-Master 有两个职责, 一是接受 salt-api 指令, runner 在本地执行, module 下发指令到对应的 salt-minion, 另一职责是运维同学手动下发指令, 完成一些非常见的 minion 配置工作。
  5. RsyncServer 负责中间件安装文件, 自研软件的文件存储和下发, RsyncServer 的文件存储是由 Salt-Master 发起的, Salt-Master 接受到 salt-api 的应用部署指令后, 会从部署指令中获得部署包下载地址, 然后下载到指定部署包存储目录, 并做解压操作; RsyncServer 的文件下发指令则是有 salt-minion 端的 Module 执行触发的。

仓库部门和 IDC 之间通过 VPN 联通, 每个仓库的服务器上都安装了 SaltStack 的 minion 端, minion 端是一个 Python 进程, 负责接收 Master 的 Module 指令, 并在本地执行。另外 minion 端在执行指令过程中需要将执行过程中的输出及时的输出给用户端, 让用户可以通过 Web 端查看执行过程的情况, 即运维的可视化, 我们是通过 minion 端的可视化模块, 将执行过程输出通过 HTTP POST 方式发送给 Web 端, Web 端将 POST 内容存储到任务执行过程输出表中, 前端通过轮询方式读取输出表中的增量消息显示给用户端。

我们采用的技术栈是 Java + Python。 前端界面展示、 工作流、权限控制、任务下发这些都是用的 Java 的 Spring MVC + MyBatis; 后端用的是 Python + Shell, Python 写了大量的 SaltStack 自定义模块。

InfoQ:为什么当初要选择 SaltStack 而没有选择 Ansible?

赵玉开:不可否认 Ansible 也是一个非常好的自动化运维工具, 但是基于以下两点我们最终选择了 SaltStack。

  1. API 的易用性方面和 SaltStack 有差距, 我们的自动化运维系统一开始就有一个目标, 将开仓部署以及推广版本这些功能开放给物流运营人员, 所以必须做好前端用户体验, 这需要好用的 API, SaltStack 恰好有。
  2. 性能,标准 SSH 连接的时候比较耗时,ZeroMQ 传输的速度会快很多。

InfoQ:在应用部署自动化这块,你们是怎么做的?

赵玉开:应用部署大致分为这么几个步骤: 打包、下发文件、更新配置、停止启动实例、备份部署版本, 具体如下。

  1. 我们使用的公司统一的打包系统, 打包系统打好包, 部署任务审批通过,自动化运维系统就可以通过 API 获得打包文件, 然后将部署包上传到版本服务器, 并解压缩,放到对应版本目录下。
  2. 通过 SaltStack 的 API 下发部署指令给部署目标服务器, 部署指令是一个 SaltStack 自定义模块, 该模块首先会执行 rsync 指令从版本服务器上同步变更文件。
  3. 文件下发之后更新配置, 通过 Web 接口请求自动化运维的 Web 端下发配置文件, 然后更新配置文件, 我们线上的配置文件是通过环境变量来配置的, 所以不管有多少个库房, 都不需要更新配置文件, 只有在特殊需求时设置环境变量, 就可以依据当前作业单位的不同改变下发的配置文件的内容。
  4. 调用应用的 stop.sh 脚本停止当前实例, 再调用 start.sh 脚本启动实例, 这里有一个约定, 不管是 Web 应用还是非 Web 应用必须在部署目录有一个 bin 目录下面有 start.sh 和 stop.sh 两个文件。
  5. 如果步骤 4 执行成功, 那么将此版本的文件备份到当前服务器上, 以备回滚使用。

InfoQ:自动化运维解决了你们哪些问题?没有解决哪些问题?

赵玉开:自动化运维解决了我们开仓周期长,人力成本高的问题, 提升了全国部署推广的效率, 大大减少了运维同事的重复性工作, 把对成熟版本的推广工作交给了运营人员, 减少了研发同事在推广上线工作上的时间。

现阶段正在探索如何通过自动化运维技术快速排查问题, 另外就是我们未来会有一些自动化的物流作业单位,如何用自动化运维平台管理好这些自动化的设备和设备软件也是我们在探索的。

InfoQ:自动化运维平台上线了这么长时间,有做过复盘吗?有哪些经验可以分享给读者?未来有什么计划?

赵玉开:做过一些复盘, 每一期开发结束下一迭代开始的时候都会做复盘, 对现有问题进行总结, 同时收集下一步的需求。 目前看最深刻的体会是做自动化运维系统一定要做好元数据的管理,元数据要管理好服务器信息属性、 应用信息、应用配置、实例管理以及作业单位, 这些元数据要在一开始就做好, 能自动化收集的要自动化收集, 动态的参数一定要动态控制, 比如 Redis、MySQL 都有主从关系, 元数据中要存储这个主从关系, 但是不能写死, 必须有机制来更新主从关系, 否则 Redis 哨兵程序更新了 Redis 主从关系, 或者 MySQL DBA 因为某些原因切换了 MySQL 的主从, 自动化运维系统的元数据没有做对应更新,再执行指令时就会出问题, 甚至发生事故。

未来计划有两个方面:

  1. 继续通过自动化运维系统来提升运维效率、 降低研发对应用运维的投入。
  2. 做自动化物流作业系统的自动化运维, 管好其中的设备和软件服务。

InfoQ:在 CNUTCon 全球运维技术大会上,你将会为读者分享哪些技术点?

赵玉开:这次大会我会给大家介绍下京东物流自动化运维平台的技术架构, 并详细介绍自动化开仓、批量部署的技术细节。

2017-08-07 19:134383
用户头像

发布了 219 篇内容, 共 138.6 次阅读, 收获喜欢 191 次。

关注

评论

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

不愧是阿里资深架构师,这本“分布式架构笔记”写得如此透彻明了

钟奕礼

Java 程序员 java面试 java编程

元宇宙之数字孪生 孪数科技-企业元宇宙引领者

Jerry Tan

别研究 ChatGPT 了,来看个国产好项目!

Java永远的神

程序员 程序人生 后端 架构师 开源项目

Verilog 编译指令

梦笔生花

Verilog语法 Verilog编译指令

GBase 8s 之数据存储空间划分

@下一站

数据库优化 国产数据库 12月日更 12月月更

Hadoop如何保证自己的江湖地位?Yarn功不可没

JAVA旭阳

Java 大数据

聊聊最适合程序员的一些画图工具?

程序员小毕

程序员 程序人生 后端 架构师 画图工具

面试官:断网了,还能 ping 通 127.0.0.1 吗?

Java全栈架构师

程序员 面试 程序人生 后端 计算机网络

小令案例 | 互联网消费分期产品引入令牌云服务,大幅提升进件转化

令牌云数字身份

身份认证 分布式数字身份 成功案例

通过假设地图进行产品待办列表排序

Bruce Talk

Agile User Story Product Owner 敏捷、

MacBook免费的电脑管家CleanMyMac2023

茶色酒

CleanMyMac CleanMyMac X

关于ChatGPT的一切;CUDA入门之矩阵乘;PyTorch 2.0发布|AI系统前沿动态

OneFlow

人工智能 深度学习 AI

分布式锁主动续期的入门级实现-自省 | 简约而不简单

小小怪下士

Java 程序员 分布式 分布式锁

啃透这500页高并发笔记薪资涨了20K,并连收天猫,京东等5个Offer

钟奕礼

Java 程序员 java面试 java 编程

从德鲁克管理实践看服务化架构

agnostic

微服务

2022-12-10:给你一个由小写字母组成的字符串 s ,和一个整数 k 如果满足下述条件,则可以将字符串 t 视作是 理想字符串 : t 是字符串 s 的一个子序列。 t 中每两个 相邻 字母在字

福大大架构师每日一题

算法 rust 福大大

分库分表经典15连问

架构师之道

Java MySQL 编程

字节大神熬夜整理MyBatis+Redis+Kafka+spring源码与实战技术齐飞

钟奕礼

Java java编程 程序员、

工赋开发者社区 | 架构瓶颈原则:用注意力probe估计神经网络组件提供多少句法信息

工赋开发者社区

基于 docker-compose 部署单机版本 ELK

忙着长大#

ELK

Compose把Text组件玩出新高度

Halifax

android 前端 kotlin Compose android jetpack

Alibaba官方「SpringCloudAlibaba全彩学习手册」限时开源!

架构师之道

Java 架构 面试 spring cloud stream

Mac内存清理工具CleanMyMac2023

茶色酒

CleanMyMacX CleanMyMac X CleanMyMac X2023

非一线工程管理者的一对一沟通

俞凡

领导力 管理

工赋开发者社区 | 65页数字化工厂规划与建设详细方案 !

工赋开发者社区

微信朋友圈高性能复杂度

闲人Eric

架构实战营

HarmonyOS玩转ArkUI动效 - 水母动画

Halifax

前端 动画 HarmonyOS OpenHarmony arkui

易观分析苏筱芮:数字科技创新场景应用为王,驱动金融与实体经济同频发展

易观分析

金融

裸辞美团花两月吃透这Java岗798道真题解析,定级阿里P7

钟奕礼

Java 程序员 java面试 java编程

我在哪里可以获得CleanMyMac2023许可证

茶色酒

CleanMyMac2023

TechSmith Camtasia Studio2023免费的屏幕录像视频编辑软件

茶色酒

Camtasia Studio2023

京东物流系统自动化运维平台技术揭密_DevOps & 平台工程_小盖_InfoQ精选文章