Corosync/Pacemaker
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