在今年北京的 rubyconf 上,@fsword分享过基于青云 API 的作品larrow-runner,应该是第一个 ruby-client 实现。
下面的内容,之前在青云深圳沙龙分享过,可能社区里没人去,整理成文字版再来分享下。
先看看友好速搭的部署架构: 一共部署了三十多台主机,是很常规的 web 应用三层架构。
系统动态请求统计图: 下午: 晚上:
下午和晚上的请求数,差距很大,午夜以后,基本没请求。 对于大部分应用,应该都有这种忙闲的周期。在闲的时候,保持最小可用就可以,没必要浪费。 既然青云将 IaaS 做成水电一样的资源,那也要学会节约。我们目前节约的方式,就是定时开关机。 动机很单纯: 一台 2 核 4G 的主机,运行时 0.45 元/小时,关机时 0.032 元/小时。
关机的时候,要避免中断当前正在处理的请求,所以要先从 nginx 下手。在 nginx 里面设置定时任务,执行 ruby 脚本,修改 upstream 配置,移除那些要关机的主机 IP,再通过service nginx reload
更新配置。reload 是用HUP 信号,不会对正在处理的请求造成影响:
Configuration reload Start the new worker processes with a new configuration Gracefully shutdown the old worker processes
之后等 20 分钟,主要是等要关机的 unicorn,将请求处理完。之后 crontab 执行 ruby 脚本,通过 API 关机,可以直接用larrow-qingcloud 中的 class:
conn = Connection.new('your_key', 'your_secret', 'zone_id')
# 调用关机接口
conn.get 'StopInstances',{ 'instances.1' => 'i-xxxx', 'instances.2' => 'i-xxxxx', 'zone' => 'gd1'}
注意,执行调用接口的主机,时间必须同步。
定时开机的话,顺序正好反过来。先通过 API 启动主机,主机中的 unicorn 配置成开机启动。然后等一段时间,等主机和 unicorn 启动完成,就更改 nginx 的 upstream 配置。
通过这种方式,全年可以节约 8% 的开支。有些包年月的 IaaS 服务商,可以打折,同样能节省开支。但是,节省开支,并非我们终极目的。
友好速搭作为服务商,商家做活动,不会通知我们做准备。商家在活动期间,系统负载不够,转化率降低,那就出大事了。
所以,我们正在尝试基于青云的 API,把这个节约体系,做的更智能。目前这个阶段,系统的负载瓶颈,主要是在中间的 Rack App 层,这个层面的主机数量也最多。我们要实现应用主机资源池,设定应用主机数量的上下限,通过算法,分析判断负载趋势,再通过工程,部署或销毁主机。