生产环境出现事故,开发和运维都有责任,到底该谁背锅

发生一档子事情,公司技术团队之中有两个部门,一个开发一个运维,开发负责公司项目软件项目实现,运维负责项目运行生产环境服务器与数据的管理与维护。 前两天生产环境发生一起故障,项目依赖的redis服务器由于内存不足而出现写入故障,有一批用户丢失了一小时的数据, 公司发出批评通告, 运维全责,运维部门涉事相关员工与领导统统被罚。

 

为什么运维被罚,因为服务器内存不足会报警,向负责服务器的运维人员发出警告短信,运维人员收到警告后需要即使处理。 而这次事故服务器发出的警告不凑巧的被运维忽略,于是事故发生, 究其原因是因为忽略警告,因此被罚。

 

这看起来似乎在情理之中,被罚是理所应当,这是运维马虎大意造成的恶果。可是不知道大家有没有觉得奇怪,为什么Redis无法写入会造成用户数据丢失,Redis只是一个缓存工具,理论上缓存数据丢失可以通过磁盘持久存储数据恢复。有的同学推测可能缓存中的数据没有同步至磁盘导致问题,事实上这次事故并非同步数据失败引起,甚至根本没有缓存数据同步至持久存储一说,因为项目的开发人员直接把Redis当成了持久存储的数据库,而没有使用MySql之类的真正持久存储数据库。是不是很奇怪,居然有人把内存数据库当真正的数据库使用,虽然Redis提供这个功能。这就是导致问题的根本原因,持久存储并非Redis擅长,强行使用不但败家,而且危险,用户数据增长内存也要跟着涨,一旦跟不上Redis崩溃,程序故障,线上业务直接受到影响。

 

现在看起来,这起事故的责任开发人员也应该承担部分,技术使用不当是导致问题的根源。可是我说了不算,公司的领导不吃这套, 毕竟触发这起事故的直接原因是运维忽略告警照成的,那这个责任没有理由推脱给别人。

 

通常在业务上犯错会被追究责任,比如说这次事故运维被罚,而技术上犯的错误却不会, 因为技术上的错误不容易被明确定义,比如说问开发人员们为什么要将Redis当成数据库,他们会有充足的理由,比如让程序跑的更快,使用Redis的确能让程序跑的更快,而且是必然。可使用Redis当数据库也存在一系列问题,比如不稳定,容易丢失数据等,这起事故便是证明,可这不是必然发生的,MySql也会丢失数据,关键是要看如何避免,这便是开发人员使用Redis的充足理由,同时也不会被认为是在范错误,他们是为了让程序获得更好的性能,这应该受到奖励而不是处罚,可实际上使用Redis当数据库就是在犯技术上的错误,就像你开个跑车去跟越野车去山路上跑比赛,你说你开跑车是为了跑赢,可却随时会有车毁人亡的危险, 因为跑车不适合开山路,Redis也同样不适合做数据库。

 

现在很多程序员对于技术的选择并不以解决问题为目的,有时候他们会为了使用技术而选择技术,就好比Redis,因为很多大公司都在使用,所以他们也非要在自己的项目中用一用,不然怎么跟的上技术的步伐。他们把Redis研究的很精通,甚至连底层的C语言实现都会去研究,这是好事,可在项目中盲目使用就不对了,恨不得把所有存储数据的地方都用Redis,至于适合不适合,他们不考虑。

 

然后随着项目的进展,使用Redis当数据库的问题渐渐暴露,他们意识到这方面Redis的确不如MySql,然后他们后悔了,可这个时候技术架构已经定型,要换成MySql需要花费极大的代价,如果项目已经上线则还要承担风险,这种伤筋动骨的修改容易产生严重的bug,要保证既不影响进度又不改出bug是一项异常艰难的任务,因次开发人员们没有勇气迈出这一步去优化。

 

甚至于对于那些全新启动但是沿用旧框架的项目他们也没有动力与勇气去改变,我常常听他们说这样一句话:旧的架构已经被证明是可用和稳定的,那么我们就没有理由去改,如果新项目采用新架构却没有办法应付业务, 出了问题谁负责。总而言之一句话,他们害怕改变害怕走出舒适区。

 

而那些级别高一点的领导却完全不关注技术对项目的影响, 即使项目部门的领导也不关注,在他们眼里业务是首当其冲,技术是细枝末节,他们对技术的要求是别拖项目的进度,生产环境别出严重的bug,如果出了那就以处罚的方式让事故责任人牢记在心避免再犯,这便是他们应对技术问题唯一的措施。然后还总爱大言炎炎的张嘴流程优化闭嘴责任态度,却从来不会深入技术部门去发现问题去督促改进,他们觉得这是技术主管负责的事情,这没错, 可要在技术主管靠谱的前提下,如果不靠谱那么就容易发生悲剧,比如说这次事故。 而现在通常很多公司技术部门主管的工作更偏向于是督促员工完成需求保证进度的包工头,至于技术选型和实现统统都要给进度让路,主动改进技术问题,不存在的。

 

我就是觉得公司对于这件事情处理不公平才说这么多,那些不懂技术的人只从问题的表明定义责任,而不是去从根本上解决问题,当然,他们的确不可能从根本上去解决问题, 因为他们根本没发现问题。

转载于:https://www.cnblogs.com/aspwebchh/p/10286553.html

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,下面我将为您详细介绍一个运维工程师常用的 Jenkins 和 GitLab 项目,包括项目的名称、描述、使用场景、配置方法和运行流程等方面的内容。 1. 项目名称:DevOpsPipeline 2. 项目描述:该项目是一个基于 Jenkins 和 GitLab 的 DevOps 自动化流水线,用于管理和协调多个开发团队的代码变更,并确保这些变更能够顺利地部署到生产环境中。 3. 使用场景: - 代码管理:使用 GitLab 托管代码仓库,并使用 Jenkins 进行持续集成和持续交付。 - 构建:使用 Jenkins 构建工具进行应用程序的编译和打包,生成可执行文件和 Docker 镜像。 - 测试:使用 Jenkins 调用测试工具进行自动化测试,包括单元测试、集成测试、性能测试等。 - 部署:使用 Jenkins 部署工具将应用程序部署到测试环境、预发布环境和生产环境中。 4. 项目配置: - GitLab:创建一个 GitLab 代码仓库,并将代码推送到该仓库中。 - Jenkins:创建一个 Jenkins 项目,配置 Jenkinsfile 文件,定义构建、测试和部署的流程,并设置触发器和构建参数等。 - 测试工具:根据项目需要选择合适的测试工具,如 JUnit、Selenium、JMeter 等,并在 Jenkins 中安装和配置相应的插件和工具。 - 部署工具:根据项目需要选择合适的部署工具,如 Ansible、Docker、Kubernetes 等,并在 Jenkins 中安装和配置相应的插件和工具。 5. 项目运行流程: - 提交代码:开发人员将代码推送到 GitLab 代码仓库中。 - 自动化构建:Jenkins 检测到代码变更,自动触发构建流程,编译应用程序并生成可执行文件和 Docker 镜像。 - 自动化测试:Jenkins 调用测试工具进行自动化测试,包括单元测试、集成测试、性能测试等。 - 自动化部署:Jenkins 调用部署工具将应用程序部署到测试环境、预发布环境和生产环境中。 具体实现过程如下: 1)在 GitLab 中创建一个空项目,并将项目代码上传到该项目中。 2)在 Jenkins 中创建一个新的 Pipeline 项目,将 GitLab 项目的仓库地址添加到 Jenkinsfile 文件中,定义了一系列的 stages,例如代码拉取、构建、测试、部署等,如下所示: ``` pipeline { agent any stages { stage('Code Checkout') { steps { git branch: 'master', url: 'https://gitlab.example.com/username/project.git' } } stage('Build') { steps { sh 'mvn clean package' } } stage('Test') { steps { sh 'mvn test' } } stage('Deploy') { steps { sh 'ansible-playbook deploy.yml' } } } } ``` 3)在 Jenkins 中安装并配置相应的插件和工具,如 Maven、JUnit、Ansible 等。 4)在 Jenkins 中配置触发器,可以选择定时触发、代码变更触发、手动触发等方式。 5)在 Jenkins 中配置构建参数,如构建环境、构建版本等。 6)运行 Jenkins Pipeline 项目,Jenkins 将自动拉取 GitLab 项目中的代码,执行构建、测试和部署的操作,并生成构建报告和部署日志。 总之,该项目的目的是为了实现 DevOps 自动化流程,减少人工干预,提高应用程序的发布速度和质量,从而使开发团队能够更加专注于应用程序的开发和创新。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值