[Pacemaker] Collocating resource with a started clone instance

Sergey Tachenov stachenov at gmail.com
Sat Jun 23 15:56:54 CEST 2012


Well, I've got to the point where I understand what exactly doesn't 
work. Now I only need to understand why, and fix it.

I created a test cluster to reproduce this issue. Here's its current state:

Online: [ node2 node1 ]

  Clone Set: dummies [dummy]
      Started: [ node2 ]
      Stopped: [ dummy:1 ]
  Master/Slave Set: ms_drbd_pgdrive [drbd_pgdrive]
      Masters: [ node1 ]
      Slaves: [ node2 ]
  Resource Group: postgres
      pgdrive_fs (ocf::heartbeat:Filesystem):    Started node1
      DBIP       (ocf::heartbeat:IPaddr2):       Started node1
      postgresql (ocf::heartbeat:pgsql): Started node1

Failed actions:
     dummy:1_start_0 (node=node1, call=54, rc=1, status=complete): 
unknown error

Here's the config:

node node1
node node2
primitive DBIP ocf:heartbeat:IPaddr2 \
         params ip="192.168.220.17" cidr_netmask="24" \
         op monitor interval="10"
primitive drbd_pgdrive ocf:linbit:drbd \
         params drbd_resource="pgdrive" \
         op start interval="0" timeout="240" \
         op stop interval="0" timeout="100" \
         op monitor interval="15"
primitive dummy ocf:heartbeat:anything \
         params binfile="/home/alqualos/dummy/dummy" 
pidfile="/home/alqualos/dummy/dummy.pid" user="alqualos" 
logfile="/home/alqualos/dummy/dummy.log" \
         op monitor interval="10"
primitive pgdrive_fs ocf:heartbeat:Filesystem \
         params device="/dev/drbd0" directory="/hd2" fstype="ext4" \
         op start interval="0" timeout="60" \
         op stop interval="0" timeout="60"
primitive postgresql ocf:heartbeat:pgsql \
         params pgdata="/hd2/pgsql" \
         op monitor interval="30" timeout="30" depth="0" \
         op start interval="0" timeout="120" \
         op stop interval="0" timeout="120"
group postgres pgdrive_fs DBIP postgresql
ms ms_drbd_pgdrive drbd_pgdrive \
         meta master-max="1" master-node-max="1" clone-max="2" 
clone-node-max="1" notify="true"
clone dummies dummy \
         meta interleave="true"
colocation postgres_on_drbd inf: postgres ms_drbd_pgdrive:Master
order postgres_after_drbd inf: ms_drbd_pgdrive:promote postgres:start
property $id="cib-bootstrap-options" \
 
dc-version="1.1.7-2.fc16-ee0730e13d124c3d58f00016c3376a1de5323cff" \
         cluster-infrastructure="openais" \
         expected-quorum-votes="2" \
         stonith-enabled="false" \
         last-lrm-refresh="1340454087"
rsc_defaults $id="rsc-options" \
         resource-stickiness="10"


Now, I'd like to get the whole postgres group (and, by consequence, the 
DRBD Master as well) moved to node2 because dummy is stopped there.

It seems that the "shortest" way is to move the ms_drbd_pgdrive:Master 
because everything else depends on it. If I try to add an explicit 
location constraint for it, it works:

location drbd_on_node2 ms_drbd_pgdrive rule role=Master 500: #uname eq node2

shadow[test] # ptest -L -s
...
drbd_pgdrive:0 promotion score on node2: 10500
drbd_pgdrive:1 promotion score on node1: 10060

I have no idea where 10000 come from, but 60 is obviously derived from 
stickiness, and 500 from the new rule. Obviously, the DRBD resource gets 
promoted on the node2, and everything else follows. So far, so good.

Now, if I replace the location constraint with a collocation one, it fails:

colocation drbd_where_dummies 500: ms_drbd_pgdrive:Master dummies

shadow[test] # ptest -L -s
...
drbd_pgdrive:1 promotion score on node1: 10060
drbd_pgdrive:0 promotion score on node2: 10000

So the problem is that the collocation constraint doesn't affect DRBD 
promotion for some reason, whether directly or indirectly via dependent 
resources such as IP. Location constraints work in both ways, that's why 
a ping test gets everything moved, but a collocation constraint doesn't.

Is there a roundabout way to implement a collocation constraint using a 
location constraint, short of writing a custom RA that sets some 
attribute (like pingd does) depending on whether the resource is running 
or not? Maybe there's already such attribute that I'm unaware of?



More information about the Pacemaker mailing list