<html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<meta name="Generator" content="Microsoft Word 12 (filtered medium)">
<style><!--
/* Font Definitions */
@font-face
        {font-family:Wingdings;
        panose-1:5 0 0 0 0 0 0 0 0 0;}
@font-face
        {font-family:宋体;
        panose-1:2 1 6 0 3 1 1 1 1 1;}
@font-face
        {font-family:"Cambria Math";
        panose-1:2 4 5 3 5 4 6 3 2 4;}
@font-face
        {font-family:Calibri;
        panose-1:2 15 5 2 2 2 4 3 2 4;}
@font-face
        {font-family:"\@宋体";
        panose-1:2 1 6 0 3 1 1 1 1 1;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0cm;
        margin-bottom:.0001pt;
        font-size:12.0pt;
        font-family:宋体;}
a:link, span.MsoHyperlink
        {mso-style-priority:99;
        color:blue;
        text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
        {mso-style-priority:99;
        color:purple;
        text-decoration:underline;}
p
        {mso-style-priority:99;
        mso-margin-top-alt:auto;
        margin-right:0cm;
        mso-margin-bottom-alt:auto;
        margin-left:0cm;
        font-size:12.0pt;
        font-family:宋体;}
tt
        {mso-style-priority:99;
        font-family:宋体;}
span.EmailStyle19
        {mso-style-type:personal-reply;
        font-family:"Calibri","sans-serif";
        color:#1F497D;}
.MsoChpDefault
        {mso-style-type:export-only;}
@page WordSection1
        {size:612.0pt 792.0pt;
        margin:72.0pt 90.0pt 72.0pt 90.0pt;}
div.WordSection1
        {page:WordSection1;}
/* List Definitions */
@list l0
        {mso-list-id:16086814;
        mso-list-type:hybrid;
        mso-list-template-ids:1271297338 15217990 67698713 67698715 67698703 67698713 67698715 67698703 67698713 67698715;}
@list l0:level1
        {mso-level-tab-stop:none;
        mso-level-number-position:left;
        margin-left:38.25pt;
        text-indent:-18.0pt;}
@list l1
        {mso-list-id:1742361939;
        mso-list-template-ids:311842874;}
@list l1:level1
        {mso-level-number-format:bullet;
        mso-level-text:\F0B7;
        mso-level-tab-stop:36.0pt;
        mso-level-number-position:left;
        text-indent:-18.0pt;
        mso-ansi-font-size:10.0pt;
        font-family:Symbol;}
ol
        {margin-bottom:0cm;}
ul
        {margin-bottom:0cm;}
--></style><!--[if gte mso 9]><xml>
<o:shapedefaults v:ext="edit" spidmax="1026" />
</xml><![endif]--><!--[if gte mso 9]><xml>
<o:shapelayout v:ext="edit">
<o:idmap v:ext="edit" data="1" />
</o:shapelayout></xml><![endif]-->
</head>
<body lang="ZH-CN" link="blue" vlink="purple">
<div class="WordSection1">
<p class="MsoNormal"><span lang="EN-US" style="font-size:10.5pt;font-family:"Calibri","sans-serif";color:#1F497D"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:10.5pt;font-family:"Calibri","sans-serif";color:#1F497D"><o:p> </o:p></span></p>
<div style="border:none;border-top:solid #B5C4DF 1.0pt;padding:3.0pt 0cm 0cm 0cm">
<p class="MsoNormal"><b><span style="font-size:10.0pt">发件人<span lang="EN-US">:</span></span></b><span lang="EN-US" style="font-size:10.0pt"> Mike Spreitzer [mailto:mspreitz@us.ibm.com]
<br>
</span><b><span style="font-size:10.0pt">发送时间<span lang="EN-US">:</span></span></b><span lang="EN-US" style="font-size:10.0pt"> 2014</span><span style="font-size:10.0pt">年<span lang="EN-US">7</span>月<span lang="EN-US">10</span>日<span lang="EN-US"> 3:19<br>
</span><b>收件人<span lang="EN-US">:</span></b><span lang="EN-US"> OpenStack Development Mailing List (not for usage questions)<br>
</span><b>主题<span lang="EN-US">:</span></b><span lang="EN-US"> Re: [openstack-dev]
</span>答复<span lang="EN-US">: [heat] autoscaling across regions and availability zones<o:p></o:p></span></span></p>
</div>
<p class="MsoNormal"><span lang="EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><tt><span lang="EN-US" style="font-size:10.0pt">Huangtianhua <<a href="mailto:huangtianhua@huawei.com">huangtianhua@huawei.com</a>> wrote on 07/04/2014 02:35:56 AM:</span></tt><span lang="EN-US" style="font-size:10.0pt"><br>
<br>
<tt>> I have register a bp about this : </tt></span><span lang="EN-US"><a href="https://blueprints.launchpad.net/"><tt><span style="font-size:10.0pt">https://blueprints.launchpad.net/</span></tt></a></span><span lang="EN-US" style="font-size:10.0pt"><br>
<tt>> heat/+spec/implement-autoscalinggroup-availabilityzones</tt></span><span lang="EN-US">
<br>
</span><tt><span lang="EN-US" style="font-size:10.0pt">> ·          </span></tt><span lang="EN-US">
<br>
</span><tt><span lang="EN-US" style="font-size:10.0pt">> ·         And I am thinking how to implement this recently.</span></tt><span lang="EN-US">
<br>
</span><tt><span lang="EN-US" style="font-size:10.0pt">> ·          </span></tt><span lang="EN-US">
<br>
</span><tt><span lang="EN-US" style="font-size:10.0pt">> ·         According to AWS autoscaling implementation  “attempts to
</span></tt><span lang="EN-US" style="font-size:10.0pt"><br>
<tt>> distribute instances evenly between the Availability Zones that are </tt><br>
<tt>> enabled for your Auto Scaling group. </tt></span><span lang="EN-US"><br>
</span><tt><span lang="EN-US" style="font-size:10.0pt">> ·         Auto Scaling does this by attempting to launch new
</span></tt><span lang="EN-US" style="font-size:10.0pt"><br>
<tt>> instances in the Availability Zone with the fewest instances. If the</tt><br>
<tt>> attempt fails, however, Auto Scaling will attempt to launch in other</tt><br>
<tt>> zones until it succeeds.”</tt></span><span lang="EN-US"> <br>
</span><tt><span lang="EN-US" style="font-size:10.0pt">>  </span></tt><span lang="EN-US">
<br>
</span><tt><span lang="EN-US" style="font-size:10.0pt">> But there is a doubt about the “fewest instance”, .e.g
</span></tt><span lang="EN-US"><br>
</span><tt><span lang="EN-US" style="font-size:10.0pt">>  </span></tt><span lang="EN-US">
<br>
</span><tt><span lang="EN-US" style="font-size:10.0pt">> There are two azs,</span></tt><span lang="EN-US">
<br>
</span><tt><span lang="EN-US" style="font-size:10.0pt">>    Az1: has two instances</span></tt><span lang="EN-US">
<br>
</span><tt><span lang="EN-US" style="font-size:10.0pt">>    Az2: has three instances</span></tt><span lang="EN-US">
<br>
</span><tt><span lang="EN-US" style="font-size:10.0pt">> ·            And then to create a asg with 4 instances, I think we
</span></tt><span lang="EN-US" style="font-size:10.0pt"><br>
<tt>> should create two instances respectively in az1 and az2, right? Now </tt><br>
<tt>> if need to extend to 5 instances for the asg, which az to lauch new instance?</tt></span><span lang="EN-US">
<br>
</span><tt><span lang="EN-US" style="font-size:10.0pt">> If you interested in this bp, I think we can discuss thisJ</span></tt><span lang="EN-US">
<br>
<br>
</span><tt><span lang="EN-US" style="font-size:10.0pt">The way AWS handles this is described in
</span></tt><span lang="EN-US"><a href="http://docs.aws.amazon.com/AutoScaling/latest/DeveloperGuide/AS_Concepts.html#arch-AutoScalingMultiAZ"><tt><span style="font-size:10.0pt">http://docs.aws.amazon.com/AutoScaling/latest/DeveloperGuide/AS_Concepts.html#arch-AutoScalingMultiAZ</span></tt></a>
<br>
<br>
</span><tt><span lang="EN-US" style="font-size:10.0pt">That document leaves a lot of freedom to the cloud provider.  And rightfully so, IMO.  To answer your specific example, when spreading 5 instances across 2 zones, the cloud provider gets to pick which zone
 gets 3 and which zone gets 2.  As for what a Heat scaling group should do, that depends on what Nova can do for Heat.  I have been told that Nova's instance-creation operation takes an optional parameter that identifies one AZ and, if that parameter is not
 provided, then a configured default AZ is used.  Effectively, the client has to make the choice.  I would start out with Heat making a random choice; in subsequent development it might query or monitor Nova for some statistics to guide the choice.</span></tt><span lang="EN-US">
<br>
<br>
<span style="color:#1F497D"><o:p></o:p></span></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:10.5pt;font-family:"Calibri","sans-serif";color:#1F497D">--------yes, I read the doc, as you said, the doc is not well written, so I doubt about the “fewest instance” before, but now IMO, “fewest instance”
 means the instances of the group, so you are right, to my specific example, the instance should be launch at random or in a round-robin mode.<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"><br>
</span><tt><span lang="EN-US" style="font-size:10.0pt">An even more interesting issue is the question of choosing which member(s) to remove when scaling down.  The approach taken by AWS
</span></tt><span lang="EN-US">is documented at <a href="http://docs.aws.amazon.com/AutoScaling/latest/DeveloperGuide/us-termination-policy.html">
http://docs.aws.amazon.com/AutoScaling/latest/DeveloperGuide/us-termination-policy.html</a>
<o:p></o:p></span></p>
<p><span lang="EN-US">but the design there has redundant complexity and the doc is not well written.  Following is a short sharp presentation of an isomorphic system.
<o:p></o:p></span></p>
<p><span lang="EN-US">A client that owns an ASG configures that ASG to have a series (possibly empty) of instance termination policies; the client can change the series during the ASG's lifetime.  Each policy is drawn from the following menu:
<o:p></o:p></span></p>
<ul type="disc">
<li class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;mso-list:l1 level1 lfo1">
<span lang="EN-US">OldestLaunchConfiguration <o:p></o:p></span></li><li class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;mso-list:l1 level1 lfo1">
<span lang="EN-US">ClosestToNextInstanceHour <o:p></o:p></span></li><li class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;mso-list:l1 level1 lfo1">
<span lang="EN-US">OldestInstance <o:p></o:p></span></li><li class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;mso-list:l1 level1 lfo1">
<span lang="EN-US">NewestInstance<o:p></o:p></span></li></ul>
<p><span lang="EN-US" style="font-size:10.5pt;font-family:"Calibri","sans-serif";color:#1F497D">--------and there is a default policy of termination: ‘</span><span lang="EN-US">Default</span><span lang="EN-US" style="font-size:10.5pt;font-family:"Calibri","sans-serif";color:#1F497D">’,
 if not specify the termination policy while asg creation, the default policy is applied:<o:p></o:p></span></p>
<p style="margin-left:38.25pt;text-indent:-18.0pt;mso-list:l0 level1 lfo3"><![if !supportLists]><span lang="EN-US" style="font-size:10.5pt;font-family:"Calibri","sans-serif";color:#1F497D"><span style="mso-list:Ignore">1.<span style="font:7.0pt "Times New Roman"">      
</span></span></span><![endif]><span lang="EN-US" style="font-size:10.5pt;font-family:"Calibri","sans-serif";color:#1F497D">Choose the az which has the max instances of the group.<o:p></o:p></span></p>
<p style="margin-left:38.25pt;text-indent:-18.0pt;mso-list:l0 level1 lfo3"><![if !supportLists]><span lang="EN-US" style="font-size:10.5pt;font-family:"Calibri","sans-serif";color:#1F497D"><span style="mso-list:Ignore">2.<span style="font:7.0pt "Times New Roman"">      
</span></span></span><![endif]><span lang="EN-US" style="font-size:10.5pt;font-family:"Calibri","sans-serif";color:#1F497D">If there has several azs base point 1, choose az in random
<o:p></o:p></span></p>
<p style="margin-left:38.25pt;text-indent:-18.0pt;mso-list:l0 level1 lfo3"><![if !supportLists]><span lang="EN-US" style="font-size:10.5pt;font-family:"Calibri","sans-serif";color:#1F497D"><span style="mso-list:Ignore">3.<span style="font:7.0pt "Times New Roman"">      
</span></span></span><![endif]><span lang="EN-US" style="font-size:10.5pt;font-family:"Calibri","sans-serif";color:#1F497D">The az is chosen, remove the instance which LaunchConfiguration is oldest<o:p></o:p></span></p>
<p style="margin-left:38.25pt;text-indent:-18.0pt;mso-list:l0 level1 lfo3"><![if !supportLists]><span lang="EN-US" style="font-size:10.5pt;font-family:"Calibri","sans-serif";color:#1F497D"><span style="mso-list:Ignore">4.<span style="font:7.0pt "Times New Roman"">      
</span></span></span><![endif]><span lang="EN-US" style="font-size:10.5pt;font-family:"Calibri","sans-serif";color:#1F497D">If there has several instances then choose according to ClosestToNextInstanceHour policy<o:p></o:p></span></p>
<p style="margin-left:38.25pt;text-indent:-18.0pt;mso-list:l0 level1 lfo3"><![if !supportLists]><span lang="EN-US" style="font-size:10.5pt;font-family:"Calibri","sans-serif";color:#1F497D"><span style="mso-list:Ignore">5.<span style="font:7.0pt "Times New Roman"">      
</span></span></span><![endif]><span lang="EN-US" style="font-size:10.5pt;font-family:"Calibri","sans-serif";color:#1F497D">If there has several instances then choose in random<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">(see the AWS doc for the exact meaning of each).  The signature of a policy is this: given a set of candidate instances for removal, return a subset (possibly the whole input set).
<o:p></o:p></span></p>
<p><span lang="EN-US">When it is time to remove instances from an ASG, they are chosen one by one.  AWS uses the following procedure to choose one instance to remove.  
<br>
</span><span lang="EN-US" style="font-size:10.0pt;font-family:"Arial","sans-serif"">1.        </span><span lang="EN-US">Choose the AZ from which the instance will be removed.  The choice is based primarily on balancing the number of group members in each AZ,
 and ties are broken randomly. <br>
</span><span lang="EN-US" style="font-size:10.0pt;font-family:"Arial","sans-serif"">2.        </span><span lang="EN-US">Starting with a "candidate set" consisting of all the ASG's members in the chosen AZ, run the configured series of policies to progressively
 narrow down the set of candidates. <br>
</span><span lang="EN-US" style="font-size:10.0pt;font-family:"Arial","sans-serif"">3.        </span><span lang="EN-US">Use OldestLaunchConfiguration and then ClosestToNextInstanceHour to further narrow the set of candidates.
<br>
</span><span lang="EN-US" style="font-size:10.0pt;font-family:"Arial","sans-serif"">4.        </span><span lang="EN-US">Make a random choice among the final set of candidates.<span style="color:#1F497D"><o:p></o:p></span></span></p>
<p><span lang="EN-US">Since each policy returns its input when its input's size is 1 we do not need to talk about early exits when defining the procedure (although the implementation might make such optimizations).
<o:p></o:p></span></p>
<p><span lang="EN-US">I plan to draft a spec. <span style="color:#1F497D"><o:p></o:p></span></span></p>
<p><span lang="EN-US" style="font-size:10.5pt;font-family:"Calibri","sans-serif";color:#1F497D">--------may be no need to draft a spec, due to my bp is approved already, and I am developing now, if you are interested in it, we can cooperate</span><span lang="EN-US" style="font-size:10.5pt;font-family:Wingdings;color:#1F497D">J</span><span lang="EN-US" style="font-size:10.5pt;font-family:"Calibri","sans-serif";color:#1F497D">,
 thanks.<o:p></o:p></span></p>
<p><span lang="EN-US"><a href="https://blueprints.launchpad.net/heat/+spec/implement-autoscalinggroup-availabilityzones">https://blueprints.launchpad.net/heat/+spec/implement-autoscalinggroup-availabilityzones</a><o:p></o:p></span></p>
<p><span lang="EN-US" style="font-size:10.5pt;font-family:"Calibri","sans-serif";color:#1F497D"><o:p> </o:p></span></p>
<p><span lang="EN-US">Thanks, <o:p></o:p></span></p>
<p><span lang="EN-US">Mike <o:p></o:p></span></p>
</div>
</body>
</html>