Reviers, le 9 décembre 2024

Le commitfest de novembre est en train de se terminer, et je me suis décidé à choisir une nouveauté intégrée à PostgreSQL sur ce commit fest…

Guillaume Lelarge

Le problème est souvent de choisir la nouveauté à mettre en avant. Pour une fois, je vais me faire plaisir et en choisir une que j’aurais aimé voir arriver beaucoup plus rapidement.

Sommes de contrôle

Les sommes de contrôle sur les fichiers de données ont été ajoutées en version 9.3. Si le DBA les active, ces sommes de contrôle permettent de détecter plus rapidement des corruptions silencieuses. À chaque écriture d’un bloc dans un fichier de données, PostgreSQL calcule une somme de contrôle pour ce bloc. Ce calcul a évidemment un coût en termes de performance, nous y reviendrons plus tard. Il n’y a aucun coût en terme de place disque, la place de la somme de contrôle étant réservée que les sommes soient activées ou non.

À chaque lecture d’un bloc dans un fichier de données, PostgreSQL vérifie que le bloc correspond bien à sa somme de contrôle. Si la vérification montre un problème, la requête tombe en erreur, un message explicatif est enregistré dans les fichiers de traces de PostgreSQL, et la vue système pg_stat_database voit sa colonne checksums incrémentée. Ainsi, une solution de supervision peut rapidement remonter une erreur de corruption aux administrateurs, qui peuvent alors obtenir plus de détails en consultant les fichiers de trace.

À l’époque, nous en parlions lors des audits, mais sans trop insister. L’activation des sommes de contrôle a un impact léger sur les CPU et plutôt fort sur les disques. En effet, cela génère plus de modifications dans les fichiers de données et, par conséquent, sur les journaux de transactions, comme le montrent des discussions en 2019 et un test de Tomas Vondra. De plus, les sommes de contrôle ne sont pas activées par défaut. Donc, les rapports d’audits se contentaient d’indiquer si les sommes de contrôle étaient activées ou non.

Plus tard, nous avons commencé à les recommander et à insister sur leur activation dès que l’application pouvait subir un arrêt assez long (mise à jour applicative complexe, changement de version majeure, etc). Leur activation nous semble actuellement plus intéressante que leur coût.

Le souci

Rapidement, notre souci principal avec les sommes de contrôle est devenu qu’elles ne sont pas utilisées parce qu’elles ne sont pas activées par défaut. Et les activer après création de la base implique de la réécrire intégralement, base arrêtée, ce qui est souvent trop long. C’était même impossible avant PostgreSQL 12.

Un changement intéressant à venir

Nous ne sommes a priori pas les seuls à avoir ce sentiment, et il se trouve que la version 18 va justement changer cela : les sommes de contrôle seront activées par défaut. Nous conservons néanmoins la possibilité de les désactiver si besoin. Un grand merci à Greg Sabino Mullane d’avoir relancé le sujet en août, écrit le patch et poussé à son intégration. Ça va vraiment faciliter la vie des utilisateurs (et des consultants :) ).

Le petit bémol revient à pg_upgrade. Ce dernier ne pourra pas transformer automatiquement une instance d’une ancienne version sans sommes de contrôle en instance de nouvelle version avec sommes de contrôle. Donc, si vous souhaitez utiliser pg_upgrade, il vous faudra avant tout arrêter l’instance de l’ancienne version et lancer pg_checksums --enable pour activer les sommes de contrôle, ce qui vous permettra ensuite d’utiliser pg_upgrade. Vous pouvez aussi utiliser l’ancienne méthode à base d’export et d’import des bases, ou la méthode plus récente à base de réplication logique. Pour plus d’informations sur les mises à jour majeures, n’hésitez pas à consulter notre support de formation « DBA1 - Administration PostgreSQL », voire à suivre cette formation !


DALIBO

DALIBO est le spécialiste français de PostgreSQL®. Nous proposons du support, de la formation et du conseil depuis 2005.