--- aliases: tags: - maturity/🌱 date: - - 2024-05-28 zero-link: - "[[../../../meta/zero/00 PostgreSQL|00 PostgreSQL]]" parents: - "[[../../architecture/highload/РСпликация Π‘Π”|РСпликация Π‘Π”]]" linked: --- ## ВСзисы - РСализуСтся Π½Π° Π±Π°Π·Π΅ ΠΆΡƒΡ€Π½Π°Π»Π° [WAL](Write-Ahead%20Log.md). - РСпликация упираСтся Π² диск, Π° Π½Π΅ Π² процСссор. - Π Π΅ΠΏΠ»ΠΈΠΊΠ° это точная бинарная копия мастСра. - Π Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ ΠΏΠΎ push ΠΌΠΎΠ΄Π΅Π»ΠΈ - ΠŸΡ€ΠΈ физичСской Ρ€Π΅ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΠΈ Ρ„ΠΈΠ»ΡŒΡ‚Ρ€Π°Ρ†ΠΈΡ Π½Π΅ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Π° *** РаспространСниС ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ Π² PostgreSQL происходит ΠΏΠΎ push ΠΌΠΎΠ΄Π΅Π»ΠΈ. Π’ΠΎ Π΅ΡΡ‚ΡŒ, master отправляСт [[Write-Ahead Log|WAL]] Π½Π° Ρ€Π΅ΠΏΠ»ΠΈΠΊΠΈ, Π° Ρ€Π΅ΠΏΠ»ΠΈΠΊΠ° примСняСт Π΄Π°Π½Π½Ρ‹Π΅ физичСски, согласно записям Π² WAL. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Ссли ΠΎΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ запись Π² master, Π΄ΠΎΠΆΠ΄Π°Ρ‚ΡŒΡΡ синхронизации Ρ€Π΅ΠΏΠ»ΠΈΠΊ ΠΈ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Π±ΠΈΠ½Π°Ρ€Π½ΠΎΠ΅ сравнСниС master ΠΈ slaves, ΠΎΠ½ΠΈ Π±ΡƒΠ΄ΡƒΡ‚ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ‡Π½Ρ‹. ![](../../../meta/files/images/Pasted%20image%2020240606094952.png) ΠŸΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ Ρ€Π΅ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΠΈ Π² PostgreSQL ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½Π° ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒΡŽ дисков, Π° Π½Π΅ процСссора. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ ΠΏΡ€ΠΈ использовании HDD рСкомСндуСтся Π²Ρ‹Π΄Π΅Π»ΡΡ‚ΡŒ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹ΠΉ диск для WAL. Π”ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ Ρ€Π΅ΠΏΠ»ΠΈΠΊΠΈ Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ остановки Ρ€Π°Π±ΠΎΡ‚Ρ‹ прилоТСния, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π½ΠΈΠΊΠ°ΠΊΠΈΠ΅ записи Π½Π΅ мСнялись Π² Π‘Π”. Π₯отя, Ссли Π΄Π°Π½Π½Ρ‹Π΅ ΠΏΠΈΡˆΡƒΡ‚ΡΡ Π½Π΅ Ρ‚Π°ΠΊ часто, Ρ‚ΠΎ новая Ρ€Π΅ΠΏΠ»ΠΈΠΊΠ° ΠΌΠΎΠΆΠ΅Ρ‚ просто Π΄ΠΎΠ³Π½Π°Ρ‚ΡŒ отставаниС Π² мастСр, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ образуСтся Π·Π° врСмя ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ слСйва. ## Бинхронизация Async: - synchronus_commit = - off - Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ Π΄ΠΎΠΆΠΈΠ΄Π°Ρ‚ΡŒΡΡ Π΄Π°ΠΆΠ΅ локального подтвСрТдСния, Π½Π΅Ρ‚ Π³Π°Ρ€Π°Π½Ρ‚ΠΈΠΈ Ρ‡Ρ‚ΠΎ Π΄Π°Π½Π½Ρ‹Π΅ дошли Π΄ΠΎ Π±Π΄ - local - происходит Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΉ ΠΊΠΎΠΌΠΌΠΈΡ‚ ΠΈ Π² этот ΠΆΠ΅ ΠΌΠΎΠΌΠ΅Π½Ρ‚ отправляСтся ΠΏΠΎΠ΄Ρ‚Π²Π΅Ρ€ΠΆΠ΄Π΅Π½ΠΈΠ΅ Sync/Semi-symc: - synchronus_commit = remote_write \/ on \/ remote_apply - remote_write - транзакция подтвСрТдаСтся Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ссли ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΎ ΠΏΠΎΠ΄Ρ‚Π²Π΅Ρ€ΠΆΠ΄Π΅Π½ΠΈΠ΅ со всСх Ρ€Π΅ΠΏΠ»ΠΈΠΊ - synchronus_standby_names = \[FIRST \/ ANY\] N (replicas_list) - позволяСт Π½Π°ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ ΠΎΡ‚ ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… Ρ€Π΅ΠΏΠ»ΠΈΠΊ оТидаСтся ΠΎΡ‚Π²Π΅Ρ‚ ## ЛогичСская рСпликация ЛогичСская рСпликация позволяСт Π±ΠΎΠ»Π΅Π΅ Π³ΠΈΠ±ΠΊΠΎ ΡƒΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒ ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ Π΄Π°Π½Π½Ρ‹Ρ…. Она прСдоставляСт Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Ρ€Π΅ΠΏΠ»ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Π΅ Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ ΠΈΠ»ΠΈ схСмы, Π° Π½Π΅ всю Π±Π°Π·Ρƒ Π΄Π°Π½Π½Ρ‹Ρ… Ρ†Π΅Π»ΠΈΠΊΠΎΠΌ. Π­Ρ‚ΠΎ особСнно ΠΏΠΎΠ»Π΅Π·Π½ΠΎ для частичного копирования Π΄Π°Π½Π½Ρ‹Ρ… ΠΈ ΠΈΠ½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΠΈ с Π΄Ρ€ΡƒΠ³ΠΈΠΌΠΈ систСмами. Logical Log Streaming Replication – это способ Ρ‚Ρ€Π°Π½ΡΡ„ΠΎΡ€ΠΌΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Write-Ahead Log. НапримСр, ΠΌΡ‹ Π½Π΅ Ρ…ΠΎΡ‚ΠΈΠΌ Ρ€Π΅ΠΏΠ»ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ всС Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ ΠΈΠ· Π΄Π°Π½Π½ΠΎΠΉ Π±Π°Π·Ρ‹, Π° Ρ…ΠΎΡ‚ΠΈΠΌ Ρ€Π΅ΠΏΠ»ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‡Π°ΡΡ‚ΡŒ. Logical Log Streaming Replication позволяСт мастСру ΠΎΠ±ΡŠΡΡΠ½ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΈΠ· Ρ‚Π°Π±Π»ΠΈΡ† Π±ΡƒΠ΄Π΅Ρ‚ ΡƒΠ΅Π·ΠΆΠ°Ρ‚ΡŒ Π½Π° слэйв. Logical Decoding – способ Π²ΠΈΠ·ΡƒΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ находится Π² PostgreSQL Write-Ahead Log. На самом Π΄Π΅Π»Π΅, Ссли ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Π½Π°ΠΏΠ΅Ρ‡Π°Ρ‚Π°Ρ‚ΡŒ Π² ΠΊΠ°ΠΊΠΎΠΌ-Ρ‚ΠΎ Π²ΠΈΠ΄Π΅ Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ Ρƒ нас происходит Π½Π° слэйвС, Ρ‚ΠΎΡ‡Π½Π΅Π΅, Ρ‡Ρ‚ΠΎ Π½Π°ΠΌ ΠΏΡ€ΠΈΡˆΠ»ΠΎ Ρ‡Π΅Ρ€Π΅Π· Write-Ahead Log, это Π·Π½Π°Ρ‡ΠΈΡ‚, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ всС Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ Π΄Π΅Π»Π°Π΅Ρ‚ libslave. ΠŸΠΎΠ»ΡƒΡ‡ΠΈΠ»ΠΈ insert, update, delete, Ρƒ нас β€œΠ΄Π΅Ρ€Π½ΡƒΠ»ΡΡβ€ Π½ΡƒΠΆΠ½Ρ‹ΠΉ callback, ΠΌΡ‹ ΡƒΠ·Π½Π°Π»ΠΈ ΠΏΡ€ΠΎ измСнСния. Π­Ρ‚ΠΎ ΠΈ Π΅ΡΡ‚ΡŒ Logical Decoding. ![](Pasted%20image%2020240606100439.png) **ΠšΠΎΠ½Ρ„Π»ΠΈΠΊΡ‚Ρ‹:** - НуТно ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ запись для update/delete (ΠΏΠΎ ΠΏΠ΅Ρ€Π²ΠΈΡ‡Π½ΠΎΠΌΡƒ ΠΊΠ»ΡŽΡ‡Ρƒ/ΠΏΠΎ ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½ΠΎΠΌΡƒ Π½Π΅Π½ΡƒΠ»Π»Π°Π±Π΅Π»ΡŒΠ½ΠΎΠΌΡƒ индСксу/ΠΏΠΎ всСм столбцам). - Π’ случаС возникновСния ΠΊΠΎΠ½Ρ„Π»ΠΈΠΊΡ‚Π° трСбуСтся Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽ ΠΈΡΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅. *** ## ΠœΠ΅Ρ‚Π° информация **ΠžΠ±Π»Π°ΡΡ‚ΡŒ**:: [[../../../meta/zero/00 PostgreSQL|00 PostgreSQL]] **Π ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒ**:: [[../../architecture/highload/РСпликация Π‘Π”|РСпликация Π‘Π”]] **Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ**:: **Автор**:: **Π‘ΠΎΠ·Π΄Π°Π½Π°**:: [[2024-05-28]] ### Π”ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ ΠΌΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π»Ρ‹ - [[Настройка Ρ€Π΅ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΠΈ Π² PostgreSQL]] - [BDR User Guide - PostgreSQL wiki](https://wiki.postgresql.org/wiki/Logical_Log_Streaming_Replication) - [PostgreSQL: Documentation: 16: Chapter 31. Logical Replication](https://www.postgresql.org/docs/current/logical-replication.html) - [PostgreSQL: Documentation: 9.4: Logical Decoding](https://www.postgresql.org/docs/9.4/logicaldecoding.html). Аналог [libslave](libslave.md) Π² MySQL - [ΠžΡ‚Π»Π°Π΄ΠΊΠ° ΠΈ устранСниС ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ Π² PostgreSQL Streaming Replication / Π₯Π°Π±Ρ€](https://m.habr.com/ru/company/oleg-bunin/blog/414111/) - [An Overview of Logical Replication in PostgreSQL | Severalnines](https://severalnines.com/blog/overview-logical-replication-postgresql/) ### Π”ΠΎΡ‡Π΅Ρ€Π½ΠΈΠ΅ Π·Π°ΠΌΠ΅Ρ‚ΠΊΠΈ - [[Настройка Ρ€Π΅ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΠΈ Π² PostgreSQL]]