产品战略专家梁宁确认出席AICon北京站,分享AI时代下的商业逻辑与产品需求 了解详情
写点什么

苏宁海量服务器自动化配置运维实践

徐洋

  • 2018-11-07
  • 本文字数:4665 字

    阅读完需:约 15 分钟

苏宁海量服务器自动化配置运维实践

运维的演进

人力运维阶段

在 IT 产业的早期,服务器运维是通过各种 Ad Hoc 命令或者 Shell 脚本来完成基础设施的自动化工作,这种方式对于简单,一次性的工作很方便,但是对于复杂和长期的项目,后期的脚本维护非常麻烦。

自动化工具阶段

现时的大型互联网公司都已经有了成千上万台服务器,对于这么庞大体量的服务器规模,以往那种原始的人工运维方式显然已经过时,大规模服务器的自动化快速运维就成为了不得不探讨的课题。

目前 Salt,Chef,Puppet 和 Ansible 等配置管理工具是运维界非常流行的工具,它们定义了各自的语法规则来管理服务器,这些工具定义的代码和 Ad Hoc 脚本语言非常相似,但是它们强制要求代码具有结构化,一致性,和清晰的参数命名,它们能够远程管理大量的服务器,并且兼容早期的 Ad hoc 脚本。

DevOps 阶段

随着自动化维护的相关工具层出不穷,有些大公司已经把它上升到了战略层面,并引入了各种各样的自动化工具与自己的业务系统进行组装。

自动化运维平台 ACM 平台的建设

从传统业务转型互联网的苏宁随着业务量的上升,服务器本身的标准化扫描,内核批量升级,在备战双 11 大促时,运维会接入大量系统扩容,配置,全局变量设定等等操作也逐渐变得常态化,动辄上千台的主机运维的工作已经不是通过堡垒机系统就可以轻松完成了。

并且随着不断有 PAAS 业务系统提出需要各种可定制化,标准化的服务器配置管理部署接口。开发一个可以批量化配置管理服务器的通用平台就变得迫切起来。

底层工具的选取

目前市场上最主流的开源工具有

Puppet/Chef/Ansible/Saltstack 四种,选型时在 github 的热度排名如下:

而在实际开发的选取时优先会考虑以下两点:

  • 第一、语言的选择(Puppet/Chef vs Ansible/Saltstack)
    Puppet、Chef 基于 Ruby 开发,Ansible、Saltstack 基于 Python(后期可做二次开发),所以抛弃较为老旧并且兼容性较差的 Puppet 和 Chef
  • 第二、速度的选择 (Ansible vs Saltstack)
    运维的配置管理讲究的是更快更稳,Ansible 基于 SSH 协议传输数据,Saltstack 使用消息队列 zeroMQ 传输数据。

在 Ansible、Saltstack 的选择中,有一些公司放弃 Saltstack 的主要原因是 Saltstack 需要安装客户端,在服务器有一定数量的情况下比较麻烦,而 Ansible 不需要安装客户端。但是目前的 Ansible 还存在以下难以解决的问题:

  • 众口难调:和业务特点相关的需求十分离散(有的重效率,有的看重流程的完备性,有的对易用性要求高)再加上需求方越来越多,没有合适的通用开放性接口提供 restful API,功能交付的排队会积压严重。
  • 性能差:当需要执行一个服务器数量级达到 K 级操作,Ansible 的响应长达数十分钟,并且还有比较高的错误率。

反观 SaltStack,它结合轻量级消息队列(ZeroMQ)与 Python 第三方模块构建。具备了配置管理、远程执行、监控等功能,具有以下明显的优势:

  1. 速度极快
  2. 兼容性好
  3. 文档详细,并且开源社区跟 Ansible 一样持续活跃

速度测试

从表格中可以看出 Ansible 和 SaltStack 性能测试中,测试了 Ansible 和 SaltStack 在执行命令、分发文件、读取文件和批量脚本执行等自动化运维场景下的性能,由耗时数据可以看出 Ansible 的响应速度比 SaltStack 要慢 10 倍左右。

经过的综合论证考量,最终选择了在大规模集群下,适用性最强的 SaltStack 作为苏宁所有服务器的基础管理工具。

使用稳定性的维护

由于早期版本的 Saltstack 的稳定性不高,各种版本之间也有兼容性问题,为了保证版本升级时保持可以向下兼容,团队进行大量的验证和测试后会把发现的 bug 向社区报告,经过不断的沟通与协商,最终得到社区的认可并接受我们提出的修改建议,目前团队也积极的参与新版本 Salt 的检证测试与维护,有力的保障底层平台的稳定性。

通用外部接口及 WEB 平台的建设

由于 Saltstack 社区并没有提供 WEB 管理界面,所有的操作都只能通过命令行操作,而 API 的调用也会暴露出用户名密码给外部系统,Master 的安全性得不到保障。并且脚本的维护升级都十分的麻烦。

所以在选定底层管理工具后还需要开发一套 ACM 上层平台,包装出通用的接口对外提供服务,并且提供可视化的操作界面提供给主机运维团队。

ACM 提供了一套 WEB 系统供运维管理人员进行可视化的运维管理。实现了页面化的脚本工具定义, 作业编排,作业执行,命令执行,报表分析等功能。

外部系统则可以通过 ACM 开放的 API 接口实现对底层 Salt 的调用,从而实现对安装有 Salt Minion Agent 的机器进行配置管理。

并且在安全的设计上,平台提供审计,命令黑名单,通道管理,Agent 配置、用户角色权限管理,并且仅允许授权过的外部系统接入 ACM。

系统架构的演进

架构 1.0

早期采用 Order Master + Syndic+Minion 的三层架构模式,当时全苏宁的 OS 虚机 + 物理服务器总数大概在 1 万左右,Salt 的原生架构还能勉强支撑。

但随着集团转型的持续进行,线上业务量的急速上升,大促前上线的服务器数量也以近乎每天一千台的速度上升,接入 ACM 的系统也从仅有的两三个,每天几百个总请求量,快速上升到几十个系统,一天有近万个配置任务;此时系统的问题也逐步暴露出来,比如任务返回慢,一个同步任务执行需要 5 秒以上的调用时间;原生架构下 Order Master 在并发任务量大时,系统压力过高,任务失败率也超过 10%

团队每天都花费大量时间应对客户苦不堪言,业务方也是经常提出抱怨,由于业务量提升的倒逼,Salt-Minion 又是集团默认的唯一基础运维 Agent,除了我们没有人可以承担下自动化配置管理的工作。于是乎 ACM 进行了整个系统的重新设计。

架构 2.0- 两层化拆分

经过反复研究跟论证,ACM 可以改造成直接充当 Order Master 的角色,对服务器发起配置任务时,ACM 可以通过安装记录直接查询到 Minion 挂载在哪台 Master 上,直接对需要的 Master 发起调用,任务如果是多台机器,后期也通过 ACM 进行结果的聚合。

由于 ACM 本身就是 JBoss 集群,这样做不仅解决了单台 Order Maser 负担太重的问题,还大大加快了请求的响应时间,从原来的五秒 + 响应提升到了毫秒级响应,解决了原生架构中官方必须开销的 Syndic 等待时间。

架构 2.1-Salt Master 的高可用化

在实际生产环境中如果发生了某一台 Salt Master 宕机的情况,就会有约 2K 的机器失去控制,人工的进行 Master 恢复长达几十分钟,对于一些业务的调用是不可以接受的。

所以 Master 迫切的需要进行高可用化的改造,而改造的过程中又需要解决以下几个问题:

  1. Minion 如何探测到 Master 宕机,并进行快速切换。
  2. 当 Minion 探测到主 Master 宕机后如何切换到备 Master。
  3. 如何解决主备 Master 之间 Salt-key 复制的问题,尤其是当主 Master 关联新的 Minion,新 Minion 的 Salt-key 如何同步给备 Master。

方案 1

采用 Saltstack 原生的高可用方案,Mutil-Master+Failover-Minion。

Mutil-Master: Saltstack 从 0.16.0 版本开始支持,提供 Minion 可以连接多 Master 的功能特性.

Failover-Minion: Minion 定期检测 Master 的可用性,当发现 Master 不可用时,则在一定时间切换到备用 Master 上。

主要的配置项如下:

复制代码
# multi-Master
Master:
- 10.27.135.188
- 10.27.135.189
# 设置为 failover Minion
Master_type: failover
# 探测 Master 的间隔,单位为秒
Master_alive_interval: <seconds>

该方案的优点是基于 SaltStack 原生的高可用支持,不需别的组合方案进行支撑,理论上可以实现 Master 的高可用,但是经过实际的验证和测试,存在一些明显的不足:

  1. Minon 在启动的时候会随机连接一台 Master,假如此时连接的 Master 恰好宕机,Minion 不会再随机选择另外一台 Master,从而导致连接失败的情况。
  2. Minion 检测间隔,根据 Master_alive_interval 的设置时间,Minion 会主动对现有的 Master 进行 TCP 连接一次检查,查看 Master 是否响应。如果探测间隔设置过长,则可能影响到切换的时效;如果探测间隔设置过短,在大规模服务器场景下,则在短时间内产生过多的网络请求,对 Master 主机以及网络带宽产生巨大冲击,相当于一次 DDOS 攻击。
  3. 假如需要更换 Master 的 IP 或者追加新的 Master 的 IP,则需要对该 Master 下的所有的 Minon 进行配置变更,更恐怖的是 Minion 需要重启才能生效。
  4. Salt-key 同步没有提供解决方案。

方案 2

经过不停实验,发现 Master 可以通过由 Keepalived 维护的 VIP 对外提供 Salt 服务,平时 VIP 绑定在主 Master,当主 Master 宕机时 VIP 漂移至备 Master,主备 Master 通过 lsyncd 共享 Salt-key 文件。

** 注:Keepalived 软件主要是通过 VRRP 协议实现高可用功能的。VRRP 是 Virtual Router RedundancyProtocol(虚拟路由器冗余协议)的缩写,VRRP 出现的目的就是为了解决静态路由单点故障问题的,它能够保证当个别节点宕机时,整个网络可以不间断地运行。

所以,Keepalived 一方面具有配置管理 LVS 的功能,同时还具有对 LVS 下面节点进行健康检查的功能,另一方面也可实现系统网络服务的高可用功能。**

在实际运行时,Minion 会主动向 Master(VIP)发起注册,每 5 分钟检测一次跟 Master 的 TCP 连接,如果连接被冲断则重新发起 TCP 握手,建立 TCP 长连接;当主 Master 发生宕机,Keepalived 检测到后将 VIP 漂移至备用 Master,Minion 最多在 5 分钟后将向备用 Master 的 VIP 发起 TCP 连接请求,并重新挂起长连接,等待 Master 发起任务。

该方案的需要安装额外的软件对高可用进行支撑,由 Keepalived 对 Master 进行宕机检测,由 lsyncd 保证 Salt-key 的实时同步。这样做的好处是可以避免的方案 1 的诸多不足。首先,Minion 端识别到的是虚拟的 Master 的 IP 地址,所以 Master 底层的 IP 地址的变化对 Minion 端是无感知的,Minion 既不需要更改配置也不需要重启;其次,Keepalived 的检活机制是对本网段内的 D 类地址进行检测,并设置了唯一的虚拟路由 ID,检测间隔控制在 5 秒以内,所以不会对集团网络造成冲击;最后由 lsyncd 对 Salt-key 进行同步,既保证了安全性,又避免了多个 Master 之间 Salt-key 同步的问题。

至此,通过以上的混合解决方案,成功的实现的 Salt Master 宕机自检测自动迁移的高可用方案,目前新港环境下的服务器已经全部由采用高可用架构的 Salt 集群接管。

总结

现在的 ACM 已经基本满足集团在日常以及大促的批量规模调用。

  • 目前 ACM 已经最大支持 K 级服务器的同步调用。
  • ACM 同步简单任务的调用平均开销时间约 200ms。
  • 平台日均调用量已经接近 50 万次。
  • 请求成功率 99.99%。

展望

随着系统可靠性得到保障,接入系统和调用量将会越来越高,以后怎么应对日均百万,千万级的任务调用也提上日程。

未来的 AIOps 对 ACM 这种基础配置服务平台也会提出的更高要求,因为当指挥监测系统在采集决策所需的数据,做出分析、决策后,ACM 则需要担当起执行动作的工具,利用自动化脚本 / 命令去执行 AI 大脑的决策。

目前 Saltstack 已经管理了十五万 + 的服务器,当 Salt 调用失败时,  可能是因为机器本身宕机、防火墙限制,七层网络不通、系统负载过高、磁盘满了等等各种,这些原因会造成 Salt 调用失败,我们希望提前对 Salt 故障问题作出预警,并能够智能的定位问题和解决问题。

而目 Salt 在批量执行时也有一定的概率产生任务结果的丢失,因为所有任务的返回结果时都需要客户端主动推回服务器,在批量任务大时,少数机器的返回结果会丢失。

这些课题我们后续也将继续研究,探索!

作者简介

徐洋,十年高可用 Linux 集群、服务器虚拟化建设经验,现为苏宁易购 IT 总部技术经理。擅长 Linux 服务器故障诊断与排除,在数据同步、SHELL 脚本、Linux 系统安全等方面有深入研究,精通服务器集群配置管理的自动化、高可用化技术。

2018-11-07 18:402847

评论 2 条评论

发布
用户头像
靠谱
2018-11-11 19:28
回复
没有更多了
发现更多内容

【Spring Boot 三】SpringBoot中事件与通知

石臻臻的杂货铺

Spring Boot 8月月更

COSCon'22城市/学校/机构出品人征集令

开源社

#开源 COSCon'22

国密是什么意思?属于商密还是普密?

行云管家

信息安全 国密

数据结构与算法完整版 | 超详细图解,看这一篇就够了

冉然学Java

字节跳动 java; 技术分享 编程、 算法与数据结构

我和 TiDB 的故事 | 横看成岭侧成峰

TiDB 社区干货传送门

人物访谈

我和 TiDB 的故事 | 学tidb半年,社区治好了我的精神内耗

TiDB 社区干货传送门

人物访谈 社区活动

NLP 论文领读|无参数机器翻译遇上对比学习:效率和性能我全都要!

澜舟孟子开源社区

人工智能 自然语言处理 机器学习 深度学习 机器翻译

字节跳动 Flink 状态查询实践与优化

Apache Flink

大数据 flink

阿里P8整理的《百亿级并发系统设计》实战教程,实在是太香了

冉然学Java

数据库 编程 架构 分布式 并发系统设计

47K Star 的SpringBoot+MyBatis+docker电商项目,附超详细的文档

冉然学Java

数据库 项目 java; 编程、 源码学习

vue-router 如何实现支持外部链接

Five

vue-router 路由 8月月更

兵荒马乱,毕业季的故事

坚果

毕业 8月月更

行云管家荣获第十一届中国财经峰会“2022杰出品牌形象奖”

行云管家

云计算 多云管理 财经峰会

shell脚本,帮你提升摸鱼时间!

工程师日月

签约计划第三季 8月月更

RT-Thread记录(二、RT-Thread内核启动流程 — 启动文件和源码分析)

矜辰所致

RTT RT-Thread 8月月更

观测云产品更新|DCA Web 端上线;新增全局的查看器自动刷新配置;新增全局黑名单功能;新增自定义功能菜单等

观测云

CRM巨头败走中国,Salesforce中国区或将解散?

ToB行业头条

华为分析&联运活动,助您提升游戏总体付费

HarmonyOS SDK

华为 游戏开发 分析 HMS Core

我和TiDB的故事 | 遇上你是我的缘

TiDB 社区干货传送门

人物访谈 社区活动

荆棘与玫瑰:基础服务架构师的成⻓之路

九叔(高翔龙)

架构师 全球架构师峰会

CVE-2021-37580 Apache ShenYu 身份验证绕过漏洞复现

美创科技

漏洞

中移链EOSJS实战使用

BSN研习社

NFT卡牌游戏系统Dapp开发(NFT链游)

薇電13242772558

dapp NFT

兆骑科创高层次人才引进平台,赛事活动举办,线上路演

兆骑科创凤阁

leetcode 240. Search a 2D Matrix II 搜索二维矩阵 II(中等)

okokabcd

数组 LeetCode 数据结构与算法

踩坑了!mysql明明加了唯一索引,还是产生了重复数据

程序员小毕

Java MySQL 数据库 程序员 后端

【Spring Boot 四】启动之准备系统环境environmentPrepared

石臻臻的杂货铺

Spring Boot 8月月更

酷炫一款动态背景+鼠标点击效果(HTML +js canvas)

Five

Hexo js 动效 canvas 8月月更

自己动手制作elasticsearch-head的Docker镜像

程序员欣宸

Java Docker elasticsearch 8月月更

文盘Rust -- 配置文件解析

TiDB 社区干货传送门

开发语言

对话庄表伟:开源第一课

开源社

#开源

苏宁海量服务器自动化配置运维实践_DevOps & 平台工程_InfoQ精选文章