Corosync/Pacemaker

Aus xinux.net
Zur Navigation springen Zur Suche springen

Corosync/Pacemaker

Voraussetzungen

  • 2 frisch aufgesetzte Systeme
  • Gleiches Betriebsystem
  • Jeweils 2 Netzwerkschnittstellen
    • Eine im LAN
    • Eine direktverbindung zwischen beiden Nodes

Allgemeine Konfiguration

Konfiguration der Netzwerkschnittstellen

IPs müssen entsprechend angepasst sein!:

root@cp1:~# cat /etc/network/interfaces
auto eth0
iface eth0 inet static
        address 192.168.242.230
        netmask 255.255.248.0
        gateway 192.168.240.100
        dns-nameservers 192.168.240.21
        dns-domainname  xinux

auto eth1
iface eth1 inet static
        address 10.0.0.1
        netmask 255.255.255.0


root@cp2:~# cat /etc/network/interfaces
auto eth0
iface eth0 inet static
        address 192.168.242.240
        netmask 255.255.248.0
        gateway 192.168.240.100
        dns-nameservers 192.168.240.21
        dns-domainname  xinux

auto eth1
iface eth1 inet static
        address 10.0.0.2
        netmask 255.255.255.0

Eintrag in /etc/hosts

Eintragen der Node IPs mit Namen in /etc/hosts

IPs müssen entsprechend angepasst sein!:

root@cp1:~# cat /etc/hosts 
 127.0.0.1	localhost 
 127.0.1.1	cp1
 10.0.0.2	cp2

root@cp2:~# cat /etc/hosts 
 127.0.0.1	localhost 
 127.0.1.1	cp2
 10.0.0.1	cp1

Austausch ssh-keys

Erstellen und austauschen der ssh-keys zwischen Nodes:

root@cp1:~# ssh-keygen
root@cp1:~# ssh-copy-id cp2

root@cp2:~# ssh-keygen
root@cp2:~# ssh-copy-id cp1

Installation Corosync/Pacemaker

Benötigte Pakete

root@cp1:~# apt-get install -y corosync pacemaker
root@cp2:~# apt-get install -y corosync pacemaker

Minimale Konfiguration

Anpassen des heartbeat-signal interfaces

root@cp1:~# cat /etc/corosync/corosync.conf
...
 	interface { 
		# The following values need to be set based on your environment 
		ringnumber: 0 
		bindnetaddr: 10.0.0.0 
		mcastaddr: 226.94.1.1 
		mcastport: 5405 
	} 
...

Clusterstart durch init-Skript erlauben

root@cp1:~# cat /etc/default/corosync
# start corosync at boot [yes|no]
START=yes

Nodes Konsistent halten

root@cp1:~# rsync -av /etc/corosync/corosync.conf cp2:/etc/corosync/
root@cp1:~# rsync -av /etc/default/corosync cp2:/etc/default/


Corosync neustarten

root@cp1:~# service corosync start
root@cp2:~# service corosync start

Stonith in CIB auf deaktiviert stellen

root@cp1:~# crm configure show
node cp1
node cp2
property $id="cib-bootstrap-options" \
	dc-version="1.1.6-9971ebba4494012a93c03b40a2c58ec0eb60f50c" \
	cluster-infrastructure="openais" \
	expected-quorum-votes="2" \
	stonith-enabled="false"

Cluster-IP einrichten (dazu CIB ergänzen)

root@cp1:~# crm configure show
...
primitive resClusterIP ocf:heartbeat:IPaddr2 \
	params ip="192.168.242.55" nic="eth0" cidr_netmask="21" \
	op monitor interval="20" timeout="60"

Erfolgreiche Ausgabe

root@cp1:~# crm status
============
Last updated: Thu Mar 7 14:32:25 2013
Last change: Thu Mar 7 14:14:55 2013 via crm_resource on cp2
Stack: openais
Current DC: cp2 - partition with quorum
Version: 1.1.6-9971ebba4494012a93c03b40a2c58ec0eb60f50c
2 Nodes configured, 2 expected votes
1 Resources configured.
============

Online: [ cp1 cp2 ]

 resClusterIP	(ocf::heartbeat:IPaddr2):	Started cp1

Corosync ist jetz Betriebsbereit

DRBD

Voraussetzungen

  • Minimalinstallation Heartbeat ( siehe oben )
  • Jeweils zusätzliche Festplatte

Installation DRBD

root@cp1:~# apt-get install drbd8-utils -y
root@cp2:~# apt-get install drbd8-utils -y

Die Konfigurationsdatei für DRBD ist /etc/drbd.conf. Eine Minimalkonfiguration sieht wie folgt aus:

root@cp1:~# cat /etc/drbd.conf 
global { usage-count yes; } 
common { 
        syncer { rate 100M; } 
        protocol C; 
} 
resource data { 
                device          /dev/drbd0; 
                meta-disk       internal; 
        on cp1 { 
                disk            /dev/sdb; 
                address         10.0.0.1:7788; 
        } 
        on cp2 { 
                disk            /dev/sdb; 
                address         10.0.0.2:7788; 
        } 
}

Diese muss auch auf beiden Nodes identisch sein.

root@cp1:~# rsync -av /etc/drbd.conf cp2:/etc/

Nun wird das DRBD-device erstellt, die Kernel Module geladen und das Device zum Test aktiviert.

root@cp1:~# drbdadm create-md data
root@cp2:~# drbdadm create-md data

root@cp1:~# modprobe drbd
root@cp2:~# modprobe drbd

root@cp1:~# drbdadm up data
root@cp2:~# drbdadm up data

root@cp1:~# drbdsetup /dev/drbd0 primary -o

Als letztes wird auf dem DRBD-device ein Dateisystem eingerichtet.

root@cp1:~# mkfs.ext3 /dev/drbd0

Auf beiden Nodes Mountpunkt erstellen:

root@cp1:~# mkdir /data
root@cp2:~# mkdir /data

DRBD und Dateisystemmount in CIB integrieren

root@cp1:~# crm configure show
...
primitive resDRBD ocf:heartbeat:drbd \
	params drbd_resource="data"
primitive resFS ocf:heartbeat:Filesystem \
	params device="/dev/drbd/by-res/data" directory="/data" fstype="ext3" \
	op monitor interval="120s" \
	meta target-role="Started"
ms msDRBD resDRBD \
	meta notify="true" master-max="1" target-role="Master"
colocation colDRBDFS inf: resFS:Started msDRBD:Master
order ordDRBDFS inf: msDRBD:promote resFS:start


Corosync neustarten

root@cp1:~# service corosync start
root@cp2:~# service corosync start


Erfolgreiche Ausgabe

root@cp1:~# crm status
============
Last updated: Thu Mar 7 15:23:25 2013
Last change: Thu Mar 7 15:01:55 2013 via crm_resource on cp2
Stack: openais
Current DC: cp2 - partition with quorum
Version: 1.1.6-9971ebba4494012a93c03b40a2c58ec0eb60f50c
2 Nodes configured, 2 expected votes
4 Resources configured.
============

Online: [ cp1 cp2 ]

 resClusterIP	(ocf::heartbeat:IPaddr2):	Started cp1
 Master/Slave Set: msDRBD [resDRBD]
     Masters: [ cp2 ]
     Slaves: [ cp1 ]
 resFS	(ocf::heartbeat:Filesystem):	Started cp2

GFS2

Voraussetzungen

  • Installation Corosync/Pacemaker + DRBD ( siehe oben )

Installation GFS2

Benötigte Pakete

root@cp1:~# apt-get install -y cman fence-agents gfs2-utils gfs2-cluster
root@cp2:~# apt-get install -y cman fence-agents gfs2-utils gfs2-cluster

Cman Konfiguaration

root@cp1:~# cat /etc/cluster/cluster.conf
<?xml version="1.0"?>
<cluster config_version="1" name="pacemaker">
<cman two_node="1" expected_votes="1"> </cman>
   <fence_daemon clean_start="0" post_fail_delay="0" post_join_delay="3"/>
   <clusternodes>
           <clusternode name="cp1" nodeid="1" votes="1">
               <fence>
                       <method name="pcmk-redirect">
                               <device name="pcmk" port="cp1"/>
                       </method>
               </fence>
           </clusternode>
           <clusternode name="cp2" nodeid="2" votes="1">
               <fence>
                       <method name="pcmk-redirect">
                               <device name="pcmk" port="cp2"/>
                       </method>
               </fence>
           </clusternode>
   </clusternodes>
 <fencedevices>
   <fencedevice name="pcmk" agent="fence_pcmk"/>
 </fencedevices>
</cluster>


Corosync Konfiguration

root@cp1:~# cat /etc/corosync/corosync.conf
...
service {
        # Load the Pacemaker Cluster Resource Manager
        ver:       1
        name:      pacemaker
}
...

Nodes konsistent halten

root@cp1:~# rsync -av /etc/cluster/cluster.conf cp2:/etc/cluster/ ; rsync -av /etc/corosync/corosync.conf cp2:/etc/corosync/

Pacemaker init-skript aktivieren

root@cp1:~# update-rc.d -f pacemaker remove ; update-rc.d pacemaker start 50 1 2 3 4 5 . stop 01 0 6 .
root@cp2:~# update-rc.d -f pacemaker remove ; update-rc.d pacemaker start 50 1 2 3 4 5 . stop 01 0 6 .

Deaktivieren des Quorums

root@cp1:~# echo CMAN_QUORUM_TIMEOUT=0 >> /etc/default/cman
root@cp2:~# echo CMAN_QUORUM_TIMEOUT=0 >> /etc/default/cman

Corosync stoppen

root@cp1:~# service corosync stop
root@cp2:~# service corosync stop

CMAN starten

root@cp1:~# service cman start
root@cp2:~# service cman start

Pacemaker starten

root@cp1:~# service pacemaker start
root@cp2:~# service pacemaker start

Konfiguration Filesystem Resourceagent

In /usr/lib/ocf/resource.d/heartbeat/Filesystem

if [ "$DEVICE" != "/dev/null" -a ! -b "$DEVICE" ] ; then
     ocf_log err "Couldn't find device [$DEVICE]. Expected /dev/??? to exist"

Ändern zu

if [ "$DEVICE" != "/dev/null" -a ! -b "$DEVICE" -a "$FSTYPE" != "gfs2" ] ; then
     ocf_log err "Couldn't find device [$DEVICE]. Expected /dev/??? to exist"

Mit anderer Node konsisten halten

root@cp1:~# rsync -av /usr/lib/ocf/resource.d/heartbeat/Filesystem cp2:/usr/lib/ocf/resource.d/heartbeat/

Nodes Standby setzen

root@cp1:~# crm node standby cp1

Resourcen für DLM eintragen

root@cp1:~# crm configure edit
node fix
node foxy
property $id="cib-bootstrap-options" \
       dc-version="1.1.6-9971ebba4494012a93c03b40a2c58ec0eb60f50c" \
       cluster-infrastructure="cman" \
       stonith-enabled="false" \
       no-quorum-policy="ignore"
primitive resDLM ocf:pacemaker:controld \
       params daemon="dlm_controld" \
       op monitor interval="120s"
primitive resGFSD ocf:pacemaker:controld \
       params daemon="gfs_controld" args="" \
       op monitor interval="120s"
clone cloneDLM resDLM \
       meta globally-unique="false" interleave="true"
clone cloneGFSD resGFSD \
       meta globally-unique="false" interleave="true" target-role="Started"
colocation colGFSDDLM inf: cloneGFSD cloneDLM
order ordDLMGFSD 0: cloneDLM cloneGFSD

DRBD für GFS vorbereiten

Anpassen der/etc/drbd.conf

global { usage-count yes; }
common {
        syncer { rate 100M; }
        protocol C;
        net {
                cram-hmac-alg sha1;
                shared-secret "lucid";
                allow-two-primaries;
                after-sb-0pri discard-zero-changes;
                after-sb-1pri discard-secondary;
                after-sb-2pri disconnect;
        }
        startup { become-primary-on both; }
}
resource data {
                device          /dev/drbd0;
                meta-disk       internal;
        on cp1 {
                disk            /dev/sdb;
                address         10.0.0.1:7788;
        }
        on cp2 {
                disk            /dev/sdb;
                address         10.0.0.2:7788;
        }

Und auf andere Node schieben:

root@cp1:~# rsync -av /etc/drbd.conf cp2:/etc/

Pacemaker autostart deaktivieren

root@cp1:~# update-rc.d -f drbd remove
root@cp2:~# update-rc.d -f drbd remove

DLM_controldeamon und GFS2+DRBD hinzufügen

root@cp1:~# crm configure edit
...
primitive resDRBD ocf:linbit:drbd \
        params drbd_resource="data" \
        operations $id="resDRBD-operations" \
        op monitor interval="20" role="Master" timeout="20" \
        op monitor interval="30" role="Slave" timeout="20"
ms msDRBD resDRBD \
        meta resource-stickines="100" notify="true" master-max="2" interleave="true"
colocation colDLMDRBD inf: cloneDLM msDRBD:Master
order ordDRBDDLM 0: msDRBD:promote cloneDLM

Beide Nodes Primär schalten

Auf Node1

drbdadm secondary data
drbdadm disconnect data
drbdadm -- --discard-my-data connect data

Auf Node 2

drbdadm -- --overwrite-data-of-peer primary data

Auf Node 1

drbdadm primary data
mkfs.gfs2 -p lock_dlm -j2 -t pacemaker:gfs2 /dev/drbd/by-res/data

Pacemaker CIB nochmal anpassen

root@cp1:~# crm configure edit
...
primitive resFS ocf:heartbeat:Filesystem \
       params device="/dev/drbd/by-res/data" directory="/data" fstype="gfs2" \
       op monitor interval="120s" \
       meta target-role="Started"
clone cloneFS resFS \
       meta interleave="true" ordered="true" target-role="Started"
colocation colFSGFSD inf: cloneFS cloneGFSD