Advertisement
Guest User

Untitled

a guest
Sep 5th, 2017
90
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.65 KB | None | 0 0
  1. #!/bin/bash
  2. ## inspired by proxysql_galera_checker.sh
  3. # Author: Frédéric -lefred- Descamps
  4. # version: 0.1
  5. # 2016-08-25
  6.  
  7. # CHANGE THOSE
  8. PROXYSQL_USERNAME="admin"
  9. PROXYSQL_PASSWORD="admin"
  10. PROXYSQL_HOSTNAME="localhost"
  11. PROXYSQL_PORT="6032"
  12. #
  13.  
  14. function usage()
  15. {
  16. echo "Usage: $0 <hostgroup_id write> [hostgroup_id read] [number writers] [writers are readers 0|1} [log_file]"
  17. exit 0
  18. }
  19.  
  20. if [ "$1" = '-h' -o "$1" = '--help' -o -z "$1" ]
  21. then
  22. usage
  23. fi
  24.  
  25. if [ $# -lt 1 ]
  26. then
  27. echo "Invalid number of arguments"
  28. usage
  29. fi
  30.  
  31. HOSTGROUP_WRITER_ID="${1}"
  32. HOSTGROUP_READER_ID="${2:--1}"
  33. NUMBER_WRITERS="${3:-0}"
  34. WRITER_IS_READER="${4:-1}"
  35. ERR_FILE="${5:-/dev/null}"
  36.  
  37. #echo "Hostgroup writers $HOSTGROUP_WRITER_ID"
  38. #echo "Hostgroup readers $HOSTGROUP_READER_ID"
  39. #echo "Number of writers $NUMBER_WRITERS"
  40. #echo "Writers are readers $WRITER_IS_READER"
  41. #echo "log file $ERR_FILE"
  42.  
  43. #Timeout exists for instances where mysqld may be hung
  44. TIMEOUT=10
  45.  
  46. PROXYSQL_CMDLINE="mysql -u$PROXYSQL_USERNAME -p$PROXYSQL_PASSWORD -h $PROXYSQL_HOSTNAME -P $PROXYSQL_PORT --protocol=tcp -Nse"
  47. MYSQL_CREDENTIALS=$($PROXYSQL_CMDLINE "SELECT variable_value FROM global_variables WHERE variable_name IN ('mysql-monitor_username','mysql-monitor_password') ORDER BY variable_name DESC")
  48. MYSQL_USERNAME=$(echo $MYSQL_CREDENTIALS | awk '{print $1}')
  49. MYSQL_PASSWORD=$(echo $MYSQL_CREDENTIALS | awk '{print $2}')
  50. #echo $MYSQL_CREDENTIALS
  51. #echo $MYSQL_USERNAME $MYSQL_PASSWORD
  52. MYSQL_CMDLINE="timeout $TIMEOUT mysql -nNE -u$MYSQL_USERNAME -p$MYSQL_PASSWORD "
  53.  
  54. $PROXYSQL_CMDLINE "SELECT hostgroup_id, hostname, port, status, max_replication_lag FROM mysql_servers WHERE hostgroup_id IN ($HOSTGROUP_WRITER_ID, $HOSTGROUP_READER_ID) AND status <> 'OFFLINE_HARD'" | while read hostgroup server port stat max_replication_lag
  55. do
  56. read GR_STATUS READONLY TRX_BEHIND <<<$($MYSQL_CMDLINE -h $server -P $port -e "SELECT concat(viable_candidate, ' ', read_only, ' ',transactions_behind) FROM sys.gr_member_routing_candidate_status" 2>>/dev/null | tail -1 2>>${ERR_FILE})
  57. echo "`date` Check server $hostgroup:$server:$port , status $stat , GR_STATUS $GR_STATUS, READONLY $READONLY, TRX_BEHIND $TRX_BEHIND" >> ${ERR_FILE}
  58. if [ "${GR_STATUS}" == "YES" -a "${READONLY}" == "NO" -a "$stat" != "ONLINE" -a ${TRX_BEHIND} -le $max_replication_lag ] ; then
  59. echo "`date` Changing server $hostgroup:$server:$port to status ONLINE" >> ${ERR_FILE}
  60. $PROXYSQL_CMDLINE "UPDATE mysql_servers SET status='ONLINE' WHERE hostgroup_id=$hostgroup AND hostname='$server' AND port='$port';" 2>> ${ERR_FILE}
  61. elif [ "${GR_STATUS}" == "YES" -a "${READONLY}" == "YES" -a "$stat" != "ONLINE" -a "$hostgroup" == "$HOSTGROUP_READER_ID" -a ${TRX_BEHIND} -le $max_replication_lag ] ; then
  62. echo "`date` Changing server $hostgroup:$server:$port to status ONLINE" >> ${ERR_FILE}
  63. $PROXYSQL_CMDLINE "UPDATE mysql_servers SET status='ONLINE' WHERE hostgroup_id=$hostgroup AND hostname='$server' AND port='$port';" 2>> ${ERR_FILE}
  64. elif [ "${GR_STATUS}" == "NO" -o "${READONLY}" == "YES" -a "$stat" = "ONLINE" -a "$hostgroup" == "$HOSTGROUP_WRITER_ID" ] ; then
  65. echo "`date` Changing server $hostgroup:$server:$port to status OFFLINE_SOFT" >> ${ERR_FILE}
  66. $PROXYSQL_CMDLINE "UPDATE mysql_servers SET status='OFFLINE_SOFT' WHERE hostgroup_id=$hostgroup AND hostname='$server' AND port='$port';" 2>> ${ERR_FILE}
  67. elif [ "${GR_STATUS}" == "YES" -a "${READONLY}" == "NO" -a "$stat" = "ONLINE" -a ${TRX_BEHIND} -gt $max_replication_lag ] ; then
  68. echo "`date` Changing server $hostgroup:$server:$port to status OFFLINE_SOFT" >> ${ERR_FILE}
  69. $PROXYSQL_CMDLINE "UPDATE mysql_servers SET status='OFFLINE_SOFT' WHERE hostgroup_id=$hostgroup AND hostname='$server' AND port='$port';" 2>> ${ERR_FILE}
  70. fi
  71. done
  72.  
  73. if [ $NUMBER_WRITERS -gt 0 ]
  74. then
  75. CONT=0
  76. # Only check online servers
  77. $PROXYSQL_CMDLINE "SELECT hostname, port FROM mysql_servers WHERE hostgroup_id = $HOSTGROUP_WRITER_ID AND status = 'ONLINE' order by hostname, port" | while read server port
  78. do
  79. if [ $CONT -ge $NUMBER_WRITERS ]
  80. then
  81. # Number of writers reached, disabling extra servers
  82. echo "`date` Number of writers reached, disabling extra write server $HOSTGROUP_WRITER_ID:$server:$port to status OFFLINE_SOFT" >> ${ERR_FILE}
  83. $PROXYSQL_CMDLINE "UPDATE mysql_servers set status = 'OFFLINE_SOFT' WHERE hostgroup_id = $HOSTGROUP_WRITER_ID AND hostname = '$server' AND port = $port;" 2>> ${ERR_FILE}
  84. fi
  85. CONT=$(( $CONT + 1 ))
  86. done
  87. fi
  88.  
  89. if [ $WRITER_IS_READER -eq 0 ]
  90. then
  91. # Writer is not a read node, but only if we have another read node online
  92. READER_NON_WRITER=$($PROXYSQL_CMDLINE "SELECT count(*) FROM mysql_servers ms1 LEFT JOIN mysql_servers ms2 ON ms1.hostname = ms2.hostname AND ms1.port = ms2.port AND ms1.hostgroup_id <> ms2.hostgroup_id WHERE ms1.hostgroup_id = $HOSTGROUP_READER_ID AND ms1.status = 'ONLINE' AND (ms2.hostgroup_id = $HOSTGROUP_WRITER_ID OR ms2.hostgroup_id IS NULL) AND (ms2.status = 'OFFLINE_SOFT' OR ms2.hostgroup_id IS NULL);" 2>>${ERR_FILE})
  93. if [ $READER_NON_WRITER -gt 0 ]
  94. then
  95. $PROXYSQL_CMDLINE "SELECT hostname, port FROM mysql_servers WHERE hostgroup_id = $HOSTGROUP_WRITER_ID AND status = 'ONLINE' order by hostname, port" | while read server port
  96. do
  97. echo "`date` Disabling read for write server $HOSTGROUP_READER_ID:$server:$port to status OFFLINE_SOFT" >> ${ERR_FILE}
  98. $PROXYSQL_CMDLINE "UPDATE mysql_servers set status = 'OFFLINE_SOFT' WHERE hostgroup_id = $HOSTGROUP_READER_ID AND hostname = '$server' AND port = $port;" 2>> ${ERR_FILE}
  99. done
  100. else
  101. echo "`date` Not enough read servers, we won't disable read in write servers" >> ${ERR_FILE}
  102. fi
  103. fi
  104.  
  105. echo "`date` Enabling config" >> ${ERR_FILE}
  106. $PROXYSQL_CMDLINE "LOAD MYSQL SERVERS TO RUNTIME;" 2>> ${ERR_FILE}
  107.  
  108. exit 0
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement