Clusteren met Corosync en Pacemaker

Afgelopen week ben ik bezig geweest met het uitzoeken hoe Corosync werkt. Ik had namelijk een 2 node cluster nodig om een iSCSI lun via NFS aan de buitenwereld aan te bieden. Corosync met Pacemaker is daar een goede kandidaat voor.
Ik heb een aantal VM’s geinstalleerd. 2 voor het cluster (node1, de primary en node2, de secondary) en een aantal voor een Ceph cluster voor de iSCSI koppeling, allen met Ubuntu 20.04LTS.
Nadat Ubuntu en het Ceph cluster geinstalleerd is en het netwerk geconfigureerd gaan we de cluster software installeren.
Als eerste voeren we op beide de installatie voor pacemaker en corosync uit. Corosync is een dependancy  van pacemaker.

sudo dpkg-reconfigure tzdata
sudo apt-get update
sudo apt-get -y install ntp
sudo apt-get install pacemaker

Daarna zorgen we ervoor dat de 2 nodes veilig met elkaar kunnen communiceren. Dit doen we door op node1 de volgende commando’s te gebruiken.

sudo apt-get install haveged
sudo corosync-keygen
sudo scp /etc/corosync/authkey username@node2:/etc/corosync/

Op node2 moeten we dan nog de volgende instellingen doen

sudo chown root: /etc/corosync/authkey
sudo chmod 400 /etc/corosync/authkey

En vervolgens op beide nodes

sudo vim /etc/corosync/corosync.conf

In dit bestand moet hetvolgende komen te staan. het <private_binding_IP_address>is het cluster adres. Deze “hopt” tussen de nodes. Ook dien je nog de ipadressen van de nodes aan te passen.

totem {
  version: 2
  cluster_name: lbcluster
  transport: udpu
  interface {
    ringnumber: 0
    bindnetaddr: <private_binding_IP_address>
    broadcast: yes
    mcastport: 5405
  }
}quorum {
  provider: corosync_votequorum
  two_node: 1
}nodelist {
  node {
    ring0_addr: <IP_address_node1>
    name: primary
    nodeid: 1
  }
  node {
    ring0_addr: <IP_address_node2>
    name: secondary
    nodeid: 2
  }
}logging {
  to_logfile: yes
  logfile: /var/log/corosync/corosync.log
  to_syslog: yes
  timestamp: on
}

Daarna gebruiken we de volgende commando’s op beide nodes om een service te maken:

sudo mkdir -p /etc/corosync/service.d
sudo vim /etc/corosync/service.d/pcmk

Met daarin als inhoud

service {
  name: pacemaker
  ver: 1
}

En

sudo vim /etc/default/corosync

Waarin we het volgende toevoegen

START=yes

Nu is het cluster voorbereid en kunnen we gaan testen of het werkt:

sudo systemctl start corosync
sudo corosync-cmapctl | grep members

Om te zorgen dat pacemaker en corosync in de goede volgorde starten bij een reboot geven we weer op beide nodes het volgende commando

sudo update-rc.d pacemaker defaults 20 01
sudo systemctl start pacemaker

Nu is je cluster gemaakt. Dit cluster werkt met resources. Beheren van het cluster doe je met crm. Hieronder staan dus een aantal commando’s om resources toe te voegen, je cluster status te bekijken en resources te verwijderen. Editen van resources kan (ook) met het commando:

crm configure edit 

Een iSCSI mountpoint configureren:

crm configure primitive mnt_nfs ocf:heartbeat:Filesystem \
params device="/dev/mapper/<iscsidisk>" directory="/mnt/iscsi" \
fstype="ext3" op start interval="0" timeout="120" op monitor \
interval="60" timeout="60" OCF_CHECK_LEVEL="20" op stop interval="0" timeout="240" 

Een NFS export configuren:

crm configure primitive mnt_nfs_export ocf:heartbeat:exportfs \
params fsid=10 directory="/mnt/iscsi" \
options="rw,no_root_squash,subtree_check" clientspec=<ip_of_nfs_client> 

En we configureren een group, zodat dit alles bij elkaar blijft:

crm configure group <group_name> mnt_nfs mnt_nfs_export meta target-role="Started"

Nu zou je vanaf vanaf het hierboven gespecificeerde <ip_of_nfs_client> moeten kunnen connecten met het cluster via het <private_binding_IP_address> adres.

mount <private_binding_IP_address>:/mnt/iscsi /mnt/nfs-external

Om resources te stoppen gebruik je op node1 of node2 het commando

crm resource stop <resource_name> 

En om resources te verwijderen het commando

crm configure delete <resource_name>

Tot zover het maken van een redelijk simple cluster.