DBMS/MySQL/DRBD
Introduction
DRBD est une technologie de Raid1 sur IP. C'est à dire que tous ce qui sera écrit sur la partition DRBD d'un noeud, le sera automatiquement sur sa partition jumelle sur l'autre noeud.
DRBD fonctionnant au niveau bloc, il faut un disque ou une partition dédiée à cela. Celle-ci n’a pas besoin (et ne doit pas) d’être formaté.
Depuis CentOS 6, les paquets DRBD ne sont plus dans les dépots de base, il faut donc ajouter ceux de atRPMS. Pour ce faire, ajouter le fichier atrpms.repo sous /etc/yum.repos.d contenant ceci :
[atrpms] name=CentOS $releasever - $basearch - ATrpms baseurl=http://dl.atrpms.net/el$releasever-$basearch/atrpms/stable gpgkey=http://atrpms.net/RPM-GPG-KEY.atrpms gpgcheck=1
Prérequis:
- Ouverture du firewall pour le port tcp:7789 pour le LAN. On part du principe que toute connexion déjà établie est autorisée.
-A RH-Firewall-1-INPUT -m state --state NEW -s 192.168.0.0/24 -d 192.168.0.0/24 -m tcp -p tcp --dport 7789 -j ACCEPT
- SELinux est désactivé
- Ajout des hôtes dans le fichier <path>/etc/hosts</path>
192.168.0.71 sql1-didier sql1-didier.b2pweb.com
192.168.0.72 sql2-didier sql2-didier.b2pweb.com
Schéma
Installation
Installation de drbd
On installe drbd ( utilitaires + module noyau ), puis on créer le volume logique qui accueillera notre partition drbd.
# yum install drbd drbd-kmdl-2.6.32-279.19.1.el6.x86_64
Fichier <path>/etc/drbd.conf</path>
#
# /etc/drbd.conf
#
include "drbd.d/global_common.conf";
include "drbd.d/*.res";
Fichier <path>/etc/drbd.d/global_common.conf</path>
global {
usage-count yes;
# minor-count dialog-refresh disable-ip-verification
}
common {
protocol C;
handlers {
pri-on-incon-degr "/usr/lib/drbd/notify-pri-on-incon-degr.sh; /usr/lib/drbd/notify-emergency-reboot.sh; echo b > /proc/sysrq-trigger ; reboot -f";
pri-lost-after-sb "/usr/lib/drbd/notify-pri-lost-after-sb.sh; /usr/lib/drbd/notify-emergency-reboot.sh; echo b > /proc/sysrq-trigger ; reboot -f";
local-io-error "/usr/lib/drbd/notify-io-error.sh; /usr/lib/drbd/notify-emergency-shutdown.sh; echo o > /proc/sysrq-trigger ; halt -f";
# fence-peer "/usr/lib/drbd/crm-fence-peer.sh";
# split-brain "/usr/lib/drbd/notify-split-brain.sh root";
# out-of-sync "/usr/lib/drbd/notify-out-of-sync.sh root";
# before-resync-target "/usr/lib/drbd/snapshot-resync-target-lvm.sh -p 15 -- -c 16k";
# after-resync-target /usr/lib/drbd/unsnapshot-resync-target-lvm.sh;
}
startup {
# wfc-timeout degr-wfc-timeout outdated-wfc-timeout wait-after-sb
}
disk {
# on-io-error fencing use-bmbv no-disk-barrier no-disk-flushes
# no-disk-drain no-md-flushes max-bio-bvecs
}
net {
# sndbuf-size rcvbuf-size timeout connect-int ping-int ping-timeout max-buffers
# max-epoch-size ko-count allow-two-primaries cram-hmac-alg shared-secret
# after-sb-0pri after-sb-1pri after-sb-2pri data-integrity-alg no-tcp-cork
}
syncer {
# rate after al-extents use-rle cpu-mask verify-alg csums-alg
}
}
Fichier <path>/etc/drbd.d/mysql.res</path>
resource mysql {
protocol C;
net {
cram-hmac-alg sha1;
shared-secret "FuCk_ThE;@@System!";
after-sb-0pri discard-older-primary;
after-sb-1pri call-pri-lost-after-sb;
after-sb-2pri call-pri-lost-after-sb;
}
disk {
# because partition is on a lvm system
no-disk-barrier;
}
startup {
wfc-timeout 120;
degr-wfc-timeout 120;
}
syncer {
rate 100M;
verify-alg "crc32c"; # Algorythm to tun "drbdadm verify"
}
on sql1-didier.b2pweb.com {
device /dev/drbd0;
disk /dev/vg0/lvmysql;
address 192.168.0.71:7789;
meta-disk internal;
}
on sql2-didier.b2pweb.com {
device /dev/drbd0;
disk /dev/vg0/lvmysql;
address 192.168.0.72:7789;
meta-disk internal;
}
}
On copie la configuration sur l'autre noeud
# scp /etc/drbd.conf sql2:/etc/ # scp /etc/drbd.d/* sql2:/etc/drbd.d/
Configuration de DRBD
Sur les deux noeuds, on créer la partition qui accueillera DRBD, ainsi que le point de montage ( sql1 + sql2 )
# lvcreate -n lvmysql -L 100G vg0
On exécute la commande suivante sur les deux noeuds ( sql1 + sql2 )
# drbdadm create-md mysql md_offset 107374178304 al_offset 107374145536 bm_offset 107370868736 Found some data ==> This might destroy existing data! <== Do you want to proceed? [need to type 'yes' to confirm] yes Writing meta data... initializing activity log NOT initialized bitmap New drbd meta data block successfully created. success
Démarrage du service drbd
On démarre le service drbd et on l'enlève à chkconfig sur les deux noeuds ( sql1 + sql2 )
# /etc/init.d/drbd start # chkconfig drbd off
On note que le service drbd démarre en secondaire. On va donc forcer le primaire ( sql1 ) à se répliquer sur le secondaire ( sql2 ) pour ce premier démarrage.
La commande suivante n'est à lancer que sur le primaire ( sql1 )
# drbdadm -- --overwrite-data-of-peer primary mysql
Maintenant on va attendre que les partitions soient synchronisées. Ce que l'on peut vérifier par la commande : cat /proc/drbd. Vu la taille de notre partition ( 100Go ), ce peut être un peu long ( voir beaucoup ).
Ici, le processus n'est pas terminé.
# cat /proc/drbd
version: 8.3.8 (api:88/proto:86-94)
GIT-hash: d78846e52224fd00562f7c225bcc25b2d422321d build by mockbuild@builder10.centos.org, 2010-06-04 08:04:09
0: cs:SyncSource ro:Primary/Secondary ds:UpToDate/Inconsistent C r----
ns:237568 nr:0 dw:0 dr:237568 al:0 bm:14 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:104616796
[>....................] sync'ed: 0.3% (102164/102396)M delay_probe: 44
finish: 2:39:28 speed: 10,816 (10,328) K/sec
Là, le processus est terminé
# cat /proc/drbd
version: 8.3.8 (api:88/proto:86-94)
GIT-hash: d78846e52224fd00562f7c225bcc25b2d422321d build by mockbuild@builder10.centos.org, 2010-06-04 08:04:09
0: cs:Connected ro:Primary/Secondary ds:UpToDate/UpToDate C r---n
ns:105395060 nr:0 dw:1780684 dr:103614448 al:849 bm:6400 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:0
On ajoute cette ligne au fichier /etc/fstab pour le montage de notre partition drbd. Celle-ci ne sera pas montée automatiquement au boot mais soit à la main, soit avec heartbeat/corosync. A rajouter sur les deux noeuds ( mail3 + mail 4 )
/dev/drbd0 /var/lib/mysql ext4 defaults,noauto 0 0
Installation de MySQL
Sur le serveur primaire ( sql1 ), avant l'installation de <package>MySQL-server</package>, on créer le répertoire <path>/var/lib/mysql</path>, ainsi qu'un système de fichier sur la partition drbd et et on monte la partition drbd
mkfs -t ext4 -L datadir /dev/drbd0 mkdir -p /var/lib/mysql mount /var/lib/mysql
Puis sur les deux serveurs, on installe
yum install mysql-server MySQL-conf-prod mysql-client mysql-shared
Sur le secondaire ( sql2 ), le répertoire <path>/var/lib/mysql</path> n'a aucune importance. On supprime son contenu et on supprime le démarrage automatique du service.
rm -rf /var/lib/mysql/* chkconfig off mysql
Il s'agit simplement que le système soit informé de l'installation et que tous fichier externe à <path>/var/lib/mysql</path> soit installé/modifié.
Sur le serveur primaire ( sql1 ) On supprime le démarrage automatique du service, on initialise les service et on le démarre.
chkconfig off mysql mysql_install_db mysql_secure_installation /etc/init.d/mysql start
Test failover manuel
En l'état le service est hautement disponible à la manivelle.
Voici la marche à suivre:
Sur le primaire ( qui va devenir secondaire )
- Arrêt du service MySQL
/etc/init.d/mysql stop
- Démontage de la partition
umount /var/lib/mysql
- Passage en secondaire de la partition drbd
drbdadm secondary mysql
Sur le secondaire ( qui va devenir primaire )
- Passage en primaire de la partition drbd
drbdadm primary mysql
- Montage de la partition
mount /var/lib/mysql
- Démarrage du service MySQL
/etc/init.d/mysql start