[openstack-dev] [heat] health maintenance in autoscaling groups
Mike Spreitzer
mspreitz at us.ibm.com
Wed Jul 2 16:29:31 UTC 2014
Qiming Teng <tengqim at linux.vnet.ibm.com> wrote on 07/02/2014 03:02:14 AM:
> Just some random thoughts below ...
>
> On Tue, Jul 01, 2014 at 03:47:03PM -0400, Mike Spreitzer wrote:
> > ...
> > I have not found design discussion of this; have I missed something?
> >
> > I suppose the natural answer for OpenStack would be centered around
> > webhooks...
>
> Well, I would suggest we generalize this into a event messaging or
> signaling solution, instead of just 'webhooks'. The reason is that
> webhooks as it is implemented today is not carrying a payload of useful
> information -- I'm referring to the alarms in Ceilometer.
OK, this is great (and Steve Hardy provided more details in his reply), I
did not know about the existing abilities to have a payload. However
Ceilometer alarms are still deficient in that way, right? A Ceilometer
alarm's action list is simply a list of URLs, right? I would be happy to
say let's generalize Ceilometer alarms to allow a payload in an action.
> There are other cases as well. A member failure could be caused by a
> temporary communication problem, which means it may show up quickly when
> a replacement member is already being created. It may mean that we have
> to respond to an 'online' event in addition to an 'offline' event?
> ...
> The problem here today is about the recovery of SG member. If it is a
> compute instance, we can 'reboot', 'rebuild', 'evacuate', 'migrate' it,
> just to name a few options. The most brutal way to do this is like what
> HARestarter is doing today -- delete followed by a create.
We could get into arbitrary subtlety, and maybe eventually will do better,
but I think we can start with a simple solution that is widely applicable.
The simple solution is that once the decision has been made to do
convergence on a member (note that this is distinct from merely detecting
and noting a divergence) then it will be done regardless of whether the
doomed member later appears to have recovered, and the convergence action
for a scaling group member is to delete the old member and create a
replacement (not in that order).
> > When the member is a nested stack and Ceilometer exists, it could be
the
> > member stack's responsibility to include a Ceilometer alarm that
detects
> > the member stack's death and hit the member stack's deletion webhook.
>
> This is difficult. A '(nested) stack' is a Heat specific abstraction --
> recall that we have to annotate a nova server resource in its metadata
> to which stack this server belongs. Besides the 'visible' resources
> specified in a template, Heat may create internal data structures and/or
> resources (e.g. users) for a stack. I am not quite sure a stack's death
> can be easily detected from outside Heat. It would be at least
> cumbersome to have Heat notify Ceilometer that a stack is dead, and then
> have Ceilometer send back a signal.
A (nested) stack is not only a heat-specific abstraction but its semantics
and failure modes are specific to the stack (at least, its template). I
think we have no practical choice but to let the template author declare
how failure is detected. It could be as simple as creating a Ceilometer
alarms that detect death one or more resources in the nested stack; it
could be more complicated Ceilometer stuff; it could be based on something
other than, or in addition to, Ceilometer. If today there are not enough
sensors to detect failures of all kinds of resources, I consider that a
gap in telemetry (and think it is small enough that we can proceed
usefully today, and should plan on filling that gap over time).
> > There is a small matter of how the author of the template used to
create
> > the member stack writes some template snippet that creates a
Ceilometer
> > alarm that is specific to a member stack that does not exist yet.
>
> How about just one signal responder per ScalingGroup? A SG is supposed
> to be in a better position to make the judgement: do I have to recreate
> a failed member? am I recreating it right now or wait a few seconds?
> maybe I should recreate the member on some specific AZs?
That is confusing two issues. The thing that is new here is making the
scaling group recognize member failure; the primary reaction is to update
its accounting of members (which, in the current code, must be done by
making sure the failed member is deleted); recovery of other scaling group
aspects is fairly old-hat, it is analogous to the problems that the
scaling group already solves when asked to increase its size.
> ...
> > I suppose we could stipulate that if the member template includes a
> > parameter with name "member_name" and type "string" then the OS OG
takes
> > care of supplying the correct value of that parameter; as illustrated
in
> > the asg_of_stacks.yaml of https://review.openstack.org/#/c/97366/ , a
> > member template can use a template parameter to tag Ceilometer data
for
> > querying. The URL of the member stack's deletion webhook could be
passed
> > to the member template via the same sort of convention.
>
> I am not in favor of the per-member webhook design. But I vote for an
> additional *implicit* parameter to a nested stack of any groups. It
> could be an index or a name.
Right, I was elaborating on a particular formulation of "implicit
parameter". In particular, I suggested an "implicit parameter value" for
an optional explicit parameter. We could make the parameter declaration
implicit, but that (1) is a bit irregular (reminiscent of "modes") if we
only do it for stacks that are scaling group members and (2) is equivalent
to the existing concept of psuedo-parameters if we do it for all stacks. I
would be content with adding a pseudo-parameter for all stacks that is the
UUID of the stack. The index of the member in the group could be
problematic, as those are re-used; the UUID is not re-used. Names also
have issues with uniqueness.
> > When Ceilometer
> > does not exist, it is less obvious to me what could usefully be done.
Are
> > there any useful SG member types besides Compute instances and nested
> > stacks? Note that a nested stack could also pass its member deletion
> > webhook to a load balancer (that is willing to accept such a thing, of
> > course), so we get a lot of unity of mechanism between the case of
> > detection by infrastructure vs. application level detection.
> >
>
> I'm a little bit concerned about passing the member deletion webhook to
> LB. Maybe we need to rethink about this: do we really want to bring
> application level design considerations down to the infrastructure
level?
I look at it this way: do we want two completely independent loops of
detection and response, or shall we share a common response mechanism with
two different levels of detection? I think both want the same response,
and so recommend a shared response mechanism.
> Some of the detection work might be covered by the observer engine specs
> that is under review. My doubt about it is about how to make it "listen
> only to what need to know while ignore everything else".
I am not sure what you mean by that. If this is about the case of the
group members being nested stacks, I go back to the idea that it must be
up to the nested template author to define failure (via declaring how to
detect it).
> > I am not entirely happy with the idea of a webhook per member. If I
> > understand correctly, generating webhooks is a somewhat expensive and
> > problematic process. What would be the alternative?
>
> My understanding is that the webhooks' problem is not about cost, it is
> more about authentication and flexibility. Steve Hardy and Thomas Herve
> are already looking into the authentication problem.
I was not disagreeing, I was including those in "problematic".
Thanks,
Mike
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.openstack.org/pipermail/openstack-dev/attachments/20140702/9e999208/attachment.html>
More information about the OpenStack-dev
mailing list