<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8">
</head>
<body bgcolor="#FFFFFF" text="#000000">
<br>
Olivier Mauras raised a very clear problem with Rudder. His use case
is very simple, but impossible to implement with Rudder today:<br>
<br>
"How can I gradually change the configuration of an elastic search
cluster with Rudder ?"<br>
<br>
To be clearer, the use general use case is as follow: we have a set
of nodes which must do action only if some global properties is set,
or if some other nodes of the pod^W(ok, kidding) defined set of
nodes are in a certain state. <br>
<br>
Typically, what we want to do: We have 3 nodes in a elastic search
cluster. We want to update elastic search version. WHEN load allow
it, we want to have one node going out of the cluster, upgrading the
version, starting again, doing some sanity check, saying that it is
up again, being included in the cluster, wainting some time, and
then have a second node taking the same step. <br>
<br>
Today, with Rudder, even with some randomisation of the datetime
when node are checking their config, you are likelly to have: the
three nodes see there is a new version, they update (perhaps within
a couple of minute of interval) the config, restart the service
=> the whole cluster goes dark<br>
<br>
<br>
The common answer to that, is of course having some kind of
orchestration :)<br>
<br>
With the Rudder of today, we could imagine having ad-hoc groups
created with specif rules, perhaps via API, so that the logic could
be in some external script. Quite cunbersome and unreliable. <br>
<br>
So, we need to add something allowing to share states betweens nodes
and global context, so that each node can coordinate (globally and
with each other). <br>
<br>
<br>
The challenges are:<br>
<ul>
<li>states may be updated more than every 5 minutes, so we can't
rely on agent runs to check them, </li>
<li>but in fact, the period it not the problem: we want to have
the node REACT to changes, not wait for the next run</li>
<li>of course, we don't want to check EVERYTHING on reaction, we
only want to check/execute things related to the event</li>
<ul>
<li>imagine: "ho, I'm going to check the md5sum of everything in
/etc (security policy) because I just got an event "load to
higth on the cluster, make the app more prioritary!"</li>
</ul>
<li>we need to thing about coordination beyond network partitions
(i.e relay servers, what happen if part of the tagets don't get
an event, etc)</li>
<li>the properties must easilly queriable (i.e: we must be able to
get them without running the agent, so that integration in
scripts is possible - or just debugging to understand what is
happening). <br>
</li>
<li>we need to be able to define complexe condition and sequences
of action for a node, so that things like that scenario are
possible:</li>
<ul>
<li>when I get an "update version" rule, <br>
</li>
<ul>
<li>if the global load of the cluster is beyond</li>
<li>and if no other node of the cluster is currently
upgrading, <br>
</li>
<ul>
<li>try to get the semaphore for upgrading <br>
</li>
<li>and wait XX time before releasing</li>
<li>of course, if something went wrong, don't keep the token
for ever<br>
</li>
</ul>
</ul>
</ul>
</ul>
<br>
The problem is hardly new, and whole part of our industry are
dedicated to solve it. For example, consul manage most of the
problems. We could integrate consul + Rudder in that way. <br>
An other idea is to use cf-engine built-in server capacities to
expose properties (promises state) to other nodes. <br>
There is certainly a whole lot of other possibilites. <br>
<br>
So, community : is it a use case that ring a bell for you ? How do
manage it ? What would be the best integration in Rudder ? <br>
<br>
Thanks !<br>
<br>
<div class="moz-signature">-- <br>
<meta content="text/html; charset=utf-8" http-equiv="Content-Type">
<style type="text/css"><!--
a.redlink:link { color: #1782E6; text-decoration: none; }
a.redlink:visited { color: #1782E6; text-decoration: none; }
.sig { font-family: 'Century Gothic', CenturyGothic, AppleGothic, sans-serif; font-size: small; }
.sigsmall { font-family: 'Century Gothic', CenturyGothic, AppleGothic, sans-serif; font-size: x-small; }
--></style> <a href="https://www.normation.com/fr/"><img alt="Nouveau
site web Normation"
src="cid:part1.02030001.04080709@normation.com">
<table border="0" cellpadding="0" cellspacing="2" width="380">
<tbody>
<tr>
<td colspan="2">
<hr></td>
</tr>
<tr>
<td colspan="2"><b><img alt=""
src="cid:part2.08020006.06080806@normation.com"
align="left" height="50" hspace="10" width="50"> <span
class="sig">François ARMAND</span></b><br>
<span class="sig"><i>Co-founder & CTO</i></span><br>
<span class="sig"><a class="redlink"
href="http://www.normation.com">Normation</a></span>
</td>
</tr>
<tr>
<td colspan="2">
<hr></td>
</tr>
<tr>
<td colspan="2"><span class="sigsmall"><b>87 rue de
Turbigo, 75003 Paris, France</b></span></td>
</tr>
<tr>
<td><span class="sigsmall">Telephone:</span></td>
<td><span class="sigsmall">+33 (0)1 83 62 99 23</span></td>
</tr>
<tr>
<td><span class="sigsmall">Mobile:</span></td>
<td><span class="sigsmall">+33 (0)6 63 37 60 55</span></td>
</tr>
<tr>
<td colspan="2">
<hr></td>
</tr>
</tbody>
</table>
</a></div>
</body>
</html>