High Availability Linux Cluster

Arjen Baart

27 mei 2009

Table Of Contents


1 Inleiding

Een high-availability cluster bestaat uit twee identieke machines die elkaars services min of meer naadloos kunnen overnemen. Onder normale omstandigheden draaien de server processen op een van de machines, terwijl de andere machine slechts standby is en geen aktieve processen uitvoert. Er kunnen minimale verschillen in de configuratie zijn, zoals een IP adres of de hostname. Ook de logging wordt op ieder systeem apart bewaard. Data die voor de services van belang is wordt door middel van replicatie op beide machines opgeslagen.

2 Hardware

Voor de hardware worden gebruikelijke Intel of AMD systemen gebruikt. Aan CPU, geheugen of graphics worden geen speciale eisen gesteld. Wel is er speciale aandacht voor harddisks en netwerk interfaces (NICs).

In iedere machine worden 3 (SATA) harddisks geplaatst. Disk 0 en disk 1 vormen samen een mirror voor de swap en filesystems. De partities op deze mirror zijn:

Alleen het physical volume (derde partitie) wordt naar de andere machine gerepliceerd. De filesystems voor het OS kunnen verschillen wanneer bij voorbeeld op een systeem een upgrade wordt geinstalleerd of een configuratie wordt aangepast. Gedurende het uitvoeren en testen van de upgrade kan de service op de andere machine dan door blijven draaien.

Disk 2 is bedoeld voor de backups. Hierop wordt een physical volume gemaakt met een filesystem op LVM. Uitbreiding van de backup capaciteit is dan eenvoudig mogelijk door extra disks bij te plaatsen. Deze disk kan ook gerepliceerd worden naar de stand-by machine.

Iedere machine wordt uitgerust met 3 NICs. Een NIC wordt aangesloten op de switch/router/modem naar internet, een NIC wordt aangesloten op de switch van het interne LAN. De derde NIC op beide machines worden rechtstreeks met elkaar verbonden door middel van een cross-cable. Over deze verbinding loopt de communicatie voor het cluster en de replicatie van de disks.

3 Software

De basis van de software is een Debian 5.0 distributie. Hier worden tenminste de volgende applicaties aan toegevoegd.

De clustering wordt gerealiseerd met heartbeat en DRBD.

4 Netwerk

De NICs op iedere machine in het cluster worden fysiek op een ander netwerk aangesloten en worden geconfigureerd met een IP adres in verschillende subnetten: Internet, Intern LAN en Cluster LAN. Voor het interne LAN kan een verdeling gemaakt worden in drie adres ranges:

  1. IP aliases voor services
  2. Fysieke hosts
  3. DHCP range

5 Installatie

De installatie gaat uit van Debian 5 (netinstall) op een systeem met twee harddisks. de disks worden als volgt geconfigureerd:

Filesystems voor /home en /srv worden later aangemaakt nadat DRBD en OCFS geconfigureerd zijn.

Installeer extra packages.

  apt-get install heartbeat pacemaker ntp ethtool ocfs2-tools drbd8-utils 

Definieer netwerk interfaces in /etc/network/interfaces:

  auto eth0
  iface eth0 inet static
     address 192.168.2.20
     netmask 255.255.255.0
     gateway 192.168.2.17

  auto eth1
  iface eth1 inet static
     address 192.168.100.3
     netmask 255.255.255.248

DNS configuratie in /etc/resolv.conf:

  search andromeda.nl
  nameserver 192.168.2.17

Selecteer de juiste tijdzone:

  cp /usr/share/zoneinfo/.....  /etc/localtime

System log configuratie in /etc/syslog.conf

Logrotate configuratie in /etc/logrotate.d/*

Logical volumes maken voor /home en /srv

 lvcreate -L 100G -n home vg-sys
 lvcreate -L 100G -n serv vg-sys
 lvcreate -L 400G -n arch vg-sys

Block devices maken met DRBD. Definities in /etc/drbd.conf:

global {
   usage-count no;
}

common {
   protocol C;
   syncer { rate 500M; }

}

# Example IPv6

resource home {
   net {
      allow-two-primaries;
      after-sb-0pri discard-least-changes;
      after-sb-1pri discard-secondary;
      after-sb-2pri disconnect;
   }
startup { 
    become-primary-on both;
  }
   on phobos.andromeda.nl {
      device /dev/drbd1;
      disk   /dev/mapper/vg--sys-home;
      meta-disk  internal;
      address    ipv6 [2001:888:18a3::26]:7789;
   }
   on deimos.andromeda.nl {
      device /dev/drbd1;
      disk   /dev/mapper/vg--sys-home;
      meta-disk  internal;
      address    ipv6 [2001:888:18a3::27]:7789;
   }
}

# Example IPv4

resource serv {
   net {
      allow-two-primaries;
      after-sb-0pri discard-least-changes;
      after-sb-1pri discard-secondary;
      after-sb-2pri disconnect;
   }
startup { 
    become-primary-on both;
  }
   on phobos.andromeda.nl {
      device /dev/drbd2;
      disk   /dev/mapper/vg--sys-serv;
      meta-disk  internal;
      address 192.168.100.3:7790;
   }
   on deimos.andromeda.nl {
      device /dev/drbd2;
      disk   /dev/mapper/vg--sys-serv;
      meta-disk  internal;
      address 192.168.100.4:7790;
   }
}

DRBD devices opbrengen op beide nodes:
drbdadm create-md home
drbdadm create-md serv
drbdadm up home
drbdadm up serv
Daarna devices synchonizeren en filesystems maken vanaf de eerste node:
drbdadm -- --overwrite-data-of-peer primary home
drbdadm -- --overwrite-data-of-peer primary serv
Opstart volgorde wijzigen zodat DRBD gestart wordt voordat OCFS filesystem geactiveerd wordt:
   mv /etc/rc2.d/S70drbd /etc/rcS.d/S41drbd
Cluster filesystem opzetten in /etc/ocfs2/cluster.conf:
node:
	ip_port = 7777
	ip_address = 192.168.100.3
	number = 0
	name = phobos
	cluster = ocfs2

node:
	ip_port = 7777
	ip_address = 192.168.100.4
	number = 1
	name = deimos
	cluster = ocfs2

cluster:
	node_count = 2
	name = ocfs2
en /etc/default/o2cb:
# O2CB_ENABLED: 'true' means to load the driver on boot.
O2CB_ENABLED=true

# O2CB_BOOTCLUSTER: If not empty, the name of a cluster to start.
O2CB_BOOTCLUSTER=ocfs2

# O2CB_HEARTBEAT_THRESHOLD: Iterations before a node is considered dead.
O2CB_HEARTBEAT_THRESHOLD=31

# O2CB_IDLE_TIMEOUT_MS: Time in ms before a network connection is considered dead.
O2CB_IDLE_TIMEOUT_MS=30000

# O2CB_KEEPALIVE_DELAY_MS: Max. time in ms before a keepalive packet is sent.
O2CB_KEEPALIVE_DELAY_MS=2000

# O2CB_RECONNECT_DELAY_MS: Min. time in ms between connection attempts.
O2CB_RECONNECT_DELAY_MS=2000

daarna een reboot om ocfs2 te activeren. Na de reboot filesystems aanmaken om de eerste node:
mkfs -t ocfs2 -N 2 -L ocfs2_drbd1 /dev/drbd1
mkfs -t ocfs2 -N 2 -L ocfs2_drbd2 /dev/drbd2
Filesystems toevoegen aan /etc/fstab:
/dev/drbd1    /home    ocfs2   _netdev   0   0
/dev/drbd2    /srv     ocfs2   _netdev   0   0
Installeer heartbeat package:
  apt-get install heartbeat
Configuratie in /etc/ha.d/ha.cf:
logfacility	local0
ucast eth1 192.168.100.3
auto_failback off
node	phobos.andromeda.nl
node	deimos.andromeda.nl
crm     respawn
/etc/ha.d/authkeys:
auth 1
1 crc

en /etc/ha.d/haresources:
#  Not used, all resources are configured in pacemaker

6 Applicaties

De applicaties die de services voor het cluster implementeren worden anders geconfigureerd dan op een enkele server. De data voor de diverse daemons wordt onder /srv geplaatst inplaats van de gebruikelijke subdirectory onder /var. Tevens wordt voor iedere service een resource group toegevoegd in /etc/ha.d/haresources. Voor een aantal services wordt de configuratie in dit hoofdstuk beschreven.

6.1 Web server

Installeren van Apache met PHP en directories maken voor de data:

  apt-get install apache2 php5 php-pear  # On both nodes
  mkdir /srv/www
  mkdir /srv/php5
  chmod go-r /srv/php5
  chmod go+w /srv/php5
  chmod o+t /srv/php5
Voor iedere virtuele host de document root aanpassen in /etc/apache2/sites-available/* op beide nodes:
   DocumentRoot /srv/www
De directory voor PHP session cookies aanpassen op beide nodes in /etc/php5/apache2/php.ini:
  session.save_path = /srv/php5
Het virtuele adres van de webserver toevoegen in DNS, bij voorbeeld:
  cww    IN    A    192.168.2.50
Een resource group toevoegen in /etc/ha.d/haresources (beide nodes):
  phobos.andromeda.nl    192.168.2.50   apache2
Heartbeat zorgt er vervolgens voor dat het IP adres op de juiste interface geconfigureerd wordt en dat de http daemon gestart wordt.

6.2 Git server

Installeren van git applicaties.

  apt-get install git git-daemon-sysvinit gitweb
  mkdir /srv/git
  rmdir /var/cache/git
  ln -s /srv/git /var/cache/git
In /etc/default/git-daemon:
GIT_DAEMON_ENABLE=true
GIT_DAEMON_USER=gitdaemon
GIT_DAEMON_DIRECTORY=/srv/git
Het virtuele adres van de git server toevoegen in DNS, bij voorbeeld:
   git     IN    AAAA    2001:888:18a3::1005
Configuration for pacemaker
crm configure primitive git lsb:git-daemon
crm configure primitive git-ip ocf:heartbeat:IPv6addr params ipv6addr=2001:888:18a3::1005/64 op monitor interval=10s
crm configure colocation gitd INFINITY: git-ip git
crm configure order git-after-ip mandatory: git-ip git

6.3 PostgreSQL database server

Installeren van postgresql, directories maken, en de data verplaatsen:

  apt-get install postgresql php5-pgsql
  mkdir -p /srv/postgresql/9.1
  /etc/init.d/postgresql stop
  mv /var/lib/postgresql/9.1/main /srv/postgresql/9.1  # Primary node only
  rm -rf /var/lib/postgresql/9.1/main                  # Secondary node only

De directory voor de database en het adres voor de service aanpassen in /etc/postgresql/9.1/main/postgresql.conf:
   data_directory = '/srv/postgresql/9.1/main'
   listen_addresses = 'localhost,pgsql'
Het virtuele adres van de database server toevoegen in DNS, bij voorbeeld:
   pgsql     IN    AAAA    2001:888:18a3::1002
Configuration for pacemaker
crm configure primitive postgres lsb:postgresql
crm configure primitive pgsql-ip ocf:heartbeat:IPv6addr params ipv6addr=2001:888:18a3::1002/64 op monitor interval=10s
crm configure colocation pgsql INFINITY: pgsql-ip postgres
crm configure order postgres-after-ip mandatory: pgsql-ip postgres

6.4 Domain Name server

Installeren van bind, directories maken, en de data verplaatsen:

  apt-get install bind9
  mkdir /srv/bind
  chgrp bind /srv/bind
  chmod g+s /srv/bind
  /etc/init.d/bind9 stop
  mv /etc/bind/named.conf.options  /srv/bind
  mv /etc/bind/named.conf.local  /srv/bind
De pathnamen voor de lokale configuratie files aanpassen in /etc/bind/named.conf:
   include "/srv/bind/named.conf.options"
   include "/srv/bind/named.conf.local"
De directory voor zone files aanpassen in /srv/bind/named.conf.local:
   directory "/srv/bind"
Het virtuele adres van de name server toevoegen in DNS, bij voorbeeld:
  dns    IN    A    192.168.2.52
Een resource group toevoegen in /etc/ha.d/haresources (beide nodes):
  phobos.andromeda.nl    192.168.2.52   bind9

6.5 DHCP server

Installeren van dhcp, directory maken

  apt-get install dhcp3-server 
  mkdir /srv/dhcp
De pathnaam voor de configuratie file aanpassen in /etc/dhcp3/dhcpd.conf:
   lease-file-name /srv/dhcp/dhcpd.leases;

6.6 Mail server

Postfix must not be put under cluster control. All nodes must be able to send and receive local mail at least. Therefore postfix will tun on each node in parallel. Dovecot, on the other hand, can only run on one node because of internal cahcing in the imap daemon.

Installeren van postfix, dovecot, etc. en directory maken

   apt-get install postfix postgrey
   apt-get install procmail dovecot-common dovecot-imapd
   apt-get install squirrelmail
   mkdir /srv/mail
   chown dovecot.mail /srv/mail
Postfix configureren om via procmail af te leveren en greylisting te gebruiken in /etc/postfix/main.cf:

   mailbox_command = /usr/bin/procmail -a "$EXTENSION"

   smtpd_recipient_restrictions =
                    permit_mynetworks
                    ...
                    reject_unauth_destination
                    check_policy_service inet:127.0.0.1:10023

    smtpd_sasl_type = dovecot
   smtpd_sasl_path = private/auth
    smtpd_sasl_auth_enable = yes
Postfix configureren om via poort 587 authenticated SMTP af te handelen in /etc/postfix/master.cf:
submission inet n       -       -       -       -       smtpd
  -o syslog_name=postfix/submission
  -o smtpd_tls_security_level=encrypt
  -o smtpd_sasl_auth_enable=yes
  -o smtpd_client_restrictions=permit_sasl_authenticated,reject
  -o milter_macro_daemon_name=ORIGINATING

Procmail de mail laten afleveren via dovecot, in /etc/procmailrc:

   # file: /etc/procmailrc
   # system-wide settings for procmail
   SHELL="/bin/bash"
   SENDMAIL="/usr/sbin/sendmail -oi -t"
   LOGFILE="/var/log/procmail.log"
   DELIVER="/usr/lib/dovecot/deliver"
   # fallback:
   DEFAULT="$HOME/Maildir/"
   MAILDIR="$HOME/Maildir/"
   :0 w
   * ^X-Spam-Status: Yes
   | $DELIVER -m spam -d $LOGNAME
   :0 w
   | $DELIVER -d $LOGNAME

Dovecot configureren om mail via de LDA te accepteren en af te leveren in /srv/mail/... door middel van de configuratie file /etc/dovecot/conf.d/10-mail.conf, 15-lda.conf:


   mail_location = maildir:/srv/mail/%u

protocol lda {
  # Address to use when sending rejection mails.
  postmaster_address = postmaster@andromeda.nl

  mail_plugins = sieve

}

For SMTP authentication. conf.d/10-master.conf:
     service auth {
       ...
       unix_listener /var/spool/postfix/private/auth {
         mode = 0660
         # Assuming the default Postfix user and group
         user = postfix
         group = postfix        
       }
       ...
     }
conf.d/10-auth.conf
     auth_mechanisms = plain login
Het virtuele adres van de imap server toevoegen in DNS, bij voorbeeld:
   imaps     IN    AAAA    2001:888:18a3::1006
Configuration for pacemaker
crm configure primitive dovecot lsb:dovecot
crm configure primitive imaps-ip ocf:heartbeat:IPv6addr params ipv6addr=2001:888:18a3::1006/64 op monitor interval=10s
crm configure colocation imaps INFINITY: imaps-ip dovecot
crm configure order dovecot-after-ip mandatory: imaps-ip dovecot
De virtuele adressen van de smtp en imap servers toevoegen in DNS, bij voorbeeld:
  smtp   IN    A    192.168.2.53
  mail   IN    A    192.168.2.54
Een resource group toevoegen in /etc/ha.d/haresources (beide nodes):
  phobos.andromeda.nl    192.168.2.53   postfix
  phobos.andromeda.nl    192.168.2.54   dovecot

6.7 Gateway and firewall

6.8 Bacula Backup server

Installeren van Bacula packages.

apt-get install bacula bacula-director-pgsql
mkdir /backup
chown bacula /backup
mount /dev/backup-filesystem /backup
Het virtuele adres van de bacula director toevoegen in DNS, bij voorbeeld:
   bacula     IN    AAAA    2001:888:18a3::1003
Configuration for pacemaker
crm configure primitive bacula lsb:bacula-director
crm configure primitive bacula-ip ocf:heartbeat:IPv6addr params ipv6addr=2001:888:18a3::1003/64 op monitor interval=10s
crm configure colocation bacula-dir INFINITY: bacula-ip bacula
crm configure order bacula-after-ip mandatory: bacula-ip bacula
Configuratie van de storage daemon in /etc/bacula/bacula-sd.conf:
Storage {                             # definition of myself
  Name = strofades-sd
  SDPort = 9103                  # Director's port
  WorkingDirectory = "/var/lib/bacula"
  Pid Directory = "/var/run/bacula"
  Maximum Concurrent Jobs = 20
}

#
# List Directors who are permitted to contact Storage daemon
#
Director {
  Name = strofades-dir
  Password = "sL0Pjc3Nl1Je8zgVW3u8+0cI+vdIl5XdizCLU0v5dotr"
}

#
# Restricted Director, used by tray-monitor to get the
#   status of the storage daemon
#
Director {
  Name = strofades-mon
  Password = "9v4d+PzZv7C5pdB4iR+larCJqMBw6zsAEKPcxKh7ZHdU"
  Monitor = yes
}

Device {
  Name = FileStorage
  Media Type = File
  Archive Device = /backup
  LabelMedia = yes;                   # lets Bacula label unlabeled media
  Random Access = Yes;
  AutomaticMount = yes;               # when device opened, read it
  RemovableMedia = no;
  AlwaysOpen = no;
}

#
# Send all messages to the Director,
# mount messages also are sent to the email address
#
Messages {
  Name = Standard
  director = strofades-dir = all
}

Configuratie van de file daemon in /etc/bacula/bacula-fd.conf:
#
# List Directors who are permitted to contact this File daemon
#
Director {
  Name = strofades-dir
  Password = "ARm7qyF3lJSBKJ9NRICUj+Ry3PRJ3EZN92EnilHFVb8/"
}

#
# Restricted Director, used by tray-monitor to get the
#   status of the file daemon
#
Director {
  Name = strofades-mon
  Password = "OWQaB2VMloOQuB5qrp+kWGzrfJ5nMfK+GVMvu1snxK7E"
  Monitor = yes
}

#
# "Global" File daemon configuration specifications
#
FileDaemon {                          # this is me
  Name = strofades-fd
  FDport = 9102                  # where we listen for the director
  WorkingDirectory = /var/lib/bacula
  Pid Directory = /var/run/bacula
  Maximum Concurrent Jobs = 20
}

# Send all messages except skipped files back to Director
Messages {
  Name = Standard
  director = strofades-dir = all, !skipped, !restored
}

Configuratie van de Bacula console in /etc/bacula/bconsole.conf:
Director {
  Name = strofades-dir
  DIRport = 9101
  address = localhost
  Password = "sWaZRqTS1VX2uacyTZNXlI4Ax9Oj5MK1ANC62QBta0xi"
}

Label een aantal volumes in de Full en Incremental pools:
strofades:/etc/bacula# bconsole
Connecting to Director localhost:9101
1000 OK: strofades-dir Version: 2.4.4 (28 December 2008)
Enter a period to cancel a command.
*label volume
Automatically selected Catalog: MyCatalog
Using Catalog "MyCatalog"
Storage resource "volume": not found
Automatically selected Storage: File
Enter new Volume name: FULL-01
Defined Pools:
     1: Default
     2: Scratch
     3: Full
     4: Incremental
Select the Pool (1-4): 3
Connecting to Storage daemon File at strofades.andromeda.nl:9103 ...
Sending label command for Volume "FULL-01" Slot 0 ...
3000 OK label. VolBytes=197 DVD=0 Volume="FULL-01" Device="FileStorage" (/backup)
Catalog record for Volume "FULL-01", Slot 0  successfully created.
Requesting to mount FileStorage ...
3906 File device "FileStorage" (/backup) is always mounted.
*label volume
Automatically selected Catalog: MyCatalog
Using Catalog "MyCatalog"
Storage resource "volume": not found
Automatically selected Storage: File
Enter new Volume name: INC-01
Defined Pools:
     1: Default
     2: Scratch
     3: Incremental
     4: Full
Select the Pool (1-4): 3
Connecting to Storage daemon File at strofades.andromeda.nl:9103 ...
Sending label command for Volume "INC-01" Slot 0 ...
3000 OK label. VolBytes=203 DVD=0 Volume="INC-01" Device="FileStorage" (/backup)
Catalog record for Volume "INC-01", Slot 0  successfully created.
Requesting to mount FileStorage ...
3906 File device "FileStorage" (/backup) is always mounted.

7 Referenties