创业公司起步或凭技术 idea ,或靠大客户资源。但打造卓越商业化软件,需修炼产品定义、客户成功、市场宣传、销售服务、人才培养、组织建设等多方面。
历经8年,我们从简陋小办公室成长为专业激情团队,满载挑战与收获。我们将推出八周年系列文章,分享我们在产品、技术、市场、团队、人才等方面的故事与内幕,涵盖从摸索定义首个产品到技术架构复杂演进,从签约首客到多行业覆盖,从技术方案到产品化运作的历程。
故事中有面对挑战的突破、创新、希望与团队凝聚力,希望在 SaaS 行业面临重重挑战的当下,和更多团队一起去探索成功之路。
企业软件产品已成为支撑企业运营的基石。然而,软件产品的运维却面临着诸多挑战,如何平衡研发成本与操作维护成本,实现高效的运维,成为摆在企业面前的难题。本文将结合实践经验,探讨企业软件产品运维的平衡艺术,并分享一些优化运维效率的策略。
运维需求的平衡艺术,核心在于如何在客户直接需求与厂商需求之间找到平衡点。客户环境差异大、多环境运维以及通用需求,都需要我们在产品设计、开发和维护过程中进行权衡。
客户环境差异大
为适应各种客户环境,在产品的设计上必须实现高度的灵活性与可配置性,来解决技术难题的应对以及技术栈和内部系统的兼容要求。
灵活性与可配置性
要实现产品高度灵活性和可配置性,我们必须设计模块化和参数化的解决方案。例如提供丰富的配置选项、支持自定义插件等,以便快速响应不同客户的需求。
技术难题应对
针对单个客户特有的技术难题,我们需要具备快速的问题定位和解决能力,并建立与客户紧密合作的沟通机制,例如定期进行技术交流、提供远程支持等,以确保问题能够得到及时解决。
技术栈和内部系统要求
产品内依赖的每种技术栈和内部系统都对运行环境有独特的要求。我们需要确保这些技术栈和系统能够在客户差异的环境中稳定运行,例如进行充分的兼容性测试、提供详细的部署指南等。
多环境运维带来了管理跨多版本升级的需求,同时也产生运维监控需求差异。
跨版本升级管理
我们需要确保历史不同版本的升级都是可行的,这需要我们有一套完善的版本控制和兼容性测试流程,例如使用自动化测试工具、建立版本发布计划等。
运维监控需求差异
由于客户技术背景不同,他们对运维监控的需求也会分布在功能丰富和简单易用两个极端之间。我们需要提供灵活的监控工具,例如,提供可定制的监控面板、支持多种告警方式等,以满足不同客户的需求。
除了应对客户环境差异和多环境运维的挑战,我们还需要关注一些通用的运维需求。
服务守护监控
实现服务守护监控,确保系统服务的高可用性,例如使用第三方监控工具、开发自定义监控脚本等。
多维度日志收集
建立集中的日志管理系统,收集来自不同模块、不同层面的日志信息,以便快速定位和解决问题,例如使用 ELK Stack、Graylog 等日志分析工具。
自动化部署
实现自动化部署可以减少人为错误,提高效率,例如使用 Ansible、Chef、Puppet 等自动化部署工具。
性能监控与优化
对系统进行性能监控和分析,找出瓶颈并进行优化,例如使用 Prometheus、Grafana 等性能监控工具。
系统配置和资源分配
调整系统配置和资源分配,以提高系统吞吐量和响应速度,例如使用容器化技术、虚拟化技术等。
数据备份与恢复
定期进行数据备份,并确保备份数据的完整性和可恢复性,例如使用 RAID 技术、备份软件等。
灾难恢复方案
制定有效的灾难恢复方案,以应对可能的系统故障,例如建立异地灾备中心、使用云服务提供商的灾备方案等。
实现上述运维需求需要投入研发成本,而追求大而全的目标会导致研发成本无限膨胀。因此,我们也需要在研发成本和操作维护成本之间找到平衡点。下面是我们在降低操作维护成本、提高运维效率上的一些行动。
使用自动化运维工具
越是操作维护成本高且场景出现次数多,就越需要自动化运维工具。这些工具能够在多个方面显著提升运维效率与质量,例如,自动化部署工具可以减少部署过程中的人为错误;自动化监控工具可以及时发现系统问题;自动化故障恢复工具可以快速恢复系统服务等。
成本效益分析
我们需要对每个运维需求进行成本效益分析,评估其带来的收益与投入的成本,并根据分析结果进行取舍。例如,对于一些低频出现的运维需求,我们可以选择手动操作,而不是开发自动化工具。
持续优化
运维是一个持续的过程,我们需要不断优化运维策略,例如定期进行运维流程评估、引入新的运维工具和技术等,以适应不断变化的需求和环境。
以衡石为例,在产品初期阶段,我们服务的每个客户都有内部独特的操作系统。这与公司内部项目基于统一、固定的操作系统进行部署大相径庭。因此,在初始部署阶段,我们不得不针对每个客户的不同操作系统发行版,逐一确认并整理所需的依赖包名称,进而实施定制化部署流程。
然而,随着部署次数的不断增加,这种手工适配操作系统发行版的方式逐渐显现出其高昂的成本和效率低下的问题。同时,客户的部署需求也日益多样化,从传统的部署方式逐渐扩展到了Docker和 k8s 等部署方式。
这些新兴技术不仅满足了客户的部署需求,同时也为我们提供了一种潜在的简化部署、提高效率的解决方案。因此,为优化部署流程、降低部署成本,我们根据运维需求的优先级,逐步推进了一系列功能优化,从而更好地应对不同操作系统和多样化方式部署的需求。以下几点是我们的重点优化内容。
二进制兼容不同 Linux 发行版
使用编译 glibc 兼容包的方式,将衡石自带的各种模块编译成 glibc 兼容二进制,实现统一套二进制程序在不同发行版不同版本号的系统上可正常运行。
部署一致性
单机、多机、Docker、K8s 按顺序逐级复用前一级的人机接口,用前一级的部署流程实现后一级的部署实现,尽最大可能减少实现分支,并最大可能暴露部署程序的问题。
完全实现 K8s 部署
适配各个依赖模块,例如在 Greenplum pod 内集成微控制器,替代大 operator 的方式,可以快速支持独立 pod 故障自动恢复。通过这些优化措施,我们可以实现在部署中只需操作1-2步逻辑部署过程,并且在不同发行版本中部署人机流程保持一致,即优化效率也统一流程避免出错。
运维不仅仅是技术问题,更是一个成本和效益的平衡问题。通过精心设计和实施运维策略,我们可以提高效率,降低成本,并最终提升客户满意度。希望本文的经验分享能够为您的运维之路提供一些启发和帮助。
本文作者吕亮:Emacs 程序员。2011年毕业于中国科学技术大学软件工程专业。毕业后入职秒针系统任高级研发工程师,从零实现分布式缓存集群。2016年加入衡石初创团队,先后担任服务端研发工程师,产品运维工程师,基础设施和运维开发 Tech Lead。