瞎扯淡 总结教训

fsword · 2013年01月05日 · 最后由 hawkflying 回复于 2013年01月08日 · 4667 次阅读

这次论坛帖子的损失很大,大家痛心不必说,责怪谁也没意义,不如讨论一下如何总结教训吧。

事情背景参考这个: http://ruby-china.org/topics/7748

当然我们可以制定制度来解决问题,比如禁止在线进行 rspec 操作,但是好的办法应该是尽量用技术和框架来搞定而不是给人定一堆条条框框。

个人观点,这次的问题是由于线上机器部署了与产品无关的配置和代码信息导致的,如果线上根本没有 rspec(以及其它用于开发、测试的环境),那么这个问题就可以很容易避免了

另外一个角度,最近在考虑这样一件事,软件框架通常都提供 production/test/development 三个不同的配置环境,初看挺不错,但有两个缺陷:

  • 实施的时候容易把环境配置文件和源代码放在同一个版本控制系统中,而真实的场景中,环境的配管信息其实是和代码有不同的维护方式和生命周期的,这是导致线上可以做 rspec 操作的一个重要原因
  • 所谓 开发/测试/线上 其实只是一个很粗略的环境分类,在真实的情况下,会有小集成(若干应用联调),大集成(系统测试)以及很多临时性的环境配置,这些都是工作中的“暗礁”

所以,似乎应该取消这种僵化的“三个环境”的配置管理策略,系统只有一个环境,但是由外部的配管系统来进行统一的配置项管理。

第一个办法比较容易,bundle+capistrano 能解决这个问题么?也许 @xdite 会有办法 第二个办法比较“大”,如果能结合一片“云”来做更好,所以可能仅适合大公司

既然都开源了,用一下travis-ci啊...

#1 楼 @bhuztez 对,忘了这个了,下次我们聚会讨论一下 CI 吧,travis ci 很不错

每日备份数据 不在生产环境调试 上线前备份数据

就好了啊,简单粗暴,但复杂度低可靠性就高,没必要用更复杂的技术了

上线前内测更好

#3 楼 @reus 制度说起来大家都知道,所以就跳过了,不过程序员善于用技术解决问题......

@bhuztez 是因为有个 bug 只有 production 环境才能重现 https://github.com/ruby-china/ruby-china/pull/143

#4 楼 @fsword 技术就如谎言,一句需要用一百句来圆谎,技术栈复杂了,任何一个部分出 bug 都可能导致灾难,所以适度使用简化的技术,会更加安全稳妥

#6 楼 @reus 这样看怎么衡量了,第一种方法可能反而让技术栈复杂了,而第二种实际上是简化了技术栈(彻底取消各种配置环境)

关键还是备份

小数据保持每日备份,上 10G 的数据不知有何办法 其实这和跑步跑测试没有关系,这次问题是正好哪里有个漏洞,才导致的。

应该从数据库级别限制:

  • 不允许删除数据库
  • 不允许全表删除

#9 楼 @huacnlee 和测试没有关系是怎么回事?

#7 楼 @fsword 比起备份,这两种方法都很复杂而且并不更安全啊

赞同 @reus ,简单最好。

我上午发过一个贴,现在这个状况也适合:疏忽大意的危险在于每个人都认为自己没有疏忽大意。没有摔过跤,就总会觉得悲剧不会在自己身上发生。我也是挂过一次服务器才养成了每日备份的意识。

#9 楼 @huacnlee 如果还在 Linode 的话,有 3 个级别的整机备份,而且 Linode 到 Amazon S3 的传输速度有 50-100Mbps 左右,10G 数据 1 小时就备完了。 当然,我想社区迁移服务器也肯定是经过综合考虑的。

#9 楼 @huacnlee 每次都全备份?增量备份不会有这么大吧?

Wait... RubyChina 的数据规模达到 10G 了么?

#15 楼 @lgn21st 目测应该不到 1G...我觉得

#14 楼 @blacktulip 每次完整备份有另外的好处

我有个数据超过 20G 的应用,主要是用户上传的 assets,不知有没有比较好的备份策略?

#3 楼 @reus 有没有详细点的教程。

@qhwa 你可以试试 backup 这个 gem 支持 rsync 方式做增量备份比较方便 配合 whenever 或者直接 crontab 在午夜去跑

我是用 backup + whenever 這個 gem 每 3 個小時跑一次 mysql 備份

直接买了 LInode 备份服务,每天自动备份~

@qhwa 看来我和 xdite 的方法一样。。。不过静态文件备份的时候很占各种资源,所以还是午夜去做好些吧

快速敏捷总要牺牲点什么... 定时做好备份就好。

@jasl 谢了,今天就用 backup 试试~

定制个简单的备份策略就好了,每周全备一次,每天就增量备份

我以前写过一个 gem 用来做备份服务器的

https://github.com/jinzhu/backupit

除了传统备份方法(备份文件,数据库本身的备份功能)之外,还可以可以考虑文件系统的快照。ZFS BtrfsLVM 都可以做到。

说下我们的备份方案: 1, RAID 1 2, 每天夜间 rsync 增量备份 3, 每天夜间 rsync 异地机房备份 4, mysql 主从复制

#9 楼 @huacnlee 这个策略是个好办法。

需要 登录 后方可回复, 如果你还没有账号请 注册新账号