Како ја користСвмС Lazy Replication Π·Π° Π²Ρ€Π°ΡœΠ°ΡšΠ΅ ΠΎΠ΄ катастрофи со PostgreSQL

Како ја користСвмС Lazy Replication Π·Π° Π²Ρ€Π°ΡœΠ°ΡšΠ΅ ΠΎΠ΄ катастрофи со PostgreSQL
Π Π΅ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΡ˜Π°Ρ‚Π° Π½Π΅ Π΅ Ρ€Π΅Π·Π΅Ρ€Π²Π½Π° копија. Или Π½Π΅? Π•Π²Π΅ ΠΊΠ°ΠΊΠΎ користСвмС ΠΎΠ΄Π»ΠΎΠΆΠ΅Π½Π° Ρ€Π΅ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΡ˜Π° Π·Π° Π΄Π° сС ΠΎΠΏΠΎΡ€Π°Π²ΠΈΠΌΠ΅ ΠΎΠ΄ ΡΠ»ΡƒΡ‡Π°Ρ˜Π½ΠΎ Π±Ρ€ΠΈΡˆΠ΅ΡšΠ΅ ΠΊΡ€Π°Ρ‚Π΅Π½ΠΊΠΈ.

Π‘ΠΏΠ΅Ρ†ΠΈΡ˜Π°Π»ΠΈΡΡ‚ΠΈ Π·Π° инфраструктура GitLab Π΅ ΠΎΠ΄Π³ΠΎΠ²ΠΎΡ€Π΅Π½ Π·Π° Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚Π° GitLab.com - Π½Π°Ρ˜Π³ΠΎΠ»Π΅ΠΌΠΈΠΎΡ‚ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠΊ Π½Π° GitLab Π²ΠΎ ΠΏΡ€ΠΈΡ€ΠΎΠ΄Π°Ρ‚Π°. Π‘ΠΎ 3 ΠΌΠΈΠ»ΠΈΠΎΠ½ΠΈ корисници ΠΈ рСчиси 7 ΠΌΠΈΠ»ΠΈΠΎΠ½ΠΈ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΈ, Ρ‚Π°Π° Π΅ Π΅Π΄Π½Π° ΠΎΠ΄ Π½Π°Ρ˜Π³ΠΎΠ»Π΅ΠΌΠΈΡ‚Π΅ Π»ΠΎΠΊΠ°Ρ†ΠΈΠΈ Π½Π° SaaS со ΠΎΡ‚Π²ΠΎΡ€Π΅Π½ ΠΊΠΎΠ΄ со посвСтСна Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Π°. Π‘Π΅Π· систСмот Π½Π° Π±Π°Π·Π° Π½Π° ΠΏΠΎΠ΄Π°Ρ‚ΠΎΡ†ΠΈ PostgreSQL, инфраструктурата GitLab.com Π½Π΅ΠΌΠ° Π΄Π° ΠΎΠ΄ΠΈ Π΄Π°Π»Π΅ΠΊΡƒ ΠΈ ΡˆΡ‚ΠΎ ΠΏΡ€Π°Π²ΠΈΠΌΠ΅ Π·Π° Π΄Π° ΠΎΠ±Π΅Π·Π±Π΅Π΄ΠΈΠΌΠ΅ Ρ‚ΠΎΠ»Π΅Ρ€Π°Π½Ρ†ΠΈΡ˜Π° Π½Π° Π³Ρ€Π΅ΡˆΠΊΠΈ Π²ΠΎ ΡΠ»ΡƒΡ‡Π°Ρ˜ Π½Π° ΠΊΠ°ΠΊΠ²ΠΈ Π±ΠΈΠ»ΠΎ Π΄Π΅Ρ„Π΅ΠΊΡ‚ΠΈ ΠΊΠΎΠ³Π° ΠΏΠΎΠ΄Π°Ρ‚ΠΎΡ†ΠΈΡ‚Π΅ ΠΌΠΎΠΆΠ΅ Π΄Π° сС ΠΈΠ·Π³ΡƒΠ±Π°Ρ‚. ΠœΠ°Π»ΠΊΡƒ Π΅ Π²Π΅Ρ€ΠΎΡ˜Π°Ρ‚Π½ΠΎ Π΄Π΅ΠΊΠ° ќС сС случи Ρ‚Π°ΠΊΠ²Π° катастрофа, Π½ΠΎ Π½ΠΈΠ΅ смС Π΄ΠΎΠ±Ρ€ΠΎ ΠΏΠΎΠ΄Π³ΠΎΡ‚Π²Π΅Π½ΠΈ ΠΈ снабдСни со Ρ€Π°Π·Π»ΠΈΡ‡Π½ΠΈ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΠΈ Π·Π° Ρ€Π΅Π·Π΅Ρ€Π²Π½Π° копија ΠΈ Ρ€Π΅ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΡ˜Π°.

Π Π΅ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΡ˜Π°Ρ‚Π° Π½Π΅ Π΅ срСдство Π·Π° Ρ€Π΅Π·Π΅Ρ€Π²Π½Π° копија Π½Π° Π±Π°Π·ΠΈΡ‚Π΅ Π½Π° ΠΏΠΎΠ΄Π°Ρ‚ΠΎΡ†ΠΈ (Π’ΠΈΠ΄ΠΈ ΠΏΠΎΠ΄ΠΎΠ»Ρƒ). Но, сСга ќС Π²ΠΈΠ΄ΠΈΠΌΠ΅ ΠΊΠ°ΠΊΠΎ Π±Ρ€Π·ΠΎ Π΄Π° Π³ΠΈ Π²Ρ€Π°Ρ‚ΠΈΠΌΠ΅ ΡΠ»ΡƒΡ‡Π°Ρ˜Π½ΠΎ ΠΈΠ·Π±Ρ€ΠΈΡˆΠ°Π½ΠΈΡ‚Π΅ ΠΏΠΎΠ΄Π°Ρ‚ΠΎΡ†ΠΈ ΠΊΠΎΡ€ΠΈΡΡ‚Π΅Ρ˜ΡœΠΈ ΠΌΡ€Π·Π»ΠΈΠ²Π° Ρ€Π΅ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΡ˜Π°: Π²ΠΊΠ»ΡƒΡ‡Π΅Π½ΠΎ GitLab.com корисникот ја ΠΈΠ·Π±Ρ€ΠΈΡˆΠ° ΠΊΡ€Π°Ρ‚Π΅Π½ΠΊΠ°Ρ‚Π° Π·Π° ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΎΡ‚ gitlab-ce ΠΈ ΠΈΠ·Π³ΡƒΠ±Π΅Π½ΠΈ врски со Π±Π°Ρ€Π°ΡšΠ° ΠΈ Π·Π°Π΄Π°Ρ‡ΠΈ Π·Π° ΡΠΏΠΎΡ˜ΡƒΠ²Π°ΡšΠ΅.

Π‘ΠΎ ΠΎΠ΄Π»ΠΎΠΆΠ΅Π½Π° Ρ€Π΅ΠΏΠ»ΠΈΠΊΠ°, Π³ΠΈ Π²Ρ€Π°Ρ‚ΠΈΠ²ΠΌΠ΅ ΠΏΠΎΠ΄Π°Ρ‚ΠΎΡ†ΠΈΡ‚Π΅ Π·Π° само 1,5 часа. ΠŸΠΎΠ³Π»Π΅Π΄Π½Π΅Ρ‚Π΅ ΠΊΠ°ΠΊΠΎ сС случи.

НавСдСтС Π³ΠΎ Π²Ρ€Π΅ΠΌΠ΅Ρ‚ΠΎ Π·Π° ΠΎΠ±Π½ΠΎΠ²ΡƒΠ²Π°ΡšΠ΅ со PostgreSQL

PostgreSQL ΠΈΠΌΠ° Π²Π³Ρ€Π°Π΄Π΅Π½Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡ˜Π° која ја Π²Ρ€Π°ΡœΠ° ΡΠΎΡΡ‚ΠΎΡ˜Π±Π°Ρ‚Π° Π½Π° Π±Π°Π·Π°Ρ‚Π° Π½Π° ΠΏΠΎΠ΄Π°Ρ‚ΠΎΡ†ΠΈ Π΄ΠΎ ΠΎΠ΄Ρ€Π΅Π΄Π΅Π½Π° врСмСнска Ρ‚ΠΎΡ‡ΠΊΠ°. Π’ΠΎΠ° сС Π½Π°Ρ€Π΅ΠΊΡƒΠ²Π° Π’ΠΎΡ‡ΠΊΠ°-Π²ΠΎ-Π²Ρ€Π΅ΠΌΠ΅ Π·Π° Π½Π°ΠΏΠ»Π°Ρ‚Π° (PITR) ΠΈ Π³ΠΈ користи иститС ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΠΈ ΠΊΠΎΠΈ ја ΠΎΠ΄Ρ€ΠΆΡƒΠ²Π°Π°Ρ‚ Ρ€Π΅ΠΏΠ»ΠΈΠΊΠ°Ρ‚Π° Π°ΠΆΡƒΡ€ΠΈΡ€Π°Π½Π°: ΠΏΠΎΡ‡Π½ΡƒΠ²Π°Ρ˜ΡœΠΈ со сигурна слика Π½Π° Ρ†Π΅Π»ΠΈΠΎΡ‚ кластСр Π½Π° Π±Π°Π·Π°Ρ‚Π° Π½Π° ΠΏΠΎΠ΄Π°Ρ‚ΠΎΡ†ΠΈ (Π±Π°Π·Π° Ρ€Π΅Π·Π΅Ρ€Π²Π½Π° копија), ΠΏΡ€ΠΈΠΌΠ΅Π½ΡƒΠ²Π°ΠΌΠ΅ ΡΠ΅Ρ€ΠΈΡ˜Π° ΠΏΡ€ΠΎΠΌΠ΅Π½ΠΈ Π½Π° ΡΠΎΡΡ‚ΠΎΡ˜Π±ΠΈΡ‚Π΅ Π΄ΠΎ ΠΎΠ΄Ρ€Π΅Π΄Π΅Π½ врСмСнски ΠΏΠ΅Ρ€ΠΈΠΎΠ΄.

Π—Π° Π΄Π° ја користимС ΠΎΠ²Π°Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡ˜Π° Π·Π° Π»Π°Π΄Π½Π° Ρ€Π΅Π·Π΅Ρ€Π²Π½Π° копија, Π½ΠΈΠ΅ Ρ€Π΅Π΄ΠΎΠ²Π½ΠΎ ΠΏΡ€Π°Π²ΠΈΠΌΠ΅ основна Ρ€Π΅Π·Π΅Ρ€Π²Π½Π° копија Π½Π° Π±Π°Π·Π°Ρ‚Π° Π½Π° ΠΏΠΎΠ΄Π°Ρ‚ΠΎΡ†ΠΈ ΠΈ ја складирамС Π²ΠΎ Π°Ρ€Ρ…ΠΈΠ²Π° (Π°Ρ€Ρ…ΠΈΠ²ΠΈΡ‚Π΅ Π½Π° GitLab ΠΆΠΈΠ²Π΅Π°Ρ‚ Π²ΠΎ Облак ΡΠΊΠ»Π°Π΄ΠΈΡ€Π°ΡšΠ΅ Π½Π° Google). НиС, исто Ρ‚Π°ΠΊΠ°, Π³ΠΈ слСдимС ΠΏΡ€ΠΎΠΌΠ΅Π½ΠΈΡ‚Π΅ Π²ΠΎ ΡΠΎΡΡ‚ΠΎΡ˜Π±Π°Ρ‚Π° Π½Π° Π±Π°Π·Π°Ρ‚Π° Π½Π° ΠΏΠΎΠ΄Π°Ρ‚ΠΎΡ†ΠΈ со Π°Ρ€Ρ…ΠΈΠ²ΠΈΡ€Π°ΡšΠ΅ Π½Π° Π΄Π½Π΅Π²Π½ΠΈΠΊΠΎΡ‚ Π·Π° ΠΎΠ΄Π½Π°ΠΏΡ€Π΅Π΄ Π·Π°ΠΏΠΈΡˆΡƒΠ²Π°ΡšΠ΅ (Π΄Π½Π΅Π²Π½ΠΈΠΊ Π·Π° ΠΎΠ΄Π½Π°ΠΏΡ€Π΅Π΄ Π·Π°ΠΏΠΈΡˆΡƒΠ²Π°ΡšΠ΅, Π’ΠžΠ›). И со сСто ΠΎΠ²Π° Π½Π° мСсто, ΠΌΠΎΠΆΠ΅ΠΌΠ΅ Π΄Π° Π½Π°ΠΏΡ€Π°Π²ΠΈΠΌΠ΅ PITR Π·Π° Π²Ρ€Π°ΡœΠ°ΡšΠ΅ ΠΎΠ΄ катастрофи: ΠΏΠΎΡ‡Π½ΡƒΠ²Π°Ρ˜ΡœΠΈ ΠΎΠ΄ снимката Π½Π°ΠΏΡ€Π°Π²Π΅Π½Π° ΠΏΡ€Π΅Π΄ нСуспСхот ΠΈ ΠΏΡ€ΠΈΠΌΠ΅Π½Π° Π½Π° ΠΏΡ€ΠΎΠΌΠ΅Π½ΠΈΡ‚Π΅ ΠΎΠ΄ Π°Ρ€Ρ…ΠΈΠ²Π°Ρ‚Π° WAL Π΄ΠΎ нСуспСхот.

Π¨Ρ‚ΠΎ Π΅ ΠΎΠ΄Π»ΠΎΠΆΠ΅Π½Π° Ρ€Π΅ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΡ˜Π°?

ΠœΡ€Π·Π»ΠΈΠ²Π° Ρ€Π΅ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΡ˜Π° Π΅ ΠΏΡ€ΠΈΠΌΠ΅Π½Π° Π½Π° ΠΏΡ€ΠΎΠΌΠ΅Π½ΠΈ ΠΎΠ΄ WAL со Π·Π°Π΄ΠΎΡ†Π½ΡƒΠ²Π°ΡšΠ΅. Π’ΠΎΠ° Π΅, Ρ‚Ρ€Π°Π½ΡΠ°ΠΊΡ†ΠΈΡ˜Π°Ρ‚Π° сС случи Π·Π° Π΅Π΄Π΅Π½ час X, Π½ΠΎ ќС сС појави Π²ΠΎ Ρ€Π΅ΠΏΠ»ΠΈΠΊΠ°Ρ‚Π° со Π·Π°Π΄ΠΎΡ†Π½ΡƒΠ²Π°ΡšΠ΅ d Π·Π° Π΅Π΄Π΅Π½ час X + d.

PostgreSQL ΠΈΠΌΠ° 2 Π½Π°Ρ‡ΠΈΠ½ΠΈ Π·Π° ΠΏΠΎΡΡ‚Π°Π²ΡƒΠ²Π°ΡšΠ΅ Π½Π° Ρ€Π΅ΠΏΠ»ΠΈΠΊΠ° Π½Π° Ρ„ΠΈΠ·ΠΈΡ‡ΠΊΠ° Π±Π°Π·Π° Π½Π° ΠΏΠΎΠ΄Π°Ρ‚ΠΎΡ†ΠΈ: Π²Ρ€Π°ΡœΠ°ΡšΠ΅ Π½Π° Ρ€Π΅Π·Π΅Ρ€Π²Π½Π°Ρ‚Π° копија ΠΈ Ρ€Π΅ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΡ˜Π° Π½Π° стриминг. Π’Ρ€Π°ΡœΠ°ΡšΠ΅ ΠΎΠ΄ Π°Ρ€Ρ…ΠΈΠ²Π°, Π²ΠΎ ΡΡƒΡˆΡ‚ΠΈΠ½Π° Ρ€Π°Π±ΠΎΡ‚ΠΈ ΠΊΠ°ΠΊΠΎ PITR, Π½ΠΎ ΠΊΠΎΠ½Ρ‚ΠΈΠ½ΡƒΠΈΡ€Π°Π½ΠΎ: ΠΏΠΎΡΡ‚ΠΎΡ˜Π°Π½ΠΎ Π³ΠΈ Π²Ρ€Π°ΡœΠ°ΠΌΠ΅ ΠΏΡ€ΠΎΠΌΠ΅Π½ΠΈΡ‚Π΅ ΠΎΠ΄ Π°Ρ€Ρ…ΠΈΠ²Π°Ρ‚Π° WAL ΠΈ Π³ΠΈ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡƒΠ²Π°ΠΌΠ΅ Π½Π° Ρ€Π΅ΠΏΠ»ΠΈΠΊΠ°Ρ‚Π°. А стриминг Ρ€Π΅ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΡ˜Π° Π΄ΠΈΡ€Π΅ΠΊΡ‚Π½ΠΎ Π³ΠΎ ΠΏΡ€Π΅Π²Π·Π΅ΠΌΠ° WAL ΠΏΠΎΡ‚ΠΎΠΊΠΎΡ‚ ΠΎΠ΄ Π΄ΠΎΠΌΠ°ΡœΠΈΠ½ΠΎΡ‚ Π½Π° Π±Π°Π·Π°Ρ‚Π° Π½Π° ΠΏΠΎΠ΄Π°Ρ‚ΠΎΡ†ΠΈ Π½Π°Π³ΠΎΡ€Π΅. ΠŸΡ€Π΅Ρ‚ΠΏΠΎΡ‡ΠΈΡ‚Π°ΠΌΠ΅ ΠΎΠ±Π½ΠΎΠ²ΡƒΠ²Π°ΡšΠ΅ Π½Π° Π°Ρ€Ρ…ΠΈΠ²ΠΈΡ‚Π΅ - полСсно Π΅ Π΄Π° сС ΡƒΠΏΡ€Π°Π²ΡƒΠ²Π° ΠΈ ΠΈΠΌΠ° Π½ΠΎΡ€ΠΌΠ°Π»Π½ΠΈ пСрформанси ΡˆΡ‚ΠΎ сС Π²ΠΎ Ρ‡Π΅ΠΊΠΎΡ€ со ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½ΠΈΠΎΡ‚ кластСр.

Како Π΄Π° поставитС ΠΎΠ΄Π»ΠΎΠΆΠ΅Π½ΠΎ ΠΎΠ±Π½ΠΎΠ²ΡƒΠ²Π°ΡšΠ΅ ΠΎΠ΄ Π°Ρ€Ρ…ΠΈΠ²Π°

ΠžΠΏΡ†ΠΈΠΈ Π·Π° ΠΎΠ±Π½ΠΎΠ²ΡƒΠ²Π°ΡšΠ΅ опишано Π²ΠΎ Π΄Π°Ρ‚ΠΎΡ‚Π΅ΠΊΠ°Ρ‚Π° recovery.conf... ΠŸΡ€ΠΈΠΌΠ΅Ρ€:

standby_mode = 'on'
restore_command = '/usr/bin/envdir /etc/wal-e.d/env /opt/wal-e/bin/wal-e wal-fetch -p 4 "%f" "%p"'
recovery_min_apply_delay = '8h'
recovery_target_timeline = 'latest'

Π‘ΠΎ ΠΎΠ²ΠΈΠ΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΈ, ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€ΠΈΡ€Π°Π²ΠΌΠ΅ ΠΎΠ΄Π»ΠΎΠΆΠ΅Π½Π° Ρ€Π΅ΠΏΠ»ΠΈΠΊΠ° со Π²Ρ€Π°ΡœΠ°ΡšΠ΅ Π½Π° Ρ€Π΅Π·Π΅Ρ€Π²Π½Π°Ρ‚Π° копија. Π’ΡƒΠΊΠ° сС користи Π²Π°Π»-Π΅ Π΄Π° сС ΠΈΠ·Π²Π»Π΅Ρ‡Π°Ρ‚ WAL сСгмСнти (restore_command) ΠΎΠ΄ Π°Ρ€Ρ…ΠΈΠ²Π°Ρ‚Π°, Π° ΠΏΡ€ΠΎΠΌΠ΅Π½ΠΈΡ‚Π΅ ќС сС ΠΏΡ€ΠΈΠΌΠ΅Π½Π°Ρ‚ ΠΏΠΎ осум часа (recovery_min_apply_delay). Π Π΅ΠΏΠ»ΠΈΠΊΠ°Ρ‚Π° ќС Π³ΠΈ слСди ΠΏΡ€ΠΎΠΌΠ΅Π½ΠΈΡ‚Π΅ Π½Π° врСмСнската линија Π²ΠΎ Π°Ρ€Ρ…ΠΈΠ²Π°Ρ‚Π°, Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΏΠΎΡ€Π°Π΄ΠΈ Π΄Π΅Ρ„Π΅ΠΊΡ‚ Π½Π° кластСрот (recovery_target_timeline).

Π‘ recovery_min_apply_delay ΠœΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° поставитС Ρ€Π΅ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΡ˜Π° Π½Π° стриминг со Π·Π°Π΄ΠΎΡ†Π½ΡƒΠ²Π°ΡšΠ΅, Π½ΠΎ Ρ‚ΡƒΠΊΠ° ΠΈΠΌΠ° Π½Π΅ΠΊΠΎΠ»ΠΊΡƒ Π·Π°ΠΌΠΊΠΈ ΠΊΠΎΠΈ сС ΠΏΠΎΠ²Ρ€Π·Π°Π½ΠΈ со слотови Π·Π° Ρ€Π΅ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΡ˜Π°, ТСшки ΠΏΠΎΠ²Ρ€Π°Ρ‚Π½ΠΈ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ Π²ΠΎ Ρ€Π΅ΠΆΠΈΠΌ Π½Π° подготвСност ΠΈ Ρ‚Π°ΠΊΠ° Π½Π°Ρ‚Π°ΠΌΡƒ. Архивата WAL Π²ΠΈ ΠΎΠ²ΠΎΠ·ΠΌΠΎΠΆΡƒΠ²Π° Π΄Π° Π³ΠΈ ΠΈΠ·Π±Π΅Π³Π½Π΅Ρ‚Π΅.

ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Π°Ρ€ recovery_min_apply_delay сС појави само Π²ΠΎ PostgreSQL 9.3. Π’ΠΎ ΠΏΡ€Π΅Ρ‚Ρ…ΠΎΠ΄Π½ΠΈΡ‚Π΅ Π²Π΅Ρ€Π·ΠΈΠΈ, Π·Π° ΠΎΠ΄Π»ΠΎΠΆΠ΅Π½Π° Ρ€Π΅ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΡ˜Π° Ρ‚Ρ€Π΅Π±Π° Π΄Π° ја ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€ΠΈΡ€Π°Ρ‚Π΅ ΠΊΠΎΠΌΠ±ΠΈΠ½Π°Ρ†ΠΈΡ˜Π°Ρ‚Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π·Π° ΡƒΠΏΡ€Π°Π²ΡƒΠ²Π°ΡšΠ΅ со ΠΎΠ±Π½ΠΎΠ²ΡƒΠ²Π°ΡšΠ΅ (pg_xlog_replay_pause(), pg_xlog_replay_resume()) ΠΈΠ»ΠΈ Π΄Ρ€ΠΆΠ΅Ρ‚Π΅ Π³ΠΈ сСгмСнтитС Π½Π° WAL Π²ΠΎ Π°Ρ€Ρ…ΠΈΠ²Π° Π΄ΠΎΠ΄Π΅ΠΊΠ° Ρ‚Ρ€Π°Π΅ Π΄ΠΎΡ†Π½Π΅ΡšΠ΅Ρ‚ΠΎ.

Како PostgreSQL Π³ΠΎ ΠΏΡ€Π°Π²ΠΈ ΠΎΠ²Π°?

Π˜Π½Ρ‚Π΅Ρ€Π΅ΡΠ½ΠΎ Π΅ Π΄Π° сС Π²ΠΈΠ΄ΠΈ ΠΊΠ°ΠΊΠΎ PostgreSQL ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½Ρ‚ΠΈΡ€Π° ΠΌΡ€Π·Π»ΠΈΠ²ΠΎ Π·Π°ΠΊΡ€Π΅ΠΏΠ½ΡƒΠ²Π°ΡšΠ΅. АјдС Π΄Π° ΠΏΠΎΠ³Π»Π΅Π΄Π½Π΅ΠΌΠ΅ recoveryApplyDelay(XlogReaderState). Π‘Π΅ Π²ΠΈΠΊΠ° ΠΎΠ΄ Π³Π»Π°Π²Π½Π° јамка Π·Π° ΠΏΠΎΠ²Ρ‚ΠΎΡ€ΡƒΠ²Π°ΡšΠ΅ Π·Π° сСкој Π²Π»Π΅Π· ΠΎΠ΄ WAL.

static bool
recoveryApplyDelay(XLogReaderState *record)
{
    uint8       xact_info;
    TimestampTz xtime;
    long        secs;
    int         microsecs;

    /* nothing to do if no delay configured */
    if (recovery_min_apply_delay <= 0)
        return false;

    /* no delay is applied on a database not yet consistent */
    if (!reachedConsistency)
        return false;

    /*
     * Is it a COMMIT record?
     *
     * We deliberately choose not to delay aborts since they have no effect on
     * MVCC. We already allow replay of records that don't have a timestamp,
     * so there is already opportunity for issues caused by early conflicts on
     * standbys.
     */
    if (XLogRecGetRmid(record) != RM_XACT_ID)
        return false;

    xact_info = XLogRecGetInfo(record) & XLOG_XACT_OPMASK;

    if (xact_info != XLOG_XACT_COMMIT &&
        xact_info != XLOG_XACT_COMMIT_PREPARED)
        return false;

    if (!getRecordTimestamp(record, &xtime))
        return false;

    recoveryDelayUntilTime =
        TimestampTzPlusMilliseconds(xtime, recovery_min_apply_delay);

    /*
     * Exit without arming the latch if it's already past time to apply this
     * record
     */
    TimestampDifference(GetCurrentTimestamp(), recoveryDelayUntilTime,
                        &secs, &microsecs);
    if (secs <= 0 && microsecs <= 0)
        return false;

    while (true)
    {
        // Shortened:
        // Use WaitLatch until we reached recoveryDelayUntilTime
        // and then
        break;
    }
    return true;
}

Π’ΠΎ ΠΊΡ€Π°Ρ˜Π½Π° линија Π΅ Π΄Π΅ΠΊΠ° Π΄ΠΎΡ†Π½Π΅ΡšΠ΅Ρ‚ΠΎ сС заснова Π½Π° Ρ„ΠΈΠ·ΠΈΡ‡ΠΊΠΎΡ‚ΠΎ Π²Ρ€Π΅ΠΌΠ΅ запишано Π²ΠΎ врСмСнскиот ΠΏΠ΅Ρ‡Π°Ρ‚ Π·Π° ΠΈΠ·Π²Ρ€ΡˆΡƒΠ²Π°ΡšΠ΅ Π½Π° Ρ‚Ρ€Π°Π½ΡΠ°ΠΊΡ†ΠΈΡ˜Π°Ρ‚Π° (xtime). Како ΡˆΡ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° Π²ΠΈΠ΄ΠΈΡ‚Π΅, Π΄ΠΎΡ†Π½Π΅ΡšΠ΅Ρ‚ΠΎ Π²Π°ΠΆΠΈ само Π·Π° ΠΎΠ±Π²Ρ€Π·ΡƒΠ²Π°ΡšΠ° ΠΈ Π½Π΅ влијаС Π½Π° Π΄Ρ€ΡƒΠ³ΠΈΡ‚Π΅ записи - ситС ΠΏΡ€ΠΎΠΌΠ΅Π½ΠΈ сС ΠΏΡ€ΠΈΠΌΠ΅Π½ΡƒΠ²Π°Π°Ρ‚ Π΄ΠΈΡ€Π΅ΠΊΡ‚Π½ΠΎ, Π° ΠΈΠ·Π²Ρ€ΡˆΡƒΠ²Π°ΡšΠ΅Ρ‚ΠΎ Π΅ ΠΎΠ΄Π»ΠΎΠΆΠ΅Π½ΠΎ, Ρ‚Π°ΠΊΠ° ΡˆΡ‚ΠΎ ΠΏΡ€ΠΎΠΌΠ΅Π½ΠΈΡ‚Π΅ ќС Π³ΠΈ Π²ΠΈΠ΄ΠΈΠΌΠ΅ само ΠΏΠΎ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€ΠΈΡ€Π°Π½ΠΎΡ‚ΠΎ ΠΎΠ΄Π»ΠΎΠΆΡƒΠ²Π°ΡšΠ΅.

Како Π΄Π° користитС ΠΎΠ΄Π»ΠΎΠΆΠ΅Π½Π° Ρ€Π΅ΠΏΠ»ΠΈΠΊΠ° Π·Π° Π²Ρ€Π°ΡœΠ°ΡšΠ΅ Π½Π° ΠΏΠΎΠ΄Π°Ρ‚ΠΎΡ†ΠΈΡ‚Π΅

Π”Π° Ρ€Π΅Ρ‡Π΅ΠΌΠ΅ Π΄Π΅ΠΊΠ° ΠΈΠΌΠ°ΠΌΠ΅ кластСр Π½Π° Π±Π°Π·Π° Π½Π° ΠΏΠΎΠ΄Π°Ρ‚ΠΎΡ†ΠΈ ΠΈ Ρ€Π΅ΠΏΠ»ΠΈΠΊΠ° со осумчасовно Π΄ΠΎΡ†Π½Π΅ΡšΠ΅ Π²ΠΎ производството. АјдС Π΄Π° Π²ΠΈΠ΄ΠΈΠΌΠ΅ ΠΊΠ°ΠΊΠΎ Π΄Π° Π³ΠΈ Π²Ρ€Π°Ρ‚ΠΈΠΌΠ΅ ΠΏΠΎΠ΄Π°Ρ‚ΠΎΡ†ΠΈΡ‚Π΅ ΠΊΠΎΡ€ΠΈΡΡ‚Π΅Ρ˜ΡœΠΈ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΡΠ»ΡƒΡ‡Π°Ρ˜Π½ΠΎ Π±Ρ€ΠΈΡˆΠ΅ΡšΠ΅ ΠΊΡ€Π°Ρ‚Π΅Π½ΠΊΠΈ.

Кога Π΄ΠΎΠ·Π½Π°Π²ΠΌΠ΅ Π·Π° ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠΎΡ‚, Π½ΠΈΠ΅ Ρ€Π΅ΡΡ‚Π°Π²Ρ€Π°Ρ†ΠΈΡ˜Π°Ρ‚Π° Π½Π° Π°Ρ€Ρ…ΠΈΠ²Π°Ρ‚Π° Π΅ ΠΏΠ°ΡƒΠ·ΠΈΡ€Π°Π½Π° Π·Π° ΠΎΠ΄Π»ΠΎΠΆΠ΅Π½Π° Ρ€Π΅ΠΏΠ»ΠΈΠΊΠ°:

SELECT pg_xlog_replay_pause();

Π‘ΠΎ ΠΏΠ°ΡƒΠ·Π°, Π½Π΅ΠΌΠ°Π²ΠΌΠ΅ Ρ€ΠΈΠ·ΠΈΠΊ Π΄Π΅ΠΊΠ° Ρ€Π΅ΠΏΠ»ΠΈΠΊΠ°Ρ‚Π° ќС Π³ΠΎ ΠΏΠΎΠ²Ρ‚ΠΎΡ€ΠΈ Π±Π°Ρ€Π°ΡšΠ΅Ρ‚ΠΎ DELETE. ΠšΠΎΡ€ΠΈΡΠ½Π° Ρ€Π°Π±ΠΎΡ‚Π° Π°ΠΊΠΎ Π²ΠΈ Ρ‚Ρ€Π΅Π±Π° Π²Ρ€Π΅ΠΌΠ΅ Π΄Π° сфатитС сè.

ΠŸΠΎΠ΅Π½Ρ‚Π°Ρ‚Π° Π΅ Π΄Π΅ΠΊΠ° ΠΎΠ΄Π»ΠΎΠΆΠ΅Π½Π°Ρ‚Π° Ρ€Π΅ΠΏΠ»ΠΈΠΊΠ° ΠΌΠΎΡ€Π° Π΄Π° стигнС Π΄ΠΎ ΠΌΠΎΠΌΠ΅Π½Ρ‚ΠΎΡ‚ ΠΏΡ€Π΅Π΄ Π±Π°Ρ€Π°ΡšΠ΅Ρ‚ΠΎ DELETE. ΠŸΡ€ΠΈΠ±Π»ΠΈΠΆΠ½ΠΎ Π³ΠΎ Π·Π½Π°Π΅Π²ΠΌΠ΅ Ρ„ΠΈΠ·ΠΈΡ‡ΠΊΠΎΡ‚ΠΎ Π²Ρ€Π΅ΠΌΠ΅ Π½Π° ΠΎΡ‚ΡΡ‚Ρ€Π°Π½ΡƒΠ²Π°ΡšΠ΅. Π˜Π·Π±Ρ€ΠΈΡˆΠ°Π²ΠΌΠ΅ recovery_min_apply_delay ΠΈ Π΄ΠΎΠ΄Π°Π΄Π΅ recovery_target_time Π² recovery.conf. Π•Π²Π΅ ΠΊΠ°ΠΊΠΎ Ρ€Π΅ΠΏΠ»ΠΈΠΊΠ°Ρ‚Π° стигнува Π²ΠΎ вистинскиот ΠΌΠΎΠΌΠ΅Π½Ρ‚ Π±Π΅Π· одлагањС:

recovery_target_time = '2018-10-12 09:25:00+00'

Π‘ΠΎ врСмСнски ΠΏΠ΅Ρ‡Π°Ρ‚ΠΈ, ΠΏΠΎΠ΄ΠΎΠ±Ρ€ΠΎ Π΅ Π΄Π° сС Π½Π°ΠΌΠ°Π»ΠΈ Π²ΠΈΡˆΠΎΠΊΠΎΡ‚ Π·Π° Π΄Π° Π½Π΅ сС ΠΏΡ€ΠΎΠΏΡƒΡˆΡ‚ΠΈ. Π’ΠΎΡ‡Π½ΠΎ, ΠΊΠΎΠ»ΠΊΡƒ Π΅ ΠΏΠΎΠ³ΠΎΠ»Π΅ΠΌΠΎ Π½Π°ΠΌΠ°Π»ΡƒΠ²Π°ΡšΠ΅Ρ‚ΠΎ, Ρ‚ΠΎΠ»ΠΊΡƒ повСќС ΠΏΠΎΠ΄Π°Ρ‚ΠΎΡ†ΠΈ Π³ΡƒΠ±ΠΈΠΌΠ΅. ΠŸΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎ, Π°ΠΊΠΎ Π³ΠΎ ΠΏΡ€ΠΎΠΏΡƒΡˆΡ‚ΠΈΠΌΠ΅ Π±Π°Ρ€Π°ΡšΠ΅Ρ‚ΠΎ DELETE, сè ќС Π±ΠΈΠ΄Π΅ ΠΈΠ·Π±Ρ€ΠΈΡˆΠ°Π½ΠΎ ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎ ΠΈ ќС ΠΌΠΎΡ€Π° Π΄Π° Π·Π°ΠΏΠΎΡ‡Π½Π΅Ρ‚Π΅ ΠΎΠ΄Π½ΠΎΠ²ΠΎ (ΠΈΠ»ΠΈ Π΄ΡƒΡ€ΠΈ ΠΈ Π΄Π° Π½Π°ΠΏΡ€Π°Π²ΠΈΡ‚Π΅ Π»Π°Π΄Π½Π° Ρ€Π΅Π·Π΅Ρ€Π²Π½Π° копија Π·Π° PITR).

Π“ΠΎ рСстартиравмС ΠΎΠ΄Π»ΠΎΠΆΠ΅Π½ΠΈΠΎΡ‚ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠΊ Π½Π° Postgres ΠΈ сСгмСнтитС WAL сС ΠΏΠΎΠ²Ρ‚ΠΎΡ€ΡƒΠ²Π°Π° Π΄ΠΎ ΠΎΠ΄Ρ€Π΅Π΄Π΅Π½ΠΎΡ‚ΠΎ Π²Ρ€Π΅ΠΌΠ΅. ΠœΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° Π³ΠΎ слСдитС Π½Π°ΠΏΡ€Π΅Π΄ΠΎΠΊΠΎΡ‚ Π²ΠΎ ΠΎΠ²Π°Π° Ρ„Π°Π·Π° ΠΏΡ€Π°ΡˆΡƒΠ²Π°Ρ˜ΡœΠΈ:

SELECT
  -- current location in WAL
  pg_last_xlog_replay_location(),
  -- current transaction timestamp (state of the replica)
  pg_last_xact_replay_timestamp(),
  -- current physical time
  now(),
  -- the amount of time still to be applied until recovery_target_time has been reached
  '2018-10-12 09:25:00+00'::timestamptz - pg_last_xact_replay_timestamp() as delay;

Ако врСмСнскиот ΠΏΠ΅Ρ‡Π°Ρ‚ повСќС Π½Π΅ сС ΠΌΠ΅Π½ΡƒΠ²Π°, ΠΎΠ±Π½ΠΎΠ²ΡƒΠ²Π°ΡšΠ΅Ρ‚ΠΎ Π΅ Π·Π°Π²Ρ€ΡˆΠ΅Π½ΠΎ. ΠΠΊΡ†ΠΈΡ˜Π°Ρ‚Π° ΠΌΠΎΠΆΠ΅ Π΄Π° сС ΠΏΡ€ΠΈΠ»Π°Π³ΠΎΠ΄ΠΈ recovery_target_actionΠ·Π° Π·Π°Ρ‚Π²ΠΎΡ€Π°ΡšΠ΅, ΠΏΡ€ΠΎΠΌΠΎΠ²ΠΈΡ€Π°ΡšΠ΅ ΠΈΠ»ΠΈ ΠΏΠ°ΡƒΠ·ΠΈΡ€Π°ΡšΠ΅ Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠΊΠΎΡ‚ ΠΏΠΎ ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎΡ‚ΠΎ ΠΎΠ±ΠΈΠ΄ (стандардно Π΅ суспСндиран).

Π‘Π°Π·Π°Ρ‚Π° Π½Π° ΠΏΠΎΠ΄Π°Ρ‚ΠΎΡ†ΠΈ сС Π²Ρ€Π°Ρ‚ΠΈ Π²ΠΎ ΡΠ²ΠΎΡ˜Π°Ρ‚Π° ΡΠΎΡΡ‚ΠΎΡ˜Π±Π° ΠΏΡ€Π΅Π΄ Ρ‚ΠΎΠ° Π½Π΅ΡΡ€Π΅ΡœΠ½ΠΎ Π±Π°Ρ€Π°ΡšΠ΅. Π‘Π΅Π³Π° ΠΌΠΎΠΆΠ΅Ρ‚Π΅, Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π΄Π° ΠΈΠ·Π²Π΅Π·ΡƒΠ²Π°Ρ‚Π΅ ΠΏΠΎΠ΄Π°Ρ‚ΠΎΡ†ΠΈ. Π“ΠΈ ΠΈΠ·Π²Π΅Π·ΠΎΠ²ΠΌΠ΅ ΠΈΠ·Π±Ρ€ΠΈΡˆΠ°Π½ΠΈΡ‚Π΅ ΠΏΠΎΠ΄Π°Ρ‚ΠΎΡ†ΠΈ Π·Π° Π΅Ρ‚ΠΈΠΊΠ΅Ρ‚Π°Ρ‚Π° ΠΈ ситС врски Π΄ΠΎ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠΈ ΠΈ Π±Π°Ρ€Π°ΡšΠ° Π·Π° ΡΠΏΠΎΡ˜ΡƒΠ²Π°ΡšΠ΅ ΠΈ Π³ΠΈ прСмСстивмС Π²ΠΎ Π±Π°Π·Π°Ρ‚Π° Π½Π° ΠΏΠΎΠ΄Π°Ρ‚ΠΎΡ†ΠΈ Π·Π° производство. Ако Π·Π°Π³ΡƒΠ±ΠΈΡ‚Π΅ сС Π³ΠΎΠ»Π΅ΠΌΠΈ, ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Сдноставно Π΄Π° ја ΠΏΡ€ΠΎΠΌΠΎΠ²ΠΈΡ€Π°Ρ‚Π΅ Ρ€Π΅ΠΏΠ»ΠΈΠΊΠ°Ρ‚Π° ΠΈ Π΄Π° ја користитС ΠΊΠ°ΠΊΠΎ Π³Π»Π°Π²Π½Π°. Но, Ρ‚ΠΎΠ³Π°Ρˆ ситС ΠΏΡ€ΠΎΠΌΠ΅Π½ΠΈ ΠΏΠΎ Ρ‚ΠΎΡ‡ΠΊΠ°Ρ‚Π° Π΄ΠΎ која сС ΠΎΠΏΠΎΡ€Π°Π²ΠΈΠ²ΠΌΠ΅ ќС Π±ΠΈΠ΄Π°Ρ‚ ΠΈΠ·Π³ΡƒΠ±Π΅Π½ΠΈ.

НамСсто врСмСнски ΠΏΠ΅Ρ‡Π°Ρ‚ΠΈ, ΠΏΠΎΠ΄ΠΎΠ±Ρ€ΠΎ Π΅ Π΄Π° користитС ID Π½Π° трансакции. ΠšΠΎΡ€ΠΈΡΠ½ΠΎ Π΅ Π΄Π° сС снимаат ΠΎΠ²ΠΈΠ΅ ID, Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π·Π° DDL изјави (ΠΊΠ°ΠΊΠΎ Π½Π° ΠΏΡ€ DROP TABLE), со ΠΊΠΎΡ€ΠΈΡΡ‚Π΅ΡšΠ΅ Π½Π° log_statements = 'ddl'. Π”Π° ΠΈΠΌΠ°Π²ΠΌΠ΅ Π»ΠΈΡ‡Π½Π° ΠΊΠ°Ρ€Ρ‚Π° Π·Π° Ρ‚Ρ€Π°Π½ΡΠ°ΠΊΡ†ΠΈΡ˜Π°, ќС Π·Π΅ΠΌΠ΅Π²ΠΌΠ΅ recovery_target_xid ΠΈ истрча сè Π΄ΠΎ Ρ‚Ρ€Π°Π½ΡΠ°ΠΊΡ†ΠΈΡ˜Π°Ρ‚Π° ΠΏΡ€Π΅Π΄ Π±Π°Ρ€Π°ΡšΠ΅Ρ‚ΠΎ DELETE.

Π’Ρ€Π°ΡœΠ°ΡšΠ΅Ρ‚ΠΎ Π½Π° Ρ€Π°Π±ΠΎΡ‚Π° Π΅ ΠΌΠ½ΠΎΠ³Ρƒ Сдноставно: отстранСтС Π³ΠΈ ситС ΠΏΡ€ΠΎΠΌΠ΅Π½ΠΈ ΠΎΠ΄ recovery.conf ΠΈ Ρ€Π΅ΡΡ‚Π°Ρ€Ρ‚ΠΈΡ€Π°Ρ˜Ρ‚Π΅ Π³ΠΎ Postgres. Π Π΅ΠΏΠ»ΠΈΠΊΠ°Ρ‚Π° наскоро ќС ΠΈΠΌΠ° ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎ Π΄ΠΎΡ†Π½Π΅ΡšΠ΅ ΠΎΠ΄ осум часа, Π° Π½ΠΈΠ΅ смС ΠΏΠΎΠ΄Π³ΠΎΡ‚Π²Π΅Π½ΠΈ Π·Π° ΠΈΠ΄Π½ΠΈ нСволји.

ΠŸΡ€ΠΈΠ΄ΠΎΠ±ΠΈΠ²ΠΊΠΈ Π·Π° Π·Π°ΠΊΡ€Π΅ΠΏΠ½ΡƒΠ²Π°ΡšΠ΅

Π‘ΠΎ ΠΎΠ΄Π»ΠΎΠΆΠ΅Π½Π° Ρ€Π΅ΠΏΠ»ΠΈΠΊΠ° намСсто Π»Π°Π΄Π½Π° Ρ€Π΅Π·Π΅Ρ€Π²Π½Π° копија, Π½Π΅ ΠΌΠΎΡ€Π° Π΄Π° Ρ‚Ρ€ΠΎΡˆΠΈΡ‚Π΅ часови Π·Π° Π΄Π° ја Π²Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Ρ†Π΅Π»Π°Ρ‚Π° слика ΠΎΠ΄ Π°Ρ€Ρ…ΠΈΠ²Π°Ρ‚Π°. На ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π½ΠΈ Ρ‚Ρ€Π΅Π±Π°Π°Ρ‚ ΠΏΠ΅Ρ‚ часа Π·Π° Π΄Π° ја Π΄ΠΎΠ±ΠΈΠ΅ΠΌΠ΅ Ρ†Π΅Π»Π°Ρ‚Π° основна Ρ€Π΅Π·Π΅Ρ€Π²Π½Π° копија ΠΎΠ΄ 2 TB. И Ρ‚ΠΎΠ³Π°Ρˆ сè ΡƒΡˆΡ‚Π΅ Ρ‚Ρ€Π΅Π±Π° Π΄Π° Π³ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΡ‚Π΅ Ρ†Π΅Π»ΠΈΠΎΡ‚ Π΄Π½Π΅Π²Π΅Π½ WAL Π·Π° Π΄Π° сС Π²Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²ΠΎ посакуваната ΡΠΎΡΡ‚ΠΎΡ˜Π±Π° (Π²ΠΎ најлош ΡΠ»ΡƒΡ‡Π°Ρ˜).

ΠžΠ΄Π»ΠΎΠΆΠ΅Π½Π°Ρ‚Π° Ρ€Π΅ΠΏΠ»ΠΈΠΊΠ° Π΅ ΠΏΠΎΠ΄ΠΎΠ±Ρ€Π° ΠΎΠ΄ Π»Π°Π΄Π½Π° Ρ€Π΅Π·Π΅Ρ€Π²Π½Π° копија Π½Π° Π΄Π²Π° Π½Π°Ρ‡ΠΈΠ½Π°:

  1. НСма ΠΏΠΎΡ‚Ρ€Π΅Π±Π° Π΄Π° сС отстрани Ρ†Π΅Π»Π°Ρ‚Π° основна Ρ€Π΅Π·Π΅Ρ€Π²Π½Π° копија ΠΎΠ΄ Π°Ρ€Ρ…ΠΈΠ²Π°Ρ‚Π°.
  2. Има фиксСн осумчасовСн ΠΏΡ€ΠΎΠ·ΠΎΡ€Π΅Ρ† Π½Π° WAL сСгмСнти кој ΠΌΠΎΡ€Π° Π΄Π° сС ΠΏΠΎΠ²Ρ‚ΠΎΡ€ΠΈ.

Π˜ΡΡ‚ΠΎ Ρ‚Π°ΠΊΠ°, ΠΏΠΎΡΡ‚ΠΎΡ˜Π°Π½ΠΎ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡƒΠ²Π°ΠΌΠ΅ Π΄Π°Π»ΠΈ Π΅ ΠΌΠΎΠΆΠ½ΠΎ Π΄Π° сС Π½Π°ΠΏΡ€Π°Π²ΠΈ PITR ΠΎΠ΄ WAL ΠΈ Π±Ρ€Π·ΠΎ Π±ΠΈ Π·Π°Π±Π΅Π»Π΅ΠΆΠ°Π»Π΅ ΠΊΠΎΡ€ΡƒΠΏΡ†ΠΈΡ˜Π° ΠΈΠ»ΠΈ Π΄Ρ€ΡƒΠ³ΠΈ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠΈ со Π°Ρ€Ρ…ΠΈΠ²Π°Ρ‚Π° Π½Π° WAL со слСдСњС Π½Π° Π·Π°Π΄ΠΎΡ†Π½ΡƒΠ²Π°ΡšΠ΅Ρ‚ΠΎ Π½Π° ΠΎΠ΄Π»ΠΎΠΆΠ΅Π½Π°Ρ‚Π° Ρ€Π΅ΠΏΠ»ΠΈΠΊΠ°.

Π’ΠΎ овој ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π½ΠΈ Ρ‚Ρ€Π΅Π±Π°Π° 50 ΠΌΠΈΠ½ΡƒΡ‚ΠΈ Π·Π° Π²Ρ€Π°ΡœΠ°ΡšΠ΅, ΡˆΡ‚ΠΎ Π·Π½Π°Ρ‡ΠΈ Π΄Π΅ΠΊΠ° Π±Ρ€Π·ΠΈΠ½Π°Ρ‚Π° бСшС 110 GB WAL ΠΏΠΎΠ΄Π°Ρ‚ΠΎΡ†ΠΈ Π½Π° час (Π°Ρ€Ρ…ΠΈΠ²Π°Ρ‚Π° сè ΡƒΡˆΡ‚Π΅ бСшС Π²ΠΊΠ»ΡƒΡ‡Π΅Π½Π° AWS S3). Π‘Π΅Π²ΠΊΡƒΠΏΠ½ΠΎ, Π³ΠΎ Ρ€Π΅ΡˆΠΈΠ²ΠΌΠ΅ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠΎΡ‚ ΠΈ Π³ΠΈ Π²Ρ€Π°Ρ‚ΠΈΠ²ΠΌΠ΅ ΠΏΠΎΠ΄Π°Ρ‚ΠΎΡ†ΠΈΡ‚Π΅ Π·Π° 1,5 часа.

Π Π΅Π·ΡƒΠ»Ρ‚Π°Ρ‚ΠΈ: ΠΊΠ°Π΄Π΅ Π΅ корисна ΠΎΠ΄Π»ΠΎΠΆΠ΅Π½Π°Ρ‚Π° Ρ€Π΅ΠΏΠ»ΠΈΠΊΠ° (Π° ΠΊΠ°Π΄Π΅ Π½Π΅ Π΅)

ΠšΠΎΡ€ΠΈΡΡ‚Π΅Ρ‚Π΅ Π·Π°Π΄ΠΎΡ†Π½Π΅Ρ‚Π° Ρ€Π΅ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΡ˜Π° ΠΊΠ°ΠΊΠΎ ΠΏΡ€Π²Π° помош Π°ΠΊΠΎ ΡΠ»ΡƒΡ‡Π°Ρ˜Π½ΠΎ стС ΠΈΠ·Π³ΡƒΠ±ΠΈΠ»Π΅ ΠΏΠΎΠ΄Π°Ρ‚ΠΎΡ†ΠΈ ΠΈ стС Π³ΠΎ Π·Π°Π±Π΅Π»Π΅ΠΆΠ°Π»Π΅ овој ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ Π²ΠΎ Ρ€Π°ΠΌΠΊΠΈΡ‚Π΅ Π½Π° ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€ΠΈΡ€Π°Π½ΠΎΡ‚ΠΎ Π΄ΠΎΡ†Π½Π΅ΡšΠ΅.

Но, ΠΈΠΌΠ°Ρ˜Ρ‚Π΅ Π½Π° ΡƒΠΌ: Ρ€Π΅ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΡ˜Π°Ρ‚Π° Π½Π΅ Π΅ Ρ€Π΅Π·Π΅Ρ€Π²Π½Π° копија.

Π Π΅Π·Π΅Ρ€Π²Π½Π°Ρ‚Π° копија ΠΈ Ρ€Π΅ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΡ˜Π°Ρ‚Π° ΠΈΠΌΠ°Π°Ρ‚ Ρ€Π°Π·Π»ΠΈΡ‡Π½ΠΈ Ρ†Π΅Π»ΠΈ. Π›Π°Π΄Π½Π° Ρ€Π΅Π·Π΅Ρ€Π²Π½Π° копија ќС Π²ΠΈ ΠΏΠΎΠΌΠΎΠ³Π½Π΅ Π°ΠΊΠΎ ΡΠ»ΡƒΡ‡Π°Ρ˜Π½ΠΎ стС ја Π½Π°ΠΏΡ€Π°Π²ΠΈΠ»Π΅ DELETE ΠΈΠ»ΠΈ DROP TABLE. ΠŸΡ€Π°Π²ΠΈΠΌΠ΅ Ρ€Π΅Π·Π΅Ρ€Π²Π½Π° копија ΠΎΠ΄ Π»Π°Π΄ΠΈΠ»Π½ΠΈΠΊΠΎΡ‚ ΠΈ ја Π²Ρ€Π°ΡœΠ°ΠΌΠ΅ ΠΏΡ€Π΅Ρ‚Ρ…ΠΎΠ΄Π½Π°Ρ‚Π° ΡΠΎΡΡ‚ΠΎΡ˜Π±Π° Π½Π° Ρ‚Π°Π±Π΅Π»Π°Ρ‚Π° ΠΈΠ»ΠΈ Ρ†Π΅Π»Π°Ρ‚Π° Π±Π°Π·Π° Π½Π° ΠΏΠΎΠ΄Π°Ρ‚ΠΎΡ†ΠΈ. Но Π²ΠΎ исто Π²Ρ€Π΅ΠΌΠ΅ ΠΈ Π±Π°Ρ€Π°ΡšΠ΅Ρ‚ΠΎ DROP TABLE РСчиси вСднаш сС Ρ€Π΅ΠΏΡ€ΠΎΠ΄ΡƒΡ†ΠΈΡ€Π° Π²ΠΎ ситС Ρ€Π΅ΠΏΠ»ΠΈΠΊΠΈ Π½Π° Ρ€Π°Π±ΠΎΡ‚Π½ΠΈΠΎΡ‚ кластСр, Ρ‚Π°ΠΊΠ° ΡˆΡ‚ΠΎ ΠΎΠ±ΠΈΡ‡Π½Π°Ρ‚Π° Ρ€Π΅ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΡ˜Π° Π½Π΅ΠΌΠ° Π΄Π° ΠΏΠΎΠΌΠΎΠ³Π½Π΅ ΠΎΠ²Π΄Π΅. Π‘Π°ΠΌΠ°Ρ‚Π° Ρ€Π΅ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΡ˜Π° ја ΠΎΠ΄Ρ€ΠΆΡƒΠ²Π° Π±Π°Π·Π°Ρ‚Π° Π½Π° ΠΏΠΎΠ΄Π°Ρ‚ΠΎΡ†ΠΈ достапна ΠΊΠΎΠ³Π° сС ΠΈΠ·Π΄Π°Π²Π°Π°Ρ‚ ΠΏΠΎΠ΅Π΄ΠΈΠ½Π΅Ρ‡Π½ΠΈ сСрвСри ΠΈ Π³ΠΎ дистрибуира Ρ‚ΠΎΠ²Π°Ρ€ΠΎΡ‚.

Π”ΡƒΡ€ΠΈ ΠΈ со ΠΎΠ΄Π»ΠΎΠΆΠ΅Π½Π° Ρ€Π΅ΠΏΠ»ΠΈΠΊΠ°, понСкогаш навистина Π½ΠΈ Ρ‚Ρ€Π΅Π±Π° Π»Π°Π΄Π½Π° Ρ€Π΅Π·Π΅Ρ€Π²Π½Π° копија Π½Π° Π±Π΅Π·Π±Π΅Π΄Π½ΠΎ мСсто Π°ΠΊΠΎ сС појави Π΄Π΅Ρ„Π΅ΠΊΡ‚ Π½Π° Ρ†Π΅Π½Ρ‚Π°Ρ€ΠΎΡ‚ Π·Π° ΠΏΠΎΠ΄Π°Ρ‚ΠΎΡ†ΠΈ, скриСно ΠΎΡˆΡ‚Π΅Ρ‚ΡƒΠ²Π°ΡšΠ΅ ΠΈΠ»ΠΈ Π΄Ρ€ΡƒΠ³ΠΈ настани ΡˆΡ‚ΠΎ Π½Π΅ сС вСднаш Π·Π°Π±Π΅Π»Π΅ΠΆΠ»ΠΈΠ²ΠΈ. Π‘Π°ΠΌΠΎ Ρ€Π΅ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΡ˜Π°Ρ‚Π° Π½Π΅ΠΌΠ° Π½ΠΈΠΊΠ°ΠΊΠ²Π° корист ΠΎΠ²Π΄Π΅.

Π˜ΠΌΠ°Ρ˜Ρ‚Π΅ Π½Π° ΡƒΠΌ. На GitLab.com Π’ΠΎ ΠΌΠΎΠΌΠ΅Π½Ρ‚ΠΎΠ² Π·Π°ΡˆΡ‚ΠΈΡ‚ΡƒΠ²Π°ΠΌΠ΅ ΠΎΠ΄ Π³ΡƒΠ±Π΅ΡšΠ΅ ΠΏΠΎΠ΄Π°Ρ‚ΠΎΡ†ΠΈ само Π½Π° систСмско Π½ΠΈΠ²ΠΎ ΠΈ Π½Π΅ Π³ΠΈ ΠΎΠ±Π½ΠΎΠ²ΡƒΠ²Π°ΠΌΠ΅ ΠΏΠΎΠ΄Π°Ρ‚ΠΎΡ†ΠΈΡ‚Π΅ Π½Π° корисничко Π½ΠΈΠ²ΠΎ.

Π˜Π·Π²ΠΎΡ€: www.habr.com

Π”ΠΎΠ΄Π°Π΄Π΅Ρ‚Π΅ ΠΊΠΎΠΌΠ΅Π½Ρ‚Π°Ρ€