<div dir="ltr"><div>I have prepared a write-up explaining my requirements and current solution that I am proposing based on my understanding so far.</div><div>Kindly let me know if what I am proposing is good or there is a better way to achieve the same.</div><div><br></div><div><a href="https://drive.google.com/file/d/0B0zPvL-Tp-JSTEJpcUFTanhsNzQ/view?usp=sharing">https://drive.google.com/file/d/0B0zPvL-Tp-JSTEJpcUFTanhsNzQ/view?usp=sharing</a><br></div><div><br></div><div>Let me know if you face any issue in accessing the above link. Thanks.</div></div><div class="gmail_extra"><br><div class="gmail_quote">On Thu, Dec 3, 2015 at 11:34 PM, Ken Gaillot <span dir="ltr"><<a href="mailto:kgaillot@redhat.com" target="_blank">kgaillot@redhat.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><span class="">On 12/03/2015 05:23 AM, Nikhil Utane wrote:<br>
> Ken,<br>
><br>
> One more question, if i have to propagate configuration changes between the<br>
> nodes then is cpg (closed process group) the right way?<br>
> For e.g.<br>
> Active Node1 has config A=1, B=2<br>
> Active Node2 has config A=3, B=4<br>
> Standby Node needs to have configuration for all the nodes such that<br>
> whichever goes down, it comes up with those values.<br>
> Here configuration is not static but can be updated at run-time.<br>
<br>
</span>Being unfamiliar with the specifics of your case, I can't say what the<br>
best approach is, but it sounds like you will need to write a custom OCF<br>
resource agent to manage your service.<br>
<br>
A resource agent is similar to an init script:<br>
<a href="http://clusterlabs.org/doc/en-US/Pacemaker/1.1-pcs/html-single/Pacemaker_Explained/index.html#ap-ocf" rel="noreferrer" target="_blank">http://clusterlabs.org/doc/en-US/Pacemaker/1.1-pcs/html-single/Pacemaker_Explained/index.html#ap-ocf</a><br>
<br>
The RA will start the service with the appropriate configuration. It can<br>
use per-resource options configured in pacemaker or external information<br>
to do that.<br>
<br>
How does your service get its configuration currently?<br>
<span class=""><br>
> BTW, I'm little confused between OpenAIS and Corosync. For my purpose I<br>
> should be able to use either, right?<br>
<br>
</span>Corosync started out as a subset of OpenAIS, optimized for use with<br>
Pacemaker. Corosync 2 is now the preferred membership layer for<br>
Pacemaker for most uses, though other layers are still supported.<br>
<div class="HOEnZb"><div class="h5"><br>
> Thanks.<br>
><br>
> On Tue, Dec 1, 2015 at 9:04 PM, Ken Gaillot <<a href="mailto:kgaillot@redhat.com">kgaillot@redhat.com</a>> wrote:<br>
><br>
>> On 12/01/2015 05:31 AM, Nikhil Utane wrote:<br>
>>> Hi,<br>
>>><br>
>>> I am evaluating whether it is feasible to use Pacemaker + Corosync to add<br>
>>> support for clustering/redundancy into our product.<br>
>><br>
>> Most definitely<br>
>><br>
>>> Our objectives:<br>
>>> 1) Support N+1 redundancy. i,e. N Active and (up to) 1 Standby.<br>
>><br>
>> You can do this with location constraints and scores. See:<br>
>><br>
>> <a href="http://clusterlabs.org/doc/en-US/Pacemaker/1.1-pcs/html-single/Pacemaker_Explained/index.html#_deciding_which_nodes_a_resource_can_run_on" rel="noreferrer" target="_blank">http://clusterlabs.org/doc/en-US/Pacemaker/1.1-pcs/html-single/Pacemaker_Explained/index.html#_deciding_which_nodes_a_resource_can_run_on</a><br>
>><br>
>> Basically, you give the standby node a lower score than the other nodes.<br>
>><br>
>>> 2) Each node has some different configuration parameters.<br>
>>> 3) Whenever any active node goes down, the standby node comes up with the<br>
>>> same configuration that the active had.<br>
>><br>
>> How you solve this requirement depends on the specifics of your<br>
>> situation. Ideally, you can use OCF resource agents that take the<br>
>> configuration location as a parameter. You may have to write your own,<br>
>> if none is available for your services.<br>
>><br>
>>> 4) There is no one single process/service for which we need redundancy,<br>
>>> rather it is the entire system (multiple processes running together).<br>
>><br>
>> This is trivially implemented using either groups or ordering and<br>
>> colocation constraints.<br>
>><br>
>> Order constraint = start service A before starting service B (and stop<br>
>> in reverse order)<br>
>><br>
>> Colocation constraint = keep services A and B on the same node<br>
>><br>
>> Group = shortcut to specify several services that need to start/stop in<br>
>> order and be kept together<br>
>><br>
>><br>
>> <a href="http://clusterlabs.org/doc/en-US/Pacemaker/1.1-pcs/html-single/Pacemaker_Explained/index.html#idm231363875392" rel="noreferrer" target="_blank">http://clusterlabs.org/doc/en-US/Pacemaker/1.1-pcs/html-single/Pacemaker_Explained/index.html#idm231363875392</a><br>
>><br>
>><br>
>> <a href="http://clusterlabs.org/doc/en-US/Pacemaker/1.1-pcs/html-single/Pacemaker_Explained/index.html#group-resources" rel="noreferrer" target="_blank">http://clusterlabs.org/doc/en-US/Pacemaker/1.1-pcs/html-single/Pacemaker_Explained/index.html#group-resources</a><br>
>><br>
>><br>
>>> 5) I would also want to be notified when any active<->standby state<br>
>>> transition happens as I would want to take some steps at the application<br>
>>> level.<br>
>><br>
>> There are multiple approaches.<br>
>><br>
>> If you don't mind compiling your own packages, the latest master branch<br>
>> (which will be part of the upcoming 1.1.14 release) has built-in<br>
>> notification capability. See:<br>
>> <a href="http://blog.clusterlabs.org/blog/2015/reliable-notifications/" rel="noreferrer" target="_blank">http://blog.clusterlabs.org/blog/2015/reliable-notifications/</a><br>
>><br>
>> Otherwise, you can use SNMP or e-mail if your packages were compiled<br>
>> with those options, or you can use the ocf:pacemaker:ClusterMon resource<br>
>> agent:<br>
>><br>
>> <a href="http://clusterlabs.org/doc/en-US/Pacemaker/1.1-pcs/html-single/Pacemaker_Explained/index.html#idm231308442928" rel="noreferrer" target="_blank">http://clusterlabs.org/doc/en-US/Pacemaker/1.1-pcs/html-single/Pacemaker_Explained/index.html#idm231308442928</a><br>
>><br>
>>> I went through the documents/blogs but all had example for 1 active and 1<br>
>>> standby use-case and that too for some standard service like httpd.<br>
>><br>
>> Pacemaker is incredibly versatile, and the use cases are far too varied<br>
>> to cover more than a small subset. Those simple examples show the basic<br>
>> building blocks, and can usually point you to the specific features you<br>
>> need to investigate further.<br>
>><br>
>>> One additional question, If I am having multiple actives, then Virtual IP<br>
>>> configuration cannot be used? Is it possible such that N actives have<br>
>>> different IP addresses but whenever standby becomes active it uses the IP<br>
>>> address of the failed node?<br>
>><br>
>> Yes, there are a few approaches here, too.<br>
>><br>
>> The simplest is to assign a virtual IP to each active, and include it in<br>
>> your group of resources. The whole group will fail over to the standby<br>
>> node if the original goes down.<br>
>><br>
>> If you want a single virtual IP that is used by all your actives, one<br>
>> alternative is to clone the ocf:heartbeat:IPaddr2 resource. When cloned,<br>
>> that resource agent will use iptables' CLUSTERIP functionality, which<br>
>> relies on multicast Ethernet addresses (not to be confused with<br>
>> multicast IP). Since multicast Ethernet has limitations, this is not<br>
>> often used in production.<br>
>><br>
>> A more complicated method is to use a virtual IP in combination with a<br>
>> load-balancer such as haproxy. Pacemaker can manage haproxy and the real<br>
>> services, and haproxy manages distributing requests to the real services.<br>
>><br>
>>> Thanking in advance.<br>
>>> Nikhil<br>
>><br>
>> A last word of advice: Fencing (aka STONITH) is important for proper<br>
>> recovery from difficult failure conditions. Without it, it is possible<br>
>> to have data loss or corruption in a split-brain situation.<br>
<br>
</div></div></blockquote></div><br></div>