【AICon】探索RAG 技术在实际应用中遇到的挑战及应对策略!AICon精华内容已上线73%>>> 了解详情
写点什么

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

徐洋

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

评论 2 条评论

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

区块链公链技术开发

西安链酷科技

System Dashboard Pro for Mac(专业系统监视器)v1.10.8激活版

影影绰绰一往直前

SponsorBlock for YouTube for Mac(跳过youtube赞助商广告)v5.5.9激活版

影影绰绰一往直前

DeFi/DAPP 质押挖矿系统技术开发

西安链酷科技

云算力挖矿源码 dap质押挖矿开发 云算力挖矿

"数字货币市场回归价值导向:Somle预售事件的启示"

区块链软件开发推广运营

区块链浏览器 dapp开发 链游开发 NFT开发 公链开发

2024-03-23:用go语言,一张桌子上总共有 n 个硬币 栈 。每个栈有 正整数 个带面值的硬币, 每一次操作中,你可以从任意一个栈的 顶部 取出 1 个硬币,从栈中移除它,并放入你的钱包里。

福大大架构师每日一题

福大大架构师每日一题

《Java并发编程实战》PDF

程序员李木子

公链系统开发全指南:从规划到实施,详解每个步骤

区块链软件开发推广运营

dapp开发 区块链开发 链游开发 NFT开发 公链开发

动力底盘域的“一小步”,智能汽车的“一大步”

脑极体

AI

Aiseesoft Mac Screen Recorder for Mac(屏幕录像截图工具)v2.2.26激活版

影影绰绰一往直前

Perfectly Clear Workbench for Mac(智能图像清晰修复软件)v4.6.0.2647永久激活版

影影绰绰一往直前

去中心化交易所搭建|区块链数字货币交易平台开发

西安链酷科技

去中心化交易所系统开发 dex交易所开发

DAPP钱包燃烧质押合约挖矿项目系统开发

l8l259l3365

Python基本文件操作及os库

百度搜索:蓝易云

Python Linux 运维 云服务器 OS

Privatus for Mac(网页缓存清理工具)v7.0.3激活版

影影绰绰一往直前

Rectangle Pro for Mac(光标快速移动和管理窗口的工具)v3.0.20激活版

影影绰绰一往直前

GameFi游戏NFT链游开发系统搭建技术

西安链酷科技

链游开发 区块链游戏开发

Wicrypt:赋有激励的 DePIN 互联网共享生态

股市老人

关于 .NET Core 中的 Host

雄鹿 @

ASP.NET Core

Ubuntu 20.04通过udev规则修改网卡名称(例如eth0)

百度搜索:蓝易云

Linux ubuntu 运维 云服务器 udev

构建多语言数字资产交易平台和秒合约系统:从概念到实现

区块链软件开发推广运营

dapp开发 区块链开发 链游开发 公链开发 FT开发

纠个错……OpenAI和马斯克的两个开源项目都叫Grok?

天马行空的大杂烩

程序员 开源项目 马斯克

Greenplum实用技巧

百度搜索:蓝易云

云计算 Linux 运维 greenplum 云服务器

Magic Disk Cleaner for Mac(磁盘垃圾清理工具)v2.7.1激活版

影影绰绰一往直前

定制Dapp开发:快速上线您的去中心化应用

区块链软件开发推广运营

dapp开发 区块链开发 链游开发 NFT开发 公链开发

Swinsian for Mac(音乐播放器)v3.0Preview15永久激活版

影影绰绰一往直前

Ghost Buster Pro for mac(苹果电脑内存清理专家)v3.0.0激活版

影影绰绰一往直前

Segment Anything(SAM)的哪些后续方法,又快又好?

AI帅辉

深度学习 计算机视觉 图像分割

初级Go工程师训练营第0期总结

刘博

Go 极客时间 课程总结

Penpad 生态资产 $PDD LaunchPad 在即,Season 2 规则解读

西柚子

MySQL之优化SELECT语句

百度搜索:蓝易云

MySQL Linux 运维 云服务器 select

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