ื•ื•ื™ ืžื™ืจ ื’ืขื•ื•ื™ื™ื ื˜ ื“ื™ืœื™ื™ื“ ืจืขืคึผืœืึทืงื™ื™ืฉืึทืŸ ืคึฟืึทืจ ื•ืžื’ืœื™ืง ืึธืคึผื–ื•ืš ืžื™ื˜ PostgreSQL

ื•ื•ื™ ืžื™ืจ ื’ืขื•ื•ื™ื™ื ื˜ ื“ื™ืœื™ื™ื“ ืจืขืคึผืœืึทืงื™ื™ืฉืึทืŸ ืคึฟืึทืจ ื•ืžื’ืœื™ืง ืึธืคึผื–ื•ืš ืžื™ื˜ PostgreSQL
ืจืขืคึผืœืึทืงื™ื™ืฉืึทืŸ ืื™ื– ื ื™ืฉื˜ ื‘ืึทืงืึทืคึผ. ืื“ืขืจ ื ื™ืฉื˜? ื“ืึธ ืก ื•ื•ื™ ืžื™ืจ ื’ืขื•ื•ื™ื™ื ื˜ ื“ื™ืคืขืจื“ ืจืขืคึผืœืึทืงื™ื™ืฉืึทืŸ ืฆื• ืฆื•ืจื™ืงืงืจื™ื’ืŸ ืคื•ืŸ ืึทืงืกืึทื“ืขื ืึทืœื™ ื“ื™ืœื™ื˜ื™ื ื’ ืฉืึธืจื˜ืงืึทืฅ.

ื™ื ืคืจืึทืกื˜ืจืึทืงื˜ืฉืขืจ ืกืคึผืขืฉืึทืœืึทืกืฅ GitLab ืื™ื– ืคืึทืจืึทื ื˜ื•ื•ืึธืจื˜ืœืขืš ืคึฟืึทืจ ื“ื™ ืึทืจื‘ืขื˜ GitLab.com - ื“ืขืจ ื’ืจืขืกื˜ืขืจ GitLab ื‘ื™ื™ึทืฉืคึผื™ืœ ืื™ืŸ ื ืึทื˜ื•ืจ. ืžื™ื˜ 3 ืžื™ืœื™ืึธืŸ ื™ื•ื–ืขืจื– ืื•ืŸ ืงื™ืžืึทื˜ 7 ืžื™ืœื™ืึธืŸ ืคึผืจืึทื“ื–ืฉืขืงืก, ืขืก ืื™ื– ืื™ื™ื ืขืจ ืคื•ืŸ ื“ื™ ื’ืจืขืกื˜ืŸ ืึธืคึฟืŸ ืžืงื•ืจ ืกืึทืึทืก ื–ื™ื™ื˜ืœืขืš ืžื™ื˜ ืึท ื“ืขื“ืึทืงื™ื™ื˜ืึทื“ ืึทืจืงืึทื˜ืขืงื˜ืฉืขืจ. ืึธืŸ ื“ื™ PostgreSQL ื“ืึทื˜ืึทื‘ื™ื™ืก ืกื™ืกื˜ืขื, ื“ื™ GitLab.com ื™ื ืคืจืึทืกื˜ืจืึทืงื˜ืฉืขืจ ื•ื•ืขื˜ ื ื™ืฉื˜ ื’ื™ื™ืŸ ื•ื•ื™ื™ึทื˜, ืื•ืŸ ื•ื•ืึธืก ืžื™ืจ ื˜ืึธืŸ ืฆื• ืขื ืฉื•ืจ ืฉื•ืœื“ ื˜ืึธืœืขืจืึทื ืฅ ืื™ืŸ ืคืึทืœ ืคื•ืŸ ืคื™ื™ืœื™ืขืจื– ื•ื•ืขืŸ ื“ืึทื˜ืŸ ืงืขื ืขืŸ ื–ื™ื™ืŸ ืคืึทืจืคืึทืœืŸ. ืขืก ืื™ื– ืึทื ืœื™ื™ืงืœื™ ืึทื– ืึทื–ืึท ืึท ื•ืžื’ืœื™ืง ื•ื•ืขื˜ ืคึผืึทืกื™ืจืŸ, ืึธื‘ืขืจ ืžื™ืจ ื–ืขื ืขืŸ ื’ืขื–ื•ื ื˜ ืฆื•ื’ืขื’ืจื™ื™ื˜ ืื•ืŸ ืกื˜ืึธืจื“ ืžื™ื˜ ืคืึทืจืฉื™ื“ืŸ ื‘ืึทืงืึทืคึผ ืื•ืŸ ืจืขืคึผืœืึทืงื™ื™ืฉืึทืŸ ืžืขืงืึทื ื™ื–ืึทืžื–.

ืจืขืคึผืœืึทืงื™ื™ืฉืึทืŸ ืื™ื– ื ื™ืฉื˜ ืึท ืžื™ื˜ืœ ืคื•ืŸ ื‘ืึทืงื™ื ื’ ืึทืจื•ื™ืฃ ื“ืึทื˜ืึทื‘ื™ื™ืกื™ื– (ื–ืข ืื•ื ื˜ืŸ). ืึธื‘ืขืจ ืื™ืฆื˜ ืžื™ืจ ื•ื•ืขืœืŸ ื–ืขืŸ ื•ื•ื™ ืฆื• ื’ืขืฉื•ื•ื™ื ื“ ืฆื•ืจื™ืงืงืจื™ื’ืŸ ืึทืงืกืึทื“ืขื ืึทืœื™ ืื•ื™ืกื’ืขืžืขืงื˜ ื“ืึทื˜ืŸ ื ื™ืฆืŸ ืคื•ื™ืœ ืจืขืคึผืœืึทืงื™ื™ืฉืึทืŸ: ืื•ื™ืฃ GitLab.com ื‘ืึทื ื™ืฆืขืจ ืื•ื™ืกื’ืขืžืขืงื˜ ื“ื™ ื“ื•ืจื›ื•ื•ืขื’ ืคึฟืึทืจ ื“ื™ ืคึผืจื•ื™ืขืงื˜ gitlab-ce ืื•ืŸ ืคืึทืจืคืึทืœืŸ ืงืึทื ืขืงืฉืึทื ื– ืžื™ื˜ ืฆื•ื ื•ื™ืคื’ื™ืกืŸ ืจื™ืงื•ื•ืขืก ืื•ืŸ ื˜ืึทืกืงืก.

ืžื™ื˜ ืึท ื“ื™ืคืขืจื“ ืจืขืคึผืœื™ืงืข, ืžื™ืจ ืจื™ืงืึทื•ื•ืขืจื“ ื“ืึทื˜ืŸ ืื™ืŸ ื‘ืœื•ื™ื– 1,5 ืฉืขื”. ืงื•ืง ื•ื•ื™ ืขืก ื’ืขื˜ืจืืคืŸ.

ืฆื™ื™ื˜ ืึธืคึผื–ื•ืš ืžื™ื˜ PostgreSQL

PostgreSQL ื”ืื˜ ืึท ื’ืขื‘ื•ื™ื˜-ืื™ืŸ ืคื•ื ืงืฆื™ืข ื•ื•ืึธืก ืจื™ืกื˜ืึธืจื– ื“ื™ ืฉื˜ืึทื˜ ืคื•ืŸ ืึท ื“ืึทื˜ืึทื‘ื™ื™ืก ืฆื• ืึท ืกืคึผืขืฆื™ืคื™ืฉ ืคื•ื ื˜ ืื™ืŸ ืฆื™ื™ื˜. ืขืก ืื™ื– ื’ืขืจื•ืคืŸ ืคื•ื ื˜-ืื™ืŸ-ืฆื™ื™ื˜ ืจืขืงืึธื•ื•ืขืจื™ (PITR) ืื•ืŸ ื ื™ืฆื˜ ื“ื™ ื–ืขืœื‘ืข ืžืขืงืึทื ื™ื–ืึทืžื– ื•ื•ืึธืก ื”ืึทืœื˜ืŸ ื“ื™ ืจืขืคึผืœื™ืงืข ื“ืขืจื”ื™ื™ึทื ื˜ื™ืงื˜: ืกื˜ืึทืจื˜ื™ื ื’ ืžื™ื˜ ืึท ืคืึทืจืœืึธื–ืœืขืš ืžืึธืžืขื ื˜ื‘ื™ืœื“ ืคื•ืŸ ื“ื™ ื’ืื ืฆืข ื“ืึทื˜ืึทื‘ื™ื™ืก ืงื ื•ื™ืœ (ื‘ืึทื–ืข ื‘ืึทืงืึทืคึผ), ืžื™ืจ ืฆื•ืœื™ื™ื’ืŸ ืึท ืกืขืจื™ืข ืคื•ืŸ โ€‹โ€‹ืฉื˜ืึทื˜ ืขื ื“ืขืจื•ื ื’ืขืŸ ื‘ื™ื– ืึท ื–ื™ื›ืขืจ ืคื•ื ื˜ ืื™ืŸ ืฆื™ื™ื˜.

ืฆื• ื ื•ืฆืŸ ื“ืขื ืฉื˜ืจื™ืš ืคึฟืึทืจ ืงืึทืœื˜ ื‘ืึทืงืึทืคึผ, ืžื™ืจ ืงืขืกื™ื™ื“ืขืจ ืžืึทื›ืŸ ืึท ื™ืงืขืจื“ื™ืง ื“ืึทื˜ืึทื‘ื™ื™ืก ื‘ืึทืงืึทืคึผ ืื•ืŸ ืงืจืึธื ืขืก ืื™ืŸ ืึทืŸ ืึทืจืงื™ื™ื•ื• (ื’ื™ื˜ืœืึทื‘ ืึทืจืงื™ื™ื•ื•ื– ืœืขื‘ืŸ ืื™ืŸ 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-e ืฆื• ืขืงืกื˜ืจืึทืงื˜ 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ืฆื• ืคืึทืจืžืึทื›ืŸ, ื”ืขื›ืขืจืŸ ืึธื“ืขืจ ืคึผื•ื™ื–ืข ื“ืขื ื‘ื™ื™ึทืฉืคึผื™ืœ ื ืึธืš ืคึผืจื•ื‘ื™ืจืŸ (ืขืก ืื™ื– ืกื•ืกืคึผืขื ื“ืขื“ ื“ื•ืจืš ืคืขืœื™ืงื™ื™ึทื˜).

ื“ื™ ื“ืึทื˜ืึทื‘ื™ื™ืก ื”ืึธื˜ ื–ื™ืš ืื•ืžื’ืขืงืขืจื˜ ืฆื• ื–ื™ื™ืŸ ืฉื˜ืึทื˜ ืื™ื™ื“ืขืจ ื“ื™ ื ืขื‘ืขืš ื‘ืขื˜ืŸ. ืื™ืฆื˜ ืื™ืจ ืงืขื ืขืŸ, ืœืžืฉืœ, ืึทืจื•ื™ืกืคื™ืจืŸ ื“ืึทื˜ืŸ. ืžื™ืจ ื™ืงืกืคึผืึธืจื˜ืึทื“ ื“ื™ ืื•ื™ืกื’ืขืžืขืงื˜ ืคื™ืจืžืข ื“ืึทื˜ืŸ ืื•ืŸ ืึทืœืข ืคึฟืึทืจื‘ื™ื ื“ื•ื ื’ืขืŸ ืฆื• ื™ืฉื•ื– ืื•ืŸ ืฆื•ื ื•ื™ืคื’ื™ืกืŸ ืจื™ืงื•ื•ืขืก ืื•ืŸ ืืจื™ื‘ืขืจื’ืขืคืืจืŸ ื–ื™ื™ ืื™ืŸ ื“ื™ ืคึผืจืึธื“ื•ืงืฆื™ืข ื“ืึทื˜ืึทื‘ื™ื™ืก. ืื•ื™ื‘ ื“ื™ ืœืึธืกืกืขืก ื–ืขื ืขืŸ ื’ืจื•ื™ืก, ืื™ืจ ืงืขื ืขืŸ ืคืฉื•ื˜ ื”ืขื›ืขืจืŸ ื“ื™ ืจืขืคึผืœื™ืงืข ืื•ืŸ ื ื•ืฆืŸ ืขืก ื•ื•ื™ ื“ื™ ื”ื•ื™ืคึผื˜. ืึธื‘ืขืจ ื“ืขืžืึธืœื˜ ืึทืœืข ืขื ื“ืขืจื•ื ื’ืขืŸ ื ืึธืš ื“ื™ ืคื•ื ื˜ ืฆื• ื•ื•ืึธืก ืžื™ืจ ื”ืึธื‘ืŸ ืจื™ืงืึทื•ื•ืขืจื“ ื•ื•ืขื˜ ื–ื™ื™ืŸ ืคืึทืจืคืึทืœืŸ.

ืึทื ืฉื˜ืึธื˜ ืคื•ืŸ ื˜ื™ืžืขืกื˜ืึทืžืคึผืก, ืขืก ืื™ื– ื‘ืขืกืขืจ ืฆื• ื ื•ืฆืŸ ื˜ืจืึทื ืกืึทืงื˜ื™ืึธืŸ ื™ื“ืก. ืขืก ืื™ื– ื ื•ืฆื™ืง ืฆื• ืจืขืงืึธืจื“ื™ืจืŸ ื“ื™ IDs, ืœืžืฉืœ, ืคึฟืึทืจ DDL ืกื˜ื™ื™ื˜ืžืึทื ืฅ (ืึทื–ืึท ื•ื•ื™ DROP TABLE), ื“ื•ืจืš ื ื•ืฆืŸ log_statements = 'ddl'. ืื•ื™ื‘ ืžื™ืจ ื”ืึธื‘ืŸ ืึท ื˜ืจืึทื ืกืึทืงื˜ื™ืึธืŸ ืฉื™ื™ึทืŸ, ืžื™ืจ ื•ื•ืึธืœื˜ ื ืขืžืขืŸ recovery_target_xid ืื•ืŸ ื’ืขืœืืคืŸ ืึทืœืฅ ืึทืจืึธืคึผ ืฆื• ื“ื™ ื˜ืจืึทื ืกืึทืงื˜ื™ืึธืŸ ืื™ื™ื“ืขืจ ื“ื™ ื‘ืงืฉื” DELETE.

ืฆื•ืจื™ืงืงื•ืžืขืŸ ืฆื• ืึทืจื‘ืขื˜ืŸ ืื™ื– ื–ื™ื™ืขืจ ืคึผืฉื•ื˜: ืึทืจืึธืคึผื ืขืžืขืŸ ืึทืœืข ืขื ื“ืขืจื•ื ื’ืขืŸ ืคื•ืŸ recovery.conf ืื•ืŸ ืจื™ืกื˜ืึทืจื˜ Postgres. ื“ื™ ืจืขืคึผืœื™ืงืข ื•ื•ืขื˜ ื‘ืึทืœื“ ื”ืึธื‘ืŸ ืึทืŸ ืึทื›ื˜-ืฉืขื” ืคืึทืจื”ืึทืœื˜ืŸ ื•ื•ื™ื“ืขืจ, ืื•ืŸ ืžื™ืจ ื–ืขื ืขืŸ ืฆื•ื’ืขื’ืจื™ื™ื˜ ืคึฟืึทืจ ืฆื•ืงื•ื ืคึฟื˜ ืงืึธืคึผื“ืจื™ื™ืขื ื™ืฉ.

ืจืขืงืึธื•ื•ืขืจื™ Benefits

ืžื™ื˜ ืึท ื“ื™ืคืขืจื“ ืจืขืคึผืœื™ืงืข ืึทื ืฉื˜ืึธื˜ ืคื•ืŸ ืึท ืงืึทืœื˜ ื‘ืึทืงืึทืคึผ, ืื™ืจ ื˜ืึธืŸ ื ื™ื˜ ื”ืึธื‘ืŸ ืฆื• ืคืึทืจื‘ืจืขื ื’ืขืŸ ืฉืขื” ืฆื• ืจื™ืกื˜ืึธืจื™ื ื’ ื“ื™ ื’ืื ืฆืข ื‘ื™ืœื“ ืคึฟื•ืŸ ื“ืขืจ ืึทืจืงื™ื™ื•ื•. ืคึฟืึทืจ ื‘ื™ื™ึทืฉืคึผื™ืœ, ืขืก ื ืขืžื˜ ืื•ื ื“ื– ืคื™ื ืฃ ืฉืขื” ืฆื• ื‘ืึทืงื•ืžืขืŸ ื“ื™ ื’ืื ืฆืข ื™ืงืขืจื“ื™ืง 2 ื˜ื‘ ื‘ืึทืงืึทืคึผ. ืื•ืŸ ืื™ืจ ื ืึธืš ื”ืึธื‘ืŸ ืฆื• ืฆื•ืœื™ื™ื’ืŸ ื“ื™ ื’ืื ืฆืข ื˜ืขื’ืœืขืš WAL ืฆื• ืฆื•ืจื™ืงืงืจื™ื’ืŸ ืฆื• ื“ืขืจ ื’ืขื•ื•ืืœื˜ ืฉื˜ืึทื˜ (ืื™ืŸ ื“ื™ ืขืจื’ืกื˜ ืคืึทืœ).

ื ื“ื™ืคืขืจื“ ืจืขืคึผืœื™ืงืข ืื™ื– ื‘ืขืกืขืจ ื•ื•ื™ ืึท ืงืึทืœื˜ ื‘ืึทืงืึทืคึผ ืื™ืŸ ืฆื•ื•ื™ื™ ื•ื•ืขื’ืŸ:

  1. ืขืก ืื™ื– ื ื™ื˜ ื“ืึทืจืคึฟืŸ ืฆื• ื‘ืึทื–ื™ื™ึทื˜ื™ืงืŸ ื“ื™ ื’ืื ืฆืข ื™ืงืขืจื“ื™ืง ื‘ืึทืงืึทืคึผ ืคื•ืŸ ื“ื™ ืึทืจืงื™ื™ื•ื•.
  2. ืขืก ืื™ื– ืึท ืคืึทืจืคืขืกื˜ื™ืงื˜ ืึทื›ื˜-ืฉืขื” ืคึฟืขื ืฆื˜ืขืจ ืคื•ืŸ WAL ืกืขื’ืžืึทื ืฅ ื•ื•ืึธืก ืžื•ื–ืŸ ื–ื™ื™ืŸ ืจื™ืคึผื™ื˜ื™ื“.

ืžื™ืจ ืื•ื™ืš ืงืึธื ื˜ืจืึธืœื™ืจืŸ ืงืขืกื™ื™ื“ืขืจ ืฆื• ื–ืขืŸ ืื•ื™ื‘ ืขืก ืื™ื– ืžืขื’ืœืขืš ืฆื• ืžืึทื›ืŸ ืึท PITR ืคึฟื•ืŸ WAL, ืื•ืŸ ืžื™ืจ ื•ื•ืึธืœื˜ ื’ืขืฉื•ื•ื™ื ื“ ื‘ืึทืžืขืจืงืŸ ืงืึธืจื•ืคึผืฆื™ืข ืึธื“ืขืจ ืื ื“ืขืจืข ืคึผืจืึธื‘ืœืขืžืก ืžื™ื˜ ื“ื™ WAL ืึทืจืงื™ื™ื•ื• ื“ื•ืจืš ืžืึธื ื™ื˜ืึธืจื™ื ื’ ื“ื™ ืึธืคึผืฉื˜ื™ื™ ืคื•ืŸ ื“ื™ ื“ื™ืคืขืจื“ ืจืขืคึผืœื™ืงืข.

ืื™ืŸ ื“ืขื ื‘ื™ื™ึทืฉืคึผื™ืœ, ืขืก ื”ืึธื˜ ืื•ื ื“ื– 50 ืžื™ื ื•ื˜ ืฆื• ื•ืžืงืขืจืŸ, ื˜ื™ื™ึทื˜ืฉ ื“ื™ ื’ื™ื›ืงื™ื™ึทื˜ ืื™ื– ื’ืขื•ื•ืขืŸ 110 ื’ื™ื’ืื‘ื™ื™ื˜ ืคื•ืŸ WAL ื“ืึทื˜ืŸ ืคึผืขืจ ืฉืขื” (ื“ืขืจ ืึทืจืงื™ื™ื•ื• ืื™ื– ื ืึธืš ืื•ื™ืฃ ืึทื•ื•ืก ืก 3). ืื™ืŸ ื’ืึทื ืฅ, ืžื™ืจ ืกืึทืœื•ื•ื“ ื“ื™ ืคึผืจืึธื‘ืœืขื ืื•ืŸ ืจื™ืงืึทื•ื•ืขืจื“ ื“ื™ ื“ืึทื˜ืŸ ืื™ืŸ 1,5 ืฉืขื”.

ืจืขื–ื•ืœื˜ืึทื˜ืŸ: ื•ื•ื• ืึท ื“ื™ืคืขืจื“ ืจืขืคึผืœื™ืงืข ืื™ื– ื ื•ืฆื™ืง (ืื•ืŸ ื•ื•ื• ืขืก ืื™ื– ื ื™ืฉื˜)

ื ื™ืฆืŸ ื“ื™ืœื™ื™ื“ ืจืขืคึผืœืึทืงื™ื™ืฉืึทืŸ ื•ื•ื™ ืึท ืขืจืฉื˜ืขืจ ื”ื™ืœืฃ ืื•ื™ื‘ ืื™ืจ ืึทืงืกืึทื“ืขื ืึทืœื™ ืคืึทืจืคืึทืœืŸ ื“ืึทื˜ืŸ ืื•ืŸ ื‘ืืžืขืจืงื˜ ื“ืขื ืคึผืจืึธื‘ืœืขื ืื™ืŸ ื“ื™ ืงืึทื ืคื™ื’ื™ืขืจื“ ืคืึทืจื”ืึทืœื˜ืŸ.

ืึธื‘ืขืจ ื”ืึทืœื˜ืŸ ืื™ืŸ ืžื™ื™ื ื•ื ื’: ืจืขืคึผืœืึทืงื™ื™ืฉืึทืŸ ืื™ื– ื ื™ืฉื˜ ืึท ื‘ืึทืงืึทืคึผ.

ื‘ืึทืงืงื•ืคึผ ืื•ืŸ ืจืขืคึผืœืึทืงื™ื™ืฉืึทืŸ ื”ืึธื‘ืŸ ืคืึทืจืฉื™ื“ืขื ืข ืฆื•ื•ืขืงืŸ. ื ืงืึทืœื˜ ื‘ืึทืงืึทืคึผ ื•ื•ืขื˜ ืงื•ืžืขืŸ ืื™ืŸ ื”ืึทื ื˜ื™ืง ืื•ื™ื‘ ืื™ืจ ืึทืงืกืึทื“ืขื ืึทืœื™ ื’ืขืžืื›ื˜ DELETE ืึธื“ืขืจ DROP TABLE. ืžื™ืจ ืžืึทื›ืŸ ืึท ื‘ืึทืงืึทืคึผ ืคื•ืŸ ืงืึทืœื˜ ืกื˜ืึธืจื™ื“ื–ืฉ ืื•ืŸ ื•ืžืงืขืจืŸ ื“ื™ ืคืจื™ืขืจื“ื™ืงืข ืฉื˜ืึทื˜ ืคื•ืŸ ื“ื™ ื˜ื™ืฉ ืึธื“ืขืจ ื“ื™ ื’ืื ืฆืข ื“ืึทื˜ืึทื‘ื™ื™ืก. ืื‘ืขืจ ืื™ืŸ ื“ืขืจ ื–ืขืœื‘ื™ืงืขืจ ืฆื™ื™ึทื˜ ื“ื™ ื‘ืงืฉื” DROP TABLE ืื™ื– ื›ึผืžืขื˜ ื˜ื™ื™ืงืขืฃ ืจื™ืคึผืจืึทื“ื•ืกื˜ ืื™ืŸ ืึทืœืข ืจืขืคึผืœืึทืงืึทื– ืื•ื™ืฃ ื“ื™ ืืจื‘ืขื˜ืŸ ืงื ื•ื™ืœ, ืึทื–ื•ื™ ืคึผืจืึธืกื˜ ืจืขืคึผืœืึทืงื™ื™ืฉืึทืŸ ื•ื•ืขื˜ ื ื™ืฉื˜ ื”ืขืœืคืŸ ื“ืึธ. ืจืขืคึผืœืึทืงื™ื™ืฉืึทืŸ ื–ื™ืš ื”ืืœื˜ ื“ื™ ื“ืึทื˜ืึทื‘ื™ื™ืก ื‘ื ื™ืžืฆื ื•ื•ืขืŸ ื™ื—ื™ื“ ืกืขืจื•ื•ืขืจืก ื–ืขื ืขืŸ ืจืขื ื˜ืึทื“ ืื•ืŸ ื“ื™ืกื˜ืจื™ื‘ื™ื•ืฅ ื“ื™ ืžืึทืกืข.

ืืคื™ืœื• ืžื™ื˜ ืึท ื“ื™ืคืขืจื“ ืจืขืคึผืœื™ืงืข, ืžื™ืจ ืžืืœ ื˜ืึทืงืข ื“ืึทืจืคึฟืŸ ืึท ืงืึทืœื˜ ื‘ืึทืงืึทืคึผ ืื™ืŸ ืึท ื–ื™ื›ืขืจ ืคึผืœืึทืฅ ืื•ื™ื‘ ืึท ื“ืึทื˜ืŸ ืฆืขื ื˜ืขืจ ื“ื•ืจื›ืคืึทืœ, ืคืึทืจื‘ืึธืจื’ืŸ ืฉืขื“ื™ืงืŸ ืึธื“ืขืจ ืื ื“ืขืจืข ื’ืขืฉืขืขื ื™ืฉืŸ ื•ื•ืึธืก ื–ืขื ืขืŸ ื ื™ืฉื˜ ื’ืœื™ื™ืš ื‘ืืžืขืจืงื˜. ืจืขืคึผืœืึทืงื™ื™ืฉืึทืŸ ืึทืœื™ื™ืŸ ืื™ื– ืคื•ืŸ ืงื™ื™ืŸ ื ื•ืฆืŸ ื“ืึธ.

ื˜ืึธืŸ. ืื•ื™ืฃ GitLab.com ื“ืขืจื•ื•ื™ื™ึทืœ ืžื™ืจ ื‘ืึทืฉื™ืฆืŸ ืงืขื’ืŸ ื“ืึทื˜ืŸ ืึธื ื•ื•ืขืจ ืื•ื™ืฃ ื“ื™ ืกื™ืกื˜ืขื ืžื“ืจื’ื” ืื•ืŸ ื˜ืึธืŸ ื ื™ื˜ ืฆื•ืจื™ืงืงืจื™ื’ืŸ ื“ืึทื˜ืŸ ืื•ื™ืฃ ื“ื™ ื‘ืึทื ื™ืฆืขืจ ืžื“ืจื’ื”.

ืžืงื•ืจ: www.habr.com

ืœื™ื™ื’ืŸ ืึท ื‘ืึทืžืขืจืงื•ื ื’