2 # script to manage the lvs ip multiplexer for a single public address cluster
7 [ -z "$CTDB_LVS_PUBLIC_IP" ] && exit 0
8 [ -z "$CTDB_PUBLIC_INTERFACE" ] && exit 0
10 [ -x /sbin/ipvsadm ] || {
11 echo "LVS configured but /sbin/ipvsadm is not installed."
19 PATH=/usr/bin:/bin:/usr/sbin:/sbin:$PATH
23 ipvsadm -D -t $CTDB_LVS_PUBLIC_IP:0
24 ipvsadm -D -u $CTDB_LVS_PUBLIC_IP:0
26 ip addr add $CTDB_LVS_PUBLIC_IP/32 dev lo scope host >/dev/null 2>/dev/null
28 # do not respond to ARPs that are for ip addresses with scope 'host'
29 echo 3 > /proc/sys/net/ipv4/conf/all/arp_ignore
30 # do not send out arp requests from loopback addresses
31 echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
35 ipvsadm -D -t $CTDB_LVS_PUBLIC_IP:0
36 ipvsadm -D -u $CTDB_LVS_PUBLIC_IP:0
39 ip addr del $CTDB_LVS_PUBLIC_IP/32 dev lo >/dev/null 2>/dev/null
41 # flush our route cache
42 echo 1 > /proc/sys/net/ipv4/route/flush
52 # kill off any tcp connections
53 ipvsadm -D -t $CTDB_LVS_PUBLIC_IP:0
54 ipvsadm -D -u $CTDB_LVS_PUBLIC_IP:0
55 kill_tcp_connections $CTDB_LVS_PUBLIC_IP
57 PNN=`ctdb pnn | sed -e "s/.*PNN://"`
58 LVSMASTER=`ctdb lvsmaster | sed -e "s/.*Node //" -e "s/ .*//"`
60 [ "$PNN" != "$LVSMASTER" ] && {
61 # we are not the lvs master so we have to
62 # change the ip address to have scope host so we wont respond
64 ip addr del $CTDB_LVS_PUBLIC_IP/32 dev lo >/dev/null 2>/dev/null
65 ip addr add $CTDB_LVS_PUBLIC_IP/32 dev lo scope host >/dev/null 2>/dev/null
69 # change the scope so we start responding to arps
70 ip addr del $CTDB_LVS_PUBLIC_IP/32 dev lo >/dev/null 2>/dev/null
71 ip addr add $CTDB_LVS_PUBLIC_IP/32 dev lo >/dev/null 2>/dev/null
73 ipvsadm -A -t $CTDB_LVS_PUBLIC_IP:0 -p 9999 -s lc
74 ipvsadm -A -u $CTDB_LVS_PUBLIC_IP:0 -p 9999 -s lc
76 # add all nodes (except ourselves) to the lvs config
77 ctdb lvs | egrep -v "^$PNN:" | sed -e "s/.*://" | while read IP; do
78 ipvsadm -a -t $CTDB_LVS_PUBLIC_IP:0 -r $IP -g
79 ipvsadm -a -u $CTDB_LVS_PUBLIC_IP:0 -r $IP -g
81 # and add the localhost too
82 ipvsadm -a -t $CTDB_LVS_PUBLIC_IP:0 -r 127.0.0.1
83 ipvsadm -a -u $CTDB_LVS_PUBLIC_IP:0 -r 127.0.0.1
85 # send out a gratious arp so our peers will update their arp tables
86 ctdb gratiousarp $CTDB_LVS_PUBLIC_IP $CTDB_PUBLIC_INTERFACE >/dev/null 2>/dev/null
88 # flush our route cache
89 echo 1 > /proc/sys/net/ipv4/route/flush