On 5/25/2017 5:33 PM, Ken Gaillot wrote:
On 05/24/2017 12:27 PM, Dan Ragle wrote:
I suspect this has been asked before and apologize if so, a google
search didn't seem to find anything that was helpful to me ...

I'm setting up an active/active two-node cluster and am having an issue
where one of my two defined clusterIPs will not return to the other node
after it (the other node) has been recovered.

I'm running on CentOS 7.3. My resource setups look like this:

# cibadmin -Q|grep dc-version
         <nvpair id="cib-bootstrap-options-dc-version" name="dc-version"
value="1.1.15-11.el7_3.4-e174ec8"/>

# pcs resource show PublicIP-clone
  Clone: PublicIP-clone
   Meta Attrs: clone-max=2 clone-node-max=2 globally-unique=true
interleave=true
   Resource: PublicIP (class=ocf provider=heartbeat type=IPaddr2)
    Attributes: ip=75.144.71.38 cidr_netmask=24 nic=bond0
    Meta Attrs: resource-stickiness=0
    Operations: start interval=0s timeout=20s (PublicIP-start-interval-0s)
                stop interval=0s timeout=20s (PublicIP-stop-interval-0s)
                monitor interval=30s (PublicIP-monitor-interval-30s)

# pcs resource show PrivateIP-clone
  Clone: PrivateIP-clone
   Meta Attrs: clone-max=2 clone-node-max=2 globally-unique=true
interleave=true
   Resource: PrivateIP (class=ocf provider=heartbeat type=IPaddr2)
    Attributes: ip=192.168.1.3 nic=bond1 cidr_netmask=24
    Meta Attrs: resource-stickiness=0
    Operations: start interval=0s timeout=20s (PrivateIP-start-interval-0s)
                stop interval=0s timeout=20s (PrivateIP-stop-interval-0s)
                monitor interval=10s timeout=20s
(PrivateIP-monitor-interval-10s)

# pcs constraint --full | grep -i publicip
   start WEB-clone then start PublicIP-clone (kind:Mandatory)
(id:order-WEB-clone-PublicIP-clone-mandatory)
# pcs constraint --full | grep -i privateip
   start WEB-clone then start PrivateIP-clone (kind:Mandatory)
(id:order-WEB-clone-PrivateIP-clone-mandatory)

FYI These constraints cover ordering only. If you also want to be sure
that the IPs only start on a node where the web service is functional,
then you also need colocation constraints.


When I first create the resources, they split across the two nodes as
expected/desired:

  Clone Set: PublicIP-clone [PublicIP] (unique)
      PublicIP:0        (ocf::heartbeat:IPaddr2):       Started node1-pcs
      PublicIP:1        (ocf::heartbeat:IPaddr2):       Started node2-pcs
  Clone Set: PrivateIP-clone [PrivateIP] (unique)
      PrivateIP:0        (ocf::heartbeat:IPaddr2):       Started node1-pcs
      PrivateIP:1        (ocf::heartbeat:IPaddr2):       Started node2-pcs
  Clone Set: WEB-clone [WEB]
      Started: [ node1-pcs node2-pcs ]

I then put the second node in standby:

# pcs node standby node2-pcs

And the IPs both jump to node1 as expected:

  Clone Set: PublicIP-clone [PublicIP] (unique)
      PublicIP:0        (ocf::heartbeat:IPaddr2):       Started node1-pcs
      PublicIP:1        (ocf::heartbeat:IPaddr2):       Started node1-pcs
  Clone Set: WEB-clone [WEB]
      Started: [ node1-pcs ]
      Stopped: [ node2-pcs ]
  Clone Set: PrivateIP-clone [PrivateIP] (unique)
      PrivateIP:0        (ocf::heartbeat:IPaddr2):       Started node1-pcs
      PrivateIP:1        (ocf::heartbeat:IPaddr2):       Started node1-pcs

Then unstandby the second node:

# pcs node unstandby node2-pcs

The publicIP goes back, but the private does not:

  Clone Set: PublicIP-clone [PublicIP] (unique)
      PublicIP:0        (ocf::heartbeat:IPaddr2):       Started node1-pcs
      PublicIP:1        (ocf::heartbeat:IPaddr2):       Started node2-pcs
  Clone Set: WEB-clone [WEB]
      Started: [ node1-pcs node2-pcs ]
  Clone Set: PrivateIP-clone [PrivateIP] (unique)
      PrivateIP:0        (ocf::heartbeat:IPaddr2):       Started node1-pcs
      PrivateIP:1        (ocf::heartbeat:IPaddr2):       Started node1-pcs

Anybody see what I'm doing wrong? I'm not seeing anything in the logs to
indicate that it tries node2 and then fails; but I'm fairly new to the
software so it's possible I'm not looking in the right place.

The pcs status would show any failed actions, and anything important in
the logs would start with "error:" or "warning:".

At any given time, one of the nodes is the DC, meaning it schedules
actions for the whole cluster. That node will have more "pengine:"
messages in its logs at the time. You can check those logs to see what
decisions were made, as well as a "saving inputs" message to get the
cluster state that was used to make those decisions. There is a
crm_simulate tool that you can run on that file to get more information.

By default, pacemaker will try to balance the number of resources
running on each node, so I'm not sure why in this case node1 has four
resources and node2 has two. crm_simulate might help explain it.

However, there's nothing here telling pacemaker that the instances of
PrivateIP should run on different nodes when possible. With your
existing constraints, pacemaker would be equally happy to run both
PublicIP instances on one node and both PrivateIP instances on the other
node.

Thanks for your reply. Finally getting back to this.

Looking back at my config and my notes I realized I'm guilty of not giving you enough information. There was indeed an additional pair of resources that I didn't list in my original output that I didn't think were relevant to the issue--my bad. Reading what you wrote made me realize that it does appear as though pacemaker is simply trying to balance the overall load of *all* the available resources.

But I'm still confused as to how one would definitively correct the issue. I tried this full reduction this morning. Starting from an empty two-node cluster (no resources, no constraints):

[root@node1 clustertest]# pcs status
Cluster name: MyCluster
Stack: corosync
Current DC: NONE
Last updated: Sat Jun 10 10:58:46 2017 Last change: Sat Jun 10 10:40:23 2017 by root via cibadmin on node1-pcs

2 nodes and 0 resources configured

OFFLINE: [ node1-pcs node2-pcs ]

No resources


Daemon Status:
  corosync: active/disabled
  pacemaker: active/disabled
  pcsd: active/enabled

[root@node1 clustertest]# pcs resource create ClusterIP ocf:heartbeat:IPaddr2 ip=1.2.3.4 nic=bond0 cidr_netmask=24 [root@node1 clustertest]# pcs resource meta ClusterIP resource-stickiness=0 [root@node1 clustertest]# pcs resource clone ClusterIP clone-max=2 clone-node-max=2 globally-unique=true interleave=true
[root@node1 clustertest]# pcs resource create Test1 systemd:vtest1
[root@node1 clustertest]# pcs resource create Test2 systemd:vtest2
[root@node1 clustertest]# pcs constraint location Test1 prefers node1-pcs=INFINITY [root@node1 clustertest]# pcs constraint location Test2 prefers node1-pcs=INFINITY

[root@node1 clustertest]# pcs node standby node1-pcs
[root@node1 clustertest]# pcs status
Cluster name: MyCluster
Stack: corosync
Current DC: node1-pcs (version 1.1.15-11.el7_3.4-e174ec8) - partition with quorum Last updated: Sat Jun 10 11:01:07 2017 Last change: Sat Jun 10 11:00:59 2017 by root via crm_attribute on node1-pcs

2 nodes and 4 resources configured

Node node1-pcs: standby
Online: [ node2-pcs ]

Full list of resources:

 Clone Set: ClusterIP-clone [ClusterIP] (unique)
     ClusterIP:0        (ocf::heartbeat:IPaddr2):       Started node2-pcs
     ClusterIP:1        (ocf::heartbeat:IPaddr2):       Started node2-pcs
 Test1  (systemd:vtest1):       Started node2-pcs
 Test2  (systemd:vtest2):       Started node2-pcs

Daemon Status:
  corosync: active/disabled
  pacemaker: active/disabled
  pcsd: active/enabled

[root@node1 clustertest]# pcs node unstandby node1-pcs
[root@node1 clustertest]# pcs status resources
 Clone Set: ClusterIP-clone [ClusterIP] (unique)
     ClusterIP:0        (ocf::heartbeat:IPaddr2):       Started node2-pcs
     ClusterIP:1        (ocf::heartbeat:IPaddr2):       Started node1-pcs
 Test1  (systemd:vtest1):       Started node1-pcs
 Test2  (systemd:vtest2):       Started node1-pcs

[root@node1 clustertest]# pcs node standby node2-pcs
[root@node1 clustertest]# pcs status resources
 Clone Set: ClusterIP-clone [ClusterIP] (unique)
     ClusterIP:0        (ocf::heartbeat:IPaddr2):       Started node1-pcs
     ClusterIP:1        (ocf::heartbeat:IPaddr2):       Started node1-pcs
 Test1  (systemd:vtest1):       Started node1-pcs
 Test2  (systemd:vtest2):       Started node1-pcs

[root@node1 clustertest]# pcs node unstandby node2-pcs
[root@node1 clustertest]# pcs status resources
 Clone Set: ClusterIP-clone [ClusterIP] (unique)
     ClusterIP:0        (ocf::heartbeat:IPaddr2):       Started node1-pcs
     ClusterIP:1        (ocf::heartbeat:IPaddr2):       Started node2-pcs
 Test1  (systemd:vtest1):       Started node1-pcs
 Test2  (systemd:vtest2):       Started node1-pcs

[root@node1 clustertest]# pcs resource delete ClusterIP
Attempting to stop: ClusterIP...Stopped
[root@node1 clustertest]# pcs resource create ClusterIP ocf:heartbeat:IPaddr2 ip=1.2.3.4 nic=bond0 cidr_netmask=24 [root@node1 clustertest]# pcs resource meta ClusterIP resource-stickiness=0 [root@node1 clustertest]# pcs resource clone ClusterIP clone-max=2 clone-node-max=2 globally-unique=true interleave=true

[root@node1 clustertest]# pcs status resources
 Test1  (systemd:vtest1):       Started node1-pcs
 Test2  (systemd:vtest2):       Started node1-pcs
 Clone Set: ClusterIP-clone [ClusterIP] (unique)
     ClusterIP:0        (ocf::heartbeat:IPaddr2):       Started node2-pcs
     ClusterIP:1        (ocf::heartbeat:IPaddr2):       Started node2-pcs

[root@node1 clustertest]# pcs node standby node1-pcs
[root@node1 clustertest]# pcs status resources
 Test1  (systemd:vtest1):       Started node2-pcs
 Test2  (systemd:vtest2):       Started node2-pcs
 Clone Set: ClusterIP-clone [ClusterIP] (unique)
     ClusterIP:0        (ocf::heartbeat:IPaddr2):       Started node2-pcs
     ClusterIP:1        (ocf::heartbeat:IPaddr2):       Started node2-pcs

[root@node1 clustertest]# pcs node unstandby node1-pcs
[root@node1 clustertest]# pcs status resources
 Test1  (systemd:vtest1):       Started node1-pcs
 Test2  (systemd:vtest2):       Started node1-pcs
 Clone Set: ClusterIP-clone [ClusterIP] (unique)
     ClusterIP:0        (ocf::heartbeat:IPaddr2):       Started node2-pcs
     ClusterIP:1        (ocf::heartbeat:IPaddr2):       Started node2-pcs

[root@node1 clustertest]# pcs node standby node2-pcs
[root@node1 clustertest]# pcs status resources
 Test1  (systemd:vtest1):       Started node1-pcs
 Test2  (systemd:vtest2):       Started node1-pcs
 Clone Set: ClusterIP-clone [ClusterIP] (unique)
     ClusterIP:0        (ocf::heartbeat:IPaddr2):       Started node1-pcs
     ClusterIP:1        (ocf::heartbeat:IPaddr2):       Started node1-pcs

[root@node1 clustertest]# pcs node unstandby node2-pcs
[root@node1 clustertest]# pcs status resources
 Test1  (systemd:vtest1):       Started node1-pcs
 Test2  (systemd:vtest2):       Started node1-pcs
 Clone Set: ClusterIP-clone [ClusterIP] (unique)
     ClusterIP:0        (ocf::heartbeat:IPaddr2):       Started node1-pcs
     ClusterIP:1        (ocf::heartbeat:IPaddr2):       Started node2-pcs

[root@node1 clustertest]# pcs node standby node1-pcs
[root@node1 clustertest]# pcs status resources
 Test1  (systemd:vtest1):       Started node2-pcs
 Test2  (systemd:vtest2):       Started node2-pcs
 Clone Set: ClusterIP-clone [ClusterIP] (unique)
     ClusterIP:0        (ocf::heartbeat:IPaddr2):       Started node2-pcs
     ClusterIP:1        (ocf::heartbeat:IPaddr2):       Started node2-pcs

[root@node1 clustertest]# pcs node unstandby node1-pcs
[root@node1 clustertest]# pcs status resources
 Test1  (systemd:vtest1):       Started node1-pcs
 Test2  (systemd:vtest2):       Started node1-pcs
 Clone Set: ClusterIP-clone [ClusterIP] (unique)
     ClusterIP:0        (ocf::heartbeat:IPaddr2):       Started node2-pcs
     ClusterIP:1        (ocf::heartbeat:IPaddr2):       Started node2-pcs

So in the initial configuration, it works as expected; putting the nodes in standby one at a time (I waited at least 5 seconds between each standby/unstandby operation) and then restoring the nodes shows the ClusterIP bouncing back and forth as expected. But then after deleting the ClusterIP resource and recreating it exactly as it originally was the clones initially both stay on one node (the one the test resources are not on). Putting the node the extra resources are on in standby and then restoring it the IPs stay on the other node. Putting the node the extra resources are *not* on in standby and then restoring that node allows the IPs to split once again.

I also did the test above with full pcs status displays after each standby/unstandby; there were no errors displayed at each step.

So I guess my bottom line question is: How does one tell Pacemaker that the individual legs of globally unique clones should *always* be spread across the available nodes whenever possible, regardless of the number of processes on any one of the nodes? For kicks I did try:

pcs constraint location ClusterIP:0 prefers node1-pcs=INFINITY

but it responded with an error about an invalid character (:).

Thanks,

Dan


I think you could probably get what you want by putting an optional
(<INFINITY) colocation preference between PrivateIP and PublicIP. The
only way pacemaker could satisfy that would be to run one of each on
each node.

Also, I noticed when putting a node in standby the main NIC appears to
be interrupted momentarily (long enough for my SSH session, which is
connected via the permanent IP on the NIC and not the clusterIP, to be
dropped). Is there any way to avoid this? I was thinking that the
cluster operations would only affect the ClusteIP and not the other IPs
being served on that NIC.

Nothing in the cluster should cause that behavior. Check all the system
logs around the time to see if anything unusual is reported.


Thanks!

Dan

_______________________________________________
Users mailing list: Users@clusterlabs.org
http://lists.clusterlabs.org/mailman/listinfo/users

Project Home: http://www.clusterlabs.org
Getting started: http://www.clusterlabs.org/doc/Cluster_from_Scratch.pdf
Bugs: http://bugs.clusterlabs.org


_______________________________________________
Users mailing list: Users@clusterlabs.org
http://lists.clusterlabs.org/mailman/listinfo/users

Project Home: http://www.clusterlabs.org
Getting started: http://www.clusterlabs.org/doc/Cluster_from_Scratch.pdf
Bugs: http://bugs.clusterlabs.org

Reply via email to