Introduction
Dans la vie d’un moteur de réplication Replication Server, les partitions doivent parfois être déplacées.
2 méthodes sont disponibles pour déplacer des partitions :
- Dans la méthode officielle et qui utilise les commandes
add partition,create partitionetdrop partition, les noms logiques des partitions sont amenés à être modifiés et la suppression des anciennes partitions peut être en échec. - La seconde méthode non supportée permet de conserver les noms logiques mais implique une indisponibilité du moteur de réplication : la table
rs_diskpartitionsdans la base RSSD (Replication Server SystemDatabase) du moteur de réplication est mise à jour directement.
La structure de la table rs_diskpartitions est décrite dans cet article.
Le contexte du schéma de réplication de l’article est le suivant
et on se propose de déplacer les partitions du moteur de réplication
DAL_P1_REP du système de fichiers (filesystem)
/dal/sybase/DAL_P1_REP/stabledevices vers le système de fichiers
/DAL/sybase/DAL_P1_REP/stabledevices en utilisant la méthode de mise à jour
directe de la table rs_diskpartitions. Les partitions n’ont pas pour support
des raw devices.
Le déplacement des partitions en mettant à jour la table rs_diskpartitions
dans la base RSSD Adaptive Server Enterprise est disponible dans le guide
pratique Sybase Replication Server - §4 : Sybase Replication Server - Guide pratique, aide-mémoire
La table rs_diskpartitions dans la base RSSD (Replication Server System Database)
La table rs_diskpartitions dans la base RSSD d’un moteur de réplication
stocke les informations sur les partitions. La structure de la table
rs_diskpartitions est la suivante :
Les colonnes name et logical_name correspondent respectivement au chemin et
au nom logique d’une partition dans un moteur de réplication.
select id, name, logical_name from rs_diskpartitionsid name logical_name ------ ------------------------------------------------ --------------- 101 /dal/sybase/DAL_P1_REP/stabledevices/PART01.dat PART01 102 /dal/sybase/DAL_P1_REP/stabledevices/PART02.dat PART02
La table rs_diskpartitions comporte deux indexes uniques : un index unique
clustered sur le nom logique de la partition (logical_name) et un index unique
non clustered sur le chemin de la partition (name).
exec sp_helpindex rs_diskpartitionsindex_name index_keys index_description index_max_rows_per_page index_fillfactor ... ---------------------- ------------- -------------------- ----------------------- ---------------- ... rs_key_diskpartitions logical_name clustered, unique 0 0 ... rs_key1_diskpartitions name nonclustered, unique 0 0 ...
Déplacer des partitions
Déplacer des partitions avec les commandes add partition, create partition et drop partition
La méthode officielle supportée consiste à créer une nouvelle partition avec
les commandes add partition / create partition, puis à supprimer l’ancienne
partition.
Pour créer les nouvelles partitions sur le système de fichiers
/DAL/sybase/DAL_P1_REP/stabledevices :
| Replication Server 12.6 | Replication Server 15.0 |
|---|---|
|
|
Compte tenu de l’unicité de la colonne logical_name de la table
rs_diskpartitions, il est impossible de créer les partitions avec les noms
logiques PART01 et PART02 car celles-ci existent déjà. C’est pourquoi dans
l’exemple ci-dessus, le nom logique part01 en minuscules est donnée à la
partition PART01.dat créée sur le système de fichiers
/DAL/sybase/DAL_P1_REP/stabledevices.
Les fichiers doivent être initialisés dans /DAL/sybase/DAL_P1_REP/stabledevices
avec la commande touch avant de lancer les commandes add partition / create partition.
cd /DAL/sybase/DAL_P1_REP/stabledevices
touch PART01.dat
touch PART02.dat
Pour supprimer les anciennes partitions :
drop partition <partition_name>
drop partition PART01
go
drop partition PART02
go
La commande drop partition marque la partition avec le statut "en attente de
suppression" ou "pending drop". Une fois marquée, aucun nouveau segment n’est
créé sur cette partition. Lorsque toutes les données de la partition ont été
distribuées, la partition est supprimée.
En revanche, lorsqu’une partition contient un segment partiellement rempli,
la file ne peut pas être supprimée tant que le segment n’est pas rempli. Si la
partition a reçu le statut "pending drop", le segment ne pourra jamais être
rempli complètement et la commande de suppression de la partition est en échec.
Ce cas de figure est problématique et peut se présenter en environnement
transactionnel intensif.
Dans cette première méthode, dite méthode classique:
- les noms logiques des partitions doivent être modifiés afin de ne pas
violer la contrainte d’unicité sur la colonne
logical_namede la tablers_diskpartitions, ce qui peut être une contrainte si des normes de nomenclature des partitions sont en place et si la conservation de l’architecture initiale est souhaitée. - le temps de suppression des anciennes partitions n’est pas prédictible en
fonction de l’activité transactionnelle en cours et du nombre de segments
présents dans les partitions à supprimer (la commande
admin disk_spacedonne le nombre de segments dans une partition). Par ailleurs la commandedrop partitionpeut être en échec dans le contexte de segments remplis partiellement lors de la mise au statut "pending drop" d’une partition.
Déplacer des partitions en mettant à jour la table rs_diskpartitions
La seconde méthode permet de conserver les noms logiques des partitions et
est bien plus rapide et plus efficace. Cette méthode alternative consiste à
déplacer physiquement les partitions avec les commandes systèmes de l’OS (mv,
move, ufsdump, ufsrestore, snapshot zfs, etc.) et mettre à jour directement la
table rs_diskpartitions dans la base RSSD.
Seule contrainte : durant cette opération, le moteur de réplication est mis
en veille et éteint. Il y a indisponibilité du moteur de réplication mais le
temps de déplacement des partitions avec les commandes systèmes de l’OS sera
toujours plus court et moins risqué qu’avec les commandes add partition/create
partition - drop partition surtout si l’activité transactionnelle est forte
dans les partitions durant le déplacement à chaud.
Voici la procédure :
Étape 1. Le moteur de réplication est mis en veille (mode quiesced). Pour la
procédure de mise en veille d’un moteur de réplication, consulter
l’article Procédure de mise en veille (mode quiesced) de Sybase
Replication Server.
La mise en veille du moteur de réplication est vérifiée avec la
commande admin quiesce_check.
DAL_D1_REP> admin quiesce_check DAL_D1_REP> goReplication Server DAL_D1_REP is quiesced
Étape 2. Le moteur de réplication est éteint avec la commande shutdown.
DAL_D1_REP> shutdown
DAL_D1_REP> go
Étape 3. La table rs_diskpartitions est mise à jour directement pour spécifier
les nouveaux chemins des partitions :
DAL_P1_REP_RSSD> update rs_diskpartitions
set name='/DAL/sybase/DAL_P1_REP/stabledevices/PART01.dat'
where logical_name='PART01'
DAL_P1_REP_RSSD> go
DAL_P1_REP_RSSD> update rs_diskpartitions
set name='/DAL/sybase/DAL_P1_REP/stabledevices/PART02.dat'
where logical_name='PART02'
DAL_P1_REP_RSSD> go
DAL_P1_REP_RSSD> checkpoint
DAL_P1_REP_RSSD> go
Étape 4. Les partitions sont physiquement déplacées avec la commande mv. après
avoir vérifié qu’il n’y a plus aucun process sur les partitions avec la
commande fuser
%> cd /dal/sybase/DAL_P1_REP/stabledevices
%> fuser *.dat
PART01.dat:
PART02.dat:
%> mv /dal/sybase/DAL_P1_REP/stabledevices/PART01.dat /DAL/sybase/DAL_P1_REP/stabledevices
%> mv /dal/sybase/DAL_P1_REP/stabledevices/PART02.dat /DAL/sybase/DAL_P1_REP/stabledevices
Étape 5. Le serveur de réplication est redémarré et le mode veille est retiré.