Frappe Framework
Migrations sans interruption de service
Le site reste consultable pendant la migration. Les écritures sont bloquées jusqu’à la fin de la maintenance, via un réplica ou des transactions en lecture seule.
À quoi sert ce mode
Les migrations à interruption quasi nulle (Zero downtime migrations) laissent le site en lecture seule pendant la mise à jour. Le site statique et les pages dynamiques qui ne font que lire continuent de répondre. Toute action qui écrit en base est désactivée, et reprend quand la mise à jour est finie.
Comment la lecture seule est obtenue
Deux moyens :
- des réplicas de lecture ;
- les transactions en lecture seule fournies par la base.
Dans les deux cas, les écritures restent coupées tant que le mode maintenance n’est pas levé. Les pages web et le bureau affichent un avertissement persistant. Tous les formulaires passent en lecture seule.
Le réplica se prépare comme indiqué dans Lectures depuis une base secondaire.
Activer pendant les mises à jour
- Facultatif : préparer un réplica de lecture.
- Dans la configuration du site :
bench --site develop set-config allow_reads_during_maintenance 1.
L’exemple utilise le site develop.
Côté application
Toutes les applications ne prennent pas ce mode en charge. Elles peuvent se comporter de façon erratique si elles n’ont pas été prévues pour la lecture seule. Pendant la mise à jour du schéma, l’application côté client est aussi mise à jour : quelques à-coups restent possibles. Le but est de réduire l’effet de l’arrêt, pas de l’effacer.
Côté serveur, frappe.flags.read_only permet de sauter ou d’adapter un comportement. L’exemple de journal de visite retourne immédiatement si le drapeau est vrai, et n’insère pas le document.
Côté Jinja, le contexte du site contient read_only_mode. On s’en sert pour un avertissement ou pour masquer une action d’écriture.
Point d’attention
allow_reads_during_maintenance se pose sur le site. Sans prise en charge dans l’application, le drapeau frappe.flags.read_only ne protège pas tout seul les écritures que le code lancerait encore.
