ΠžΡ‚ΠΊΠ°Π·ΠΎΡƒΡΡ‚ΠΎΠΉΡ‡ΠΈΠ²Ρ‹ΠΉ кластСр PostgreSQL + Patroni. ΠžΠΏΡ‹Ρ‚ внСдрСния

Π’ ΡΡ‚Π°Ρ‚ΡŒΠ΅ я расскаТу, ΠΊΠ°ΠΊ ΠΌΡ‹ подошли ΠΊ вопросу отказоустойчивости PostgreSQL, ΠΏΠΎΡ‡Π΅ΠΌΡƒ это стало для нас Π²Π°ΠΆΠ½ΠΎ ΠΈ Ρ‡Ρ‚ΠΎ Π² ΠΈΡ‚ΠΎΠ³Π΅ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»ΠΎΡΡŒ.

Π£ нас высоконагруТСнный сСрвис: 2,5 ΠΌΠ»Π½ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ ΠΏΠΎ всСму ΠΌΠΈΡ€Ρƒ, 50К+ Π°ΠΊΡ‚ΠΈΠ²Π½Ρ‹Ρ… ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ дСнь. Π‘Π΅Ρ€Π²Π΅Ρ€Π° находятся Π² Amazone Π² ΠΎΠ΄Π½ΠΎΠΌ Ρ€Π΅Π³ΠΈΠΎΠ½Π΅ Π˜Ρ€Π»Π°Π½Π΄ΠΈΠΈ: Π² Ρ€Π°Π±ΠΎΡ‚Π΅ постоянно 100+ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… сСрвСров, ΠΈΠ· Π½ΠΈΡ… ΠΏΠΎΡ‡Ρ‚ΠΈ 50 β€” с Π±Π°Π·Π°ΠΌΠΈ Π΄Π°Π½Π½Ρ‹Ρ….

Π’Π΅ΡΡŒ backend β€” большоС ΠΌΠΎΠ½ΠΎΠ»ΠΈΡ‚Π½ΠΎΠ΅ stateful-ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π½Π° Java, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Π΄Π΅Ρ€ΠΆΠΈΡ‚ постоянноС websocket соСдинСниС с ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΠΎΠΌ. ΠŸΡ€ΠΈ ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ Ρ€Π°Π±ΠΎΡ‚Π΅ Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ Π½Π° ΠΎΠ΄Π½ΠΎΠΉ доскС всС ΠΎΠ½ΠΈ видят измСнСния Π² Ρ€Π΅ΠΆΠΈΠΌΠ΅ Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ ΠΊΠ°ΠΆΠ΄ΠΎΠ΅ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ ΠΌΡ‹ записываСм Π² Π±Π°Π·Ρƒ. Π£ нас ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π½ΠΎ 10К запросов Π² сСкунду ΠΊ нашим Π±Π°Π·Π°ΠΌ. Π’ ΠΏΠΈΠΊΠΎΠ²ΠΎΠΉ Π½Π°Π³Ρ€ΡƒΠ·ΠΊΠ΅ Π² Redis ΠΌΡ‹ пишСм ΠΏΠΎ 80-100К запросов Π² сСкунду.
ΠžΡ‚ΠΊΠ°Π·ΠΎΡƒΡΡ‚ΠΎΠΉΡ‡ΠΈΠ²Ρ‹ΠΉ кластСр PostgreSQL + Patroni. ΠžΠΏΡ‹Ρ‚ внСдрСния

ΠŸΠΎΡ‡Π΅ΠΌΡƒ ΠΌΡ‹ ΠΏΠ΅Ρ€Π΅ΡˆΠ»ΠΈ с Redis Π½Π° PostgreSQL

Π˜Π·Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎ наш сСрвис Ρ€Π°Π±ΠΎΡ‚Π°Π» с Redis, key-value Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π΅ΠΌ, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Ρ…Ρ€Π°Π½ΠΈΡ‚ всС Π΄Π°Π½Π½Ρ‹Π΅ Π² ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΈΠ²Π½ΠΎΠΉ памяти сСрвСра.

ΠŸΠ»ΡŽΡΡ‹ Redis:

  1. Высокая ΡΠΊΠΎΡ€ΠΎΡΡ‚ΡŒ ΠΎΡ‚Π²Π΅Ρ‚Π°, Ρ‚.ΠΊ. всё хранится Π² памяти;
  2. Удобство бэкапа ΠΈ Ρ€Π΅ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΠΈ.

ΠœΠΈΠ½ΡƒΡΡ‹ Redis для нас:

  1. НСт настоящих Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΉ. ΠœΡ‹ ΠΏΡ‹Ρ‚Π°Π»ΠΈΡΡŒ ΠΈΠΌΠΈΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΈΡ… Π½Π° ΡƒΡ€ΠΎΠ²Π½Π΅ нашСго прилоТСния. К соТалСнию, это Π½Π΅ всСгда Ρ…ΠΎΡ€ΠΎΡˆΠΎ Ρ€Π°Π±ΠΎΡ‚Π°Π»ΠΎ ΠΈ Ρ‚Ρ€Π΅Π±ΠΎΠ²Π°Π»ΠΎ написания ΠΎΡ‡Π΅Π½ΡŒ слоТного ΠΊΠΎΠ΄Π°.
  2. ΠžΠ±ΡŠΡ‘ΠΌ Π΄Π°Π½Π½Ρ‹Ρ… ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ количСством памяти. ΠŸΡ€ΠΈ ΡƒΠ²Π΅Π»ΠΈΡ‡Π΅Π½ΠΈΠΈ количСства Π΄Π°Π½Π½Ρ‹Ρ… ΠΏΠ°ΠΌΡΡ‚ΡŒ Π±ΡƒΠ΄Π΅Ρ‚ расти, ΠΈ, Π² ΠΊΠΎΠ½Ρ†Π΅ ΠΊΠΎΠ½Ρ†ΠΎΠ², ΠΌΡ‹ упрёмся Π² характСристики Π²Ρ‹Π±Ρ€Π°Π½Π½ΠΎΠ³ΠΎ инстанса, Ρ‡Ρ‚ΠΎ Π² AWS Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ остановки нашСго сСрвиса для измСнСния Ρ‚ΠΈΠΏΠ° инстанса.
  3. НСобходимо постоянно ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Ρ‚ΡŒ ΡƒΡ€ΠΎΠ²Π΅Π½ΡŒ Π½ΠΈΠ·ΠΊΠΎΠ³ΠΎ latency, Ρ‚.ΠΊ. Ρƒ нас ΠΎΡ‡Π΅Π½ΡŒ большоС количСство запросов. ΠžΠΏΡ‚ΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΉ для нас ΡƒΡ€ΠΎΠ²Π΅Π½ΡŒ Π·Π°Π΄Π΅Ρ€ΠΆΠΊΠΈ β€” 17-20 ms. ΠŸΡ€ΠΈ ΡƒΡ€ΠΎΠ²Π½Π΅ 30-40 ms ΠΌΡ‹ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ Π΄ΠΎΠ»Π³ΠΈΠ΅ ΠΎΡ‚Π²Π΅Ρ‚Ρ‹ Π½Π° запросы нашСго прилоТСния ΠΈ Π΄Π΅Π³Ρ€Π°Π΄Π°Ρ†ΠΈΡŽ сСрвиса. К соТалСнию, Ρƒ нас это ΡΠ»ΡƒΡ‡ΠΈΠ»ΠΎΡΡŒ Π² сСнтябрС 2018 Π³ΠΎΠ΄Π°, ΠΊΠΎΠ³Π΄Π° ΠΎΠ΄ΠΈΠ½ ΠΈΠ· инстансов с Redis ΠΏΠΎΡ‡Π΅ΠΌΡƒ-Ρ‚ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ» latency Π² 2 Ρ€Π°Π·Π° большС ΠΎΠ±Ρ‹Ρ‡Π½ΠΎΠ³ΠΎ. Для Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ ΠΌΡ‹ остановили сСрвис Π² сСрСдинС Ρ€Π°Π±ΠΎΡ‡Π΅Π³ΠΎ дня для Π²Π½Π΅ΠΏΠ»Π°Π½ΠΎΠ²ΠΎΠ³ΠΎ maintenance ΠΈ Π·Π°ΠΌΠ΅Π½ΠΈΠ»ΠΈ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ½Ρ‹ΠΉ инстанс Redis.
  4. Π›Π΅Π³ΠΊΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ Π½Π΅ΠΊΠΎΠ½ΡΠΈΠ½ΡΡ‚Π΅Π½Ρ‚Π½ΠΎΡΡ‚ΡŒ Π΄Π°Π½Π½Ρ‹Ρ… Π΄Π°ΠΆΠ΅ ΠΏΡ€ΠΈ Π½Π΅Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… ΠΎΡˆΠΈΠ±ΠΊΠ°Ρ… Π² ΠΊΠΎΠ΄Π΅ ΠΈ ΠΏΠΎΡ‚ΠΎΠΌ ΠΏΠΎΡ‚Ρ€Π°Ρ‚ΠΈΡ‚ΡŒ ΠΌΠ½ΠΎΠ³ΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ Π½Π° написаниС ΠΊΠΎΠ΄Π° для исправлСния этих Π΄Π°Π½Π½Ρ‹Ρ….

ΠœΡ‹ ΡƒΡ‡Π»ΠΈ минусы ΠΈ поняли, Ρ‡Ρ‚ΠΎ Π½Π°ΠΌ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΏΠ΅Ρ€Π΅Π΅Ρ…Π°Ρ‚ΡŒ Π½Π° Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ Π±ΠΎΠ»Π΅Π΅ ΡƒΠ΄ΠΎΠ±Π½ΠΎΠ΅, с Π½ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΌΠΈ транзакциями ΠΈ мСньшСй Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡ‚ΡŒΡŽ ΠΎΡ‚ latency. ΠŸΡ€ΠΎΠ²Π΅Π»ΠΈ исслСдованиС, ΠΏΡ€ΠΎΠ°Π½Π°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π»ΠΈ мноТСство Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ΠΎΠ² ΠΈ Π²Ρ‹Π±Ρ€Π°Π»ΠΈ PostgreSQL.

На Π½ΠΎΠ²ΡƒΡŽ Π‘Π” ΠΌΡ‹ ΠΏΠ΅Ρ€Π΅Π΅Π·ΠΆΠ°Π΅ΠΌ ΡƒΠΆΠ΅ 1,5 Π³ΠΎΠ΄Π° ΠΈ ΠΏΠ΅Ρ€Π΅Π²Π΅Π·Π»ΠΈ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π½Π΅Π±ΠΎΠ»ΡŒΡˆΡƒΡŽ Ρ‡Π°ΡΡ‚ΡŒ Π΄Π°Π½Π½Ρ‹Ρ…, поэтому сСйчас Ρ€Π°Π±ΠΎΡ‚Π°Π΅ΠΌ ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ с Redis ΠΈ PostgreSQL. ΠŸΠΎΠ΄Ρ€ΠΎΠ±Π½Π΅Π΅ ΠΎΠ± этапах ΠΏΠ΅Ρ€Π΅Π΅Π·Π΄Π° ΠΈ ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΈ Π΄Π°Π½Π½Ρ‹Ρ… ΠΌΠ΅ΠΆΠ΄Ρƒ Π‘Π” написано Π² ΡΡ‚Π°Ρ‚ΡŒΠ΅ ΠΌΠΎΠ΅Π³ΠΎ ΠΊΠΎΠ»Π»Π΅Π³ΠΈ.

Когда ΠΌΡ‹ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π½Π°Ρ‡ΠΈΠ½Π°Π»ΠΈ ΠΏΠ΅Ρ€Π΅Π΅Π·ΠΆΠ°Ρ‚ΡŒ, нашС ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Ρ€Π°Π±ΠΎΡ‚Π°Π»ΠΎ Π½Π°ΠΏΡ€ΡΠΌΡƒΡŽ с Π‘Π” ΠΈ ΠΎΠ±Ρ€Π°Ρ‰Π°Π»ΠΎΡΡŒ ΠΊ мастСру Redis ΠΈ PostgreSQL. ΠšΠ»Π°ΡΡ‚Π΅Ρ€ PostgreSQL состоял ΠΈΠ· мастСра ΠΈ Ρ€Π΅ΠΏΠ»ΠΈΠΊΠΈ с асинхронной Ρ€Π΅ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΠ΅ΠΉ. Π’Π°ΠΊ выглядСла схСма Ρ€Π°Π±ΠΎΡ‚Ρ‹ с Π±Π°Π·Π°ΠΌΠΈ:
ΠžΡ‚ΠΊΠ°Π·ΠΎΡƒΡΡ‚ΠΎΠΉΡ‡ΠΈΠ²Ρ‹ΠΉ кластСр PostgreSQL + Patroni. ΠžΠΏΡ‹Ρ‚ внСдрСния

Π’Π½Π΅Π΄Ρ€Π΅Π½ΠΈΠ΅ PgBouncer

Пока ΠΌΡ‹ ΠΏΠ΅Ρ€Π΅Π΅Π·ΠΆΠ°Π»ΠΈ, ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ‚ Ρ‚ΠΎΠΆΠ΅ развивался: ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΠ²Π°Π»ΠΎΡΡŒ количСство ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ ΠΈ количСство сСрвСров, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Ρ€Π°Π±ΠΎΡ‚Π°Π»ΠΈ с PostgreSQL, ΠΈ Π½Π°ΠΌ стало Π½Π΅ Ρ…Π²Π°Ρ‚Π°Ρ‚ΡŒ соСдинСний. PostgreSQL Π½Π° ΠΊΠ°ΠΆΠ΄ΠΎΠ΅ соСдинСниС создаёт ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹ΠΉ процСсс ΠΈ потрСбляСт рСсурсы. Π£Π²Π΅Π»ΠΈΡ‡ΠΈΠ²Π°Ρ‚ΡŒ число ΠΊΠΎΠ½Π½Π΅ΠΊΡ‚ΠΎΠ² ΠΌΠΎΠΆΠ½ΠΎ Π΄ΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Ρ‘Π½Π½ΠΎΠ³ΠΎ ΠΌΠΎΠΌΠ΅Π½Ρ‚Π°, ΠΈΠ½Π°Ρ‡Π΅ Π΅ΡΡ‚ΡŒ шанс ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ Π½Π΅ΠΎΠΏΡ‚ΠΈΠΌΠ°Π»ΡŒΠ½ΡƒΡŽ Ρ€Π°Π±ΠΎΡ‚Ρƒ Π‘Π”. Π˜Π΄Π΅Π°Π»ΡŒΠ½Ρ‹ΠΌ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ΠΎΠΌ Π² Ρ‚Π°ΠΊΠΎΠΉ ситуации Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π±ΠΎΡ€ ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€Π° ΠΊΠΎΠ½Π½Π΅ΠΊΡ‚ΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ встанСт ΠΏΠ΅Ρ€Π΅Π΄ Π±Π°Π·ΠΎΠΉ.

Π£ нас Π±Ρ‹Π»ΠΎ Π΄Π²Π° Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Π° для ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€Π° соСдинСний: Pgpool ΠΈ PgBouncer. Но ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ Π½Π΅ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΎΠ½Π½Ρ‹ΠΉ Ρ€Π΅ΠΆΠΈΠΌ Ρ€Π°Π±ΠΎΡ‚Ρ‹ с Π±Π°Π·ΠΎΠΉ, поэтому ΠΌΡ‹ Π²Ρ‹Π±Ρ€Π°Π»ΠΈ PgBouncer.

ΠœΡ‹ настроили ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΡƒΡŽ схСму Ρ€Π°Π±ΠΎΡ‚Ρ‹: нашС ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ обращаСтся ΠΊ ΠΎΠ΄Π½ΠΎΠΌΡƒ PgBouncer, Π·Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ находятся masters PostgreSQL, Π° Π·Π° ΠΊΠ°ΠΆΠ΄Ρ‹ΠΌ мастСром β€” ΠΎΠ΄Π½Π° Ρ€Π΅ΠΏΠ»ΠΈΠΊΠ° с асинхронной Ρ€Π΅ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΠ΅ΠΉ.
ΠžΡ‚ΠΊΠ°Π·ΠΎΡƒΡΡ‚ΠΎΠΉΡ‡ΠΈΠ²Ρ‹ΠΉ кластСр PostgreSQL + Patroni. ΠžΠΏΡ‹Ρ‚ внСдрСния

ΠŸΡ€ΠΈ этом ΠΌΡ‹ Π½Π΅ ΠΌΠΎΠ³Π»ΠΈ Ρ…Ρ€Π°Π½ΠΈΡ‚ΡŒ вСсь ΠΎΠ±ΡŠΡ‘ΠΌ Π΄Π°Π½Π½Ρ‹Ρ… Π² PostgreSQL ΠΈ для нас Π±Ρ‹Π»Π° Π²Π°ΠΆΠ½Π° ΡΠΊΠΎΡ€ΠΎΡΡ‚ΡŒ Ρ€Π°Π±ΠΎΡ‚Ρ‹ с Π±Π°Π·ΠΎΠΉ, поэтому ΠΌΡ‹ Π½Π°Ρ‡Π°Π»ΠΈ ΡˆΠ°Ρ€Π΄ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ PostgreSQL Π½Π° ΠΏΡ€ΠΈΠΊΠ»Π°Π΄Π½ΠΎΠΌ ΡƒΡ€ΠΎΠ²Π½Π΅. Описанная Π²Ρ‹ΡˆΠ΅ схСма являСтся для этого ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΡƒΠ΄ΠΎΠ±Π½ΠΎΠΉ: ΠΏΡ€ΠΈ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠΈ Π½ΠΎΠ²ΠΎΠ³ΠΎ ΡˆΠ°Ρ€Π΄Π° PostgreSQL достаточно ΠΎΠ±Π½ΠΎΠ²ΠΈΡ‚ΡŒ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡŽ PgBouncer ΠΈ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ сразу Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ с Π½ΠΎΠ²Ρ‹ΠΌ ΡˆΠ°Ρ€Π΄ΠΎΠΌ.

ΠžΡ‚ΠΊΠ°Π·ΠΎΡƒΡΡ‚ΠΎΠΉΡ‡ΠΈΠ²ΠΎΡΡ‚ΡŒ PgBouncer

Π­Ρ‚Π° схСма ΠΏΡ€ΠΎΡ€Π°Π±ΠΎΡ‚Π°Π»Π° Π΄ΠΎ ΠΌΠΎΠΌΠ΅Π½Ρ‚Π°, ΠΏΠΎΠΊΠ° СдинствСнный инстанс PgBouncer Π½Π΅ ΡƒΠΌΠ΅Ρ€. ΠœΡ‹ находимся Π² AWS, Π³Π΄Π΅ всС инстансы Π·Π°ΠΏΡƒΡ‰Π΅Π½Ρ‹ Π½Π° ΠΆΠ΅Π»Π΅Π·Π΅, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ пСриодичСски ΡƒΠΌΠΈΡ€Π°Π΅Ρ‚. Π’ Ρ‚Π°ΠΊΠΈΡ… случаях инстанс просто ΠΏΠ΅Ρ€Π΅Π΅Π·ΠΆΠ°Π΅Ρ‚ Π½Π° Π½ΠΎΠ²ΠΎΠ΅ ΠΆΠ΅Π»Π΅Π·ΠΎ ΠΈ снова Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚. Π’Π°ΠΊ ΠΏΡ€ΠΎΠΈΠ·ΠΎΡˆΠ»ΠΎ ΠΈ с PgBouncer, ΠΎΠ΄Π½Π°ΠΊΠΎ ΠΎΠ½ стал нСдоступСн. Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠΌ этого падСния стала Π½Π΅Π΄ΠΎΡΡ‚ΡƒΠΏΠ½ΠΎΡΡ‚ΡŒ нашСго сСрвиса Π² Ρ‚Π΅Ρ‡Π΅Π½ΠΈΠ΅ 25 ΠΌΠΈΠ½ΡƒΡ‚. AWS для Ρ‚Π°ΠΊΠΈΡ… ситуаций Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡƒΠ΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΈΠ·Π±Ρ‹Ρ‚ΠΎΡ‡Π½ΠΎΡΡ‚ΡŒ Π½Π° сторонС ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ, Ρ‡Ρ‚ΠΎ Π½Π΅ Π±Ρ‹Π»ΠΎ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½ΠΎ Ρƒ нас Π½Π° Ρ‚ΠΎΡ‚ ΠΌΠΎΠΌΠ΅Π½Ρ‚.

ПослС этого ΠΌΡ‹ Π²ΡΠ΅Ρ€ΡŒΡ‘Π· Π·Π°Π΄ΡƒΠΌΠ°Π»ΠΈΡΡŒ ΠΎΠ± отказоустойчивости PgBouncer ΠΈ кластСров PostgreSQL, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ подобная ситуация ΠΌΠΎΠ³Π»Π° ΠΏΠΎΠ²Ρ‚ΠΎΡ€ΠΈΡ‚ΡŒΡΡ с Π»ΡŽΠ±Ρ‹ΠΌ инстансом Π² нашСм AWS Π°ΠΊΠΊΠ°ΡƒΠ½Ρ‚Π΅.

Π‘Ρ…Π΅ΠΌΡƒ отказоустойчивости PgBouncer ΠΌΡ‹ построили ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ: всС сСрвСра прилоТСния ΠΎΠ±Ρ€Π°Ρ‰Π°ΡŽΡ‚ΡΡ ΠΊ Network Load Balancer, Π·Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ стоят Π΄Π²Π° PgBouncer. ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΈΠ· PgBouncer смотрит Π½Π° ΠΎΠ΄Π½ΠΈ ΠΈ Ρ‚Π΅ ΠΆΠ΅ master PostgreSQL ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΡˆΠ°Ρ€Π΄Π°. Π’ случаС повторСния ситуации с ΠΏΠ°Π΄Π΅Π½ΠΈΠ΅ΠΌ инстанса AWS, вСсь Ρ‚Ρ€Π°Ρ„ΠΈΠΊ пСрСнавравляСтся Ρ‡Π΅Ρ€Π΅Π· Π΄Ρ€ΡƒΠ³ΠΎΠΉ PgBouncer. ΠžΡ‚ΠΊΠ°Π·ΠΎΡƒΡΡ‚ΠΎΠΉΡ‡ΠΈΠ²ΠΎΡΡ‚ΡŒ Network Load Balancer обСспСчиваСт AWS.

Вакая схСма позволяСт Π±Π΅Π· ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ Π΄ΠΎΠ±Π°Π²Π»ΡΡ‚ΡŒ Π½ΠΎΠ²Ρ‹Π΅ сСрвСра PgBouncer.
ΠžΡ‚ΠΊΠ°Π·ΠΎΡƒΡΡ‚ΠΎΠΉΡ‡ΠΈΠ²Ρ‹ΠΉ кластСр PostgreSQL + Patroni. ΠžΠΏΡ‹Ρ‚ внСдрСния

Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ отказоустойчивого кластСра PostgreSQL

ΠŸΡ€ΠΈ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠΈ этой Π·Π°Π΄Π°Ρ‡ΠΈ ΠΌΡ‹ рассматривали Ρ€Π°Π·Π½Ρ‹Π΅ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Ρ‹: самописный failover, repmgr, AWS RDS, Patroni.

БамописныС скрипты

ΠœΠΎΠ³ΡƒΡ‚ ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€ΠΈΡ‚ΡŒ Ρ€Π°Π±ΠΎΡ‚Ρƒ мастСра ΠΈ, Π² случаС Π΅Π³ΠΎ падСния, ΠΏΡ€ΠΎΠ΄Π²ΠΈΠ³Π°Ρ‚ΡŒ Ρ€Π΅ΠΏΠ»ΠΈΠΊΡƒ Π΄ΠΎ мастСра ΠΈ ΠΎΠ±Π½ΠΎΠ²Π»ΡΡ‚ΡŒ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡŽ PgBouncer.

ΠŸΠ»ΡŽΡΡ‹ Ρ‚Π°ΠΊΠΎΠ³ΠΎ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄Π° Π² максимальной простотС, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ Π²Ρ‹ сами ΠΏΠΈΡˆΠΈΡ‚Π΅ скрипты ΠΈ Ρ‚ΠΎΡ‡Π½ΠΎ ΠΏΠΎΠ½ΠΈΠΌΠ°Π΅Ρ‚Π΅, ΠΊΠ°ΠΊ ΠΎΠ½ΠΈ Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚.

ΠœΠΈΠ½ΡƒΡΡ‹:

  • ΠœΠ°ΡΡ‚Π΅Ρ€ ΠΌΠΎΠ³ Π½Π΅ ΡƒΠΌΠ΅Ρ€Π΅Ρ‚ΡŒ, вмСсто этого ΠΌΠΎΠ³ ΠΏΡ€ΠΎΠΈΠ·ΠΎΠΉΡ‚ΠΈ сСтСвой сбой. Failover, Π½Π΅ зная ΠΎΠ± этом, ΠΏΡ€ΠΎΠ΄Π²ΠΈΠ½Π΅Ρ‚ Ρ€Π΅ΠΏΠ»ΠΈΠΊΡƒ Π΄ΠΎ мастСра, Π° старый мастСр Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ°Ρ‚ΡŒ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ. Π’ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ ΠΌΡ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠΌ Π΄Π²Π° сСрвСра Π² Ρ€ΠΎΠ»ΠΈ master ΠΈ Π½Π΅ Π±ΡƒΠ΄Π΅ΠΌ Π·Π½Π°Ρ‚ΡŒ, Π½Π° ΠΊΠ°ΠΊΠΎΠΌ ΠΈΠ· Π½ΠΈΡ… послСдниС Π°ΠΊΡ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅. Π’Π°ΠΊΡƒΡŽ ΡΠΈΡ‚ΡƒΠ°Ρ†ΠΈΡŽ Π½Π°Π·Ρ‹Π²Π°ΡŽΡ‚ Π΅Ρ‰Ρ‘ split-brain;
  • ΠœΡ‹ ΠΎΡΡ‚Π°Π»ΠΈΡΡŒ Π±Π΅Π· Ρ€Π΅ΠΏΠ»ΠΈΠΊΠΈ. Π’ нашСй ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ мастСр ΠΈ ΠΎΠ΄Π½Π° Ρ€Π΅ΠΏΠ»ΠΈΠΊΠ°, послС ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ Ρ€Π΅ΠΏΠ»ΠΈΠΊΠ° продвигаСтся Π΄ΠΎ мастСра ΠΈ Ρƒ нас большС Π½Π΅Ρ‚ Ρ€Π΅ΠΏΠ»ΠΈΠΊ, поэтому приходится Π² Ρ€ΡƒΡ‡Π½ΠΎΠΌ Ρ€Π΅ΠΆΠΈΠΌΠ΅ Π΄ΠΎΠ±Π°Π²Π»ΡΡ‚ΡŒ Π½ΠΎΠ²ΡƒΡŽ Ρ€Π΅ΠΏΠ»ΠΈΠΊΡƒ;
  • НуТСн Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€ΠΈΠ½Π³ Ρ€Π°Π±ΠΎΡ‚Ρ‹ failover, ΠΏΡ€ΠΈ этом Ρƒ нас 12 ΡˆΠ°Ρ€Π΄ΠΎΠ² PostgreSQL, Π° Π·Π½Π°Ρ‡ΠΈΡ‚ ΠΌΡ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€ΠΈΡ‚ΡŒ 12 кластСров. ΠŸΡ€ΠΈ ΡƒΠ²Π΅Π»ΠΈΡ‡Π΅Π½ΠΈΠΈ количСства ΡˆΠ°Ρ€Π΄ΠΎΠ² Π½Π°Π΄ΠΎ Π΅Ρ‰Ρ‘ Π½Π΅ Π·Π°Π±Ρ‹Ρ‚ΡŒ ΠΎΠ±Π½ΠΎΠ²ΠΈΡ‚ΡŒ failover.

Бамописный failover выглядит ΠΎΡ‡Π΅Π½ΡŒ слоТно ΠΈ Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ Π½Π΅Ρ‚Ρ€ΠΈΠ²ΠΈΠ°Π»ΡŒΠ½ΠΎΠΉ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΈ. ΠŸΡ€ΠΈ ΠΎΠ΄Π½ΠΎΠΌ PostgreSQL кластСрС это Π±ΡƒΠ΄Π΅Ρ‚ самым простым Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ΠΎΠΌ, Π½ΠΎ ΠΎΠ½ Π½Π΅ ΠΌΠ°ΡΡˆΡ‚Π°Π±ΠΈΡ€ΡƒΠ΅Ρ‚ΡΡ, поэтому Π½Π΅ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ΠΈΡ‚ для нас.

Repmgr

Replication Manager for PostgreSQL clusters, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΡƒΠΌΠ΅Π΅Ρ‚ ΡƒΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒ Ρ€Π°Π±ΠΎΡ‚ΠΎΠΉ кластСра PostgreSQL. ΠŸΡ€ΠΈ этом Π² Π½Ρ‘ΠΌ Π½Π΅Ρ‚ автоматичСского failover β€œΠΈΠ· коробки”, поэтому для Ρ€Π°Π±ΠΎΡ‚Ρ‹ потрСбуСтся ΠΏΠΈΡΠ°Ρ‚ΡŒ свою β€œΠΎΠ±Ρ‘Ρ€Ρ‚ΠΊΡƒβ€ ΠΏΠΎΠ²Π΅Ρ€Ρ… Π³ΠΎΡ‚ΠΎΠ²ΠΎΠ³ΠΎ Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ. Π’Π°ΠΊ Ρ‡Ρ‚ΠΎ всё ΠΌΠΎΠΆΠ΅Ρ‚ получится Π΄Π°ΠΆΠ΅ слоТнСС, Ρ‡Π΅ΠΌ с самописными скриптами, поэтому Repmgr ΠΌΡ‹ Π΄Π°ΠΆΠ΅ Π½Π΅ стали ΠΏΡ€ΠΎΠ±ΠΎΠ²Π°Ρ‚ΡŒ.

AWS RDS

ΠŸΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ всё Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΠ΅ для нас, ΡƒΠΌΠ΅Π΅Ρ‚ Π΄Π΅Π»Π°Ρ‚ΡŒ бэкапы ΠΈ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ ΠΏΡƒΠ» ΠΊΠΎΠ½Π½Π΅ΠΊΡ‚ΠΎΠ². Π˜ΠΌΠ΅Π΅Ρ‚ автоматичСскоС ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅: ΠΏΡ€ΠΈ смСрти мастСра Ρ€Π΅ΠΏΠ»ΠΈΠΊΠ° становится Π½ΠΎΠ²Ρ‹ΠΌ мастСром, Π° AWS мСняСт dns запись Π½Π° Π½ΠΎΠ²ΠΎΠ³ΠΎ мастСра, ΠΏΡ€ΠΈ этом Ρ€Π΅ΠΏΠ»ΠΈΠΊΠΈ ΠΌΠΎΠ³ΡƒΡ‚ находится Π² Ρ€Π°Π·Π½Ρ‹Ρ… AZ.

К минусам ΠΌΠΎΠΆΠ½ΠΎ отнСсти отсутствиС Ρ‚ΠΎΠ½ΠΊΠΈΡ… настроСк. Как ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Ρ‚ΠΎΠ½ΠΊΠΈΡ… настроСк: Π½Π° Π½Π°ΡˆΠΈΡ… инстансах стоят ограничСния для tcp ΠΊΠΎΠ½Π½Π΅ΠΊΡ‚ΠΎΠ², Ρ‡Π΅Π³ΠΎ, ΠΊ соТалСнию, нСльзя ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Π² RDS:

net.ipv4.tcp_keepalive_time=10
net.ipv4.tcp_keepalive_intvl=1
net.ipv4.tcp_keepalive_probes=5
net.ipv4.tcp_retries2=3

ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ Ρƒ AWS RDS Ρ†Π΅Π½Π° ΠΏΠΎΡ‡Ρ‚ΠΈ Π² Π΄Π²Π° Ρ€Π°Π·Π° Π΄ΠΎΡ€ΠΎΠΆΠ΅ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎΠΉ Ρ†Π΅Π½Ρ‹ instance, Ρ‡Ρ‚ΠΎ ΠΈ послуТило Π³Π»Π°Π²Π½ΠΎΠΉ ΠΏΡ€ΠΈΡ‡ΠΈΠ½ΠΎΠΉ ΠΎΡ‚ΠΊΠ°Π·Π° ΠΎΡ‚ этого Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ.

Patroni

Π­Ρ‚ΠΎ шаблон Π½Π° python для управлСния PostgreSQL с Ρ…ΠΎΡ€ΠΎΡˆΠ΅ΠΉ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠ΅ΠΉ, автоматичСским failover ΠΈ исходным ΠΊΠΎΠ΄ΠΎΠΌ Π½Π° github.

ΠŸΠ»ΡŽΡΡ‹ Patroni:

  • Расписан ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ, понятно ΠΊΠ°ΠΊ Ρ‡Ρ‚ΠΎ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚;
  • АвтоматичСский failover Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ ΠΈΠ· ΠΊΠΎΡ€ΠΎΠ±ΠΊΠΈ;
  • Написан Π½Π° python, Π° Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ ΠΌΡ‹ сами ΠΌΠ½ΠΎΠ³ΠΎ пишСм Π½Π° python, Ρ‚ΠΎ Π½Π°ΠΌ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€ΠΎΡ‰Π΅ Ρ€Π°Π·Π±ΠΈΡ€Π°Ρ‚ΡŒΡΡ с ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ°ΠΌΠΈ ΠΈ, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Π΄Π°ΠΆΠ΅ ΠΏΠΎΠΌΠΎΡ‡ΡŒ Ρ€Π°Π·Π²ΠΈΡ‚ΠΈΡŽ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°;
  • ΠŸΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ управляСт PostgreSQL, позволяСт ΠΌΠ΅Π½ΡΡ‚ΡŒ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡŽ сразу Π½Π° всСх Π½ΠΎΠ΄Π°Ρ… кластСра, Π° Ссли для примСнСния Π½ΠΎΠ²ΠΎΠΉ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ трСбуСтся пСрСзапуск кластСра, Ρ‚ΠΎ это ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ ΠΎΠΏΡΡ‚ΡŒ ΠΆΠ΅ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Patroni.

ΠœΠΈΠ½ΡƒΡΡ‹:

  • Из Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ нСпонятно, ΠΊΠ°ΠΊ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ с PgBouncer. Π₯отя минусом это Π½Π°Π·Π²Π°Ρ‚ΡŒ слоТно, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ Π·Π°Π΄Π°Ρ‡Π° Patroni β€” ΡƒΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒ PostgreSQL, Π° ΠΊΠ°ΠΊ Π±ΡƒΠ΄ΡƒΡ‚ Ρ…ΠΎΠ΄ΠΈΡ‚ΡŒ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ ΠΊ Patroni β€” ΡƒΠΆΠ΅ наша ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ°;
  • Мало ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠ² внСдрСния Patroni Π½Π° Π±ΠΎΠ»ΡŒΡˆΠΈΡ… ΠΎΠ±ΡŠΡ‘ΠΌΠ°Ρ…, ΠΏΡ€ΠΈ этом ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠ² внСдрСния с нуля.

Π’ ΠΈΡ‚ΠΎΠ³Π΅ для создания отказоустойчивого кластСра ΠΌΡ‹ Π²Ρ‹Π±Ρ€Π°Π»ΠΈ ΠΈΠΌΠ΅Π½Π½ΠΎ Patroni.

ΠŸΡ€ΠΎΡ†Π΅ΡΡ внСдрСния Patroni

Π”ΠΎ Patroni Ρƒ нас Π±Ρ‹Π»ΠΎ 12 ΡˆΠ°Ρ€Π΄ΠΎΠ² PostgreSQL Π² ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ ΠΎΠ΄ΠΈΠ½ мастСр ΠΈ ΠΎΠ΄Π½Π° Ρ€Π΅ΠΏΠ»ΠΈΠΊΠ° с асинхронной Ρ€Π΅ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΠ΅ΠΉ. Π‘Π΅Ρ€Π²Π΅Ρ€Π° прилоТСния ΠΎΠ±Ρ€Π°Ρ‰Π°Π»ΠΈΡΡŒ ΠΊ Π±Π°Π·Π°ΠΌ Π΄Π°Π½Π½Ρ‹Ρ… Ρ‡Π΅Ρ€Π΅Π· Network Load Balancer, Π·Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ стояли Π΄Π²Π° instance с PgBouncer, Π° Π·Π° Π½ΠΈΠΌΠΈ Π½Π°Ρ…ΠΎΠ΄ΠΈΠ»ΠΈΡΡŒ всС PostgreSQL сСрвСра.
ΠžΡ‚ΠΊΠ°Π·ΠΎΡƒΡΡ‚ΠΎΠΉΡ‡ΠΈΠ²Ρ‹ΠΉ кластСр PostgreSQL + Patroni. ΠžΠΏΡ‹Ρ‚ внСдрСния

Для внСдрСния Patroni Π½Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ Π²Ρ‹Π±Ρ€Π°Ρ‚ΡŒ распрСдСлСнноС Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π΅ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ кластСра. Patroni Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ с распрСдСлёнными систСмами хранСния ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΉ, Ρ‚Π°ΠΊΠΈΠΌΠΈ ΠΊΠ°ΠΊ etcd, Zookeeper, Π‘onsul. Π£ нас ΠΊΠ°ΠΊ Ρ€Π°Π· Π½Π° ΠΏΡ€ΠΎΠ΄Π΅ Π΅ΡΡ‚ΡŒ ΠΏΠΎΠ»Π½ΠΎΡ†Π΅Π½Π½Ρ‹ΠΉ кластСр Consul, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Π² связкС с Vault ΠΈ большС ΠΌΡ‹ Π΅Π³ΠΎ Π½ΠΈΠΊΠ°ΠΊ Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ. ΠžΡ‚Π»ΠΈΡ‡Π½Ρ‹ΠΉ ΠΏΠΎΠ²ΠΎΠ΄ Π½Π°Ρ‡Π°Ρ‚ΡŒ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Consul ΠΏΠΎ Π½Π°Π·Π½Π°Ρ‡Π΅Π½ΠΈΡŽ.

Как Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Patroni с Consul

Π£ нас Π΅ΡΡ‚ΡŒ кластСр Π‘onsul, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ состоит ΠΈΠ· Ρ‚Ρ€Ρ‘Ρ… Π½ΠΎΠ΄ ΠΈ кластСр Patroni, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ состоит ΠΈΠ· Π»ΠΈΠ΄Π΅Ρ€Π° ΠΈ Ρ€Π΅ΠΏΠ»ΠΈΠΊΠΈ (Π² Patroni мастСр называСтся Π»ΠΈΠ΄Π΅Ρ€ΠΎΠΌ кластСра, Π° слСйвы β€” Ρ€Π΅ΠΏΠ»ΠΈΠΊΠ°ΠΌΠΈ). ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ инстанс кластСра Patroni постоянно посылаСт Π² Consul ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎ состоянии кластСра. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ ΠΈΠ· Π‘onsul всСгда ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠ·Π½Π°Ρ‚ΡŒ Ρ‚Π΅ΠΊΡƒΡ‰ΡƒΡŽ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡŽ кластСра Patroni ΠΈ Ρ‚ΠΎΠ³ΠΎ, ΠΊΡ‚ΠΎ являСтся Π»ΠΈΠ΄Π΅Ρ€ΠΎΠΌ Π² Π΄Π°Π½Π½Ρ‹ΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚.

ΠžΡ‚ΠΊΠ°Π·ΠΎΡƒΡΡ‚ΠΎΠΉΡ‡ΠΈΠ²Ρ‹ΠΉ кластСр PostgreSQL + Patroni. ΠžΠΏΡ‹Ρ‚ внСдрСния

Для ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ Patroni ΠΊ Π‘onsul достаточно ΠΈΠ·ΡƒΡ‡ΠΈΡ‚ΡŒ ΠΎΡ„ΠΈΡ†ΠΈΠ°Π»ΡŒΠ½ΡƒΡŽ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΡŽ, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ написано, Ρ‡Ρ‚ΠΎ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ хост Π² Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π΅ http ΠΈΠ»ΠΈ https Π² зависимости ΠΎΡ‚ Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ ΠΌΡ‹ Ρ€Π°Π±ΠΎΡ‚Π°Π΅ΠΌ с Π‘onsul, ΠΈ схСму ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ, ΠΎΠΏΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎ:

host: the host:port for the Consul endpoint, in format: http(s)://host:port
scheme: (optional) http or https, defaults to http

Выглядит просто, Π½ΠΎ Ρ‚ΡƒΡ‚ Π½Π°Ρ‡ΠΈΠ½Π°ΡŽΡ‚ΡΡ ΠΏΠΎΠ΄Π²ΠΎΠ΄Π½Ρ‹Π΅ ΠΊΠ°ΠΌΠ½ΠΈ. Π‘ Π‘onsul ΠΌΡ‹ Ρ€Π°Π±ΠΎΡ‚Π°Π΅ΠΌ ΠΏΠΎ Π·Π°Ρ‰ΠΈΡ‰Ρ‘Π½Π½ΠΎΠΌΡƒ соСдинСнию Ρ‡Π΅Ρ€Π΅Π· https ΠΈ наш ΠΊΠΎΠ½Ρ„ΠΈΠ³ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π³Π»ΡΠ΄Π΅Ρ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

consul:
  host: https://server.production.consul:8080 
  verify: true
  cacert: {{ consul_cacert }}
  cert: {{ consul_cert }}
  key: {{ consul_key }}

Но Ρ‚Π°ΠΊ Π½Π΅ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚. ΠŸΡ€ΠΈ стартС Patroni Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒΡΡ ΠΊ Π‘onsul, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ пытаСтся всё Ρ€Π°Π²Π½ΠΎ ΠΈΠ΄Ρ‚ΠΈ ΠΏΠΎ http.

Π Π°Π·ΠΎΠ±Ρ€Π°Ρ‚ΡŒΡΡ с ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠΎΠΉ ΠΏΠΎΠΌΠΎΠ³ исходный ΠΊΠΎΠ΄ Patroni. Π₯ΠΎΡ€ΠΎΡˆΠΎ, Ρ‡Ρ‚ΠΎ ΠΎΠ½ написан Π½Π° python. ΠžΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ΡΡ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ host Π½ΠΈΠΊΠ°ΠΊ Π½Π΅ парсится, Π° ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ» Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ Π² scheme. Π’ΠΎΡ‚ Ρ‚Π°ΠΊ выглядит Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‰ΠΈΠΉ Π±Π»ΠΎΠΊ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с Π‘onsul Ρƒ нас:

consul:
  host: server.production.consul:8080
  scheme: https
  verify: true
  cacert: {{ consul_cacert }}
  cert: {{ consul_cert }}
  key: {{ consul_key }}

Consul-template

Π˜Ρ‚Π°ΠΊ, Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π΅ для ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ ΠΌΡ‹ Π²Ρ‹Π±Ρ€Π°Π»ΠΈ. Π’Π΅ΠΏΠ΅Ρ€ΡŒ Π½ΡƒΠΆΠ½ΠΎ ΠΏΠΎΠ½ΡΡ‚ΡŒ, ΠΊΠ°ΠΊ PgBouncer Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π°Ρ‚ΡŒ свою ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡŽ ΠΏΡ€ΠΈ смСнС Π»ΠΈΠ΄Π΅Ρ€Π° Π² кластСрС Patroni. Π’ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ Π½Π° этот вопрос ΠΎΡ‚Π²Π΅Ρ‚Π° Π½Π΅Ρ‚, Ρ‚.ΠΊ. Ρ‚Π°ΠΌ Π² ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠ΅ Π½Π΅ описана Ρ€Π°Π±ΠΎΡ‚Π° с PgBouncer.

Π’ поисках Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ ΠΌΡ‹ нашли ΡΡ‚Π°Ρ‚ΡŒΡŽ (Π½Π°Π·Π²Π°Π½ΠΈΠ΅, ΠΊ соТалСнию, Π½Π΅ помню), Π³Π΄Π΅ Π±Ρ‹Π»ΠΎ написано, Ρ‡Ρ‚ΠΎ Π‘onsul-template ΠΎΡ‡Π΅Π½ΡŒ ΠΏΠΎΠΌΠΎΠ³ Π² связкС PgBouncer ΠΈ Patroni. Π­Ρ‚ΠΎ ΠΏΠΎΠ΄Ρ‚ΠΎΠ»ΠΊΠ½ΡƒΠ»ΠΎ нас Π½Π° исслСдованиС Ρ€Π°Π±ΠΎΡ‚Ρ‹ Consul-template.

Оказалось, Ρ‡Ρ‚ΠΎ Π‘onsul-template постоянно ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€ΠΈΡ‚ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡŽ кластСра PostgreSQL Π² Π‘onsul. ΠŸΡ€ΠΈ смСнС Π»ΠΈΠ΄Π΅Ρ€Π° ΠΎΠ½ обновляСт ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡŽ PgBouncer ΠΈ отправляСт ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ Π½Π° Π΅Ρ‘ ΠΏΠ΅Ρ€Π΅Π·Π°Π³Ρ€ΡƒΠ·ΠΊΡƒ.

ΠžΡ‚ΠΊΠ°Π·ΠΎΡƒΡΡ‚ΠΎΠΉΡ‡ΠΈΠ²Ρ‹ΠΉ кластСр PostgreSQL + Patroni. ΠžΠΏΡ‹Ρ‚ внСдрСния

Π‘ΠΎΠ»ΡŒΡˆΠΎΠΉ плюс template Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΠΎΠ½ хранится Π² Π²ΠΈΠ΄Π΅ ΠΊΠΎΠ΄Π°, поэтому ΠΏΡ€ΠΈ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠΈ Π½ΠΎΠ²ΠΎΠ³ΠΎ ΡˆΠ°Ρ€Π΄Π° достаточно ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Π½ΠΎΠ²Ρ‹ΠΉ ΠΊΠΎΠΌΠΌΠΈΡ‚ ΠΈ ΠΎΠ±Π½ΠΎΠ²ΠΈΡ‚ΡŒ template Π² автоматичСском Ρ€Π΅ΠΆΠΈΠΌΠ΅, поддСрТивая ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏ Infrastructure as code.

Новая Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Π° с Patroni

Π’ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ ΠΌΡ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»ΠΈ Ρ‚Π°ΠΊΡƒΡŽ схСму Ρ€Π°Π±ΠΎΡ‚Ρ‹:
ΠžΡ‚ΠΊΠ°Π·ΠΎΡƒΡΡ‚ΠΎΠΉΡ‡ΠΈΠ²Ρ‹ΠΉ кластСр PostgreSQL + Patroni. ΠžΠΏΡ‹Ρ‚ внСдрСния

ВсС сСрвСра прилоТСния ΠΎΠ±Ρ€Π°Ρ‰Π°ΡŽΡ‚ΡΡ ΠΊ балансировщику β†’ Π·Π° Π½ΠΈΠΌ стоят Π΄Π²Π° instance PgBouncer β†’ Π½Π° ΠΊΠ°ΠΆΠ΄ΠΎΠΌ instance Π·Π°ΠΏΡƒΡ‰Π΅Π½ Π‘onsul-template, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€ΠΈΡ‚ состояниС ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ кластСра Patroni ΠΈ слСдит Π·Π° Π°ΠΊΡ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΡΡ‚ΡŒΡŽ ΠΊΠΎΠ½Ρ„ΠΈΠ³Π° PgBouncer, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ направляСт запросы Π½Π° Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ Π»ΠΈΠ΄Π΅Ρ€Π° ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ кластСра.

Π ΡƒΡ‡Π½ΠΎΠ΅ тСстированиС

Π­Ρ‚Ρƒ схСму ΠΏΠ΅Ρ€Π΅Π΄ Π²Ρ‹Π²ΠΎΠ΄ΠΎΠΌ Π½Π° ΠΏΡ€ΠΎΠ΄ ΠΌΡ‹ запустили Π½Π° нСбольшой тСстовой срСдС ΠΈ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΠ»ΠΈ Ρ€Π°Π±ΠΎΡ‚Ρƒ автоматичСского ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ. ΠžΡ‚ΠΊΡ€Ρ‹Π²Π°Π»ΠΈ доску, ΠΏΠ΅Ρ€Π΅Π΄Π²ΠΈΠ³Π°Π»ΠΈ стикСр ΠΈ Π² этот ΠΌΠΎΠΌΠ΅Π½Ρ‚ β€œΡƒΠ±ΠΈΠ²Π°Π»ΠΈβ€ Π»ΠΈΠ΄Π΅Ρ€Π° кластСра. Π’ AWS для этого достаточно Π²Ρ‹ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ инстанс Ρ‡Π΅Ρ€Π΅Π· консоль.

ΠžΡ‚ΠΊΠ°Π·ΠΎΡƒΡΡ‚ΠΎΠΉΡ‡ΠΈΠ²Ρ‹ΠΉ кластСр PostgreSQL + Patroni. ΠžΠΏΡ‹Ρ‚ внСдрСния

Π‘Ρ‚ΠΈΠΊΠ΅Ρ€ Π² Ρ‚Π΅Ρ‡Π΅Π½ΠΈΠ΅ 10-20 сСкунд возвращался Π½Π°Π·Π°Π΄, Π° ΠΏΠΎΡ‚ΠΎΠΌ вновь Π½Π°Ρ‡ΠΈΠ½Π°Π» Π½ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½ΠΎ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Π°Ρ‚ΡŒΡΡ. Π—Π½Π°Ρ‡ΠΈΡ‚, кластСр Patroni сработал Π²Π΅Ρ€Π½ΠΎ: смСнил Π»ΠΈΠ΄Π΅Ρ€Π°, ΠΎΡ‚ΠΏΡ€Π°Π²ΠΈΠ» ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ Π² Π‘onsul, Π° Π‘onsul-template сразу ΠΏΠΎΠ΄Ρ…Π²Π°Ρ‚ΠΈΠ» эту ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ, Π·Π°ΠΌΠ΅Π½ΠΈΠ» ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡŽ PgBouncer ΠΈ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΈΠ» ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ Π½Π° reload.

Как Π²Ρ‹ΠΆΠΈΡ‚ΡŒ ΠΏΠΎΠ΄ высокой Π½Π°Π³Ρ€ΡƒΠ·ΠΊΠΎΠΉ ΠΈ ΡΠΎΡ…Ρ€Π°Π½ΠΈΡ‚ΡŒ ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΉ Π΄Π°ΡƒΠ½Ρ‚Π°ΠΉΠΌ?

Всё Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ ΠΎΡ‚Π»ΠΈΡ‡Π½ΠΎ! Но ΠΏΠΎΡΠ²Π»ΡΡŽΡ‚ΡΡ Π½ΠΎΠ²Ρ‹Π΅ вопросы: Как это сработаСт ΠΏΠΎΠ΄ высокой Π½Π°Π³Ρ€ΡƒΠ·ΠΊΠΎΠΉ? Как быстро ΠΈ бСзопасно Ρ€Π°ΡΠΊΠ°Ρ‚Π°Ρ‚ΡŒ всё Π½Π° production?

ΠžΡ‚Π²Π΅Ρ‚ΠΈΡ‚ΡŒ Π½Π° ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ вопрос Π½Π°ΠΌ ΠΏΠΎΠΌΠΎΠ³Π°Π΅Ρ‚ тСстовая срСда, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΠΌΡ‹ ΠΏΡ€ΠΎΠ²ΠΎΠ΄ΠΈΠΌ Π½Π°Π³Ρ€ΡƒΠ·ΠΎΡ‡Π½ΠΎΠ΅ тСстированиС. Она ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ‡Π½Π° production ΠΏΠΎ Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Π΅ ΠΈ ΠΈΠΌΠ΅Π΅Ρ‚ сгСнСрированныС тСстовыС Π΄Π°Π½Π½Ρ‹Π΅, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΠΎ ΠΎΠ±ΡŠΡ‘ΠΌΡƒ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π½ΠΎ Ρ€Π°Π²Π½Ρ‹ production. ΠœΡ‹ Ρ€Π΅ΡˆΠ°Π΅ΠΌ просто β€œΡƒΠ±ΠΈΡ‚ΡŒβ€ ΠΎΠ΄ΠΈΠ½ ΠΈΠ· мастСров PostgreSQL Π²ΠΎ врСмя тСста ΠΈ ΠΏΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ Π±ΡƒΠ΄Π΅Ρ‚. Но ΠΏΠ΅Ρ€Π΅Π΄ этим Π²Π°ΠΆΠ½ΠΎ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΡ‡Π΅ΡΠΊΡƒΡŽ раскатку, вСдь Π½Π° этой срСдС Ρƒ нас Π΅ΡΡ‚ΡŒ нСсколько ΡˆΠ°Ρ€Π΄ΠΎΠ² PostgreSQL, Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ ΠΌΡ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠΌ ΠΎΡ‚Π»ΠΈΡ‡Π½ΠΎΠ΅ тСстированиС ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΎΠ½Π½Ρ‹Ρ… скриптов ΠΏΠ΅Ρ€Π΅Π΄ ΠΏΡ€ΠΎΠ΄ΠΎΠΌ.

ОбС Π·Π°Π΄Π°Ρ‡ΠΈ выглядят Π°ΠΌΠ±ΠΈΡ†ΠΈΠΎΠ·Π½ΠΎ, Π½ΠΎ Ρƒ нас PostgreSQL 9.6. ΠœΠΎΠΆΠ΅Ρ‚ ΠΌΡ‹ сразу Π½Π° 11.2 обновимся?

ΠœΡ‹ Ρ€Π΅ΡˆΠ°Π΅ΠΌ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ это Π² 2 этапа: сначала ΠΎΠ±Π½ΠΎΠ²ΠΈΡ‚ΡŒ Π²Π΅Ρ€ΡΠΈΡŽ Π΄ΠΎ 11.2, ΠΏΠΎΡ‚ΠΎΠΌ Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ Patroni.

ОбновлСниС PostgreSQL

Для быстрого обновлСния вСрсии PostgreSQL Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠΏΡ†ΠΈΡŽ -k, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΡΠΎΠ·Π΄Π°ΡŽΡ‚ΡΡ hard link Π½Π° дискС ΠΈ Π½Π΅Ρ‚ нСобходимости Π² ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΈ Π²Π°ΡˆΠΈΡ… Π΄Π°Π½Π½Ρ‹Ρ…. На Π±Π°Π·Π°Ρ… Π² 300-400 Π“Π‘ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅ Π·Π°Π½ΠΈΠΌΠ°Π΅Ρ‚ 1 сСкунду.

Π£ нас ΠΌΠ½ΠΎΠ³ΠΎ ΡˆΠ°Ρ€Π΄ΠΎΠ², поэтому ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅ Π½ΡƒΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Π² автоматичСском Ρ€Π΅ΠΆΠΈΠΌΠ΅. Для этого ΠΌΡ‹ написали Ansible playbook, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ выполняСт вСсь процСсс обновлСния Π·Π° нас:

/usr/lib/postgresql/11/bin/pg_upgrade 
<b>--link </b>
--old-datadir='' --new-datadir='' 
 --old-bindir=''  --new-bindir='' 
 --old-options=' -c config_file=' 
 --new-options=' -c config_file='

Π—Π΄Π΅ΡΡŒ Π²Π°ΠΆΠ½ΠΎ ΠΎΡ‚ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΏΠ΅Ρ€Π΅Π΄ запуском Π°ΠΏΠ³Ρ€Π΅ΠΉΠ΄Π° Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ Π΅Π³ΠΎ с ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠΌ —check, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π±Ρ‹Ρ‚ΡŒ ΡƒΠ²Π΅Ρ€Π΅Π½Π½Ρ‹ΠΌ Π² возмоТности Π°ΠΏΠ³Ρ€Π΅ΠΉΠ΄Π°. Π’Π°ΠΊ ΠΆΠ΅ наш сцСнарий Π΄Π΅Π»Π°Π΅Ρ‚ ΠΏΠΎΠ΄ΠΌΠ΅Π½Ρƒ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΠΎΠ² Π½Π° врСмя Π°ΠΏΠ³Ρ€Π΅ΠΉΠ΄Π°. Π‘Ρ†Π΅Π½Π°Ρ€ΠΈΠΉ Ρƒ нас выполнился Π·Π° 30 сСкунд, это ΠΎΡ‚Π»ΠΈΡ‡Π½Ρ‹ΠΉ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚.

Запуск Patroni

Для Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ Π²Ρ‚ΠΎΡ€ΠΎΠΉ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ достаточно Π²Π·Π³Π»ΡΠ½ΡƒΡ‚ΡŒ Π½Π° ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡŽ Patroni. Π’ ΠΎΡ„ΠΈΡ†ΠΈΠ°Π»ΡŒΠ½ΠΎΠΌ Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΈ Π΅ΡΡ‚ΡŒ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ с initdb, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΎΡ‚Π²Π΅Ρ‡Π°Π΅Ρ‚ Π·Π° ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ Π½ΠΎΠ²ΠΎΠΉ Π±Π°Π·Ρ‹ ΠΏΡ€ΠΈ ΠΏΠ΅Ρ€Π²ΠΎΠΌ запускС Patroni. Но Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ Ρƒ нас Π΅ΡΡ‚ΡŒ ΡƒΠΆΠ΅ готовая Π±Π°Π·Π°, Ρ‚ΠΎ ΠΌΡ‹ просто ΡƒΠ΄Π°Π»ΠΈΠ»ΠΈ этот Ρ€Π°Π·Π΄Π΅Π» ΠΈΠ· ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ.

Когда ΠΌΡ‹ Π½Π°Ρ‡Π°Π»ΠΈ ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ Patroni ΡƒΠΆΠ΅ Π½Π° Π³ΠΎΡ‚ΠΎΠ²Ρ‹ΠΉ кластСр PostgreSQL ΠΈ Π·Π°ΠΏΡƒΡΠΊΠ°Ρ‚ΡŒ Π΅Π³ΠΎ, Ρ‚ΠΎ ΡΡ‚ΠΎΠ»ΠΊΠ½ΡƒΠ»ΠΈΡΡŒ с Π½ΠΎΠ²ΠΎΠΉ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠΎΠΉ: ΠΎΠ±Π° сСрвСра Π·Π°ΠΏΡƒΡΠΊΠ°Π»ΠΈΡΡŒ ΠΊΠ°ΠΊ leader. Patroni Π½ΠΈΡ‡Π΅Π³ΠΎ Π½Π΅ Π·Π½Π°Π΅Ρ‚ ΠΎ Ρ€Π°Π½Π½Π΅ΠΌ состоянии кластСра ΠΈ пытаСтся Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ ΠΎΠ±Π° сСрвСра ΠΊΠ°ΠΊ Π΄Π²Π° ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Ρ… кластСра с ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²Ρ‹ΠΌ ΠΈΠΌΠ΅Π½Π΅ΠΌ. Для Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ этой ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΡƒΠ΄Π°Π»ΠΈΡ‚ΡŒ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΡŽ с Π΄Π°Π½Π½Ρ‹ΠΌΠΈ Π½Π° slave:

rm -rf /var/lib/postgresql/

Π­Ρ‚ΠΎ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π½Π° slave!

ΠŸΡ€ΠΈ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΈ чистой Ρ€Π΅ΠΏΠ»ΠΈΠΊΠΈ Patroni Π΄Π΅Π»Π°Π΅Ρ‚ basebackup leader ΠΈ восстанавливаСт Π΅Π³ΠΎ Π½Π° Ρ€Π΅ΠΏΠ»ΠΈΠΊΡƒ, Π° Π·Π°Ρ‚Π΅ΠΌ догоняСт Π°ΠΊΡ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΠ΅ состояниС ΠΏΠΎ wal-Π»ΠΎΠ³Π°ΠΌ.

Π•Ρ‰Ρ‘ ΠΎΠ΄Π½Π° ΡΠ»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ, с ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΠΌΡ‹ ΡΡ‚ΠΎΠ»ΠΊΠ½ΡƒΠ»ΠΈΡΡŒ, β€” всС кластСры PostgreSQL ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Π½Π°Π·Ρ‹Π²Π°ΡŽΡ‚ΡΡ main. Когда ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ кластСр Π½ΠΈΡ‡Π΅Π³ΠΎ Π½Π΅ Π·Π½Π°Π΅Ρ‚ ΠΏΡ€ΠΎ Π΄Ρ€ΡƒΠ³ΠΎΠΉ β€” это Π½ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½ΠΎ. Но ΠΊΠΎΠ³Π΄Π° Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Patroni, Ρ‚ΠΎ всС кластСра Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΈΠΌΠ΅Ρ‚ΡŒ ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½ΠΎΠ΅ имя. РСшСниС β€” ΠΏΠΎΠΌΠ΅Π½ΡΡ‚ΡŒ имя кластСра Π² ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ PostgreSQL.

Нагрузочный тСст

ΠœΡ‹ запустили тСст, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΈΠΌΠΈΡ‚ΠΈΡ€ΡƒΠ΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Ρƒ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ Π½Π° досках. Когда Π½Π°Π³Ρ€ΡƒΠ·ΠΊΠ° достигла нашСго срСднСго Π΄Π½Π΅Π²Π½ΠΎΠ³ΠΎ значСния, ΠΌΡ‹ ΠΏΠΎΠ²Ρ‚ΠΎΡ€ΠΈΠ»ΠΈ Ρ‚ΠΎΡ‡Π½ΠΎ Ρ‚Π°ΠΊΠΎΠΉ ΠΆΠ΅ тСст, ΠΌΡ‹ Π²Ρ‹ΠΊΠ»ΡŽΡ‡ΠΈΠ»ΠΈ ΠΎΠ΄ΠΈΠ½ instance с leader PostgreSQL. АвтоматичСский failover сработал Ρ‚Π°ΠΊ, ΠΊΠ°ΠΊ ΠΌΡ‹ ΠΎΠΆΠΈΠ΄Π°Π»ΠΈ: Patroni смСнил Π»ΠΈΠ΄Π΅Ρ€Π°, Π‘onsul-template ΠΎΠ±Π½ΠΎΠ²ΠΈΠ» ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡŽ PgBouncer ΠΈ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΈΠ» ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ Π½Π° reload. По нашим Π³Ρ€Π°Ρ„ΠΈΠΊΠ°ΠΌΠΈ Π² Grafana Π±Ρ‹Π»ΠΎ Π²ΠΈΠ΄Π½ΠΎ, Ρ‡Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ Π·Π°Π΄Π΅Ρ€ΠΆΠΊΠΈ Π½Π° 20-30 сСкунд ΠΈ нСбольшой ΠΎΠ±ΡŠΡ‘ΠΌ ошибок с сСрвСров, связанных с соСдинСниСм ΠΊ Π±Π°Π·Π΅. Π­Ρ‚ΠΎ Π½ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½Π°Ρ ситуация, Ρ‚Π°ΠΊΠΈΠ΅ значСния допустимы для нашСго failover ΠΈ Ρ‚ΠΎΡ‡Π½ΠΎ Π»ΡƒΡ‡ΡˆΠ΅, Ρ‡Π΅ΠΌ Π΄Π°ΡƒΠ½Ρ‚Π°ΠΉΠΌ сСрвиса.

Π’Ρ‹Π²ΠΎΠ΄ Patroni Π½Π° production

Π’ ΠΈΡ‚ΠΎΠ³Π΅ Ρƒ нас получился ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΠΏΠ»Π°Π½:

  • Π”Π΅ΠΏΠ»ΠΎΠΉ Π‘onsul-template Π½Π° сСрвСра PgBouncer ΠΈ запуск;
  • ОбновлСния PostgreSQL Π΄ΠΎ вСрсии 11.2;
  • Π‘ΠΌΠ΅Π½Π° ΠΈΠΌΠ΅Π½ΠΈ кластСра;
  • Запуск кластСра Patroni.

ΠŸΡ€ΠΈ этом наша схСма позволяСт ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ ΠΏΡƒΠ½ΠΊΡ‚ практичСски Π² любоС врСмя, ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΠΎ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ ΡƒΠ±Ρ€Π°Ρ‚ΡŒ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ PgBouncer ΠΈΠ· Ρ€Π°Π±ΠΎΡ‚Ρ‹ ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ Π½Π° Π½Π΅Π³ΠΎ Π΄Π΅ΠΏΠ»ΠΎΠΉ ΠΈ запуск consul-template. Π’Π°ΠΊ ΠΌΡ‹ ΠΈ сдСлали.

Для быстрой раскатки ΠΌΡ‹ использовали Ansible, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ всС playbook ΠΌΡ‹ ΡƒΠΆΠ΅ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΠ»ΠΈ Π½Π° тСстовой срСдС, Π° врСмя выполнСния ΠΏΠΎΠ»Π½ΠΎΠ³ΠΎ сцСнария Π±Ρ‹Π»ΠΎ ΠΎΡ‚ 1,5 Π΄ΠΎ 2 ΠΌΠΈΠ½ΡƒΡ‚ для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΡˆΠ°Ρ€Π΄Π°. ΠœΡ‹ ΠΌΠΎΠ³Π»ΠΈ всё Π²Ρ‹ΠΊΠ°Ρ‚ΠΈΡ‚ΡŒ ΠΏΠΎΠΎΡ‡Π΅Ρ€Π΅Π΄Π½ΠΎ Π½Π° ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΡˆΠ°Ρ€Π΄ Π±Π΅Π· остановки нашСго сСрвиса, Π½ΠΎ Π½Π°ΠΌ ΠΏΡ€ΠΈΡˆΠ»ΠΎΡΡŒ Π±Ρ‹ Π½Π° нСсколько ΠΌΠΈΠ½ΡƒΡ‚ Π²Ρ‹ΠΊΠ»ΡŽΡ‡Π°Ρ‚ΡŒ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ PostgreSQL. Π’ этом случаС ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΠΈ, Ρ‡ΡŒΠΈ Π΄Π°Π½Π½Ρ‹Π΅ Π΅ΡΡ‚ΡŒ Π½Π° этом ΡˆΠ°Ρ€Π΄Π΅, Π½Π΅ ΠΌΠΎΠ³Π»ΠΈ Π±Ρ‹ ΠΏΠΎΠ»Π½ΠΎΡ†Π΅Π½Π½ΠΎ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ Π² это врСмя, Π° это для нас Π½Π΅ΠΏΡ€ΠΈΠ΅ΠΌΠ»Π΅ΠΌΠΎ.

Π’Ρ‹Ρ…ΠΎΠ΄ΠΎΠΌ ΠΈΠ· этой ситуации стал ΠΏΠ»Π°Π½ΠΎΠ²Ρ‹ΠΉ maintenance, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΡ€ΠΎΡ…ΠΎΠ΄ΠΈΡ‚ Ρƒ нас ΠΊΠ°ΠΆΠ΄Ρ‹Π΅ 3 мСсяца. Π­Ρ‚ΠΎ ΠΎΠΊΠ½ΠΎ для ΠΏΠ»Π°Π½ΠΎΠ²Ρ‹Ρ… Ρ€Π°Π±ΠΎΡ‚, ΠΊΠΎΠ³Π΄Π° ΠΌΡ‹ ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ Π²Ρ‹ΠΊΠ»ΡŽΡ‡Π°Π΅ΠΌ наш сСрвис ΠΈ обновляСм инстансы Π±Π°Π· Π΄Π°Π½Π½Ρ‹Ρ…. Π”ΠΎ ΠΎΡ‡Π΅Ρ€Π΅Π΄Π½ΠΎΠ³ΠΎ ΠΎΠΊΠ½Π° ΠΎΡΡ‚Π°Π²Π°Π»Π°ΡΡŒ ΠΎΠ΄Π½Π° нСдСля, ΠΈ ΠΌΡ‹ Ρ€Π΅ΡˆΠΈΠ»ΠΈ просто ΠΏΠΎΠ΄ΠΎΠΆΠ΄Π°Ρ‚ΡŒ ΠΈ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΏΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²ΠΈΡ‚ΡŒΡΡ. Π—Π° врСмя оТидания ΠΌΡ‹ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΏΠΎΠ΄ΡΡ‚Ρ€Π°Ρ…ΠΎΠ²Π°Π»ΠΈΡΡŒ: для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΡˆΠ°Ρ€Π΄Π° PostgreSQL подняли ΠΏΠΎ запасной Ρ€Π΅ΠΏΠ»ΠΈΠΊΠ΅ Π½Π° случай Π½Π΅ΡƒΠ΄Π°Ρ‡ΠΈ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡΠΎΡ…Ρ€Π°Π½ΠΈΡ‚ΡŒ самыС послСдниС Π΄Π°Π½Π½Ρ‹Π΅, ΠΈ Π΄ΠΎΠ±Π°Π²ΠΈΠ»ΠΈ ΠΏΠΎ Π½ΠΎΠ²ΠΎΠΌΡƒ инстансу для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΡˆΠ°Ρ€Π΄Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΡΡ‚Π°Ρ‚ΡŒ Π½ΠΎΠ²ΠΎΠΉ Ρ€Π΅ΠΏΠ»ΠΈΠΊΠΎΠΉ Π² кластСрС Patroni, Ρ‡Ρ‚ΠΎΠ± Π½Π΅ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ для удалСния Π΄Π°Π½Π½Ρ‹Ρ…. Всё это ΠΏΠΎΠΌΠΎΠ³Π»ΠΎ максимально ΡΠ½ΠΈΠ·ΠΈΡ‚ΡŒ риск ошибки.
ΠžΡ‚ΠΊΠ°Π·ΠΎΡƒΡΡ‚ΠΎΠΉΡ‡ΠΈΠ²Ρ‹ΠΉ кластСр PostgreSQL + Patroni. ΠžΠΏΡ‹Ρ‚ внСдрСния

ΠœΡ‹ пСрСзапустили наш сСрвис, всС Π·Π°Ρ€Π°Π±ΠΎΡ‚Π°Π»ΠΎ ΠΊΠ°ΠΊ Π½Π°Π΄ΠΎ, ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΠΈ ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠΈΠ»ΠΈ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ, Π½ΠΎ Π½Π° Π³Ρ€Π°Ρ„ΠΈΠΊΠ°Ρ… ΠΌΡ‹ Π·Π°ΠΌΠ΅Ρ‚ΠΈΠ»ΠΈ аномально Π²Ρ‹ΡΠΎΠΊΡƒΡŽ Π½Π°Π³Ρ€ΡƒΠ·ΠΊΡƒ Π½Π° Π‘onsul-сСрвСра.
ΠžΡ‚ΠΊΠ°Π·ΠΎΡƒΡΡ‚ΠΎΠΉΡ‡ΠΈΠ²Ρ‹ΠΉ кластСр PostgreSQL + Patroni. ΠžΠΏΡ‹Ρ‚ внСдрСния

ΠŸΠΎΡ‡Π΅ΠΌΡƒ ΠΌΡ‹ Π½Π΅ ΡƒΠ²ΠΈΠ΄Π΅Π»ΠΈ это Π½Π° тСстовой срСдС? Π­Ρ‚Π° ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ° ΠΎΡ‡Π΅Π½ΡŒ Ρ…ΠΎΡ€ΠΎΡˆΠΎ ΠΈΠ»Π»ΡŽΡΡ‚Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚, Ρ‡Ρ‚ΠΎ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΡƒ Infrastructure as code ΠΈ Π΄ΠΎΡ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ всю инфраструктуру, начиная с тСстовых срСд ΠΈ заканчивая production. Π˜Π½Π°Ρ‡Π΅ ΠΎΡ‡Π΅Π½ΡŒ Π»Π΅Π³ΠΊΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ Ρ‚Π°ΠΊΡƒΡŽ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»ΠΈ ΠΌΡ‹. Π§Ρ‚ΠΎ ΠΏΡ€ΠΎΠΈΠ·ΠΎΡˆΠ»ΠΎ? Π‘onsul сначала появился Π½Π° production, Π° ΠΏΠΎΡ‚ΠΎΠΌ Π½Π° тСстовых срСдах, Π² ΠΈΡ‚ΠΎΠ³Π΅ Π½Π° тСстовых срСдах вСрсия Consul Π±Ρ‹Π»Π° Π²Ρ‹ΡˆΠ΅, Ρ‡Π΅ΠΌ Π½Π° production. Как Ρ€Π°Π· Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΈΠ· Ρ€Π΅Π»ΠΈΠ·ΠΎΠ² Π±Ρ‹Π»Π° Ρ€Π΅ΡˆΠ΅Π½Π° ΡƒΡ‚Π΅Ρ‡ΠΊΠ° CPU ΠΏΡ€ΠΈ Ρ€Π°Π±ΠΎΡ‚Π΅ с consul-template. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ ΠΌΡ‹ просто ΠΎΠ±Π½ΠΎΠ²ΠΈΠ»ΠΈ Consul, Ρ€Π΅ΡˆΠΈΠ² Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ.

Restart Patroni cluster

Однако ΠΌΡ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»ΠΈ Π½ΠΎΠ²ΡƒΡŽ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ, ΠΎ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Π΄Π°ΠΆΠ΅ Π½Π΅ ΠΏΠΎΠ΄ΠΎΠ·Ρ€Π΅Π²Π°Π»ΠΈ. ΠŸΡ€ΠΈ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠΈ Consul ΠΌΡ‹ просто удаляСм Π½ΠΎΠ΄Ρƒ Consul ΠΈΠ· кластСра с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ consul leave β†’ Patroni ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ ΠΊ Π΄Ρ€ΡƒΠ³ΠΎΠΌΡƒ Consul сСрвСру β†’ всё Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚. Но ΠΊΠΎΠ³Π΄Π° ΠΌΡ‹ дошли Π΄ΠΎ послСднСго инстанса кластСра Consul ΠΈ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΈΠ»ΠΈ Π΅ΠΌΡƒ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ consul leave, всС кластСры Patroni просто ΠΏΠ΅Ρ€Π΅Π·Π°ΠΏΡƒΡΡ‚ΠΈΠ»ΠΈΡΡŒ, Π° Π² Π»ΠΎΠ³Π°Ρ… ΠΌΡ‹ ΡƒΠ²ΠΈΠ΄Π΅Π»ΠΈ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΡƒΡŽ ΠΎΡˆΠΈΠ±ΠΊΡƒ:

ERROR: get_cluster
Traceback (most recent call last):
...
RetryFailedError: 'Exceeded retry deadline'
ERROR: Error communicating with DCS
<b>LOG: database system is shut down</b>

ΠšΠ»Π°ΡΡ‚Π΅Ρ€ Patroni Π½Π΅ смог ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎ своём кластСрС ΠΈ пСрСзапустился.

Для поиска Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ ΠΌΡ‹ ΠΎΠ±Ρ€Π°Ρ‚ΠΈΠ»ΠΈΡΡŒ ΠΊ Π°Π²Ρ‚ΠΎΡ€Π°ΠΌ Patroni Ρ‡Π΅Ρ€Π΅Π· issue Π½Π° github. Они ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠΈΠ»ΠΈ ΡƒΠ»ΡƒΡ‡ΡˆΠ΅Π½ΠΈΡ Π½Π°ΡˆΠΈΡ… ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΎΠ½Π½Ρ‹Ρ… Ρ„Π°ΠΉΠ»ΠΎΠ²:

consul:
 consul.checks: []
bootstrap:
 dcs:
   retry_timeout: 8

ΠœΡ‹ смогли ΠΏΠΎΠ²Ρ‚ΠΎΡ€ΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ Π½Π° тСстовой срСдС ΠΈ протСстировали Ρ‚Π°ΠΌ эти ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹, Π½ΠΎ, ΠΊ соТалСнию, ΠΎΠ½ΠΈ Π½Π΅ сработали.

ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΠ° Π΄ΠΎ сих ΠΏΠΎΡ€ остаётся Π½Π΅Ρ€Π΅ΡˆΡ‘Π½Π½ΠΎΠΉ. ΠœΡ‹ ΠΏΠ»Π°Π½ΠΈΡ€ΡƒΠ΅ΠΌ ΠΏΠΎΠΏΡ€ΠΎΠ±ΠΎΠ²Π°Ρ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Ρ‹ Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ:

  • Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π‘onsul-agent Π½Π° ΠΊΠ°ΠΆΠ΄ΠΎΠΌ инстансС кластСра Patroni;
  • Π˜ΡΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ Π² ΠΊΠΎΠ΄Π΅.

Нам понятно мСсто возникновСния ошибки: вСроятно, ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ° Π² использовании default timeout, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π½Π΅ пСрСопрСдСляСтся Ρ‡Π΅Ρ€Π΅Π· Ρ„Π°ΠΉΠ» ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ. ΠŸΡ€ΠΈ ΡƒΠ΄Π°Π»Π΅Π½ΠΈΠΈ послСднСго сСрвСра Π‘onsul ΠΈΠ· кластСра происходит зависаниС всСго Π‘onsul-кластСра, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ длится дольшС сСкунды, ΠΈΠ·-Π·Π° этого Patroni Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ состояниС кластСра ΠΈ ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ пСрСзапускаСт вСсь кластСр.

К ΡΡ‡Π°ΡΡ‚ΡŒΡŽ, большС Π½ΠΈΠΊΠ°ΠΊΠΈΡ… ошибок ΠΌΡ‹ Π½Π΅ встрСтили.

Π˜Ρ‚ΠΎΠ³ΠΈ использования Patroni

ПослС ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎΠ³ΠΎ запуска Patroni ΠΌΡ‹ Π΄ΠΎΠ±Π°Π²ΠΈΠ»ΠΈ ΠΏΠΎ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΉ Ρ€Π΅ΠΏΠ»ΠΈΠΊΠ΅ Π² ΠΊΠ°ΠΆΠ΄ΠΎΠΌ кластСрС. Π’Π΅ΠΏΠ΅Ρ€ΡŒ Π² ΠΊΠ°ΠΆΠ΄ΠΎΠΌ кластСрС Π΅ΡΡ‚ΡŒ ΠΏΠΎΠ΄ΠΎΠ±ΠΈΠ΅ ΠΊΠ²ΠΎΡ€ΡƒΠΌΠ°: ΠΎΠ΄ΠΈΠ½ Π»ΠΈΠ΄Π΅Ρ€ ΠΈ Π΄Π²Π΅ Ρ€Π΅ΠΏΠ»ΠΈΠΊΠΈ, β€” для подстраховки Π½Π° случай split-brain ΠΏΡ€ΠΈ ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΈ.
ΠžΡ‚ΠΊΠ°Π·ΠΎΡƒΡΡ‚ΠΎΠΉΡ‡ΠΈΠ²Ρ‹ΠΉ кластСр PostgreSQL + Patroni. ΠžΠΏΡ‹Ρ‚ внСдрСния

На production Patroni Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Π±ΠΎΠ»Π΅Π΅ Ρ‚Ρ€Ρ‘Ρ… мСсяцСв. Π—Π° это врСмя ΠΎΠ½ ΡƒΠΆΠ΅ успСл нас Π²Ρ‹Ρ€ΡƒΡ‡ΠΈΡ‚ΡŒ. НСдавно Π² AWS ΡƒΠΌΠ΅Ρ€ Π»ΠΈΠ΄Π΅Ρ€ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈΠ· кластСров, автоматичСский failover сработал ΠΈ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΠΈ ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠΈΠ»ΠΈ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ. Patroni Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΠ» свою Π³Π»Π°Π²Π½ΡƒΡŽ Π·Π°Π΄Π°Ρ‡Ρƒ.

НСбольшой ΠΈΡ‚ΠΎΠ³ использования Patroni:

  • Удобство измСнСния ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ. Достаточно ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡŽ Π½Π° ΠΎΠ΄Π½ΠΎΠΌ инстансС ΠΈ ΠΎΠ½Π° подтянСтся Π½Π° вСсь кластСр. Если трСбуСтся ΠΏΠ΅Ρ€Π΅Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠ° для примСнСния Π½ΠΎΠ²ΠΎΠΉ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ, Ρ‚ΠΎ Patroni ΠΎΠ± этом сообщит. Patroni ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠ΅Ρ€Π΅Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ вСсь кластСр с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΎΠ΄Π½ΠΎΠΉ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹, Ρ‡Ρ‚ΠΎ Ρ‚ΠΎΠΆΠ΅ ΠΎΡ‡Π΅Π½ΡŒ ΡƒΠ΄ΠΎΠ±Π½ΠΎ.
  • АвтоматичСский failover Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ ΠΈ ΡƒΠΆΠ΅ успСл нас Π²Ρ‹Ρ€ΡƒΡ‡ΠΈΡ‚ΡŒ.
  • ОбновлСниС PostgreSQL Π±Π΅Π· Π΄Π°ΡƒΠ½Ρ‚Π°ΠΉΠΌΠ° прилоТСния. НСобходимо сначала ΠΎΠ±Π½ΠΎΠ²ΠΈΡ‚ΡŒ Ρ€Π΅ΠΏΠ»ΠΈΠΊΠΈ Π½Π° Π½ΠΎΠ²ΡƒΡŽ Π²Π΅Ρ€ΡΠΈΡŽ, Π·Π°Ρ‚Π΅ΠΌ ΡΠΌΠ΅Π½ΠΈΡ‚ΡŒ Π»ΠΈΠ΄Π΅Ρ€Π° Π² кластСрС Patroni ΠΈ ΠΎΠ±Π½ΠΎΠ²ΠΈΡ‚ΡŒ старого Π»ΠΈΠ΄Π΅Ρ€Π°. ΠŸΡ€ΠΈ этом происходит Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΠ΅ тСстированиС автоматичСского failover.

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ: habr.com