工作中有个项目用 ruby 做的分布式,前端是 rails+mysql 实现的,原来的 ruby 是 1.9.3,rails 是 2.3。后端 ruby 版本也是 1.9.3。我们小组几个人花了两个月的时间,对前端的 ruby 完成了 2.1.2 的升级,并且在后端做了一个基于 ruby2.1.2 的后端架构的改版,上线的时候为了稳妥起见,决定采用小步快跑的方式,后端机上要实现新旧架构同时存在,前端逐步从旧版往新版上挪。
前端挪的工作比较容易,除了改一点配置以外,剩下的都是体力活。最大的问题可能是在后端,因为之前后端一直是在使用 god 来守护服务的,领导还是希望使用 god 来做这件事,那么我要解决的问题就是:** 如何实现使用 god 来支持两个 ruby 版本的服务 **。
实现这个要求其实有两种思路:1、装两个 god,一个版本一个,都启动;2、在其中一个版本中装 god,然后用它去支持两个版本的服务。
对比来说,肯定是第二种比较好,因为装两个 god 就等于说一个 god 的消耗进行了一次 double,这对于处女座的人来说是无法忍受的,所以果断放弃了(这么做其实更简单)。好,来说说第二种方法。
首先我们只是用一个 god 就决定了我们只能用一个用户来进行上面的东西,在 ruby 的管理工具中,rvm 和 chruby 都是备选,chruby 相对于 rvm 更轻,rvm 对于大家来说可能更熟。按理来说放在服务器端运行的东西,chruby 应该更合适才对,但是这条道路上还有太多的坑还需要挖,我们还是暂时选择了 rvm,因为我们等所有的东西都挪到新后端后,我们还是要去 rvm 的,所有没有必要在管理工具上消耗太多精力。
rvm 是个好东西,功能还是比较多的,它会自动的去扫描你的文件夹下 Gemfile,.rvmrc,.ruby_version 中是不是有规定 ruby 版本的信息,我不喜欢用 Gemfile 和 rvmrc 来做规定 ruby 版本这件事,因为我不是每个项目都有 Gemfile,而 rvmrc 又太过复杂,影响我切换 ruby 版本的速度,.ruby_version 还是极好的!因为它真的特别简单,里面就只有一个 ruby 版本的信息,直接 echo '2.1.2' > .ruby_version
。就 OK 了。
装 rvm
装 ruby
设定一个 ruby 版本为 default,在这个版本上装 god
设定不同服务的 ruby 版本
改 keep.god,start 都改成 rvm in service_path do start command
修改启动项
测试
OK,搞完下班!