Serveur MYSQL CLUSTER cluster

De wiki.nexiat.fr
Aller à la navigation Aller à la recherche
Fiche express
Type Script de démarrage SysV (/etc/init.d/cluster)
Rôle Démarre/arrête les 3 démons d'un nœud MySQL Cluster combiné
Démons gérés ndb_mgmd · ndbmtd · mysqld_safe
Fichiers liés config.ini · my.cnf
Voir aussi Sauvegarde · Restauration · Désinstallation · Mysql · Mariadb

MySQL Cluster (moteur de stockage NDB, Network DataBase) est une architecture de haute disponibilité pour MySQL reposant sur trois types de nœuds : le nœud de gestion (ndb_mgmd, orchestre le cluster et sert de point d'administration), les nœuds de données (ndbd en mono-thread ou ndbmtd en multi-thread, stockent les données en mémoire avec réplication synchrone) et les nœuds SQL (mysqld, exposent les données via le protocole MySQL classique).

Cette page documente le script d'administration utilisé sur une architecture à nœuds combinés : chaque serveur physique cumule les trois rôles (gestion + données + SQL) plutôt que de les répartir sur des machines dédiées — un choix de simplicité/coût plus que de performance pure, courant sur les clusters à 2 nœuds. Voir config.ini pour le détail de la topologie.

Architecture du cluster

Sur cette installation, le cluster est réduit à 2 nœuds symétriques (typiquement sql1 et sql2) qui hébergent chacun les trois rôles :

  • deux entrées [ndb_mgmd] (un nœud de gestion sur chaque serveur, pour éviter le point de défaillance unique) ;
  • deux entrées [ndbd] avec NoOfReplicas=2 (chaque nœud de données porte une réplique complète des données) ;
  • plusieurs entrées [mysqld] (les nœuds SQL nommés, plus des emplacements libres pour des connexions API supplémentaires).

Le détail des paramètres est dans config.ini (lu par ndb_mgmd) et my.cnf (lu par mysqld).

Script de démarrage/arrêt

Script SysV classique (chkconfig, RHEL/CentOS 5-6) installé en /etc/init.d/cluster ; sur des distributions plus récentes (systemd), l'équivalent serait une unité .service dédiée par démon plutôt qu'un script unique orchestrant les trois (à vérifier selon la distribution cible).

#!/bin/bash
#
#       /etc/rc.d/init.d/cluster
#
# chkconfig: 345 90 10
# description: Launching script for 3 in 1 Mysql cluster node
#
# processname: ndb_mgmd
# processname: ndbmtd
# processname: mysqld_safe &
#
# config: /usr/local/mysql-cluster/config.ini
# config: /etc/my.cnf

clusterdaemons="ndb_mgmd ndbmtd mysqld_safe"
initdir=/etc/init.d
LOCKFILE=/var/lock/subsys/cluster

# Check that networking is up.
if [ ! -f /etc/sysconfig/network ]; then
    echo "No Network"
    exit 1
fi

. /etc/sysconfig/network

[ "${NETWORKING}" = "no" ] && exit 1

# Source function library
if [ -r $initdir/functions ]; then
	. $initdir/functions
fi

# Check that all daemons exists
if ! which $clusterdaemons >/dev/null 2>&1
then
	echo_failure
	echo "One or more of { $clusterdaemons } missing"
	exit 1
fi

function start() {

	local RETVAL=1

	if [ -f $LOCKFILE ]; then
		echo "Already running or lockfile not deleted."
		echo "Try \"stop\" or \"restart\""
		return 1
	fi

	for prog in $clusterdaemons ; do

		if ps ax | grep $prog | grep -vq "grep"
		then
			echo_failure
			echo "$prog already launched"
		else
			echo -n $"Starting $prog: "
			if [ $prog = "mysqld_safe" ]; then
				$prog >/dev/null &
				RETVAL=$?
			else
				# si --initial : la sortie du démon reste affichée
				if [ -n "$1" ] && [ $1 = "--initial" ]; then
					$prog $1
				else
					$prog >/dev/null
				fi

				RETVAL=$?
			fi

			if [ $RETVAL -eq 0 ] ; then
			        success "$prog startup"
				echo
        		else
			        failure "$prog startup"
				echo
				break
        		fi

		fi
	done

	[ $RETVAL -eq 0 ] && touch $LOCKFILE
	return $RETVAL
}

function stop() {

	for prog in $clusterdaemons ; do

		echo -n $"Stopping $prog: "

		# Exception : le signal doit être envoyé à mysqld, pas au wrapper mysqld_safe
		[ $prog = "mysqld_safe" ] && prog="mysqld"

		count=0
		while [ -n "`pidof $prog`" -a $count -lt 15 ] ; do
			killproc $prog -TERM >& /dev/null
			RETVAL=$?
			[ $RETVAL = 0 -a -z "`pidof $prog`" ] || sleep 3
			count=`expr $count + 1`
		done

		if [ -n "`pidof $prog`" ] ; then
			failure "$prog shutdown"
		else
			success "$prog shutdown"
		fi
		echo

	done

	[ $RETVAL -eq 0 ] && rm -f $LOCKFILE
	return $RETVAL
}

function cluster_status() {
	ndb_mgm  -t1 -e show
	for prog in $clusterdaemons ; do
		status $prog
		[ $prog = "mysqld_safe" ] && status mysqld
	done
}

RETVAL=0

case "$1" in
	start)
		start
		;;
	stop)
		stop
		;;
	status)
		cluster_status
		;;
	restart)
		stop
		start
		;;
	reload)
		stop
		start --initial
		;;
	condrestart)
		[ -f $LOCKFILE ] && restart || :
		;;
	initialstart)
		start --initial
		;;
	*)
		echo $"Usage: $0 {start|stop|status|restart|reload|condrestart|initialstart}"
		exit 1;
		;;
esac

exit $?

Actions disponibles

  • start — démarre les trois démons dans l'ordre (gestion, données, SQL).
  • stop — arrête les trois démons (envoie TERM, jusqu'à 15 tentatives espacées de 3s).
  • status — affiche l'état du cluster via ndb_mgm -e show puis le statut de chaque démon local.
  • restartstop puis start normal.
  • reloadstop puis start --initial. Attention : l'option --initial d'un nœud de données NDB efface son système de fichiers local (redo log, checkpoints) et force une resynchronisation complète depuis l'autre nœud — une commande potentiellement longue et impactante, à ne jamais utiliser par réflexe sur un reload de routine (à vérifier : ce comportement sur reload semble risqué, le script original ne le documente pas).
  • condrestart — redémarre seulement si le lockfile existe (déjà démarré).
  • initialstart — premier démarrage du cluster (initialise les nœuds de données).

Voir aussi