• 1
  • 2
  • 3
  • 4
  • 5
阿里云应用开发 首 页  »  帮助中心  »  云服务器  »  阿里云应用开发
基于Docker的Rails集群与Ruby负载均衡代理
发布日期:2016-8-3 15:8:55

  我打算做一个比较酷的使用Docker的例子:一个Rails集群,以及集群前面的一个Ruby负载均衡服务。曾经想过使用阿里云若干不同的机器(每台机器都有自己的IP地址与端口)来运行同样的Rails服务,然后在外部配置一台负载均衡的代理服务器,在各Railf服务间进行请求分配。

  但使用Docker的话,在一台阿里云机器上就可模拟集群环境了。


  图1

  这里我们将演示一下怎样来创建这个集群环境。

  你可从我的Github项目上下载所有这次测试的源代码。

  1、创建Docker镜像

  首先创建两个Docker镜像,1个用来运行Rails服务,1个运行Ruby代理服务。

  (1)首先我制作了一个可信Docker构建(Trusted Docker build),构建脚本也在我的Github上( Github project docker-ruby )。使用这个构建脚本创建的镜像为 murielsalvan/ruby ,它基于Ubuntu Precise,并安装了Ruby 2.1.0p0。

  docker pull murielsalvan/ruby

  (2)接着我基于murielsalvan/ruby来创建一个Docker容器,来执行一个bash shell,在里面安装Rails并创建一个Rails应用程序。这个应用程序只有一页,它将打印出它所在服务器的主机名与IP地址(集群里的每台Rails服务都有不同的主机名与IP地址)。你可从这里查看这个测试程序的源代码。这步的最后,我将把这个容器提交,生成一个新的镜像,并且命名为murielsalvan/server,这个镜像执行时,会启动Rails服务,并且监听3000端口号(容器内的端口号)。

  

  (3)最后我们来基于murielsalvan/ruby创建第二个容器。这个容器也是启动一个bash然后安装一个Ruby代理服务。。这个Ruby代理服务将接收一个地址列表作为输入参数,并创建一个基于随机策略的负载均衡服务,轮询所有给定的IP地址以及3000端口。这个代理服务的源代码可以在 这里 查看。最后我把这个容器也做了提交操作,生成了一个新的镜像 murielsalvan/proxy,它也将监听3000端口。

  

  2、运行Rails cluster

  在所有的镜像都创建完成后,我们就可启动容器了。我写了个小脚本来启动所有需要运行Rails服务的容器,它接收一个N参数,为Rails服务器个数。等Rails服务全部启动完成之后,这个脚本会打印出这些服务的IP地址列表。

  这个脚本的另一个工作就是将运行Rails服务的容器内的3000端口,绑定到本机的5000+i 端口上,这样就可非常方便的透过代理服务直接通过 wget -S -O – http://localhost:5000 命令来确认每台Rails服务是否运行正常。


  这段代码执行后输出结果如下所示,请注意最后的那IP地址,这些地址是Rails服务所监听的IP地址,我们在后面的Ruby代理服务器中会使用到这些地址。

  

  3、启动Ruby代理

  同样,在这里也通过一段Ruby代码来完成启动代理服务器的工作:

  

  这段代码将启动运行Ruby代理服务的Docker容器,其执行结果如下所示:

  

  这将启动Ruby代理服务程序,并监听3000端口

  4、打开浏览器

  服务程序都启动后,就可打开浏览器访问了。输入网址 http://localhost:3000,可确认返回结果里的主机名和IP地址。为确保每次请求都会发给代理服务来处理,要在每次请求这个网址时先清空一下缓存(强制刷新)。

  如图2所示,是两次请求的结果,从中我们可以看出,两次请求是分别由两台不同的Rails服务器返回的。


  图2

  刷新浏览器后:


  图3

  怎样,是不是很简单的一种Rails集群方案?你也可在自己的机器上尝试一下。

  我个人的测试环境如下:64位的Windows 7 主机,然后通过VirtualBox运行了Ubuntu 14.04 Alpha,所有的操作都在虚拟机里进行。性能也还算说的过去(每个请求的响应时间都低于1秒)。