ЁЯУ╝ рдзрдбрд╛ 15 тАФ Engine рдЪреНрдпрд╛ рдЖрдд: рдЖрдзреА log
ЁЯУН рддреБрдореНрд╣реА рдЗрдереЗ рдЖрд╣рд╛рдд: 18 рдкреИрдХреА рдзрдбрд╛ 15 ┬╖ рдорд╛рдЧреАрд▓: lesson-14-advanced-sql ┬╖ рдкреБрдвреАрд▓: lesson-16-replication-failover
рднрд╛рдЧ 3 тАФ рдЕрдзрд┐рдХ рдЦреЛрд▓рд╛рдд. рдзрдбреЗ 01тАУ12 рдиреА рд░реЗрдХреЙрд░реНрдб рд░реВрдо рдмрд╛рдВрдзрд▓реА рдЖрдгрд┐ рдЪрд╛рд▓рд╡рд▓реА. рдзрдбреЗ 13тАУ18 рд╣реЗ interviews рдЖрдгрд┐ incidents рдордзреНрдпреЗ рд╡рд┐рдЪрд╛рд░рд▓реЗ рдЬрд╛рдгрд╛рд░реЗ рд╡рд┐рд╖рдп рдЖрд╣реЗрдд тАФ рдкреНрд░рддреНрдпреЗрдХ рддреНрдпрд╛рдЪ
school.dbрд╡рд░ рдкреНрд░рддреНрдпрдХреНрд╖ рдЪрд╛рд▓рддреЛ.
ЁЯУж рдпрд╛ рдмреНрд░рдБрдЪрдордзреНрдпреЗ рдХрд╛рдп рдЖрд╣реЗ
рдзрдбреЗ 01тАУ15, рдЖрдгрд┐ db/demo.py рдордзрд▓реЗ wal(): рддреЗ school.db рд▓рд╛
WAL mode рдордзреНрдпреЗ рдиреЗрддреЗ, reader transaction рдЪреНрдпрд╛ рдордзреНрдпрд╛рдд рдЕрд╕рддрд╛рдирд╛ writer рд▓рд╛ commit рдХрд░реВ рджреЗрддреЗ,
reader рдЖрдкрд▓рд╛ snapshot рдЯрд┐рдХрд╡реВрди рдареЗрд╡рддреЛ рд╣реЗ рджрд╛рдЦрд╡рддреЗ, school.db-wal рдореЛрдЬрддреЗ, рддреНрдпрд╛рдЪрд╛ checkpoint рдХрд░рддреЗ, рдЖрдгрд┐ рдкрд░рдд рдкреВрд░реНрд╡реАрдЪреНрдпрд╛ mode рдордзреНрдпреЗ рдиреЗрддреЗ.
ЁЯзТ 5 рд╡рд░реНрд╖рд╛рдВрдЪреНрдпрд╛ рдореБрд▓рд╛рд▓рд╛ рд╕рдордЬрд╛рд╡рд▓реНрдпрд╛рд╕рд╛рд░рдЦреЗ
рдореЛрдареНрдпрд╛ рдиреЛрдВрджрд╡рд╣реАрддрд▓реЗ рдкрд╛рди рдкреБрдиреНрд╣рд╛ рд▓рд┐рд╣рд┐рдгреЗ рд╣рд│реВ рдЖрдгрд┐ рдзреЛрдХреНрдпрд╛рдЪреЗ рдЕрд╕рддреЗ тАФ рдЕрд░реНрдзреНрдпрд╛рд╡рд░ рд╡реАрдЬ рдЧреЗрд▓реА рддрд░ рдкрд╛рди рдЕрд░реНрдзреЗ рдЬреБрдиреЗ, рдЕрд░реНрдзреЗ рдирд╡реЗ рд░рд╛рд╣рддреЗ. рдореНрд╣рдгреВрди рдХрд╛рд│рдЬреАрдкреВрд░реНрд╡рдХ рдХрд╛рдо рдХрд░рдгрд╛рд░реА рдЕрднрд┐рд▓реЗрдЦрдкрд╛рд▓ рдЖрдзреА рдбрд╛рдпрд░реАрдд ЁЯУ╝ рдПрдХ рдУрд│ рд▓рд┐рд╣рд┐рддреЗ: "page 7: Aishwarya тЖТ Aishwarya S". рдбрд╛рдпрд░реАрддрд▓реА рдУрд│ рдХрд╛рдЧрджрд╛рд╡рд░ рд╕реБрд░рдХреНрд╖рд┐рдд рдЭрд╛рд▓реНрдпрд╛рд╡рд░рдЪ рддреА "рдЭрд╛рд▓реЗ тЬЕ" рдореНрд╣рдгрддреЗ. рдирдВрддрд░, рд╢рд╛рдВрдд рд╡реЗрд│реА, рддреА рдбрд╛рдпрд░реАрддрд▓реНрдпрд╛ рдУрд│реА рдореЛрдареНрдпрд╛ рдиреЛрдВрджрд╡рд╣реАрдд рдЙрддрд░рд╡рддреЗ. рд╡реАрдЬ рдЧреЗрд▓реА, рддрд░ рддреА рдбрд╛рдпрд░реА рд╡рд╛рдЪрддреЗ рдЖрдгрд┐ рдХрд╛рдо рдкреВрд░реНрдг рдХрд░рддреЗ. рддреА рдбрд╛рдпрд░реА рдореНрд╣рдгрдЬреЗ write-ahead log (WAL).
рдЖрдгрд┐ рддреА рдХрд╛рдо рдХрд░рдд рдЕрд╕рддрд╛рдирд╛, рдПрдХ рдорд┐рдирд┐рдЯрд╛рдкреВрд░реНрд╡реА рдиреЛрдВрджрд╡рд╣реА рдЙрдШрдбрд▓реЗрд▓реНрдпрд╛ рд╡рд╛рдЪрдгрд╛рд▒реНрдпрд╛рд▓рд╛ рдкрд╛рди рддреНрдпрд╛рдиреЗ рд╕реБрд░реБрд╡рд╛рдд рдХреЗрд▓реА рддреЗрд╡реНрд╣рд╛ рдЬрд╕реЗ рд╣реЛрддреЗ рддрд╕реЗрдЪ рджрд┐рд╕рдд рд░рд╛рд╣рддреЗ тАФ рдЦреЛрд▓реАрдЪрд╛ рддреНрдпрд╛рдЪрд╛ рд╕реНрд╡рддрдГрдЪрд╛ рдлреЛрдЯреЛ. рд╣реЗрдЪ MVCC: readers writers рдирд╛ рдХрдзреА рдЕрдбрд╡рдд рдирд╛рд╣реАрдд, writers readers рдирд╛ рдХрдзреА рдЕрдбрд╡рдд рдирд╛рд╣реАрдд.
ЁЯЧ║я╕П рдЖрдХреГрддреА
sequenceDiagram
participant R as ЁЯСА reader
participant DB as ЁЯЧДя╕П school.db (WAL mode)
participant W as тЬНя╕П writer
R->>DB: BEGIN ┬╖ SELECT name тЖТ 'Aishwarya'
W->>DB: UPDATE тЖТ 'Aishwarya S' ┬╖ COMMIT (appended to the WAL)
DB-->>W: OK тАФ no waiting for the reader
R->>DB: SELECT again тЖТ still 'Aishwarya' (snapshot)
R->>DB: COMMIT ┬╖ new SELECT тЖТ 'Aishwarya S'
ЁЯЧ║я╕П рдХрд╛рдврд▓реЗрд▓реА рдЖрд╡реГрддреНрддреА + рдПрдХ lab: https://school-edh.pages.dev/database/lesson-diagrams.html#l15
тЭУ рдХрд╛рдп
- Write-ahead log тАФ рдкреНрд░рддреНрдпреЗрдХ рдмрджрд▓ log рдордзреНрдпреЗ рдЬреЛрдбрд▓рд╛ рдЬрд╛рддреЛ рдЖрдгрд┐ COMMIT рдкрд░рдд рдпреЗрдгреНрдпрд╛рдЖрдзреА
disk рд╡рд░ flush рд╣реЛрддреЛ (
fsync). Data pages рдирдВрддрд░ checkpoint рд╡реЗрд│реА рд▓рд┐рд╣рд┐рд▓реА рдЬрд╛рддрд╛рдд. Crash рдирдВрддрд░ engine log рдкреБрдиреНрд╣рд╛ рдЪрд╛рд▓рд╡рддреЗ (replay). рд╣реЗрдЪ ACID рдордзрд▓реЗ D (рдзрдбрд╛ 04). - Buffer cache тАФ pages memory рдордзреНрдпреЗ рд░рд╛рд╣рддрд╛рдд; log рдореБрд│реЗ рддреА рдЙрд╢рд┐рд░рд╛ disk рд╡рд░ рдкреЛрд╣реЛрдЪрд▓реА рддрд░реА рд╕реБрд░рдХреНрд╖рд┐рдд рдЕрд╕рддреЗ.
- MVCC (multi-version concurrency control) тАФ рдПрдХрд╛ row рдЪреНрдпрд╛ рдЕрдиреЗрдХ versions рдЕрд╕реВ рд╢рдХрддрд╛рдд; рдкреНрд░рддреНрдпреЗрдХ
transaction рд▓рд╛ рддреА рд╕реБрд░реВ рдЭрд╛рд▓реА рддреЗрд╡реНрд╣рд╛ commit рдЭрд╛рд▓реЗрд▓реНрдпрд╛ versions рджрд┐рд╕рддрд╛рдд. Postgres рдЬреБрдиреНрдпрд╛
row versions table рдордзреНрдпреЗрдЪ рдареЗрд╡рддреЗ рдЖрдгрд┐ VACUUM рдиреЗ рд╕рд╛рдл рдХрд░рддреЗ; WAL mode рдордзрд▓реЗ SQLite
рдирд╡реА pages checkpoint рд╣реЛрдИрдкрд░реНрдпрдВрдд
-walfile рдордзреНрдпреЗ рдареЗрд╡рддреЗ. - SQLite рдЪрд╛ default (rollback journal) рд╡реЗрдЧрд│рд╛ рдЖрд╣реЗ: writer рд▓рд╛ рд╕рдВрдкреВрд░реНрдг file рд▓рд╛рдЧрддреЗ, рдореНрд╣рдгреВрди рддреЛ
readers рдЪреА рд╡рд╛рдЯ рдкрд╛рд╣рддреЛ тАФ рд╣рд╛рдЪ рдзрдбрд╛ 07 рдордзрд▓рд╛
database is locked.
ЁЯдФ рдХрд╛
рд╣реЗ рддреАрди рдЧреЛрд╖реНрдЯреА рд╕рдордЬрд╛рд╡рддреЗ рдЬреНрдпрд╛ рд▓реЛрдХ рдЕрдиреНрдпрдерд╛ рдбреЛрд│реЗ рдЭрд╛рдХреВрди рдорд╛рдирддрд╛рдд: OK рдорд┐рд│рд╛рд▓реЗрд▓рд╛ commit рд╡реАрдЬ рдЧреЗрд▓реНрдпрд╛рд╡рд░рд╣реА рдХрд╛ рдЯрд┐рдХрддреЛ, Postgres рдордзреНрдпреЗ readers writers рдЪреА рд╡рд╛рдЯ рдХрд╛ рдкрд╛рд╣рдд рдирд╛рд╣реАрдд, рдЖрдгрд┐ рддреБрдореНрд╣реА рдлрдХреНрдд UPDATE рдХрд░рдд рдЕрд╕рддрд╛рдирд╛ table рдХрд╛ рд╡рд╛рдвреВ рд╢рдХрддреЛ (VACUUM рдЪреА рд╡рд╛рдЯ рдкрд╛рд╣рдгрд╛рд▒реНрдпрд╛ рдЬреБрдиреНрдпрд╛ versions). рд╣рд╛рдЪ log replication (L16) рдЖрдгрд┐ change data capture (L18) рд▓рд╛ рдкреБрд░рд╡рддреЛ.
ЁЯФз рдХрд╕реЗ (рдпрд╛ repo рдордзреНрдпреЗ)
db/demo.py рдордзрд▓реЗ wal() тАФ рдПрдХрд╛рдЪ file рд▓рд╛ рджреЛрди рдЦрд░реА connections, рдЖрдгрд┐
PRAGMA wal_checkpoint(TRUNCATE) рдЪреНрдпрд╛ рдЖрдзреА рдЖрдгрд┐ рдирдВрддрд░ рдореЛрдЬрд▓реЗрд▓реА -wal file.
ЁЯзк рдХрд░реВрди рдкрд╛рд╣рд╛
python3 db/demo.py wal
python3 - <<'EOF'
import sqlite3
c = sqlite3.connect("db/school.db")
print(c.execute("PRAGMA journal_mode").fetchone()) # delete тАФ the demo switched it back
print(c.execute("PRAGMA journal_mode=WAL").fetchone()) # try it: now open a second python and write while you read
c.execute("PRAGMA journal_mode=DELETE")
EOF
тЬЕ рддрдкрд╛рд╕рд╛ тАФ рддреБрдореНрд╣рд╛рд▓рд╛ рдХрд╛рдп рджрд┐рд╕рд╛рдпрд▓рд╛ рд╣рд╡реЗ
journal mode before: delete тЖТ after: wal; writer рдХреЛрдгрддреНрдпрд╛рд╣реА lock error рд╢рд┐рд╡рд╛рдп 'Aishwarya S'
commit рдХрд░рддреЛ; рддреНрдпрд╛рдЪ transaction рдордзрд▓реНрдпрд╛ reader рд▓рд╛ рдЕрдЬреВрдирд╣реА 'Aishwarya' рджрд┐рд╕рддреЗ, рдЖрдгрд┐ рддреНрдпрд╛рдЪреНрдпрд╛
COMMIT рдирдВрддрд░ 'Aishwarya S'; -wal file рдХрд╛рд╣реА kilobytes рдЪреА рдЕрд╕рддреЗ, рдордЧ checkpoint рдирдВрддрд░ 0 bytes.
ЁЯПБ рддреБрдореНрд╣реА рдЖрддреНрддрд╛рдЪ рдХрд╛рдп рд╕рд┐рджреНрдз рдХреЗрд▓реЗ
рддреБрдореНрд╣реА durability рдЖрдгрд┐ snapshot isolation рдШрдбрддрд╛рдирд╛ рдкрд╛рд╣рд┐рд▓реЗ: рдЖрдзреА log, рдирдВрддрд░ pages, рдЖрдгрд┐ рдкреНрд░рддреНрдпреЗрдХ reader рдЦреЛрд▓реАрдЪрд╛ рд╕реНрд╡рддрдГрдЪрд╛ рдлреЛрдЯреЛ рдареЗрд╡рддреЛ.
тЪая╕П рдиреЗрд╣рдореАрдЪреНрдпрд╛ рдЪреБрдХрд╛
- COMMIT data file рд▓рд┐рд╣рд┐рддреЛ рдЕрд╕реЗ рдорд╛рдирдгреЗ тАФ рддреЛ log рд▓рд┐рд╣рд┐рддреЛ
- рд╡реЗрдЧрд╛рд╕рд╛рдареА
fsync/synchronousрдмрдВрдж рдХрд░рдгреЗ рдЖрдгрд┐ crash рдордзреНрдпреЗ commits рдЧрдорд╛рд╡рдгреЗ - рдЦреВрдк рд▓рд╛рдВрдм transactions: рддреНрдпрд╛рдВрдирд╛ рдЕрдЬреВрди рджрд┐рд╕реВ рд╢рдХрддреАрд▓ рдЕрд╢рд╛ row versions Postgres VACUUM рдХрд░реВ рд╢рдХрдд рдирд╛рд╣реА, рдЖрдгрд┐ tables рдлреБрдЧрддрд╛рдд
- disk рд╡рд░рдЪреНрдпрд╛ WAL/log рд╡рд╛рдвреАрдХрдбреЗ рджреБрд░реНрд▓рдХреНрд╖ (рдзрдбрд╛ 12 рдЪреА рдЪреЗрдХрд▓рд┐рд╕реНрдЯ)
- рдкреНрд░рддреНрдпреЗрдХ engine SQLite рдЪреНрдпрд╛ default journal рд╕рд╛рд░рдЦреЗ рд╡рд╛рдЧрддреЗ рдЕрд╕реЗ рдЧреГрд╣реАрдд рдзрд░рдгреЗ тАФ Postgres рдордзреНрдпреЗ readers writers рдирд╛ рдХрдзреАрдЪ рдЕрдбрд╡рдд рдирд╛рд╣реАрдд
ЁЯПн рдкреНрд░рддреНрдпрдХреНрд╖ рд╡рд╛рдкрд░рд╛рдд рд╣реЗ рдХрд╛ рдорд╣рддреНрддреНрд╡рд╛рдЪреЗ: WAL settings, checkpoint tuning, autovacuum рдЖрдгрд┐ long-running-transaction alerts рд╣реЗ database on-call рдЪреЗ рдиреЗрд╣рдореАрдЪреЗ рд╡рд┐рд╖рдп рдЖрд╣реЗрдд.
тПня╕П рдкреБрдвреЗ
git checkout lesson-16-replication-failover тАФ рддреЛ log рдЦреЛрд▓реАрдЪреНрдпрд╛ рдПрдХрд╛ рдкреНрд░рддреАрдХрдбреЗ рдкрд╛рдард╡рд╛.