Slide 1

Slide 1 text

SQLite en production ? Et si vous réévaluiez vos options ?

Slide 2

Slide 2 text

Salutations

Slide 3

Slide 3 text

Bien le bonjour Guillaume Loulier aka Guikingone Développeur chez SensioLabs Apprécie surtout PHP et Rust, parfois Go A hésité à faire ce talk, l’a fini dans le train

Slide 4

Slide 4 text

Sommaire 01 - Flemmardise et lenteurs 02 - SQLite ? 03 - Vers la production et au-delà 04 - Et demain ? 01

Slide 5

Slide 5 text

“ Tout ce que nous entendons est une opinion et non un fait. Tout ce que nous voyons est une perspective et non la vérité.” Moment philosophie Marc Aurèle

Slide 6

Slide 6 text

Flemmardise et lenteurs

Slide 7

Slide 7 text

Schématisons Base de données Cache Application Worker Infrastructure Réseau

Slide 8

Slide 8 text

Climbing the ladder Infrastructure Application Worker Worker Base de données Cache Réseau Application

Slide 9

Slide 9 text

Nage synchronisée Infrastructure Application Worker Base de données Cache Réseau Application Worker Base de données Cache

Slide 10

Slide 10 text

Servermore ? Infrastructure Application Worker Réseau Base de données Cache Base de données Cache Application Worker Application Worker Application Worker

Slide 11

Slide 11 text

Oui mais tu veux en venir où ?

Slide 12

Slide 12 text

Soyons transparents Qui se soucie des règles d’Edgar F. Codd ? Au fond, une BDD n’est qu’un empilement de couches Quid des ressources ? De l’infrastructure ? La mise en réseau ? Sharding ? Plait-il ?

Slide 13

Slide 13 text

Servermore ? Infrastructure Réseau Application Worker DB Cache Application Worker DB Cache Application Worker DB Cache

Slide 14

Slide 14 text

SQLite ?

Slide 15

Slide 15 text

Rappel historique Projet lancé en août 2000 par Richard Hipp Conçu pour résoudre un problème logiciel introduit par IBM Concurrent de fopen et non d’Oracle / MySQL / etc (Ré)inventer la roue pour la rendre plus résiliente

Slide 16

Slide 16 text

La rolls-royce des DB ? Environ ~150K ligne de code (> 600K pour PostgreSQL, ~2M pour MySQL) Résistant à la charge (> 10 mds lecture / J) Besoin d’un cache ? D’un filesystem ? Portable entre architecture (32 / 64 bits)

Slide 17

Slide 17 text

Clair, simple, précis SQLite stocke les données via 5 types (Null, Integer, Real, Text, Blob) SQLite se veut flexible mais supporte les tables strictes (> 2021)

Slide 18

Slide 18 text

Vendez-moi ce stylo Avantages Inconvénients Rapide, léger, “serverless par conception” Complexe à mettre à l’échelle Supporte la majorité des specs SQL Quelques manquements / biais Aucun appel réseau Notion de cluster / réplication inexistante Très peu de dépendances système Extensibilité “complexe” (API en C) Peut gérer jusqu’à 281 terabytes Résilience “relative” Aucune configuration requise Liée à son langage / processus d’usage

Slide 19

Slide 19 text

Vers la production et au-delà

Slide 20

Slide 20 text

“ ACID ? Pourquoi s’en soucier ? J’ai un SRE”

Slide 21

Slide 21 text

Corrompre sans s’étaler SQLite stocke via un format de “page” de 4kb, chaque page contenant un B-Tree SQLite utilise une journalisation et / ou une approche WAL Mécanisme de lock natif pour éviter les conflits Une action a lieu ou n’a pas lieu

Slide 22

Slide 22 text

symfony_demo.sqlite symfony_demo.sqlite-journal Page I Page II Page III Headers N° de page Page III (copie) Checksum

Slide 23

Slide 23 text

“Moi, j’ai entendu dire que SQLite, c’était peu adapté aux environnement concurrentiels [...]” Dev, 16e siècle

Slide 24

Slide 24 text

L’attaque des logs Journalisation ? Non, Write Ahead Log Ecrire, vérifier, synchroniser, renvoyer Plus efficient en écriture / discutable en lecture Facilement récupérable en backup

Slide 25

Slide 25 text

La saison des salaisons symfony_demo.sqlite Page I Page II Page III Page III (modifiée) symfony_demo.sqlite-wal Headers Taille de page salt checksum

Slide 26

Slide 26 text

“Oui mais si le serveur tombe, la DB tombe avec, tu n’as pas de solution à cette situation ? Si ?”

Slide 27

Slide 27 text

Hold my bucket SQLite ne gère pas la corruption ou le backup de façon automatisée Et si “S3” était une solution ? Synchroniser en asynchrone

Slide 28

Slide 28 text

Schématisons Page I Page II Page III Litestream symfony_demo.sqlite s3://bucket.host:port/sf.db litestream replicate symfony_demo.sqlite s3://bucket.host:port/sf.db Fichier wal

Slide 29

Slide 29 text

Soyons honnêtes Une disponibilité au-delà de 99.99% est contreproductive et coûteuse S3 se dit disponible 99.99999999999% du temps, pour quel usage ? Vous ne contrôlerez jamais le chat / chien de votre client Visez 99.99% et adaptez-vous

Slide 30

Slide 30 text

Et demain ?

Slide 31

Slide 31 text

Vers l’infini et peut-être au-delà SQLite n’est pas une “silver-bullet” SQLite ne résoudra pas vos problèmes de performances SQL De par son approche, SQLite reste relativement fermé Le web évolue, SQLite devra évoluer

Slide 32

Slide 32 text

“Mais in fine, je me sers de SQLite quand ?”

Slide 33

Slide 33 text

Concluons Soyez pragmatiques, si votre application marche, laissez-là en l’état Commencez petit et montez en taille au besoin Microservices ? Edge computing ? Serverless ? Doctrine est votre ami

Slide 34

Slide 34 text

Des questions ?