NGINX Cluster mit corosync + pacemaker

Für einen Reverse Proxy basierend auf NGINX habe ich kürzlich ein Cluster mit corosync und pacemaker erstellt. Das Setup läuft auf einem Ubuntu Server 14.04 LTS mit 2 Nodes.

Zuerst muss auf beiden Nodes corosync und pacemaker installiert werden:

apt-get install corosync pacemaker

Bei corosync habe ich mich für UDP Unicast Transport entschieden, möglich wäre auch ein Multicast Setup. Dazu habe ich die corosync Konfiguration wie folgt angepasst:

totem {
[...]
        crypto_cipher: none
        crypto_hash: none
        interface {
                # The following values need to be set based on your environment
                ringnumber: 0
                bindnetaddr: {ip des aktuellen Node}
                mcastport: 5405
        }
        transport: udpu
}
nodelist {
        node {
                ring0_addr:{ip oder hostname Node 1}
                nodeid: 1
        }
        node {
                ring0_addr: {ip oder hostname Node 2}
                nodeid: 2
        }
}
quorum {
        provider: corosync_votequorum
        two_node: 1
}

[...]

Anschliessend muss corosync und pacemaker auf beiden Nodes gestartet werden:

service corosync start
service pacemaker start

und dann kann mit crm_mon der Status des Clusters überprüft werden.

Last updated: Fri May 29 14:12:26 2015
Last change: Fri May 29 08:53:56 2015 via crm_resource on rproxy-node1

Stack: corosync
Current DC: rproxy-node1 (1) - partition with quorum
Version: 1.1.10-42f2063

2 Nodes configured

Online: [ rproxy-node1 rproxy-node2 ]

mit crm configure können dann entsprechend Ressourcen erstellt werden. In meinem Beispiel habe ich je eine IPv4 und eine IPv6 Ressource erstellt

primitive res_ipv6 ocf:heartbeat:IPv6addr params ipv6addr="{ipv6_addr}" cidr_netmask="{cidr_netmask}" nic="{nic}"

primitive res_ip ocf:heartbeat:IPaddr2 params ip="{ipv4_addr}" cidr_netmask="{cidr_netmask" nic="{nic}"

nach commit sind dann auf einem der beiden Nodes die VIP’s zugewiesen:

Last updated: Fri May 29 14:24:05 2015
Last change: Fri May 29 08:53:56 2015 via crm_resource on rproxy-node1
Stack: corosync
Current DC: rproxy-node1 (1) - partition with quorum
Version: 1.1.10-42f2063
2 Nodes configured
2 Resources configured

Online: [ rproxy-node1 rproxy-node2 ]
 Resource Group: rg_export
     res_ip     (ocf::heartbeat:IPaddr2):       Started rproxy-node1 
     res_ipv6   (ocf::heartbeat:IPv6addr):      Started rproxy-node1

Hier im Beispiel habe ich noch eine Resource Group erstellt, damit die beiden Ressourcen zusammen migriert werden, falls ein Node ausfällt.

Wichtig für die Konfiguration von nginx, damit auf eine nicht vorhandene (die IP ist nur auf dem aktuellen Node vorhanden) IPv4 Adresse gebinded werden kann muss:

net.ipv4.ip_nonlocal_bind=1

gesetzt werden werden. Die IPv6 VIP kann einfach auf den loopback Interface konfiguriert werden.

Man könnte einen NGINX auch direkt als Ressource definieren, ich hab das aber vorläufig mal nicht so gemacht sondern starte den NGINX Server normal als Service in Ubuntu:

service nginx start