qmail - HA Qmail in configurazione High Availability Daniele Duca
qmail - HA ✗ I sistemi di posta classici ✗ I sistemi di posta in High Availability ✗ Il software ✗ Prerequisiti per un installazione felice ✗ DRBD ✗ Heartbeat ✗ Script di servizio ✗ Organizzazione del filesystem Sommario
qmail - HA I sistemi di posta classici Mail server esterni e spammer MX secondarioMX terziario MX primario (SMTP, POP, IMAP,...) (utenti )
qmail - HA Vantaggi di un sistema classico ✗ Facilita' di gestione e svantaggi.. ✗ Presenza di un single point of failure ✗ Possibilita' di overload
qmail - HA I sistemi di posta in high availability Mail server esterni e spammer MX secondarioMX terziario (sempre utenti) Interfaccia virtuale Nodo attivoNodo inattivo Storage condiviso
qmail - HA Vantaggi di un sistema high availability ✗ Affidabilita' ✗ Ridondanza dei dati.. svantaggi ✗ Piccole complicazioni nelle configurazioni ✗ Costo
qmail - HA Software utlizzato per il sistema HA ✗ qmail ( ✗ netqmail ( ✗ vpopmail ( ✗ drbd ( ✗ heartbeat ( ✗ Vari ed eventuali (clamav, spamassassin,...)
qmail - HA Prerequisiti per un installazione felice ✗ Due server sostanzialmente identici nell architettura ✗ Spazio su disco a sufficienza ✗ File di sistema principali con permessi e ownership uguali su entrambi i server ✗ Sono preferibili due schede di rete dedicate alla sincronizzazione ✗ La directory /etc identica su entrambe le macchine
qmail - HA DRBD – /etc/drbd.conf resource drbd0 { protocol C; // Protocollo di comunicazione tra i nodi incon-degr-cmd "echo '!DRBD! pri on incon-degr' | wall ; sleep 60 ; halt -f"; startup { wfc-timeout 10; // Wait for connect Timeout degr-wfc-timeout 120; // Wait for connect se il nodo e' l'unico rimasto attivo } disk { on-io-error detach; // Azione da intraprendere su errori I/O } net { max-buffers 8192; // Dimensione massima buffer } syncer { rate 70000K; //Velocita' massima sincronizzazione } on linuxclm { device /dev/drbd0; disk /dev/sda5; address :7788; meta-disk /dev/sda6[0]; } on linuxcls { device /dev/drbd0; disk /dev/sda5; address :7788; meta-disk /dev/sda6[0]; }
qmail - HA Heartbeat - /etc/ha.d/ha.cf debugfile /var/log/ha-debug logfile /var/log/ha-log logfacility daemon # Log to syslog as facility "daemon" node linuxclm linuxcls # List our cluster members keepalive 1 # Send one heartbeat each second deadtime 10 # Declare nodes dead after 10 seconds bcast eth1 # Broadcast heartbeats oneth1 interfaces ping # Ping our mate to monitor ethernet connectivity auto_failback no # Don't fail back to linuxclm automatically respawn hacluster /usr/lib/heartbeat/ipfail # Failover on network failures Heartbeat - /etc/ha.d/haresources linuxclm cluster services
qmail - HA Script di servizio - /etc/init.d/services #! /bin/sh prefix="/opt" exec_prefix=${prefix} sbindir="${exec_prefix}/sbin" case "$1" in start) # Start daemons. cd / /etc/init.d/qmail start sleep 30;/usr/bin/crontab /etc/cron.cluster & ;; stop) # Stop daemons. cd / killall -9 tcpserver killall -9 qmail-send /usr/bin/crontab -r ;; restart | reload | force-reload) $0 stop $0 start ;; *) echo "Usage: $0 {start|stop}" >&2 exit 1 ;; esac exit 0
qmail - HA Script di servizio - /etc/init.d/cluster (thanks to Alberto Cammozzo) #!/bin/bash SHARED_MOUNTPOINT="/home" DRBD="/etc/init.d/drbd" DRBDADM="/sbin/drbdadm" MOUNT="/bin/mount" UMOUNT="/bin/umount" case "$1" in start) echo -n "Starting cluster:" $UMOUNT $SHARED_MOUNTPOINT $DRBDADM disconnect all $DRBDADM primary all $MOUNT $SHARED_MOUNTPOINT echo "." ;; stop) echo -n "Stopping cluster:" $UMOUNT $SHARED_MOUNTPOINT $DRBDADM secondary all $DRBDADM wait_connect all echo "." ;; *) echo "Usage: /etc/init.d/cluster {start|stop}" exit 1 ;; esac exit 0
qmail - HA #!/bin/sh fuori() { rm -f /tmp/roundlock exit } if [ -f /tmp/roundlock ]; then exit fi DRBDADM="/sbin/drbdadm" mntd=`mount | grep "/dev/drbd0" | wc -l` ctcd=`cat /proc/drbd | grep StandAlone | grep Primary | wc -l` if [ $mntd = 1 ]; then if [ $ctcd = 1 ]; then $DRBDADM connect all fuori fi ctcd=`cat /proc/drbd | grep StandAlone | grep Secondary | wc -l` if [ $mntd = 0 ]; then if [ $ctcd = 1 ]; then touch /tmp/roundlock $DRBDADM connect all $DRBDADM wait_connect all fuori fi ctcd=`cat /proc/drbd | grep WFConnection | grep Secondary | wc -l` if [ $mntd = 0 ]; then if [ $ctcd = 1 ]; then touch /tmp/roundlock $DRBDADM wait_connect all fuori fi ctcd=`cat /proc/drbd | grep WFConnection | grep Primary | wc -l` if [ $mntd = 0 ]; then if [ $ctcd = 1 ]; then touch /tmp/roundlock $DRBDADM secondary all $DRBDADM connect all $DRBDADM wait_connect all fuori fi ctcd=`cat /proc/drbd | grep StandAlone | grep Primary | wc -l` if [ $mntd = 0 ]; then if [ $ctcd = 1 ]; then touch /tmp/roundlock $DRBDADM secondary all $DRBDADM connect all $DRBDADM wait_connect all fuori fi Script di servizio - /bin/connector
qmail - HA sync/etc/cron.cluster sync/var/qmail vpopmail opt / - /usr - /boot - /etc - cron.cluster - /home - - /opt - /var - qmail.... Organizzazione del filesystem sui nodi / - /usr - /boot - /etc - cron.cluster - /home - /opt - /var - qmail.... Storage sincronizzato Nodo attivoNodo passivo
qmail - HA Fine! Dubbi? Perplessita'?