写点什么

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

徐洋

  • 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:402808

评论 2 条评论

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

郑州商品交易所:数智一体化助力交易所数字化转型

星环科技

青岛研博基于EMQ物联网数据基础设施在智慧水务平台产品中的实践

EMQ映云科技

物联网 IoT 实践案例 emq 5月月更

太极限了,JDK的这个BUG都能被我踩到

捉虫大师

jdk bug 5月月更

TDS:标签平台+API平台+数据共享平台,助力数据运营平台建设

星环科技

TDC 3.0 从数据分析到数据流通,数据云拓展新场景

星环科技

Zadig v1.11.0 发布:不止于环境,与开发者一起交付全球业务

Zadig

DevOps 云原生 CI/CD 软件交付

iview 如何实现文件上传并限制上传格式和大小

CRMEB

在Rainbond中一键部署高可用 EMQX 集群

北京好雨科技有限公司

Rainbond结合NeuVector实践容器安全管理

北京好雨科技有限公司

京东优惠价格策略助手

江苏京酷电子商务有限公司

查询优化 京东 优惠券 转链

深入探索云原生流水线的架构设计

尔达Erda

DevOps 运维 云原生 架构设计 pipeline

星环科技打造自主可控的高性能数据库,开启国产化升级新篇章

星环科技

星环科技多模型大数据基础平台TDH9.0:十种数据模型组合拳 打通大数据业务全场景

星环科技

【LeetCode】移除指定数字得到的最大结果Java题解

Albert

算法 LeetCode 5月月更

如何将你的 WordPress 网站置于维护模式

海拥(haiyong.site)

WordPress 5月月更

星环科技TDH社区版:让大数据分析触手可及

星环科技

CRM系统可以拯救您的初创企业

低代码小观

初创公司 CRM 中小企业 CRM系统 初创型企业

使用开源软件的优点和缺点是什么

爱吃小舅的鱼

超低延迟传输网络架构在元宇宙场景的应用

网易云信

音视频 元宇宙 传输网络

String源码解析-String的使用注意

zarmnosaj

5月月更

星环科技Sophon 3.1发布,模型运管、隐私计算、边缘计算、知识全流程实现从数据到智能的全链路构建

星环科技

制作网站的FAQ时,需要考虑哪些功能,要有哪些注意事项

小炮

FAQ

Wally-DR6000/IPQ6000/802.11ax/ 2x2 2.4GHz&5GHz /1.7Gbps

wallys-wifi6

Linux wifi6 openwrt

星环科技StellarDB4.0正式发布:性能数倍提升,万亿级图数据库挖掘海量数据互联价值

星环科技

netty系列之:给ThreadLocal插上梦想的翅膀,详解FastThreadLocal

程序那些事

Java Netty 程序那些事 5月月更

手慢无!Alibaba五份自研Java程序员进阶宝典限时开源(开发手册+面试指南+性能优化+机器学习+架构手册)

Java全栈架构师

Java 程序员 架构 面试 程序人生

面试以前上司,能力一般,但他卑微哀求,我该不该放水?

Java全栈架构师

架构 面试 程序人生 java程序员 java 编程

GPU服务器:全球市值最大的半导体公司

Finovy Cloud

人工智能 云计算 GPU服务器

星环科技数据安全与流通新产品+原创合规体系方法论,加速数据安全落地!

星环科技

体验有礼 | 1 分钟 Serverless 极速部署个人网盘,真网盘真好用!

Serverless Devs

阿里云 互联网

HarmonyOS 2版本更新!两个小技巧让你告别隐私泄露烦恼

科技汇

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