evoadmin-web/scripts/install-replication.sh

101 lines
2.8 KiB
Bash
Executable File

#!/bin/sh
# Script to install MySQL and lsync replication on master and slave host.
# It's part of Evocluster project.
set -e
LOGFILE=~/log/evocluster.log
error() {
echo -n "$(date +"%b %d %T") " >>$LOGFILE
echo "ERROR: $1" |tee -a $LOGFILE >&2
}
info() {
echo -n "$(date +"%b %d %T") " >>$LOGFILE
echo "INFO: $1" |tee -a $LOGFILE
}
if [ $# -ne 1 ] && ([ $1 != 'master' ] || [ $1 != 'slave']); then
error 'You must specify one argument: master or slave'
exit 2
fi
if [ $1 = 'master' ]; then
# **
# Warning: script supposes the database to configure is empty and stay
# empty during all the configuration process.
# **
# Change MySQL configuration
sed -i 's/^bind-address\t.*$/#&/' /etc/mysql/my.cnf
sed -i 's/^#\(server-id\t.*\)$/\1/' /etc/mysql/my.cnf
sed -i 's/^#\(log_bin\t.*\)$/\1/' /etc/mysql/my.cnf
/etc/init.d/mysql restart # a voir...
# Create repl user if it doesn't exist
pass=$(apg -c /dev/urandom -n1 -E \&\\\/\"\')
if [ -z "$(mysql -e "SELECT user FROM mysql.user WHERE user='repl'")" ]
then
mysql -e "GRANT REPLICATION SLAVE ON *.* to repl@'%' IDENTIFIED BY
'$pass'"
fi
# lsyncd daemon
(crontab -l; echo "@reboot lsyncd ~/www slave:www") |crontab -
# TODO: Monitoring lsyncd a mettre en place
MASTER_LOG_FILE=$(mysql -Ne "SHOW MASTER STATUS" |cut -f 1)
MASTER_LOG_POS=$(mysql -Ne "SHOW MASTER STATUS" |cut -f 2)
if [ -z $MASTER_LOG_FILE ] || [ -z $MASTER_LOG_POS ]; then
error 'MASTER_LOG_FILE or MASTER_LOG_POS are not set, bin-log seem not
working correctly.'
fi
# Return some MySQL information
# (required to configure slave)
echo "MASTER_PASSWORD=$pass"
echo "MASTER_LOG_FILE=$MASTER_LOG_FILE"
echo "MASTER_LOG_POS=$MASTER_LOG_POS"
else
# Source stding
# doesn't POSIX compatible :'(
#. <(grep -E '^MASTER_(HOST|DATABASE|PASSWORD|LOG_FILE|LOG_POS)=')
tmpfile=$(mktemp)
grep -E '^MASTER_(HOST|DATABASE|PASSWORD|LOG_FILE|LOG_POS)=' >$tmpfile
. $tmpfile
rm $tmpfile
# Change MySQL configuration
sed -i 's/^#(server-id\t.*)\d$/\12/' /etc/mysql/my.cnf
if grep -q '^replicate-do-db' /etc/mysql/my.cnf; then
sed -i "/^replicate-do-db\t.*/&, $MASTER_DATABASE"
else
sed -i "/^#binlog_ignore_db/a replicate-do-db = $MASTER_DATABASE"
fi
/etc/init.d/mysql restart # a voir...
# Start replication
mysql -e "CHANGE MASTER TO
MASTER_HOST='$MASTER_HOST',
MASTER_USER='repl',
MASTER_PASSWORD='$MASTER_PASSWORD',
MASTER_LOG_FILE='$MASTER_LOG_FILE',
MASTER_LOG_POS=$MASTER_LOG_FILE"
mysql -e "START SLAVE"
sleep 2
mysql -Ne "SHOW SLAVE STATUS"
# TODO: Add nagios check
# info a retourner :
# - show slave status pour etre sur que la replication a demarre
fi