Logo

基于腾讯云服务的 Rails 负载均衡部署方案简介

avatar hugo 22 Jul 2016

最近应客户要求,将网站的单机部署架构,改为了双机负载均衡架构,以提高整个系统的可用性。

方案一、自建方案

1.1 负载均衡:Keepalived + Nginx + HAproxy

自建负载均衡方案的主要原理是,在每一处有单点故障风险的地方(如 Web server、Rails app server、数据库等),都使用 keepalived 配置至少两个独立进程,防止其中一个服务宕机后,导致整个网站不可访问。

1.2 数据库高可用:MySQL MHA

MySQL 数据库高可用的架构,考虑到一般网站的访问量、对 down time 的要求和各种架构配置的复杂度,采用 MySQL MHA 比较合适。

参考资料:

自建方案架构图

架构图1

自建方案费用

单台 VPS:¥65元/月

最低费用:(Nginx/App Servers x 2 + MySQL DBs x 2 + MHA Manager x 1) x ¥65元/月/台 = ¥325元/月

优点

  • 部署、运维人员对系统有完整的掌控权
  • Keepalived 提供了失效切换的 callback 功能,可以在服务器宕机时执行脚本,例如发送通知邮件、尝试重启服务器等

缺点

  • 由于网络较为复杂,对部署、运维人员的能力要求较高
  • 相对方案二,硬件成本也比较高

方案二、购买腾讯云服务方案(推荐并且已实施的部署方案)

2.1 腾讯云负载均衡

费用:

  • 负载均衡实例费用 :公网有日租:1元/天
  • 负载均衡带宽费用:
    • 云服务器按带宽计费:带宽消耗使用的是云服务器已包含的公网带宽,不另外收取带宽费用;
    • 云服务器按流量计费:用户使用公网负载均衡会产生出流量,需支付对应的流量费用。

网络计费说明

2.2 腾讯云的云数据库 CDB for MySQL

费用:

  • 推荐配置:高IO型,容量25GB,内存1000MB
  • 费用:112元/月/台

架构图

架构图2

最低费用总计

负载均衡实例费用30元/月/个 + 云数据库 CDB for MySQL 112元/月/台 + App Servers x 2 x 65元/月/台 = 272元/月

优点

  • 降低系统的配置、管理复杂度
  • 数据库实时双机热备,故障秒级切换。不需自建主从,自建 RAID(腾讯云数据库的产品说明)
  • 费用相对自建方案便宜

缺点

  • 腾讯云的负载均衡在检查到服务器失效后,没有提供 callback 的功能,导致在失效切换时不能进行一些自定义操作

结论

综合考虑费用、维护复杂度等因素,最终我们选择了方案二来实施双机负载均衡部署。

遇到的问题

问题一:图片存储(已解决)

原有的单机架构是使用 carrierwave gem 将图片存储在服务器本地,那在某个用户某次访问网站更新图片后,图片被存储在了服务器1上。假如后来服务器1宕机了,那图片就会丢失了。

解决办法就是使用腾讯云对象存储服务 COS 。迁移图片到腾讯云 COS 也费了点时间。我厂 CTO Rain 还为此写了支持腾讯云 COS 存储的 carrierwave gem 插件:carrierwave-qcloud

问题二:计划任务(暂未解决)

使用 capistrano 结合 whenever 部署 Rails 的后台定时任务,crontab 配置只会生成在 db role 为 primary 的服务器,这里又是一个单点故障的地方。

计划任务这个单点故障的地方,因为时间关系在最终的部署方案里没有做成高可用架构。设想的方案是配合 redis 部署一个高可用的定时任务服务器。

Tags
rails
Load Balance
联系我们