2 # script to manage the lvs ip multiplexer for a single public address cluster
8 [ -z "$CTDB_LVS_PUBLIC_IP" ] && exit 0
9 [ -z "$CTDB_PUBLIC_INTERFACE" ] && exit 0
11 [ -x /sbin/ipvsadm ] || {
12 echo "LVS configured but /sbin/ipvsadm is not installed."
18 ipvsadm -D -t $CTDB_LVS_PUBLIC_IP:0
19 ipvsadm -D -u $CTDB_LVS_PUBLIC_IP:0
21 ip addr add $CTDB_LVS_PUBLIC_IP/32 dev lo scope host >/dev/null 2>/dev/null
23 # do not respond to ARPs that are for ip addresses with scope 'host'
24 echo 3 > /proc/sys/net/ipv4/conf/all/arp_ignore
25 # do not send out arp requests from loopback addresses
26 echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
30 ipvsadm -D -t $CTDB_LVS_PUBLIC_IP:0
31 ipvsadm -D -u $CTDB_LVS_PUBLIC_IP:0
34 ip addr del $CTDB_LVS_PUBLIC_IP/32 dev lo >/dev/null 2>/dev/null
36 # flush our route cache
37 echo 1 > /proc/sys/net/ipv4/route/flush
40 recovered|stopped|ipreallocated)
41 # kill off any tcp connections
42 ipvsadm -D -t $CTDB_LVS_PUBLIC_IP:0
43 ipvsadm -D -u $CTDB_LVS_PUBLIC_IP:0
44 kill_tcp_connections_local_only $CTDB_LVS_PUBLIC_IP
46 PNN=`ctdb pnn | sed -e "s/.*PNN://"`
47 LVSMASTER=`ctdb lvsmaster | sed -e "s/.*Node //" -e "s/ .*//"`
49 [ "$PNN" != "$LVSMASTER" ] && {
50 # we are not the lvs master so we have to
51 # change the ip address to have scope host so we wont respond
53 ip addr del $CTDB_LVS_PUBLIC_IP/32 dev lo >/dev/null 2>/dev/null
54 ip addr add $CTDB_LVS_PUBLIC_IP/32 dev lo scope host >/dev/null 2>/dev/null
58 # change the scope so we start responding to arps
59 ip addr del $CTDB_LVS_PUBLIC_IP/32 dev lo >/dev/null 2>/dev/null
60 ip addr add $CTDB_LVS_PUBLIC_IP/32 dev lo >/dev/null 2>/dev/null
62 ipvsadm -A -t $CTDB_LVS_PUBLIC_IP:0 -p 999999999 -s lc
63 ipvsadm -A -u $CTDB_LVS_PUBLIC_IP:0 -p 999999999 -s lc
65 # add all nodes (except ourselves) to the lvs config
66 ctdb lvs | egrep -v "^$PNN:" | sed -e "s/.*://" | while read IP; do
67 ipvsadm -a -t $CTDB_LVS_PUBLIC_IP:0 -r $IP -g
68 ipvsadm -a -u $CTDB_LVS_PUBLIC_IP:0 -r $IP -g
70 # and add the localhost too
71 ipvsadm -a -t $CTDB_LVS_PUBLIC_IP:0 -r 127.0.0.1
72 ipvsadm -a -u $CTDB_LVS_PUBLIC_IP:0 -r 127.0.0.1
74 # send out a gratious arp so our peers will update their arp tables
75 ctdb gratiousarp $CTDB_LVS_PUBLIC_IP $CTDB_PUBLIC_INTERFACE >/dev/null 2>/dev/null
77 # flush our route cache
78 echo 1 > /proc/sys/net/ipv4/route/flush
82 ctdb_standard_event_handler "$@"