/ctdb/events.d/91.lvs

http://github.com/brinkman83/bashrc · Shell · 86 lines · 51 code · 20 blank · 15 comment · 6 complexity · b9721062420276564e6fe1b1ab4f9119 MD5 · raw file

  1. #!/bin/sh
  2. # script to manage the lvs ip multiplexer for a single public address cluster
  3. . $CTDB_BASE/functions
  4. loadconfig ctdb
  5. [ -z "$CTDB_LVS_PUBLIC_IP" ] && exit 0
  6. [ -z "$CTDB_PUBLIC_INTERFACE" ] && exit 0
  7. [ -x /sbin/ipvsadm ] || {
  8. echo "LVS configured but /sbin/ipvsadm is not installed."
  9. exit 0
  10. }
  11. case "$1" in
  12. startup)
  13. ipvsadm -D -t $CTDB_LVS_PUBLIC_IP:0
  14. ipvsadm -D -u $CTDB_LVS_PUBLIC_IP:0
  15. ip addr add $CTDB_LVS_PUBLIC_IP/32 dev lo scope host >/dev/null 2>/dev/null
  16. # do not respond to ARPs that are for ip addresses with scope 'host'
  17. echo 3 > /proc/sys/net/ipv4/conf/all/arp_ignore
  18. # do not send out arp requests from loopback addresses
  19. echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
  20. ;;
  21. shutdown)
  22. ipvsadm -D -t $CTDB_LVS_PUBLIC_IP:0
  23. ipvsadm -D -u $CTDB_LVS_PUBLIC_IP:0
  24. # remove the ip
  25. ip addr del $CTDB_LVS_PUBLIC_IP/32 dev lo >/dev/null 2>/dev/null
  26. # flush our route cache
  27. echo 1 > /proc/sys/net/ipv4/route/flush
  28. ;;
  29. recovered|stopped)
  30. # kill off any tcp connections
  31. ipvsadm -D -t $CTDB_LVS_PUBLIC_IP:0
  32. ipvsadm -D -u $CTDB_LVS_PUBLIC_IP:0
  33. kill_tcp_connections_local_only $CTDB_LVS_PUBLIC_IP
  34. PNN=`ctdb pnn | sed -e "s/.*PNN://"`
  35. LVSMASTER=`ctdb lvsmaster | sed -e "s/.*Node //" -e "s/ .*//"`
  36. [ "$PNN" != "$LVSMASTER" ] && {
  37. # we are not the lvs master so we have to
  38. # change the ip address to have scope host so we wont respond
  39. # to arps
  40. ip addr del $CTDB_LVS_PUBLIC_IP/32 dev lo >/dev/null 2>/dev/null
  41. ip addr add $CTDB_LVS_PUBLIC_IP/32 dev lo scope host >/dev/null 2>/dev/null
  42. exit 0
  43. }
  44. # change the scope so we start responding to arps
  45. ip addr del $CTDB_LVS_PUBLIC_IP/32 dev lo >/dev/null 2>/dev/null
  46. ip addr add $CTDB_LVS_PUBLIC_IP/32 dev lo >/dev/null 2>/dev/null
  47. ipvsadm -A -t $CTDB_LVS_PUBLIC_IP:0 -p 9999 -s lc
  48. ipvsadm -A -u $CTDB_LVS_PUBLIC_IP:0 -p 9999 -s lc
  49. # add all nodes (except ourselves) to the lvs config
  50. ctdb lvs | egrep -v "^$PNN:" | sed -e "s/.*://" | while read IP; do
  51. ipvsadm -a -t $CTDB_LVS_PUBLIC_IP:0 -r $IP -g
  52. ipvsadm -a -u $CTDB_LVS_PUBLIC_IP:0 -r $IP -g
  53. done
  54. # and add the localhost too
  55. ipvsadm -a -t $CTDB_LVS_PUBLIC_IP:0 -r 127.0.0.1
  56. ipvsadm -a -u $CTDB_LVS_PUBLIC_IP:0 -r 127.0.0.1
  57. # send out a gratious arp so our peers will update their arp tables
  58. ctdb gratiousarp $CTDB_LVS_PUBLIC_IP $CTDB_PUBLIC_INTERFACE >/dev/null 2>/dev/null
  59. # flush our route cache
  60. echo 1 > /proc/sys/net/ipv4/route/flush
  61. ;;
  62. *)
  63. ctdb_standard_event_handler "$@"
  64. ;;
  65. esac
  66. exit 0