Différences entre les versions de « Kvm Cluster & Lvm & Drdb »

De BlaxWiki
Aller à la navigationAller à la recherche
Ligne 15 : Ligne 15 :


==== /etc/hosts ====
==== /etc/hosts ====
'''Attention : il est très important sur la ligne avec l'ip qui sert au cluster 10.250.250.17|18 d'avoir en premier le nom du "clusternode name" présent dans cluster.conf (ici kvm1_node.ecomobilier.fr), sinon lorsque l'on va lancer cman,il va dire qu'il ne trouve pas le serveur'''
'''Attention : il est très important sur la ligne avec l'ip qui sert au cluster 10.250.250.17|18 d'avoir en premier le nom du "clusternode name" présent dans cluster.conf (ici kvm1_node.ecomobilier.fr), sinon lorsque l'on va lancer cman, on va avoir le message "Starting cman... Cannot find node name in cluster.conf, Unable to get the configuration,Cannot
find node name in cluster.conf'''
<pre>
<pre>
# kvm1
# kvm1
Ligne 259 : Ligne 260 :
exec /usr/libexec/qemu-kvm `echo "$@" | sed 's|virtio-net-pci|virtio-net-pci,tx=timer|g'`
exec /usr/libexec/qemu-kvm `echo "$@" | sed 's|virtio-net-pci|virtio-net-pci,tx=timer|g'`
</pre>
</pre>
=== Services au démarrage ===
Les services dédiés au cluster doivent être configuré dans le chkconfig pour ne pas booter au démarrage. C'est un protection afin d'éviter de planter le cluster en cas de problème de
synchro sur le DRBD lors d'un reboot. Si la synchro DRBD est cassé et que le cluster se lance, il y a des locks qui sont créés et il est impossible de rebooter la machine (en dehors
d'un reboot hard électrique).
<pre>
chkconfig cman off
chkconfig clvmd off
chkconfig rgmanager off
chkconfig ricci off
chkconfig corosync off
</pre>
Les services suivant doivent tourner :
<pre>
cman
messagebus
clvmd
libvirtd
libvirt-guests
rgmanager
ricci
fenced
dlm_controld
corosync
</pre>


Afin de ne pas avoir de problème de resynchro, il faut créer autant de partition (pour stocker les vm) qu'il y a de noeuds dans le cluster. Ces partitions seront bien sur de tailles
Afin de ne pas avoir de problème de resynchro, il faut créer autant de partition (pour stocker les vm) qu'il y a de noeuds dans le cluster. Ces partitions seront bien sur de tailles

Version du 17 décembre 2012 à 19:17

KVM est l'hyperviseur libre supporté par RedHat. Il est extrêmement simple et facile d'utilisation. Par rapport à Xen, il n'oblige pas de faire tourner un kernel linux spécifique et se présente sous la forme de modules kernel. Chaque VM est vu comme un process lambda sur l'hyperviseur et un "ps" permet de voir les VM qui tournent. Par défaut, il n'existe pas de commande equivalente au "xm" de Xen. Afin d'agir sur les VM KVM, il faut passer par libvirtd qui est un daemon d'abstraction multi-hyperviseur.

Présentation

Voilà les informations niveau serveur / ip / volume de ce tutorial

 - 2 serveurs : kvm1.ecomobilier.fr & kvm2.ecomobilier.fr
 - 2 interfaces en aggrégation avec 2 ip sur le bonding (une par volume)
 - Ip kvm1 : 10.250.250.17 & 10.250.250.19
 - Ip kvm2 : 10.250.250.18 & 10.250.250.20
 - On va avoir 2 volumes drdb
 - les vm seront créées sur des LV

/etc/hosts

Attention : il est très important sur la ligne avec l'ip qui sert au cluster 10.250.250.17|18 d'avoir en premier le nom du "clusternode name" présent dans cluster.conf (ici kvm1_node.ecomobilier.fr), sinon lorsque l'on va lancer cman, on va avoir le message "Starting cman... Cannot find node name in cluster.conf, Unable to get the configuration,Cannot

find node name in cluster.conf
# kvm1
127.0.0.1       kvm1.ecomobilier.fr kvm1 localhost localhost.localdomain
192.168.77.241  kvm1.ecomobilier.fr kvm1 (ip d'admin)
192.168.77.242  kvm2.ecomobilier.fr kvm2 (ip d'admin)
10.250.250.17   kvm1_node.ecomobilier.fr kvm1_node
10.250.250.18   kvm2_node.ecomobilier.fr kvm2_node

# kvm2
127.0.0.1       kvm2.ecomobilier.fr kvm2 localhost localhost.localdomain
192.168.77.242  kvm2.ecomobilier.fr kvm2
192.168.77.241  kvm1.ecomobilier.fr kvm1
10.250.250.17   kvm1_node.ecomobilier.fr kvm1_node
10.250.250.18   kvm2_node.ecomobilier.fr kvm2_node


Installation

Kvm

Kvm est souvent par défaut sur les distributions. Les services suivant doivent être lancés pour que kvm fonctionne : messagebus, libvirtd, libvirt-guests

Cluster

Voilà les packages à installer pour la partie cluster : openais cman rgmanager lvm2-cluster gfs2-utils cluster-cim

Drbd

On peut l'installer via les packages, mais il est préférable d'installer la dernière version via les sources :
# cd /root/install/
# cd drbd-8.4.1/
# ./configure
# make rpm
# make km-rpm 
# cd /root/rpmbuild/RPMS/x86_64/
# rpm -Uvh ./drdb*

Configuration

drbd.conf

global {
        usage-count no;
        # minor-count dialog-refresh disable-ip-verification
}

common {
       protocol C;

       startup {
               wfc-timeout 300;
               degr-wfc-timeout 10;
               become-primary-on both;
       }

       disk {
               on-io-error detach;
               fencing dont-care;
       }

       syncer {
               rate 110M;
       }

       net {
               timeout 50;
               connect-int 20;
               ping-int 30;
               allow-two-primaries;
               after-sb-0pri discard-zero-changes;
               after-sb-1pri discard-secondary;
               after-sb-2pri disconnect;

       }
}

resource drbd0 {
       on kvm1.ecomobilier.fr {
               disk /dev/sdb1;
               device /dev/drbd0;
               meta-disk internal;
               address 10.250.250.17:7788;
       }
       on kvm2.ecomobilier.fr {
               disk /dev/sdb1;
               device /dev/drbd0;
               meta-disk internal;
               address 10.250.250.18:7788;
       }
       syncer {
               rate 110M;
       }

}

resource drbd1 {
       on kvm1.ecomobilier.fr {
               disk /dev/sdb2;
               device /dev/drbd1;
               meta-disk internal;
               address 10.250.250.19:7788;
       }
       on kvm2.ecomobilier.fr {
               disk /dev/sdb2;
               device /dev/drbd1;
               meta-disk internal;
               address 10.250.250.20:7788;
       }
       syncer {
               rate 110M;
       }

}

Initialisation et creation des drbd

Créer bien sur dans un premier temps 2 partitions sur un disque physique différent du disque system. Ces 2 partitions seront exactement les mêmes sur les 2 serveurs (les 2 partitions peuvent ne pas avoir la même taille, mais la partition1 de kvm1 aura la meme taille que la partion1 de kvm2, et pareil pour la partition 2)

* Sur chaque node et pour chaque device (synchronisation initiale des volumes DRBD)
# /etc/init.d/drbd start (si il n est pas démarré)
# drbdadm down drbd0
# drbdadm create-md drbd0
# drbdadm up drbd0 (doit être en  cs:Connected ro:Secondary/Secondary ds:Inconsistent/Inconsistent C r-----)

* Sur un des noeud et pour chaque device
# drbdadm -- --overwrite-data-of-peer primary drbd0

* Mettre en place la configuration drbd.conf sur chaque node, et démarrer les services cman & clvmd

* Sur le noeud qui est en secondary (faire un cat /proc/drbd)
#drbdadm primary drbd0
#drbdadm primary drbd1

Le cat /proc/drbd doit remonter en primary/primary

* Sur un node et pour chaque device (création des PV LVM)
#pvcreate /dev/drbd0
#pvcreate /dev/drbd1

* Sur un des 2 nodes
#vgcreate -cy vol_kvm1 /dev/drbd0 (le -cy s'est pour cluster=yes)
#vgcreate -cy vol_kvm2 /dev/drbd1

Intégration des nodes

# Sur les 2 noeuds : 
1/ modif lvm.conf :
    locking_type = 3
    fallback_to_clustered_locking = 0

cluster.conf

<?xml version="1.0"?>
<cluster config_version="15" name="ecomobolier001">
        <clusternodes>
                <clusternode name="kvm1_node.ecomobilier.fr" nodeid="1" votes="1">
                        <fence>
                                <method name="1">
                                        <device name="fence_fake" nodename="kvm1_node.ecomobilier.fr"/>
                                </method>
                        </fence>
                </clusternode>
                <clusternode name="kvm2_node.ecomobilier.fr" nodeid="2" votes="1">
                        <fence>
                                <method name="1">
                                        <device name="fence_fake" nodename="kvm2_node.ecomobilier.fr"/>
                                </method>
                        </fence>
                </clusternode>
        </clusternodes>
        <cman expected_votes="1" two_node="1"/>
        <fencedevices>
                <fencedevice agent="fence_fake" name="fence_fake"/>
        </fencedevices>
        <rm>
                <failoverdomains>
                        <failoverdomain name="kvm_node01" nofailback="0" ordered="1" restricted="0">
                                <failoverdomainnode name="kvm1_node.ecomobilier.fr" priority="1"/>
                                <failoverdomainnode name="kvm2_node.ecomobilier.fr" priority="2"/>
                        </failoverdomain>
                        <failoverdomain name="kvm_node02" nofailback="0" ordered="1" restricted="0">
                                <failoverdomainnode name="kvm2_node.ecomobilier.fr" priority="1"/>
                                <failoverdomainnode name="kvm1_node.ecomobilier.fr" priority="2"/>
                        </failoverdomain>
                </failoverdomains>
                <resources/>

<!-- Exemple pour l'intégration des vm
<vm autostart="1" domain="kvm_node01" exclusive="0" hypervisor="qemu" migrate="live" name="vitrine-www1.ecomobilier.fr" path="/etc/libvirt/qemu/" recovery="relocate" use_virsh="1"/>
<vm autostart="1" domain="kvm_node02" exclusive="0" hypervisor="qemu" migrate="live" name="simm-recette1.ecomobilier.fr" path="/etc/libvirt/qemu/" recovery="relocate" use_virsh="1"/>
-->
        </rm>
</cluster>

/usr/sbin/fence_fake

#vim /usr/sbin/fence_fake

#!/bin/sh
echo "success: fence_fake $1"
exit 0

chmod +x /usr/sbin/fence_fake 

Clés ssh

Pour que les vm puisse migrer entre les 2 serveurs, il faut que les données puissent se copier en ssh

# sur KVM2
ssh-keygen
ssh-copy-id kvm1_node.ecomobilier.fr
ssh kvm1_node.ecomobilier.fr

# sur KVM1
ssh-keygen
ssh-copy-id kvm2_node.ecomobilier.fr
ssh kvm2_node.ecomobilier.fr

Ricci

Le script d'init code en dur le chemin vers openssl. Le lien symbolique évite de péter le script en cas d'upgrade du rpm
# ln -s /opt/applis/openssl/bin/openssl /usr/bin/openssl
# service ricci start
Mettez enfin un passwd au user ricci automatiquement créé (identique sur les 2 serveurs) 

Hack qemu-kvm

Dans certaines versions de qemu, il y'avait des problèmes de perfs des cartes réseaux

/usr/libexec/qemu-kvm.txtimer

#!/bin/sh
exec /usr/libexec/qemu-kvm `echo "$@" | sed 's|virtio-net-pci|virtio-net-pci,tx=timer|g'`

Services au démarrage

Les services dédiés au cluster doivent être configuré dans le chkconfig pour ne pas booter au démarrage. C'est un protection afin d'éviter de planter le cluster en cas de problème de synchro sur le DRBD lors d'un reboot. Si la synchro DRBD est cassé et que le cluster se lance, il y a des locks qui sont créés et il est impossible de rebooter la machine (en dehors d'un reboot hard électrique).

chkconfig cman off
chkconfig clvmd off
chkconfig rgmanager off
chkconfig ricci off
chkconfig corosync off


Les services suivant doivent tourner :

cman
messagebus
clvmd
libvirtd
libvirt-guests
rgmanager
ricci
fenced
dlm_controld
corosync


Afin de ne pas avoir de problème de resynchro, il faut créer autant de partition (pour stocker les vm) qu'il y a de noeuds dans le cluster. Ces partitions seront bien sur de tailles égales sur les différents noeuds