Centos 7 Cluster PCS

Installo due VM in VirtualBox identiche (4C, 4Gb RAM, 32Gb HDD) con una versione minimale di Centos 7 aggiornata.

Aggiorno il kernel a 4.16 dal repository elrepo.

# rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
# rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-3.el7.elrepo.noarch.rpm
# yum --disablerepo="*" --enablerepo="elrepo-kernel" list available
# yum --enablerepo=elrepo-kernel install kernel-ml kernel-ml-devel

Edito il file /etc/default/grub

GRUB_TIMEOUT=5
GRUB_DEFAULT=0
GRUB_DISABLE_SUBMENU=true
GRUB_TERMINAL_OUTPUT="console"
GRUB_CMDLINE_LINUX="rd.lvm.lv=centos/root rd.lvm.lv=centos/swap crashkernel=auto rhgb quiet"
GRUB_DISABLE_RECOVERY="true"

Ed eseguo per attivare la modifica precedente.

# grub2-mkconfig -o /boot/grub2/grub.cfg

Aggiungo qualche pacchetto.

# yum install epel-release.noarch
# yum update
# yum group install "Development Tools"
# yum install bzip2 net-tools psmisc nmap acpid unzip

Modifico /etc/hosts sui due nodi.

192.168.254.83  nodeA.netlite.it nodeA
192.168.254.84  nodeB.netlite.it nodeB

Installo i numerosi pacchetti necessari al cluster.

# yum install pcs fence-agents-all -y

Aggiungo le regole di firewalling.

# firewall-cmd --permanent --add-service=high-availability
# firewall-cmd --add-service=high-availability
# firewall-cmd --list-service
dhcpv6-client ssh high-availability

Modifico la password dell’utente hacluster.

# passwd hacluster
Changing password for user hacluster.
New password:
BAD PASSWORD: The password is shorter than 8 characters
Retype new password:
passwd: all authentication tokens updated successfully.

Avvio i servizi.

# systemctl start pcsd.service
# systemctl enable pcsd.service

Autorizzo i nodi del cluster.

# pcs cluster auth nodeA.netlite.it nodeB.netlite.it
Username: hacluster
Password:
nodeA.netlite.it: Authorized
nodeB.netlite.it: Authorized

Inizializzo il cluster.

# pcs cluster setup --start --name ClusterTest nodeA.netlite.it                                                        nodeB.netlite.it
Destroying cluster on nodes: nodeA.netlite.it, nodeB.netlite.it...
nodeA.netlite.it: Stopping Cluster (pacemaker)...
nodeB.netlite.it: Stopping Cluster (pacemaker)...
nodeB.netlite.it: Successfully destroyed cluster
nodeA.netlite.it: Successfully destroyed cluster
Sending 'pacemaker_remote authkey' to 'nodeA.netlite.it', 'nodeB.netlite.it'
nodeA.netlite.it: successful distribution of the file 'pacemaker_remote authkey'
nodeB.netlite.it: successful distribution of the file 'pacemaker_remote authkey'
Sending cluster config files to the nodes...
nodeA.netlite.it: Succeeded
nodeB.netlite.it: Succeeded
Starting cluster on nodes: nodeA.netlite.it, nodeB.netlite.it...
nodeB.netlite.it: Starting Cluster...
nodeA.netlite.it: Starting Cluster...
Synchronizing pcsd certificates on nodes nodeA.netlite.it, nodeB.netlite.it...
nodeA.netlite.it: Success
nodeB.netlite.it: Success
Restarting pcsd on the nodes in order to reload the certificates...
nodeA.netlite.it: Success
nodeB.netlite.it: Success

Abilito il cluster.

# pcs cluster enable --all

Visualizzo lo stato.

# pcs cluster status
Cluster Status:
 Stack: corosync
 Current DC: nodeA.netlite.it (version 1.1.16-12.el7_4.8-94ff4df) - partition with quorum
 Last updated: Tue Apr  3 13:02:21 2018
 Last change: Tue Apr  3 13:00:43 2018 by hacluster via crmd on nodeA.netlite.it
 2 nodes configured
 0 resources configured
PCSD Status:
  nodeA.netlite.it: Online
  nodeB.netlite.it: Online

Status dettagliati.

# pcs status
Cluster name: ClusterTest
WARNING: no stonith devices and stonith-enabled is not false
Stack: corosync
Current DC: nodeA.netlite.it (version 1.1.16-12.el7_4.8-94ff4df) - partition with quorum
Last updated: Tue Apr  3 13:02:53 2018
Last change: Tue Apr  3 13:00:43 2018 by hacluster via crmd on nodeA.netlite.it
2 nodes configured
0 resources configured
Online: [ nodeA.netlite.it nodeB.netlite.it ]
No resources
Daemon Status:
  corosync: active/enabled
  pacemaker: active/enabled
  pcsd: active/enabled

Disabilito i device stonith (meglio non farlo ma per test è ok).

# pcs property set stonith-enabled=false
In caso sia necessario attivare i devices qui c’è un buon punto di partenza STONITH.

Configuro un FS.

# pcs resource create httpd_fs Filesystem device="/dev/mapper/vg_apache-lv_apache" directory="/var/www" fstype="ext4" --group apache

Configuro un VIP.

# pcs resource create httpd_vip IPaddr2 ip=192.168.12.100 cidr_netmask=24 --group apache

Configuro un servizio.

# firewall-cmd --add-service=http
# firewall-cmd --permanent --add-service=http
# pcs resource create httpd_ser apache configfile="/etc/httpd/conf/httpd.conf" statusurl="http://127.0.0.1/server-status" --group apache

Disabilita un nodo.

# pcs cluster stop nodeA.netlite.it

Comandi utili.

# pcs resource move apache nodeA.netlite.it
# pcs resource stop apache nodeB.netlite.it
# pcs resource disable apache nodeB.netlite.it
# pcs resource enable apache nodeB.netlite.it
# pcs resource restart apache

andrea

Documentazione completa LINK

Per l’installazione e l’utilizzo del DRBD è preferibile che vi sia almeno una scheda di rete dedicata alla sincronizzazione configurata in /etc/network/interfaces su ogni nodo.

# network interface settings
auto lo
iface lo inet loopback
iface eth0 inet manual
auto eth1
iface eth1 inet static
        address  10.0.7.106
        netmask  255.255.240.0
auto vmbr0
iface vmbr0 inet static
        address  192.168.7.106
        netmask  255.255.240.0
        gateway  192.168.2.1
        bridge_ports eth0
        bridge_stp off
        bridge_fd 0

Tuning dello strato di rete per DRBD da inserire in rc.local

echo 30000 > /proc/sys/net/ipv4/tcp_max_syn_backlog
echo 50000 > /proc/sys/net/core/netdev_max_backlog

Nel caso di DRBD su 2 x 10Gb SFP+ in bonding la configurazione ha dato i risultati sperati e le prestazioni sono state di circa 400Mbytes/sec in TCP e 800Mbytes/sec in UDP, l’innalzamento dell’MTU e del TXQUEUELEN hanno migliorato sensibilmente le performances

ifconfig eth3 mtu 9000
ifconfig eth4 mtu 9000
ifconfig bond0 mtu 9000
ifconfig eth3 txqueuelen 5000
ifconfig eth4 txqueuelen 5000
ifconfig bond0 txqueuelen 5000

Si passa all’installazione dei tools necessari

apt-get install drbd8-utils

Sulla porzione di disco (o sul pool di dischi) da destinare al DRBD (ipotizziamo sdb) si crea una partizione di tipo 8e (Linux LVM)

Si modificano i files di configurazione /etc/drbd.d/global_common.conf

global { usage-count no; }
common { syncer { rate 30M; verify-alg md5; } }

e /etc/drbd.d/r0.res

resource r0 {
        protocol C;
        startup {
                wfc-timeout  0;     # non-zero wfc-timeout can be dangerous (http://forum.proxmox.com/threads/3465-Is-it-safe-to-use-wfc-timeout-in-DRBD-configuration)
                degr-wfc-timeout 60;
                become-primary-on both;
        }
        net {
                cram-hmac-alg sha1;
                shared-secret "my-secret";
                allow-two-primaries;
                after-sb-0pri discard-zero-changes;
                after-sb-1pri discard-secondary;
                after-sb-2pri disconnect;
                #data-integrity-alg crc32c;     # has to be enabled only for test and disabled for production use (check man drbd.conf, section "NOTES ON DATA INTEGRITY")
        }
        on proxmox-105 {
                device /dev/drbd0;
                disk /dev/sdb1;
                address 10.0.7.105:7788;
                meta-disk internal;
        }
        on proxmox-106 {
                device /dev/drbd0;
                disk /dev/sdb1;
                address 10.0.7.106:7788;
                meta-disk internal;
        }
}

Si fa partire il servizio drbd con

/etc/init.d/drbd start

e si creano i metadata

drbdadm create-md r0

dopodichè si attivano i device su entrambi i nodi

drbdadm up r0

E’ possibile visualizzare lo stato del drbd con

pve1:~# cat /proc/drbd
version: 8.3.13 (api:88/proto:86-90)
GIT-hash: dd7985327f146f33b86d4bff5ca8c94234ce840e build by [email protected], 2009-09-10 15:18:39
 0: cs:Connected ro:Secondary/Secondary ds:Inconsistent/Inconsistent C r----
    ns:0 nr:0 dw:0 dr:0 al:0 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:b oos:2096348

Su di un solo nodo digitare

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

per avviare la sincronizzazione e riabbiare il drbd su entrambi i nodi per attivare la risorsa in modalità attivo/attivo con

/etc/init.d/drbd stop
/etc/init.d/drbd start

Tuning per performance DRBD 8.3 LINK

resource resource {
  net {
    max-buffers 8000;
    max-epoch-size 8000;
    ...
  }
  ...
}
resource resource {
  net {
    sndbuf-size 0;
    ...
  }
  ...
}
resource resource {
  syncer {
    al-extents 3389;
    ...
  }
  ...
}
resource resource {
  disk {
    no-disk-barrier;
    no-disk-flushes;
    ...
  }
  ...
}

A questo punto è possibile configurare LVM editando /etc/lvm/lvm.conf

# By default we accept every block device:
filter = [ "r|/dev/sdb1|", "r|/dev/disk/|", "r|/dev/block/|", "a/.*/" ]

per eliminare sdb1 dall’autoscan
e si crea un device con

 pvcreate /dev/drbd0
 vgcreate [VG_NAME] /dev/drbd0

Tramite l’interfaccia web è possibile aggiungere il disco LVM/DRBD

Documentazione completa LINK

Dopo l’installazione e l’aggiornamento dei nodi su uno di essi si crea il cluster

pvecm create [CLUSTER_NAME]

Per aggiungere nodi al cluster sul nodo da aggiungere si digita

pve add [CLUSTER_IP_ADDRES]

Per verificare lo stato del cluster

pvecm status
pvecm nodes

Per rimuovere un nodo

pvecm delnode [NODE_NAME]

Una volta instaurato il cluster con due nodi non è possibile spegnere un nodo senza perdere la possibilità di editare i files di configurazione o di effettuare backup o creare vm in quanto non viene raggiunto il quorum necessario che si ottiene con configurazioni tipiche di 3 nodi.
E possibile abbassare temporaneamente o definitivamente il quorum a 2 o aggiungere un quorumdisk.

Documentazione completa LINK

Per configurare il fencing occorre modificare il file /etc/pve/cluster.conf

cp /etc/pve/cluster.conf /etc/pve/cluster.conf.new

Ed aumentare di +1 il valore di config_version=”XX”


Nella sezione cman aggiungere expected_votes=”1″


Situazione che è possibile forzare anche manualmente con il comando

pvecm expected 1

E dopo


E’ preferibile usare ipaddr=”192.168.1.2″ al posto di hostname=”nodeA”

Poi modificare clusternode


Per applicare le modifiche nell’interfaccia web di gestione datacenter nel tab HA è possibile Attivare le modifiche, queste verranno applicate all’intero cluster.
Eventuali errori di configurazione vengono segnalati in fase di applicazione.

Documentazione completa LINK
Per attivare il fencing bisogna aggiungere ogni nodo al dencing domain

Si modifica /etc/default/redhat-cluster-pve affinchè contenga

FENCE_JOIN="yes"

E si lancia il comando su ogni nodo

fence_tool join

Per verificare lo stato

fence_tool ls

Per installare un quorum disk iSCSI presente su di un NAS

apt-get install tgt
vi /etc/iscsi/iscsid.conf  # change node.startup to automatic
/etc/init.d/open-iscsi restart

Selezionare il target

iscsiadm --mode discovery --type sendtargets --portal [iSCSI_IP]
iscsiadm -m node -T iqn.[BLAHBLAH] -p [iSCSI_IP] -l

Create una partizione primaria con fdisk e create il quorumdisk

mkqdisk -c /dev/sdc1 -l proxmox1_qdisk

Per inserirlo nella configurazione si procede come sopra

cp /etc/pve/cluster.conf /etc/pve/cluster.conf.new

si incrementa di +1 la config_version si rimuove two_node=”1″ e si aggiunge la definizione quorumd


Sempre dall’interfaccia web nel tab HA si applica la modifica, si verifica lo stato con

pvecm s

e si applicano le modifiche con

  /etc/init.d/rgmanager stop  # This will restart any VMs that are HA enabled onto the other node.
  /etc/init.d/cman reload     # This will activate the qdisk

Assicurarsi che rgmanager sia partito o avviarlo e verificare che su ogni nodo clustat riporti qualcosa del tipo

Cluster Status for proxmox1 @ Thu Jun 28 12:23:10 2012
Member Status: Quorate
 Member Name                                         ID   Status
 ------ ----                                         ---- ------
 proxmox1a                                               1 Online, Local, rgmanager
 proxmox1b                                               2 Online, rgmanager
 /dev/block/8:33                                         0 Online, Quorum Disk

Configurazione finale