Le Journal des Admins Sys

tail -f /var/log/sysblog

Aller au contenu | Aller au menu | Aller à la recherche

2010-08-12

Authentification Linux Debian sur un Active Directory

Voici comment s'authentifier sur un serveur Linux Debian/Ubuntu, avec des comptes utilisateurs stockés sur un serveur Active Directory.

En premier lieu, il convient de bien saisir la différence entre l'identification et l'authentification.

  • L'identification permet simplement l'accès aux informations de l'utilisateur, et l'association entre son UID et son nom. Elle est utilisée par exemple pour afficher le nom de l'utilisateur à partir de l'UID dans la commande ls -l. L'identification est gérée par la libnss.
  • L'authentification permet d'autoriser ou non l'accès au service à l'utilisateur. Elle est gérée par PAM (Pluggable Authentication Modules).

Il est donc nécessaire d'installer 2 paquets : libnss-ldap pour l'identification, et libpam-krb5 pour l'authentification :

aptitude install libnss-ldap libpam-krb5

La configuration de l'identification se fait dans les fichier /etc/libnss-ldap.conf et etc/nsswitch.conf :

Voici un exemple de fichier /etc/libnss-ldap.conf :

base dc=company,dc=com
uri ldap://ad1.intranet ldap://ad2.intranet
referrals no
ldap_version 3
pam_password md5
pam_password md5
nss_base_passwd ou=Users,dc=company,dc=com?sub?objectClass=user
nss_base_group          dc=company,dc=com?sub?&(gidNumber=*)
nss_map_attribute uid msSFU30Name
nss_map_objectclass posixAccount user
nss_map_objectclass shadowAccount user
nss_map_attribute homeDirectory unixHomeDirectory
nss_map_attribute shadowLastChange pwdLastSet
nss_map_objectclass posixGroup group
nss_map_attribute uniqueMember member
pam_login_attribute sAMAccountName
pam_filter objectclass=User
nss_initgroups_ignoreusers avahi,avahi-autoipd,backup,bin,couchdb,daemon,games,gdm,gnats,haldaemon,hplip,irc,kernoops,libuuid,list,lp,mail,man,messagebus,mysql,news,proxy,pulse,root,saned,speech-dispatcher,sshd,statd,sync,sys,syslog,uucp,www-data

Attention : sous Ubuntu le fichier /etc/libnss-ldap.conf est en fait /etc/ldap.conf (voir /usr/share/doc/libnss-ldap/README.Debian).

Et il faut ajouter les mots "ldap" dans /etc/nsswitch.conf :

passwd:         compat ldap
group:          compat ldap

On peut maintenant tester l'identification par :

getent passwd USER

Pour l'authentification, tout se passe dans /etc/krb5.conf et les fichiers /etc/pam.d/common-* :

[libdefaults]
        default_realm = COMPANY.COM

[realms]
        COMPANY.COM = {
                kdc = ad1.intranet
                kdc = ad2.intranet
        }

[domain_realm]
        .intranet = COMPANY.COM

[login]
        krb4_convert = true
        krb4_get_tickets = false

Et pour la configuration PAM, il suffit de rajouter les ligne suivante en haut des fichiers common-auth, common-session, common-account et common-passwd :

auth  sufficient  pam_krb5.so minimum_uid=1000
session  optional  pam_krb5.so minimum_uid=1000
account  required  pam_krb5.so minimum_uid=1000
password  sufficient  pam_krb5.so minimum_uid=1000

(Comme expliqué dans /usr/share/doc/libpam-krb5/README.Debian.)

Voila, on peut maintenant tester l'authentification à l'aide de la commande login, ou en SSH. En cas de problème, aller voir dans le fichier /var/log/auth.log.

Pour aller plus loin, on pourra ajouter la création automatique du dossier de l'utilisateur en ajoutant la ligne suivante dans /etc/pam.d/common-session :

session  required  pam_mkhomedir.so

On peut aussi restreindre l'accès à une liste blanche d'utilisateurs uniquement dans /etc/pam.d/common-auth :

auth  required    pam_listfile.so onerr=fail item=user sense=allow file=/etc/loginusers

Voir aussi man pam_krb5, man pam_mkhomedir et man pam_listfile.

2010-03-22

Réécriture de liens sous apache avec mod_substitute

Voici comment utiliser le module apache mod_substitute pour modifier à la volée le contenu envoyé par apache.

Note : cette pratique n'est à utiliser qu'en dernier recours. Il est toujours mieux de faire les modifications à la source (dans le site) quand c'est possible.

À partir de Debian Lenny (Apache 2.2.7 et plus), mod_substitute est installé par défaut avec Apache :

a2enmod substitute
/etc/init.d/apache2 restart

Puis ajouter une configuration de ce genre dans votre virtualhost :

<Location />
        AddOutputFilterByType SUBSTITUTE text/html
        AddOutputFilterByType SUBSTITUTE text/css

        Substitute "s/Hello/Hello world/"
        Substitute "s| src=\"([^\"\?]*)\"| src=\"$1?refresh\"|"
        Substitute "s|link href=\"([^\"\?]*)\"|link href=\"$1?refresh\"|"
        Substitute "s|url\(([^(]*)\)|url($1?refresh)|"
</Location>

Ensuite, on teste la configuration puis on la charge dans Apache.

apache2ctl -S
/etc/init.d/apache2 reload

Maintenant il ne reste plus qu'à tester !

La configuration en exemple remplace bien sûr tous les "Hello" par des "Hello world", mais elle permet aussi de rajouter des "?refresh" à la fin des chemins d'accès aux images et autres éléments du site. Exemple : <img src="monimage.png" /> sera remplacé par <img src="monimage.png?refresh" />.

Cette réécriture permet de changer les URLs des images d'un site, et donc de forcer les navigateurs clients à recharger les contenus. Très utile en cas de mauvaise utilisation de mod_expires et des directives du type : ExpiresByType image/png "access plus 2 years".

Notes :

  • Il existe aussi un module Apache mod_proxy_html dédié aux modifications de contenu HTML, basé sur un parseur SAX. Je n'ai pas réussi à faire fonctionner correctement ce module avec notre site (suppression de l'en-tête DTD, problème de codage). Il faudrait peut-être pousser plus en avant les tests.
  • Attention à vos règles de remplacement : elles peuvent peut-être causer des effets de bord ailleurs dans le site.

Sous version d'Apache antérieure à la 2.2.7 (Debian Etch), vous pouvez utiliser mod_line_edit, avec une configuration telle que :

SetOutputFilter line-editor
SetEnv  LineEdit "text/html;text/css"

LERewriteRule "Hello" "Hello world"
LERewriteRule " src=\"([^\"\?]*)\"" " src=\"$1?refresh\"" R
LERewriteRule "link href=\"([^\"\?]*)\"" "link href=\"$1?refresh\"" R
LERewriteRule "url\(([^(]*)\)" "url($1?refresh)" R

Note : on peut compiler le module Apache à l'aide de la commande apxs2.

2010-03-12

[Xorg] Changement de bureau en ligne de commande

LA commande pour changer de bureau en ligne de commande : wmctrl (window manager controller).

aptitude install wmctrl
wmctrl -s 0
wmctrl -s 1

On peut aussi faire tourner les bureaux par un petit script :

#!/bin/sh

while true
do
        for D in 0 1 2 3
        do
                wmctrl -s $D
                sleep 1
        done
done

Utile pour un écran de surveillance !

Liens :

MAJ 26/03/2010 :

Si vous utilisez les effets visuels 3D, wmctrl -s ne fonctionne pas.

Il faut utiliser @wmctrl -o @ avec des coordonnées X,Y

Voir https://bugs.launchpad.net/ubuntu/+... et man wmctrl.

2010-01-07

[OpenVZ] environnement vzctl enter

Quand on fait vzctl enter depuis un parent OpenVZ pour accéder à une machine virtuelle enfant, on obtient un environnement incomplet (pas d'historique des commandes, mauvaise locale...).

Il faut faire su - pour récupérer un environnement cohérent :

parent:~# vzctl enter enfant
entered into VE 101
enfant:/# echo $LANG

enfant:/# su -
enfant:~# echo $LANG
en_US.UTF-8

Pour palier à ce problème, nous ajoutons les lignes suivantes au début du fichier /root/.bashrc dans l'enfant :

# si l'environement n'est pas bon (vzctl enter ?)
# on lance un shell de login
if [ "$LANG" = "" ]
then
        exec su -
fi

À noter que dans la mesure du possible, il est préférable d'accéder au serveur enfant par SSH, ce qui est plus cohérent d'un point de vue de la virtualisation (isolation parent/enfant). En SSH, il n'y a pas ce problème d'environnement.

2009-12-21

PSSH

PSSH (parallel SSH) permet d'exécuter une commande sur plusieurs serveurs en parallèle. L'exécution d'une commande sur une grappe de serveur est très rapide.

Un avantage de PSSH sur ses alternatives comme DSH est la manière simple d'enregistrer les résultats de l'exécution : toutes les sorties sont envoyées dans un dossier contenant un fichier de sortie par serveur.

Pour installer PSSH sous Debian Lenny :

aptitude install pssh

On crée ensuite notre grappe de serveurs dans un fichier simple, chaque ligne étant de la forme host:port user :

vi /tmp/hosts.txt
serveur1
serveur2
serveur3:222
serveur4 admin

Maintenant, on crée deux dossiers de sortie : un pour les sorties standard, un autre pour les sorties d'erreur.

mkdir /tmp/output
mkdir /tmp/error

Enfin, on lance la commande sur notre grappe de serveurs. Pour tester, on utilise la commande ls :

parallel-ssh -h /tmp/hosts.txt -o /tmp/output/ -e /tmp/error/ ls

PSSH vous permettra d'exécuter votre commande sur plusieurs centaine de serveurs en quelques dizaines de secondes !

Test d'exécution de la commande uptime sur 316 serveurs : 15.548s

Notes :

  • Attention aux commandes destructrices comme parallel-ssh -h /tmp/hosts.txt rm -rf / !!
  • Pour ceux qui ont leur clé privée SSH chiffrée, PSSH ne le gère pas encore : http://code.google.com/p/parallel-s...

Liens :

2009-11-25

[Linux] Bonding

Le bonding est une technique qui permet d'agréger deux ports réseaux d'un serveur sous Linux en un seul.

L'objectif poursuivi est d'obtenir la redondance au niveau des ports réseau du serveur lui-même, en utilisant idéalement deux cartes réseau différentes, et non pas deux ports de la même carte, mais surtout de pouvoir utiliser deux commutateurs distincts et se mettre à l'abri de la panne d'un commutateur.

Il est également possible d'utiliser le bonding pour augmenter le débit, puisqu'on utilise deux ports, mais dans ce cas, il faut que les liens soient connectés au même commutateur. Ce mode ne répond pas à la problématique de haute disponibilité.

Chez Cisco, on parle de Etherchannel. Sous OpenBSD, on appelle ces interfaces des trunks (attention à ne pas confondre avec les liens trunk entre switchs quand on utilise des VLANS).

L'objectif du bonding dans nos infrastructures est d'avoir une infrastructure entièrement redondante en composants réseaux : commutateurs, firewalls, cablages, etc.... Dans notre cas, le bonding fonctionne en mode actif/passif, un seul des ports étant actif à un moment donné.

Avoir une infrastructure réseau redondante assure une haute disponibilité de fonctionnement, mais surtout, permet de procéder à la maintenance des commutateurs sans coupure réseau.

Voici la procédure pour faire du bonding sur une Debian Lenny.

Installation et configuration

  • On installe les outils qui vont nous permettre d'attacher/détacher une interface au bonding :
~# aptitude install ifenslave
  • On modifie ensuite le fichier de configuration réseau :
lenny:~# cat /etc/network/interfaces
# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).

# The loopback network interface
auto lo
iface lo inet loopback

# The primary network interface
auto bond0
iface bond0 inet static
      slaves eth0 eth2
      bond_mode active-backup
      bond_miimon 100
      bond_downdelay 200
      bond_updelay 200
      address xxx.xxx.xxx.xxx
      netmask xxx.xxx.xxx.xxx
      network xxx.xxx.xxx.xxx
      gateway xxx.xxx.xxx.xxx

Toutes références aux interfaces attachées au bonding (ici eth0 et eth2) sont supprimées.

Pour les paramètres :

  • slaves permet d'attacher les interfaces spécifiées au bonding. Dans notre cas eth0 et eth1 sont sur la carte mère et eth2 et eth3 sont sur une carte d'extension.
  • bond_mode permet de déterminer le mode d'utilisation : dans notre cas, actif / passif, mais on peut choisir par exemple balance_rr pour faire de l'équilibrage de charge. Voir les options possibles sur le site kernel.org.
  • bond_miimon est le temps en ms passé entre deux monitoring
  • bond_downdelay correspond au temps en ms entre le moment où la carte réseau est détectée comme défaillante et celui où on la retire du bonding.
  • bond_updelay correspond au temps en ms entre le moment où la carte réseau qui était défaillante revient à la vie et celui où elle est remise dans le bonding.

Un redémarrage plus tard (des /etc/init.d/networking restart à distance sur ce genre de manipulations nous ont donné d'assez mauvais résultats ;)), l'interface bond0 doit être visible via un ifconfig.

Références

http://www.kernel.org/doc/Documentation/networking/bonding.txt

2009-11-20

[PGDay.eu 2009] Notes sur les conférences

Nous avons assisté à plusieurs conférences du PostgreSQL Day 2009. Voici quelques éléments clés que nous avons relevés.

PostgreSQL : The Next 20 Years

http://2009.pgday.eu/simon_riggs

  • Long-terme : Un SGBD multi-lingue, capable de parler plusieurs version de SQL (MySQL, Oracle, SQL Server...).
  • Le MVCC implémenté dans Oracle vient en grande partie du projet PostgreSQL (ce dernier étant sous la licence BSD, qui est très permissive).
  • Quand une entreprise externe est prête à payer pour une nouvelle fonctionnalité, le faire plus rapidement (2 ans c'est trop long).
  • Gratifier/Remercier tout le monde et pas seulement ceux qui ont écrit le code (ceux qui documentent, rapportent les bugs, écrivent les tests unitaires...)
  • Il y a très peu de bogues dans PostgreSQL : c'est un produit de qualité.
  • Beaucoup de super idées sont codées par des chercheurs dans leur coin (labos universités). Il faut essayer d'intégrer plus rapidement ces idées dans Postgres.
  • Évidemment : les Forks importants ne sont pas profitables au projet Postgres. Par contre, les petits forks comme POC (Proof of Concept) avec 95% de code en commun, et l'utilisation de git pour gérer ces branches, c'est bien !
  • Plus besoin de VACUUM (aspiration littéralement) à l'avenir.

Retour d'expérience migration Oracle vers PostgresSQL

http://2009.pgday.eu/vincent_moreau

  • Migration des ~400 magasins Leroy Merlin de Oracle vers PostgreSQL par ADEO.
  • Chaque magasin ayant un serveur central sous Postgres, et chaque caisse enregistreuse sous Postgres.
  • Raison économique : Oracle Standard Edition 4000 euros par installation + 22% 4000 euros tous les ans de support.
  • Objectif : Obtenir des performances identiques à Oracle
  • L'opération a consisté à migrer de Oracle9i vers Postgres 9.2
  • Pour la migration des données, utilisation de Ora2Pg, un outil écrit en Perl qui se connecte simultanément aux bases Oracle et Postgres.
  • Pour accélérer la transformation : Utilisation de COPY pour les grosses tables. Création des clés/indexes après l'import, fsync=off et achivage=off dans la config, commit intermédiaire toutes les 20 000 lignes. Suite à ces optimisations, la migration est passée de 4h à 1h30.
  • Dans la crontab : scripts de sauvegarde à chaud + vacuumdb + reindexdb.
  • Quelques problèmes rencontrés (certains indexes non recréés, quelques problématiques de syntaxe sql...), mais rien de bloquant
  • PgFouine pour détecter les requêtes consommatrices (rapport html).

Data warehousing with PostgreSQL

http://2009.pgday.eu/gabriele_bartolini

  • Data warehousing = gros entrepôt de données
  • Ce que PostgreSQL peut apporter.
  • Conception du modèle de données : il est important de garder un modèle de données simple.
  • Postgres permet de placer indexes et données sur des tablespaces différents.
  • Partitionnement horizontal de tables : plusieurs tables héritent d'une table maître avec une règle de partitionnement spécifique. Exemple : une sous-table par année. Mais on peut ensuite faire toutes les requêtes de manière transparente sur la table maître. On peut aussi placer les vieilles tables sur un tablespace moins rapide.
  • On utilise PLProxy pour la "scalabitité" et le "load balancing".
  • PostgreSQL fonctionne sans problème en production avec plusieurs Teras de données.

Utilisation de Postgresql chez HiMedia

http://2009.pgday.eu/dimitri_fontaine

  • Utilisation de Debian pour le système, Nagios pour les alertes et Munin pour le monitoring.
  • Les outils annexes sont très importants dans le monde Postgres. Il ne faut pas hésiter à contribuer !
  • Chez HiMedia, forte utilisation des skytools :
    • londiste pour la replication croisée (répartition de charge)
    • walmgr pour la reprise d'activité avec les journaux de transaction : serveurs esclaves en warm standby, non accessible en lecture mais prêt à prendre la relève en cas de failover
    • pgq pour les traitements par lots
    • pgbouncer : programme de pooling de connexion pour supprimer le temps de création d'une connexion à la base. pgbouncer maintient des connexions actives vers Postgres et ces connexions sont réutilisables. HiMedia utilise pgbouncer devant tous les Postgresql.
    • plproxy pour la distribution des données
  • Utilisation de pgfouine pour traquer les requêtes lentes.

Scaling PostgreSQL Under Fire

http://2009.pgday.eu/gavin_m_roy

  • Par le CTO de myYearBook.com, dans le top 5 des réseaux sociaux aux US.
  • Utilisation de pgBouncer, pgPool II, pl/Proxy.
  • Avantage énorme du partitionnement des tables : permet de sortir facilement les données anciennes ou plus utilisées de la base. (mieux qu'une table que l'on remplit indéfiniment).
  • Postgres est préféré à Mysql car : avec posgreSQL, pas besoin de memcache (ex FaceBook) et les données sans schéma ont un usage limité.
  • Postgres tire parti du cache disque du noyau Linux. Avant d'envoyer des connexions à un frontal, parcours de la base pour charger les données en mémoire, sinon le frontal tombe dès le début.
  • Tirer aussi parti des performances en lecture du RAID disque.
  • Pour accélerer la réindexation, ils n'utilisent pas de clés primaires, mais UNIQUE.
  • Le plugin Nagios check_postgres.pl pour le monitoring fait plein de choses. Il leur est TRÈS utile.
  • Utilisation de [Staplr pour le graphage des perfs de Postgres.
  • Pour le reste : Cacti, Posuta, pgFouine.
  • Et privilégier une configuration avec des CHECKPOINTS (flush/écritures sur le disque) en continu dans le temps, plutôt que des pics.

Performance Enhancements In PostgreSQL 8.4

http://2009.pgday.eu/magnus_hagander

  • Attention aux ORM (Hibernate...), c'est bien, mais pour améliorer les perfs faut mettre les mains dans le camboui.
  • Dans beaucoup de cas, on peut aussi laisser Postgres se débrouiller.
  • Possibilité de VACUUM (aspiration littéralement) partiels uniquement sur les données qui changent.
  • Optimisation de la mise à jour des statistiques (suggestion : stat_temp_file sur un tmpfs ?)
  • pg_restore multi-threaded
  • WITH RECURSIVE permet de faire des requêtes récursives pour récupérer par exemple une arborescence à partir d'une table (id, id_parent).
  • migration pg8.2 -> 8.4 : utiliser pg_dump8.4 pour dumper la base 8.2

The Future of PostgreSQL HA

http://2009.pgday.eu/robert_hodges_simon_riggs

  • Tungsten Replicator, en Java, gère MySQL et Postgres
  • Complexity is the #1 enemy of HA
  • Hot Standby pour le futur : moins de 0,1% de performances en moins que la replication WAL (Write Ahead Logs) actuelle.
  • Impact quasi-nul pour les performances du maître.
  • Esclave en lecture seule : conflits de requêtes possibles mais très rares. Réplication prioritaire : on tuera la requête.
  • Dans la future version : Réplication continue synchrone par streaming de logs
  • Alternatives HA à Postgres, revue de l'existant :
    • MySQL en réplication Master-Master avec une VIP.
    • Réplication semi-synchrone Google (avec MySQL ?) : COMMIT OK s'il s'est fait sur au moins un esclave (pas encore disponible en telechargement).
    • Oracle Flash Back : 1 snapshot toutes les heures, et possibilité d'exécuter un SELECT sur n'importe quel Snapshot. Très pratique si effacement accidentel d'une donnée précise.
    • Drizzle (fork MySQL) : Pluggable replication : replication modulaire à base d'un plugin.
  • Objectif : implémenter un Flash Back dans Postgres, à base de "zoned snapshots"

Welcome to WAL (dev conference)

http://2009.pgday.eu/heikki_linnakangas

  • Conférence technique sur l'implémentation des WAL dans Postgres
  • Dans postgres un fichier de log fait 16Mo, même s'il est plein juste à 1%.
  • Mais possibilité de ne conserver que la partie utile à l'aide de pglesslog ou clearxlogtail.
  • Très utile pour garder beaucoup de logs et faire du PITR.

Bacula et PostgreSQL, optimisation et retour d'expérience

http://2009.pgday.eu/marc_cousin_eric_bollengier

  • Parle de l'utilisation de Postgres comme SGBD pour Bacula
  • Bacula fait BEAUCOUP d'INSERTs vu que chaque fichier a son entrée dans la base.
  • Pour améliorer les perfs : INSERTS dans une table temporaire, puis COPY de cette table à la fin de la sauvegarde dans la table fichiers.
  • En production, utilisation d'un DRBD+Heartbeat pour stocker la base Postgres.
  • YouTube : faroult sql practice

Clustering : la nouvelle donne

http://2009.pgday.eu/stephane_giron_gilles_rayrat

  • Tungsten : solution de clustering maison, basée sur Java, drivers ODBC
  • Gère plusieurs SGBD : MySQL, PostgreSQL, Oracle

Indexation d'une base documentaire pour le quotidien Libération

http://2009.pgday.eu/gael_le_mignot

  • +500 000 articles à indexer, +1 000 000 commentaires en moins de 2 ans
  • Pour un besoin de recherches en backoffice uniquement (PHP).
  • Remplacement d'un serveur d'indexation M$ TextML, par PostgreSQL + SeSQL (Python)
  • Problème de performance pour chercher des articles avec un mot clé trop fréquent comme "gauche".
  • Du coup, pour gérer ce cas il utilise une heuristique qui recherche dans les 2500 derniers articles par exemple (sous requête dans le FROM).
  • Petites lacunes de l'indexation plein texte PostgreSQL : recherche de "france 2" avec les guillemets. Pour la recherche d'une expression entière, postgres fait une recherche avec france, une recherche avec 2, puis fait un LIKE "%france 2%". C'est pas terrible mais ça marche bien dans la majorité des cas.
  • Dans une question à la fin de la conférence, on apprend que la recherche "france 2" est aussi la plus lente chez un fournisseur de blog français très connu !
  • Dommage : pas de comparaison avec Solr+Lucene

PITR made easy

http://2009.pgday.eu/joshua_drake

  • Point In Time Recovery : permet à partir du système de sauvegarde de revenir à un instant T.
  • PITR Tools outils Python très pratique pour gérer la replication par WAL, surtout pratique quand on a plusieurs esclaves.
  • Aussi, envoie un mail quand l'envoi du fichier de log échoue.
  • send_nsca pour le monitoring Nagios de l'envoi des logs.

Liens

2009-11-10

[PostgreSQL] Replication par les archive logs

Prérequis

Tout d'abord, les utilisateurs postgres sur les serveurs maîtres et esclave doivent pouvoir se connecter en ssh dans les deux sens sans mot de passe :

postgres@master~$ ssh slave
postgres@slave~$ ssh master

Il faut aussi installer le paquet postgresql-contrib pour bénéficier de l'outil pg_standby :

master:~# aptitude install postgresql-contrib-8.3
slave:~# aptitude install postgresql-contrib-8.3

Activation des archives logs

On crée le dossier pour les logs sur le slave :

postgres@slave:~$ mkdir /var/lib/postgresql/archivelog/

On active les journaux de transactions. Un journal de transaction est envoyé par rsync vers le serveur esclave dès que le fichier de log est plein (16Mo), ou que le timeout est atteint (1 minute ici).

master:~# vi /etc/postgresql/8.3/main/postgresql.conf
archive_mode = on
archive_command = 'rsync -a %p slave:/var/lib/postgresql/archivelog/%f'
archive_timeout = 60
master:~# /etc/init.d/postgresql-8.3 restart

À ce point, on voit les journaux de transactions locaux, et les journaux archivé à distance :

postgres@master:~$ ls -ltr /var/lib/postgresql/8.3/main/pg_xlog/
postgres@slave:~$ ls -ltr /var/lib/postgresql/archivelog/

En cas de problème, observer le fichier /var/log/postgresql/postgresql-8.3-main.log (problème de rsync...)

Note : un CHECKPOINT est nécessaire pour que le fichier de log soit archivé (toutes les 5min par défaut). On peut le forcer à l'aide de la commande SQL éponyme.

Sauvegarde à chaud du maître

Sur le maître :

postgres@master:~$ psql
postgres=# SELECT pg_start_backup('label');

Sur l'esclave :

postgres@slave:~$ /etc/init.d/postgresql-8.3 stop
postgres@slave:~$ rsync -av --delete --exclude="recovery.conf" master:/var/lib/postgresql/8.3/main/ /var/lib/postgresql/8.3/main/
# on efface les fichiers de logs en gardant le dossier archive_status
postgres@slave:~$ rm -f /var/lib/postgresql/8.3/main/pg_xlog/*

Sur le maître :

postgres=# SELECT pg_stop_backup();

Lancement de la réplication

postgres@slave:~$ vi /var/lib/postgresql/8.3/main/recovery.conf
restore_command = '/usr/lib/postgresql/8.3/bin/pg_standby -d -t /tmp/stopstandby /var/lib/postgresql/archivelog %f %p %r >> /var/log/postgresql/pg_standby.log 2>&1'
postgres@slave:~$ /etc/init.d/postgresql-8.3 start

Maintenant, on peut observer l'injection des fichiers de logs :

postgres@slave:~$ tail -f /var/log/postgresql/pg_standby.log
postgres@slave:~$ less /var/log/postgresql/pg_standby.log
postgres@slave:~$ ps -edf | grep "waiting"
postgres  2908  2907  0 15:22 ?        00:00:00 postgres: startup process   waiting for 000000010000000000000040          

Arrêt de la réplication

Une fois la réplication lancée, toute connexion au serveur est impossible :

postgres@slave:~$ psql
psql: FATAL:  the database system is starting up

On peut casser la réplication en créant le fichier stopstandby :

postgres@slave:~$ touch /tmp/stopstandby

À ce point, pour faire repartir la réplication, il faut refaire une sauvegarde à chaud.

Références

Ouverture du blog des Admins Sys

Bonjour,

Nous ouvrons ce jour le blog des administrateurs système de Smile, dédié aux trucs et astuces systèmes.