使用Auto-Scaling服务在Bluemix平台构建可自动伸缩的应用

来源:互联网 发布:海贼王888 知乎 编辑:程序博客网 时间:2024/05/21 19:22

Auto-Scaling简介

      Bluemix Auto-Scaling是由CDL team发起并开发的一个能够对Bluemix平台的应用自动扩展的服务,致力于为开发者营造更友好和稳定的开发环境。

          通过Bluemix平台,用户可以非常方便的开发并部署自己的应用。一个应用的性能可能会随着访问量的增加而急剧下降。在不对应用本身进行代码优化的前提下,若要提高访问此应用的用户体验,对此应用进行扩展是最好的办法。

    在Bluemix上,存在两种扩展方式,垂直扩展和水平扩展。

          垂直扩展被称为向上 (scale up) 扩展。垂直扩展通过向运行应用的容器添加容量来增加可供应用程序使用的资源,比如增加CPU数目或者增加内存的容量。

          水平扩展又被称为向外扩展 (scale out)。通过增加应用的实例数目增加总体应用程序资源容量。比如以前是一个实例,现在扩展到5个应用实例。而在Bluemix上,这对应用的访问者来说是透明的,即访问者访问应用只有一个入口,其并不知道这个应用具体有多少个实例。

    Bluemix上的Auto-Scaling就是基于水平扩展来使应用具有可伸缩性的。

Auto-Scaling现在支持两种途径的缩放,第一种是基于应用的性能参数(如内存,Liberty的应用还支持heap,throughout等)的自动缩放,第二种是基于应用作者指定的时间段的缩放。

准备工作

        在Bluemix上创建一个应用并且绑定到Auto-Scaling服务

        注册一个Bluemix ID并登录。

        在Bluemix上创建一个应用,在Bluemix的dashboard点击CREATE APP。


 

 

   

     这里我们选择创建一个WEB APP作为示例。


 

 

 

     选择Liberty for Java类型。


 

 

    输入应用的名字。



     给应用添加Auto-Scaling服务。选择ADD A SERVICE OR API。


 

    找到Auto-Scaling并选择。


 

    创建一个Auto-Scaling服务的实例。


 

     完成后会提示应用要Restage,点击确定。

使用Auto-Scaling服务

    到此我们就完成了准备工作,下面就可以开始定义自己的规则来实现应用的自动伸缩了。

基于性能参数的缩放

    下面我们先来看第一种类型的缩放规则:根据应用的性能参数缩放。

    点击创建的Auto-Scaling服务的实例到创建规则的页面,点击CREATE AUTO-SCALING POLICY。


 

     在此页面添加如下图的规则,


 

    这里我们定义参数如下:

    最大的实例数Allowable maximum instance count为5

    默认的实例数Default minimum instance count 为1

    性能参数的类型选择Memory,为了使应用能够更容易缩放,我们将扩展的上限设置为50%,这样只要应用实例的Memory使用超过50%,就会增加一个实例。

同时将收缩的下限设置为30%,这样当应用实例的Memory使用少于30%就会减少一个实例。

           对于 Statistic Window 和 Breach Duration:指定 120 秒(最小值),以便对是否扩展应用程序的决策应用最高的灵敏度级别。 

    对于扩展和精减的 Cooldown period:指定 120 秒。

 

           一些设置规则的技巧:

          如果应用程序的工作负载在短期内的增长非常快,那么可以将 Breach Duration 设置为一个较小的值,让您的应用程序能够提前扩展,避免超出 CPU 或内存容量和应用程序崩溃。如果您选择的 Metric TypeCPUMemory 或 Heap)在短期内增高并降低,可以为 Statistic Window 指定一个更高的值。为了确定您的应用程序的 CPU 利用率是否超出了上限或下限,Auto-Scaling 会考虑一个时间范围(在 Statistic Window 参数上指定的值)内的指标数据并计算平均值。为 Statistic Window 指定的值越高,它选择用来计算应用程序是否达到上限或下限的数据范围就越宽。

        第一次扩展完成后,第二次扩展在 Cooldown 期限过去后才能触发。此做法提供了足够的时间让应用程序状态变得稳定。出于演示用途,我们为 Cooldown 指定一个较短的期限,对于生产环境,可以使用较长的期限。 

 

    下面我们来提高应用的内存用量来使其进行自动扩展。

    在Eclipse中建立一个web project,名称为helloWorld。然后创建一个servlet。在此servlet中定义一个List<String>的实例。然后添加两个方法add和delete。当调用add时,每次为list添加指定书目的字符串,当调用delete时,把list置为null,即之前所有添加的元素都删除。

    代码片段如下所示:

protected void doGet(HttpServletRequest request, HttpServletResponse response)

    throws ServletException, IOException

  {

  String method = request.getParameter("method");

  if("add".equals(method)){

  int count = Integer.parseInt(request.getParameter("count"));

  this.add(count);

  }

  else

  {

  this.delete();

  }

  response.setContentType("text/html");

    PrintWriter out = response.getWriter();

    out.write("----------"+list.size());

    out.flush();

  }

 

  protected void doPost(HttpServletRequest request, HttpServletResponse responsethrows ServletException, IOException {

    serveRequest(requestresponse);

  }

  private int add(int count){

  if(null == list){

  list = new ArrayList<String>();

  }

  for(int i = 0; icounti++){

  list.add("XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX");

  }

  return list.size();

  }

  private int delete(){

  list = null;

  return 0;

  }

        这样我们通过带着特定的参数访问应用时,就可以手动的改变应用的内存用量,使其达到扩展的限值。

        此后我们访问此应用并不断提高其内存用量,切换到Metric Statistics标签页可以看到内存的参数如下图所示,已经达到了扩展的上限,


 

 

    此时我们切换到Scaling History标签页,发现应用的实例已经开始扩展了,如下图所示。

 


 

 

 基于指定时间段的调度缩放

    以上基于应用的性能参数的缩放能够满足大多数的应用的要求。但是对于在某个特定时间段内访问量爆炸性上升从而造成性能下降的应用的支持度并不是非常友好。比如一个应用只有在特定的时间段例如晚上7点到11点之间的访问量会急剧上升,而且是在7点短时间内就到达一个非常大的值得话,这样如果还采用第一种方式一步一步的扩展就会带来前期的实例数不能满足其巨大的访问量而性能下降的问题。这时的扩展过程如下图所示,


 

    既然我们已经知道访问量急剧增大的时间段,我们可以在这个时间段开始之前就预先将应用的实例数目扩展到一个可以支撑其访问量的数目,此后在随着应用的性能参数来进行缩放。这样就避免里上述的问题。

    由此,我们引入下一种缩放方式,即用户指定某一个时间段,在此时间段内,应用的实例数会自动上升到一个指定最小的数目,此后会根据第一种缩放方式来根据应用的性能自动增加或减少应用的实例,并且此阶段内,应用的实例数不会小于应用所有者指定的最小数目,也不会大于指定的最大的数目。这时的缩放过程会如下图所示,


 

 

 

 

 

 

    下面我们来实际操作一下这种方式。

    选择时区:

    后面指定的时间都会是这个选取的时区的时间,这里选择东八区的北京时间。

 


 

创建一个可重复调度的规则:


    如上图所示,

    我们指定了这样的一个重复调度的规则:

    每天从东八区的13:40开始,到13:50结束,自动把应用的实例数调整到3个。

    所有的字段中,Start Time和End Time的取值区间是0:00 至 23:59,并且Start Time须早于End Time。

    Repeat On字段可以多选,其包含的值是从Monday至Sunday,如果选择全部,则显示的是Everyday。

    Minimum Instance Count的值须大于0,并且小于之前设定的Allowable maximum instane count

    下面再来创建一个特定时间段调度规则:

    如下图所示,


    从东八区时间的201563日的14:00开始,到20156314:15结束,自动把应用的实例数调整到4个。

所有的字段中,Start Date & Time代表的时间须小于End Date & Time代表的时间。

    Minimum Instance Count的值须大于0,并且小于之前设定的Allowable maximum instane count

在所有的缩放规则中,特定时间段调度规则有最高的优先级,即如果重复调度规则和特定时间段调度规则制定的时间冲突,则以特定时间段调度规则为准。

点击 Save Policy来保存创建的规则。

    此后我们开始观察应用实际的缩放情况。

    点击 Scaling History标签页,现在的时间是13:42,如下图所示,应用的实例数目已经在1:40的时候增加为3个,增加的原因是Recurring schedule Wed 1:40 PM triggered


    过了一段时间后,现在的时间是13:50,点击Metric Statistics标签,如下图所示,现在应用所用的Memory已经小于我们之前设定的总内存的30%

  

    再切回Scaling History标签页,如下图所示,我们看到应用的实例已经逐渐减小为1。

  

    一段时间后,现在的时间是14:02,已经进入了我们之前指定的特定时间段调度规则指定的时间,如下图所示,应用的实例数目已经直接由1增加为4,增加的原因是Schedule Jun 3, 2015, 2:00 PM triggered


    在14:15之后,切换到Metric Statistics标签页,现在应用的内存用量又已经小于30%的阈值,如下图所示,

  

 

    切换到Scaling History标签页,可以看到,应用的实例数目已经逐渐由4减小到1


结束语 

    现在,您已经知道了如何将一个应用程序部署在 Bluemix 上,并为它启用 Auto-Scaling 功能。我们希望您觉得 Auto-Scaling服务确实很容易使用,它可以帮助您改善应用程序的弹性,并会在您在 Bluemix 上工作时为您降低总体成本。

1 0
原创粉丝点击