Как ΠΌΡ‹ построили Π½Π°Π΄Ρ‘ΠΆΠ½Ρ‹ΠΉ кластСр PostgreSQL Π½Π° Patroni

Как ΠΌΡ‹ построили Π½Π°Π΄Ρ‘ΠΆΠ½Ρ‹ΠΉ кластСр PostgreSQL Π½Π° Patroni

На сСгодняшний дСнь высокая Π΄ΠΎΡΡ‚ΡƒΠΏΠ½ΠΎΡΡ‚ΡŒ сСрвисов трСбуСтся всСгда ΠΈ Π²Π΅Π·Π΄Π΅, Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² ΠΊΡ€ΡƒΠΏΠ½Ρ‹Ρ… Π΄ΠΎΡ€ΠΎΠ³ΠΈΡ… ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°Ρ…. Π’Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ нСдоступныС сайты с сообщСниСм Β«Π˜Π·Π²ΠΈΠ½ΠΈΡ‚Π΅, проводится тСхничСскоС обслуТиваниС» Π΅Ρ‰Ρ‘ Π²ΡΡ‚Ρ€Π΅Ρ‡Π°ΡŽΡ‚ΡΡ, Π½ΠΎ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‚ ΡΠ½ΠΈΡΡ…ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΡƒΡŽ ΡƒΠ»Ρ‹Π±ΠΊΡƒ. ΠŸΡ€ΠΈΠ±Π°Π²ΠΈΠΌ ΠΊ этому Тизнь Π² ΠΎΠ±Π»Π°ΠΊΠ°Ρ…, ΠΊΠΎΠ³Π΄Π° для запуска Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ сСрвСра Π½ΡƒΠΆΠ΅Π½ лишь ΠΎΠ΄ΠΈΠ½ Π²Ρ‹Π·ΠΎΠ² ΠΊ API, ΠΏΡ€ΠΈΡ‡Π΅ΠΌ Π΄ΡƒΠΌΠ°Ρ‚ΡŒ ΠΎ Β«ΠΆΠ΅Π»Π΅Π·Π½ΠΎΠΉΒ» эксплуатации Π½Π΅ Π½Π°Π΄ΠΎ. И ΡƒΠΆΠ΅ Π½Π΅ остаСтся ΠΎΠΏΡ€Π°Π²Π΄Π°Π½ΠΈΠΉ, ΠΏΠΎΡ‡Π΅ΠΌΡƒ критичная систСма Π½Π΅ Π±Ρ‹Π»Π° сдСлана Π½Π°Π΄Π΅ΠΆΠ½ΠΎ с использованиСм кластСрных Ρ‚Π΅Ρ…Π½ΠΎΠ»ΠΎΠ³ΠΈΠΉ ΠΈ рСзСрвирования.

ΠœΡ‹ расскаТСм, ΠΊΠ°ΠΊΠΈΠ΅ Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ ΠΌΡ‹ рассматривали для обСспСчСния надёТности Π±Π°Π· Π΄Π°Π½Π½Ρ‹Ρ… Π² своих сСрвисах ΠΈ ΠΊ Ρ‡Π΅ΠΌΡƒ ΠΏΡ€ΠΈΡˆΠ»ΠΈ. Плюс Π΄Π΅ΠΌΠΎ с Π΄Π°Π»Π΅ΠΊΠΎ ΠΈΠ΄ΡƒΡ‰ΠΈΠΌΠΈ Π²Ρ‹Π²ΠΎΠ΄Π°ΠΌΠΈ.

ЛСгаси Π² Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Π΅ обСспСчСния высокой доступности

Π•Ρ‰Π΅ Π»ΡƒΡ‡ΡˆΠ΅ это Π²ΠΈΠ΄Π½ΠΎ Π² Ρ€Π°Π·Ρ€Π΅Π·Π΅ развития Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… opensource-систСм. Π‘Ρ‚Π°Ρ€Ρ‹Π΅ Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ Π²Ρ‹Π½ΡƒΠΆΠ΄Π΅Π½Ρ‹ Π±Ρ‹Π»ΠΈ Π΄ΠΎΠ±Π°Π²Π»ΡΡ‚ΡŒ Ρ‚Π΅Ρ…Π½ΠΎΠ»ΠΎΠ³ΠΈΠΈ высокой доступности ΠΏΠΎ ΠΌΠ΅Ρ€Π΅ ΠΏΠΎΠ²Ρ‹ΡˆΠ΅Π½ΠΈΡ спроса. И качСство ΠΈΡ… Π±Ρ‹Π»ΠΎ Ρ€Π°Π·Π½Ρ‹ΠΌ. РСшСния Π½ΠΎΠ²ΠΎΠ³ΠΎ поколСния ставят Π²Ρ‹ΡΠΎΠΊΡƒΡŽ Π΄ΠΎΡΡ‚ΡƒΠΏΠ½ΠΎΡΡ‚ΡŒ Π² основу своСй Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Ρ‹. НапримСр, MongoDB ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΎΠ½ΠΈΡ€ΡƒΠ΅Ρ‚ кластСр ΠΊΠ°ΠΊ основной Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ использования. ΠšΠ»Π°ΡΡ‚Π΅Ρ€ ΠΌΠ°ΡΡˆΡ‚Π°Π±ΠΈΡ€ΡƒΠ΅Ρ‚ΡΡ Π³ΠΎΡ€ΠΈΠ·ΠΎΠ½Ρ‚Π°Π»ΡŒΠ½ΠΎ, Ρ‡Ρ‚ΠΎ являСтся ΡΠΈΠ»ΡŒΠ½Ρ‹ΠΌ ΠΊΠΎΠ½ΠΊΡƒΡ€Π΅Π½Ρ‚Π½Ρ‹ΠΌ прСимущСством этой Π‘Π£Π‘Π”.

ВСрнёмся ΠΊ PostgreSQL. Π­Ρ‚ΠΎ ΠΎΠ΄ΠΈΠ½ ΠΈΠ· ΡΡ‚Π°Ρ€Π΅ΠΉΡˆΠΈΡ… популярных opensource-ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΎΠ², ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ Ρ€Π΅Π»ΠΈΠ· ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ состоялся Π² 95-ΠΌ Π³ΠΎΠ΄Ρƒ ΠΏΡ€ΠΎΡˆΠ»ΠΎΠ³ΠΎ Π²Π΅ΠΊΠ°. Команда ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° Π΄ΠΎΠ»Π³ΠΎΠ΅ врСмя Π½Π΅ считала Π²Ρ‹ΡΠΎΠΊΡƒΡŽ Π΄ΠΎΡΡ‚ΡƒΠΏΠ½ΠΎΡΡ‚ΡŒ Π·Π°Π΄Π°Ρ‡Π΅ΠΉ, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ Π½ΡƒΠΆΠ½ΠΎ Ρ€Π΅ΡˆΠ°Ρ‚ΡŒ со стороны систСмы. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ тСхнология Ρ€Π΅ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΠΈ для создания ΠΊΠΎΠΏΠΈΠΉ Π΄Π°Π½Π½Ρ‹Ρ… стала встроСнной Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² вСрсии 8.2 Π² 2006-ΠΌ, Π½ΠΎ ΠΎΠ½Π° Π±Ρ‹Π»Π° Ρ„Π°ΠΉΠ»ΠΎΠ²ΠΎΠΉ (log shipping). Π’ 2010 Π² вСрсии 9.0 появилась потоковая рСпликация, ΠΈ ΠΎΠ½Π° являСтся основой для создания самых Ρ€Π°Π·Π½Ρ‹Ρ… кластСров. Π­Ρ‚ΠΎ, собствСнно, ΠΎΡ‡Π΅Π½ΡŒ удивляСт людСй, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ знакомятся с PostgreSQL послС Enterprise SQL ΠΈΠ»ΠΈ соврСмСнных NoSQL β€” стандартным Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ΠΌ ΠΎΡ‚ сообщСства являСтся просто ΠΏΠ°Ρ€Π° master-replica с синхронной ΠΈΠ»ΠΈ асинхронной Ρ€Π΅ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΠ΅ΠΉ. ΠŸΡ€ΠΈ этом Π² стокС ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ мастСра производится Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽ, ΠΈ вопрос ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΠΎΠ² Ρ‚Π°ΠΊΠΆΠ΅ прСдлагаСтся Ρ€Π΅ΡˆΠ°Ρ‚ΡŒ ΡΠ°ΠΌΠΎΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½ΠΎ.

Как ΠΌΡ‹ Ρ€Π΅ΡˆΠΈΠ»ΠΈ Π΄Π΅Π»Π°Ρ‚ΡŒ Π½Π°Π΄Ρ‘ΠΆΠ½Ρ‹ΠΉ PostgreSQL ΠΈ Ρ‡Ρ‚ΠΎ ΠΌΡ‹ для этого Π²Ρ‹Π±Ρ€Π°Π»ΠΈ

Π’Π΅ΠΌ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅, PostgreSQL Π½Π΅ стал Π±Ρ‹ Ρ‚Π°ΠΊΠΈΠΌ популярным, Ссли Π±Ρ‹ Π½Π΅ Π±Ρ‹Π»ΠΎ ΠΎΠ³Ρ€ΠΎΠΌΠ½ΠΎΠ³ΠΎ количСства ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΎΠ² ΠΈ инструмСнтов, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΠΎΠΌΠΎΠ³Π°ΡŽΡ‚ ΠΏΠΎΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ отказоустойчивоС Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅, Π½Π΅ Ρ‚Ρ€Π΅Π±ΡƒΡŽΡ‰Π΅Π΅ постоянного внимания. Π’ ΠΎΠ±Π»Π°ΠΊΠ΅ Mail.ru Cloud Solutions (MCS) с самого запуска DBaaS Π±Ρ‹Π»ΠΈ доступны ΠΎΠ΄ΠΈΠ½ΠΎΡ‡Π½Ρ‹Π΅ сСрвСры PostgreSQL ΠΈ ΠΏΠ°Ρ€Ρ‹ мастСр-Ρ€Π΅ΠΏΠ»ΠΈΠΊΠ° с асинхронной Ρ€Π΅ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΠ΅ΠΉ.

ЕстСствСнно, ΠΌΡ‹ Ρ…ΠΎΡ‚Π΅Π»ΠΈ ΡƒΠΏΡ€ΠΎΡΡ‚ΠΈΡ‚ΡŒ всСм Тизнь ΠΈ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ доступной Ρ‚Π°ΠΊΡƒΡŽ ΠΈΠ½ΡΡ‚Π°Π»Π»ΡΡ†ΠΈΡŽ PostgreSQL, которая ΠΌΠΎΠ³Π»Π° ΡΠ»ΡƒΠΆΠΈΡ‚ΡŒ основой для высокодоступных сСрвисов, Π·Π° ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Π½Π΅ Π½ΡƒΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ Π±Ρ‹ постоянно ΡΠ»Π΅Π΄ΠΈΡ‚ΡŒ ΠΈ ΠΏΡ€ΠΎΡΡ‹ΠΏΠ°Ρ‚ΡŒΡΡ Π½ΠΎΡ‡ΡŒΡŽ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅. Π’ этом сСгмСнтС Π΅ΡΡ‚ΡŒ ΠΈ старыС ΠΏΡ€ΠΎΠ²Π΅Ρ€Π΅Π½Π½Ρ‹Π΅ Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ, ΠΈ ΠΏΠΎΠΊΠΎΠ»Π΅Π½ΠΈΠ΅ Π½ΠΎΠ²Ρ‹Ρ… ΡƒΡ‚ΠΈΠ»ΠΈΡ‚, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰ΠΈΡ… послСдниС Π½Π°Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ.

БСгодня ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ° высокой доступности упираСтся Π½Π΅ Π² Ρ€Π΅Π·Π΅Ρ€Π²ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ (это само собой), Π° Π² консСнсус β€” Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ ΠΏΠΎ Π²Ρ‹Π±ΠΎΡ€Ρƒ Π»ΠΈΠ΄Π΅Ρ€Π° (Leader election). Π§Π°Ρ‰Π΅ всСго ΠΊΡ€ΡƒΠΏΠ½Ρ‹Π΅ Π°Π²Π°Ρ€ΠΈΠΈ происходят Π½Π΅ ΠΈΠ·-Π·Π° Π½Π΅Ρ…Π²Π°Ρ‚ΠΊΠΈ сСрвСров, Π° ΠΈΠ·-Π·Π° ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ с консСнсусом: Π½Π΅ выбрался Π½ΠΎΠ²Ρ‹ΠΉ Π»ΠΈΠ΄Π΅Ρ€, появились Π΄Π²Π° Π»ΠΈΠ΄Π΅Ρ€Π° Π² Ρ€Π°Π·Π½Ρ‹Ρ… Π΄Π°Ρ‚Π°Ρ†Π΅Π½Ρ‚Ρ€Π°Ρ… ΠΈ Ρ‚.ΠΏ. ΠŸΡ€ΠΈΠΌΠ΅Ρ€ β€” авария Π½Π° MySQL-кластСрС Github β€” ΠΎΠ½ΠΈ написали ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½Ρ‹ΠΉ постмортСм.

ΠœΠ°Ρ‚Π΅ΠΌΠ°Ρ‚ΠΈΡ‡Π΅ΡΠΊΠ°Ρ Π±Π°Π·Π° Π² этом вопросС ΠΎΡ‡Π΅Π½ΡŒ ΡΠ΅Ρ€ΡŒΠ΅Π·Π½Π°Ρ. Π‘ ΠΎΠ΄Π½ΠΎΠΉ стороны, Π΅ΡΡ‚ΡŒ CAP Ρ‚Π΅ΠΎΡ€Π΅ΠΌΠ°, которая Π½Π°ΠΊΠ»Π°Π΄Ρ‹Π²Π°Π΅Ρ‚ тСорСтичСскиС ограничСния Π½Π° возмоТности построСния HA-Ρ€Π΅ΡˆΠ΅Π½ΠΈΠΉ, с Π΄Ρ€ΡƒΠ³ΠΎΠΉ β€” матСматичСски Π΄ΠΎΠΊΠ°Π·Π°Π½Π½Ρ‹Π΅ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΡ‹ опрСдСлСния консСнсуса, Ρ‚Π°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ Paxos ΠΈ Raft. На этой основС ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‚ довольно популярныС DCS (систСмы Π΄Π΅Ρ†Π΅Π½Ρ‚Ρ€Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ консСнсуса) β€” Zookeeper, etcd, Consul. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ Ссли систСма принятия Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Π½Π° ΠΊΠ°ΠΊΠΎΠΌ-Ρ‚ΠΎ своСм Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ΅, написанном ΡΠ°ΠΌΠΎΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½ΠΎ, слСдуСт ΠΊΡ€Π°ΠΉΠ½Π΅ остороТно ΠΊ Π½Π΅ΠΌΡƒ ΠΎΡ‚Π½ΠΎΡΠΈΡ‚ΡŒΡΡ. ПослС Π°Π½Π°Π»ΠΈΠ·Π° ΠΎΠ³Ρ€ΠΎΠΌΠ½ΠΎΠ³ΠΎ количСства систСм ΠΌΡ‹ ΠΎΡΡ‚Π°Π½ΠΎΠ²ΠΈΠ»ΠΈΡΡŒ Π½Π° Patroni β€” opensource-систСмС, Π² основном, Ρ€Π°Π·Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅ΠΌΠΎΠΉ ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΠ΅ΠΉ Zalando.

Π’ качСствС лиричСского отступлСния скаТу, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ Ρ‚Π°ΠΊΠΆΠ΅ рассматривали ΠΈ multi-master Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ, Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ кластСры, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠΆΠ½ΠΎ Π³ΠΎΡ€ΠΈΠ·ΠΎΠ½Ρ‚Π°Π»ΡŒΠ½ΠΎ ΠΌΠ°ΡΡˆΡ‚Π°Π±ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π½Π° запись. Однако ΠΏΠΎ Π΄Π²ΡƒΠΌ Π³Π»Π°Π²Π½Ρ‹ΠΌ ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π°ΠΌ Ρ€Π΅ΡˆΠΈΠ»ΠΈ Π½Π΅ Π΄Π΅Π»Π°Ρ‚ΡŒ Ρ‚Π°ΠΊΠΎΠΉ кластСр. Π’ΠΎ-ΠΏΠ΅Ρ€Π²Ρ‹Ρ…, Ρ‚Π°ΠΊΠΈΠ΅ Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ ΠΈΠΌΠ΅ΡŽΡ‚ Π²Ρ‹ΡΠΎΠΊΡƒΡŽ ΡΠ»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΈ, соотвСтствСнно, большС уязвимых мСст. Π‘ΡƒΠ΄Π΅Ρ‚ тяТСло ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ ΡΡ‚Π°Π±ΠΈΠ»ΡŒΠ½ΠΎΠ΅ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ для всСх случаСв. Π’ΠΎ-Π²Ρ‚ΠΎΡ€Ρ‹Ρ…, Π² Ρ‚Π°ΠΊΠΎΠΌ случаС PostgreSQL пСрСстаСт Π±Ρ‹Ρ‚ΡŒ чистым (native), Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π±ΡƒΠ΄ΡƒΡ‚ нСдоступны, Ρƒ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ ΠΏΡ€ΠΈ Ρ€Π°Π±ΠΎΡ‚Π΅ ΠΌΠΎΠ³ΡƒΡ‚ Π²ΠΎΠ·Π½ΠΈΠΊΠ½ΡƒΡ‚ΡŒ скрытыС Π±Π°Π³ΠΈ.

Patroni

Π˜Ρ‚Π°ΠΊ, ΠΊΠ°ΠΊ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Patroni? Π Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ Π½Π΅ стали ΠΈΠ·ΠΎΠ±Ρ€Π΅Ρ‚Π°Ρ‚ΡŒ вСлосипСд ΠΈ ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠΈΠ»ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π² основС ΠΎΠ΄Π½ΠΎ ΠΈΠ· ΠΏΡ€ΠΎΠ²Π΅Ρ€Π΅Π½Π½Ρ‹Ρ… DCS-Ρ€Π΅ΡˆΠ΅Π½ΠΈΠΉ. На ΠΎΡ‚ΠΊΡƒΠΏ Π΅ΠΌΡƒ ΠΎΡ‚Π΄Π°ΡŽΡ‚ΡΡ всС вопросы с синхронизациСй ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΉ, Π²Ρ‹Π±ΠΎΡ€ΠΎΠΌ Π»ΠΈΠ΄Π΅Ρ€Π° ΠΈ ΠΊΠ²ΠΎΡ€ΡƒΠΌΠΎΠΌ. ΠœΡ‹ Π²Ρ‹Π±Ρ€Π°Π»ΠΈ для этого etcd.

Π”Π°Π»Π΅Π΅ Patroni занимаСтся ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ΠΌ всСх настроСк Π½Π° PostgreSQL ΠΈ настройками Ρ€Π΅ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΠΈ, Π° Ρ‚Π°ΠΊΠΆΠ΅ исполнСниСм ΠΊΠΎΠΌΠ°Π½Π΄ Π½Π° switchover ΠΈ failover (Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ β€” ΡˆΡ‚Π°Ρ‚Π½ΠΎΠ³ΠΎ ΠΈ Π½Π΅ΡˆΡ‚Π°Ρ‚Π½ΠΎΠ³ΠΎ ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ мастСра). ΠšΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎ Π² ΠΎΠ±Π»Π°ΠΊΠ΅ MCS ΠΌΠΎΠΆΠ½ΠΎ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ кластСр ΠΈΠ· мастСра, синхронной Ρ€Π΅ΠΏΠ»ΠΈΠΊΠΈ ΠΈ ΠΎΠ΄Π½ΠΎΠΉ ΠΈΠ»ΠΈ Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… асинхронных Ρ€Π΅ΠΏΠ»ΠΈΠΊ. ΠŸΡ€ΠΈΡΡƒΡ‚ΡΡ‚Π²ΠΈΠ΅ синхронной Ρ€Π΅ΠΏΠ»ΠΈΠΊΠΈ обСспСчиваСт ΡΠΎΡ…Ρ€Π°Π½Π½ΠΎΡΡ‚ΡŒ Π΄Π°Π½Π½Ρ‹Ρ… ΠΊΠ°ΠΊ ΠΌΠΈΠ½ΠΈΠΌΡƒΠΌ Π½Π° 2 сСрвСрах, ΠΈ ΠΈΠΌΠ΅Π½Π½ΠΎ эта Ρ€Π΅ΠΏΠ»ΠΈΠΊΠ° Π±ΡƒΠ΄Π΅Ρ‚ Π³Π»Π°Π²Π½Ρ‹ΠΌ Β«ΠΊΠ°Π½Π΄ΠΈΠ΄Π°Ρ‚ΠΎΠΌ Π² мастСра».

Π’Π°ΠΊ ΠΊΠ°ΠΊ etcd разворачиваСтся Π½Π° Ρ‚Π΅Ρ… ΠΆΠ΅ сСрвСрах, рСкомСндуСтся количСство сСрвСров 3 ΠΈΠ»ΠΈ 5, для ΠΎΠΏΡ‚ΠΈΠΌΠ°Π»ΡŒΠ½ΠΎΠ³ΠΎ значСния ΠΊΠ²ΠΎΡ€ΡƒΠΌΠ°. Π’Π°ΠΊΠΎΠΉ кластСр ΠΌΠ°ΡΡˆΡ‚Π°Π±ΠΈΡ€ΡƒΠ΅Ρ‚ΡΡ Π³ΠΎΡ€ΠΈΠ·ΠΎΠ½Ρ‚Π°Π»ΡŒΠ½ΠΎ Π½Π° Ρ‡Ρ‚Π΅Π½ΠΈΠ΅ (ΠΎ ΠΌΠ°ΡΡˆΡ‚Π°Π±ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΈ Π½Π° запись я писал Π²Ρ‹ΡˆΠ΅). Π’Π΅ΠΌ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅ слСдуСт ΡƒΡ‡ΠΈΡ‚Ρ‹Π²Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ асинхронным Ρ€Π΅ΠΏΠ»ΠΈΠΊΠ°ΠΌ свойствСнно отставаниС, особСнно ΠΏΡ€ΠΈ высоких Π½Π°Π³Ρ€ΡƒΠ·ΠΊΠ°Ρ….

ИспользованиС Ρ‚Π°ΠΊΠΈΡ… Ρ€Π΅ΠΏΠ»ΠΈΠΊ Π½Π° Ρ‡Ρ‚Π΅Π½ΠΈΠ΅ (hot standby) обоснованно для Π·Π°Π΄Π°Ρ‡ отчСтности ΠΈΠ»ΠΈ Π°Π½Π°Π»ΠΈΡ‚ΠΈΠΊΠΈ ΠΈ Ρ€Π°Π·Π³Ρ€ΡƒΠΆΠ°Π΅Ρ‚ мастСр-сСрвСр.

Если Π²Ρ‹ Π·Π°Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Ρ‚Π°ΠΊΠΎΠΉ кластСр ΡΠ°ΠΌΠΎΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½ΠΎ, Ρ‚ΠΎ Π²Π°ΠΌ понадобится:

  • ΠΏΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²ΠΈΡ‚ΡŒ 3 ΠΈΠ»ΠΈ Π±ΠΎΠ»Π΅Π΅ сСрвСров, Π½Π°ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ IP-Π°Π΄Ρ€Π΅ΡΠ°Ρ†ΠΈΡŽ ΠΈ ΠΏΡ€Π°Π²ΠΈΠ»Π° firewall ΠΌΠ΅ΠΆΠ΄Ρƒ Π½ΠΈΠΌΠΈ;
  • ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ ΠΏΠ°ΠΊΠ΅Ρ‚Ρ‹ для сСрвисов etcd, Patroni, PostgreSQL;
  • Π½Π°ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ etcd кластСр;
  • Π½Π°ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ слуТбу patroni для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с PostgreSQL.

Π’ΠΎ Π΅ΡΡ‚ΡŒ Π² ΠΎΠ±Ρ‰Π΅ΠΉ слоТности Π½ΡƒΠΆΠ½ΠΎ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ ΡΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ дСсяток ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΎΠ½Π½Ρ‹Ρ… Ρ„Π°ΠΉΠ»ΠΎΠ² ΠΈ Π½ΠΈΠ³Π΄Π΅ Π½Π΅ ΠΎΡˆΠΈΠ±ΠΈΡ‚ΡŒΡΡ. Для этого Ρ‚ΠΎΡ‡Π½ΠΎ стоит ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ configuration management tool, Ρ‚Π°ΠΊΠΎΠΉ ΠΊΠ°ΠΊ Ansible, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€. ΠŸΡ€ΠΈ этом здСсь всС Ρ€Π°Π²Π½ΠΎ отсутствуСт высокодоступный TCP-балансировщик. Π‘Π΄Π΅Π»Π°Ρ‚ΡŒ Π΅Π³ΠΎ β€” ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Π°Ρ Ρ€Π°Π±ΠΎΡ‚Π°.

Для Ρ‚Π΅Ρ…, ΠΊΠΎΠΌΡƒ Π½ΡƒΠΆΠ΅Π½ Π³ΠΎΡ‚ΠΎΠ²Ρ‹ΠΉ кластСр, Π½ΠΎ Π½Π΅ хочСтся Π²ΠΎ всём этом ΠΊΠΎΠ²Ρ‹Ρ€ΡΡ‚ΡŒΡΡ, ΠΌΡ‹ ΠΏΠΎΡΡ‚Π°Ρ€Π°Π»ΠΈΡΡŒ ΡƒΠΏΡ€ΠΎΡΡ‚ΠΈΡ‚ΡŒ Тизнь ΠΈ сдСлали Π³ΠΎΡ‚ΠΎΠ²Ρ‹ΠΉ кластСр Π½Π° Patroni Ρƒ сСбя Π² ΠΎΠ±Π»Π°ΠΊΠ΅, Π΅Π³ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΡ‚Π΅ΡΡ‚ΠΈΡ‚ΡŒ бСсплатно. Помимо самого кластСра, ΠΌΡ‹ сдСлали:

  • TCP-балансировщик; ΠΏΠΎ Ρ€Π°Π·Π½Ρ‹ΠΌ ΠΏΠΎΡ€Ρ‚Π°ΠΌ ΠΎΠ½ всСгда ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Π½Π° Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΉ мастСр, ΡΠΈΠ½Ρ…Ρ€ΠΎΠ½Π½ΡƒΡŽ ΠΈΠ»ΠΈ Π°ΡΠΈΠ½Ρ…Ρ€ΠΎΠ½Π½ΡƒΡŽ Ρ€Π΅ΠΏΠ»ΠΈΠΊΡƒ, соотвСтствСнно;
  • API для ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎΠ³ΠΎ мастСра Patroni.

Π˜Ρ… ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ΄ΠΊΡŽΠ»Π°ΡΡ‚ΡŒ ΠΈ Ρ‡Π΅Ρ€Π΅Π· API ΠΎΠ±Π»Π°ΠΊΠ° MCS, ΠΈ Π²Π΅Π±-консоль.

Π”Π΅ΠΌΠΎ

Для тСстирования возмоТностСй PostgreSQL кластСра Π² ΠΎΠ±Π»Π°ΠΊΠ΅ MCS Π΄Π°Π²Π°ΠΉΡ‚Π΅ посмотрим, ΠΊΠ°ΠΊ ΠΏΠΎΠ²Π΅Π΄Π΅Ρ‚ сСбя ΠΆΠΈΠ²ΠΎΠ΅ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΏΡ€ΠΈ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ°Ρ… с Π‘Π£Π‘Π”.

Π”Π°Π»Π΅Π΅ прСдставлСн ΠΊΠΎΠ΄ прилоТСния, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Π±ΡƒΠ΄Π΅Ρ‚ Π»ΠΎΠ³ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ искусствСнныС события ΠΈ ΡΠΎΠΎΠ±Ρ‰Π°Ρ‚ΡŒ ΠΎΠ± этом Π½Π° экран. Π’ случаС ошибок ΠΎΠ½ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ ΡΠΎΠΎΠ±Ρ‰Π°Ρ‚ΡŒ ΠΎΠ± этом ΠΈ ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ°Ρ‚ΡŒ свою Ρ€Π°Π±ΠΎΡ‚Ρƒ Π² Ρ†ΠΈΠΊΠ»Π΅, ΠΏΠΎΠΊΠ° ΠΌΡ‹ Π΅Π³ΠΎ Π½Π΅ остановим ΠΊΠΎΠΌΠ±ΠΈΠ½Π°Ρ†ΠΈΠ΅ΠΉ Ctrl + C.

from __future__ import print_function

from datetime import datetime
from random import randint
from time import sleep
import psycopg2


def main():
    try:
        connection = psycopg2.connect(user = "admin",
                                      password = "P@ssw0rd",
                                      host = "89.208.87.38",
                                      port = "5432",
                                      database = "myproddb")

        cursor = connection.cursor()
        cursor.execute("SELECT version();")
        record = cursor.fetchone()
        print("Connection opened to", record[0])

        cursor.execute(
            "INSERT INTO log VALUES ({});".format(randint(1, 10000)))
        connection.commit()
        cursor.execute("SELECT COUNT(event_id) from log;")
        record = cursor.fetchone()
        print("Logged a value, overall count: {}".format(record[0]))
    except Exception as error:
        print ("Error while connecting to PostgreSQL", error)
    finally:
        if connection:
            cursor.close()
            connection.close()
            print("Connection closed")


if __name__ == '__main__':
    try:
        while True:
            try:
                print(datetime.now())
                main()
                sleep(3)
            except Exception as e:
                print("Caught error:n", e)
                sleep(1)
    except KeyboardInterrupt:
        print("exit")

ΠŸΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡŽ для Ρ€Π°Π±ΠΎΡ‚Ρ‹ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌ PostgreSQL. Π‘ΠΎΠ·Π΄Π°Π΄ΠΈΠΌ кластСр Π² ΠΎΠ±Π»Π°ΠΊΠ΅ MCS, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ API. Π’ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎΠΌ Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»Π΅, Π³Π΄Π΅ Π² ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ OS_TOKEN содСрТится Ρ‚ΠΎΠΊΠ΅Π½ для доступа ΠΊ API (ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ openstack token issue), Π½Π°Π±Π΅Ρ€Π΅ΠΌ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹:

Π‘ΠΎΠ·Π΄Π°Π΅ΠΌ кластСр:

cat <<EОF > pgc10.json
{"cluster":{"name":"postgres10","allow_remote_access":true,"datastore":{"type":"postgresql","version":"10"},"databases":[{"name":"myproddb"}],"users":[{"databases":[{"name":"myproddb"}],"name":"admin","password":"P@ssw0rd"}],"instances":[{"key_name":"shared","availability_zone":"DP1","flavorRef":"d659fa16-c7fb-42cf-8a5e-9bcbe80a7538","nics":[{"net-id":"b91eafed-12b1-4a46-b000-3984c7e01599"}],"volume":{"size":50,"type":"DP1"}},{"key_name":"shared","availability_zone":"DP1","flavorRef":"d659fa16-c7fb-42cf-8a5e-9bcbe80a7538","nics":[{"net-id":"b91eafed-12b1-4a46-b000-3984c7e01599"}],"volume":{"size":50,"type":"DP1"}},{"key_name":"shared","availability_zone":"DP1","flavorRef":"d659fa16-c7fb-42cf-8a5e-9bcbe80a7538","nics":[{"net-id":"b91eafed-12b1-4a46-b000-3984c7e01599"}],"volume":{"size":50,"type":"DP1"}}]}}
EOF

curl -s -H "X-Auth-Token: $OS_TOKEN" 
-H 'Accept: application/json' 
-H 'Content-Type: application/json' 
-d @pgc10.json https://infra.mail.ru:8779/v1.0/ce2a41bbd1434013b85bdf0ba07c770f/clusters

Как ΠΌΡ‹ построили Π½Π°Π΄Ρ‘ΠΆΠ½Ρ‹ΠΉ кластСр PostgreSQL Π½Π° Patroni

Когда кластСр ΠΏΠ΅Ρ€Π΅ΠΉΠ΄Π΅Ρ‚ Π² статус ACTIVE, всС поля ΠΏΠΎΠ»ΡƒΡ‡Π°Ρ‚ Π°ΠΊΡ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Π΅ значСния β€” кластСр Π³ΠΎΡ‚ΠΎΠ².

Π’ GUI:

Как ΠΌΡ‹ построили Π½Π°Π΄Ρ‘ΠΆΠ½Ρ‹ΠΉ кластСр PostgreSQL Π½Π° Patroni

ΠŸΠΎΠΏΡ€ΠΎΠ±ΡƒΠ΅ΠΌ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒΡΡ ΠΈ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ:

psql -h 89.208.87.38 -U admin -d myproddb
Password for user admin:
psql (11.1, server 10.7)
Type "help" for help.

myproddb=> CREATE TABLE log (event_id integer NOT NULL);
CREATE TABLE
myproddb=> INSERT INTO log VALUES (1),(2),(3);
INSERT 0 3
myproddb=> SELECT * FROM log;
 event_id
----------
        1
        2
        3
(3 rows)

myproddb=>

Как ΠΌΡ‹ построили Π½Π°Π΄Ρ‘ΠΆΠ½Ρ‹ΠΉ кластСр PostgreSQL Π½Π° Patroni

Π’ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ ΡƒΠΊΠ°ΠΆΠ΅ΠΌ Π°ΠΊΡ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Π΅ настройки для ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ ΠΊ PostgreSQL. ΠœΡ‹ ΡƒΠΊΠ°ΠΆΠ΅ΠΌ адрСс TCP-балансировщика, Ρ‚Π΅ΠΌ самым ΠΎΡ‚ΠΏΠ°Π΄Ρ‘Ρ‚ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΡΡ‚ΡŒ Π² Ρ€ΡƒΡ‡Π½ΠΎΠΌ ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΈ Π½Π° адрСс мастСра. Запустим Π΅Π³ΠΎ. Как Π²ΠΈΠ΄Π½ΠΎ, события ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ Π»ΠΎΠ³ΠΈΡ€ΡƒΡŽΡ‚ΡΡ Π² Π±Π°Π·Ρƒ Π΄Π°Π½Π½Ρ‹Ρ….

Как ΠΌΡ‹ построили Π½Π°Π΄Ρ‘ΠΆΠ½Ρ‹ΠΉ кластСр PostgreSQL Π½Π° Patroni

ПлановоС ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ мастСра

Π’Π΅ΠΏΠ΅Ρ€ΡŒ протСстируСм Ρ€Π°Π±ΠΎΡ‚Ρƒ нашСго прилоТСния ΠΏΡ€ΠΈ ΠΏΠ»Π°Π½ΠΎΠ²ΠΎΠΌ ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΈ мастСра:

Как ΠΌΡ‹ построили Π½Π°Π΄Ρ‘ΠΆΠ½Ρ‹ΠΉ кластСр PostgreSQL Π½Π° Patroni

НаблюдаСм Π·Π° ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΠΌ. Π’ΠΈΠ΄ΠΈΠΌ, Ρ‡Ρ‚ΠΎ Ρ€Π°Π±ΠΎΡ‚Π° прилоТСния Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ прСрываСтся, Π½ΠΎ Π·Π°Π½ΠΈΠΌΠ°Π΅Ρ‚ это всСго нСсколько сСкунд, Π² этом ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠΌ случаС, максимум 9.

Как ΠΌΡ‹ построили Π½Π°Π΄Ρ‘ΠΆΠ½Ρ‹ΠΉ кластСр PostgreSQL Π½Π° Patroni

ПадСниС ΠΌΠ°ΡˆΠΈΠ½Ρ‹

Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΏΠΎΠΏΡ€ΠΎΠ±ΡƒΠ΅ΠΌ ΡΡ‹ΠΌΠΈΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠ°Π΄Π΅Π½ΠΈΠ΅ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΠΉ ΠΌΠ°ΡˆΠΈΠ½Ρ‹, Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ мастСра. МоТно Π±Ρ‹Π»ΠΎ Π±Ρ‹ просто Π²Ρ‹ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½ΡƒΡŽ ΠΌΠ°ΡˆΠΈΠ½Ρƒ Ρ‡Π΅Ρ€Π΅Π· интСрфСйс Horizon, Ρ‚ΠΎΠ»ΡŒΠΊΠΎ это Π±ΡƒΠ΄Π΅Ρ‚ ΡˆΡ‚Π°Ρ‚Π½ΠΎΠ΅ Π²Ρ‹ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅. Π’Π°ΠΊΠΎΠ΅ ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°Π½ΠΎ всСми слуТбами, Π² Ρ‚ΠΎΠΌ числС, Patroni.

Нам ΠΆΠ΅ Π½ΡƒΠΆΠ½ΠΎ нСпрСдсказуСмоС Π²Ρ‹ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ я попросил Π½Π°ΡˆΠΈΡ… администраторов Π² тСстовых цСлях Π²Ρ‹ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½ΡƒΡŽ ΠΌΠ°ΡˆΠΈΠ½Ρƒ β€” Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ мастСра β€” Π½Π΅ΡˆΡ‚Π°Ρ‚Π½Ρ‹ΠΌ способом.

Как ΠΌΡ‹ построили Π½Π°Π΄Ρ‘ΠΆΠ½Ρ‹ΠΉ кластСр PostgreSQL Π½Π° Patroni

Π’ это ΠΆΠ΅ врСмя ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ°Π»ΠΎ Ρ€Π°Π±ΠΎΡ‚Ρƒ нашС ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅. ЕстСствСнно, Ρ‚Π°ΠΊΠΎΠ΅ экстрСнноС ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ мастСра Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€ΠΎΠΉΡ‚ΠΈ Π½Π΅Π·Π°ΠΌΠ΅Ρ‚Π½ΠΎ.

2019-03-29 10:45:56.071234
Connection opened to PostgreSQL 10.7 on x86_64-pc-linux-gnu, compiled by gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-36), 64-bit
Logged a value, overall count: 453
Connection closed
2019-03-29 10:45:59.205463
Connection opened to PostgreSQL 10.7 on x86_64-pc-linux-gnu, compiled by gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-36), 64-bit
Logged a value, overall count: 454

Connection closed
2019-03-29 10:46:02.661440
Error while connecting to PostgreSQL server closed the connection unexpectedly
        This probably means the server terminated abnormally
        before or while processing the request.

Caught error:
 local variable 'connection' referenced before assignment
……………………………………………………….. - здСсь ΠΊΠ°ΠΊΠΎΠ΅-Ρ‚ΠΎ количСство ошибок
2019-03-29 10:46:30.930445
Error while connecting to PostgreSQL server closed the connection unexpectedly
        This probably means the server terminated abnormally
        before or while processing the request.

Caught error:
 local variable 'connection' referenced before assignment
2019-03-29 10:46:31.954399
Connection opened to PostgreSQL 10.7 on x86_64-pc-linux-gnu, compiled by gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-36), 64-bit
Logged a value, overall count: 455
Connection closed
2019-03-29 10:46:35.409800
Connection opened to PostgreSQL 10.7 on x86_64-pc-linux-gnu, compiled by gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-36), 64-bit
Logged a value, overall count: 456
Connection closed
^Cexit

Как Π²ΠΈΠ΄Π½ΠΎ, ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ смогло ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠΈΡ‚ΡŒ свою Ρ€Π°Π±ΠΎΡ‚Ρƒ ΠΌΠ΅Π½Π΅Π΅ Ρ‡Π΅ΠΌ Ρ‡Π΅Ρ€Π΅Π· 30 сСкунд. Π”Π°, ΠΊΠ°ΠΊΠΎΠ΅-Ρ‚ΠΎ количСство ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ сСрвиса успССт Π·Π°ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹. Однако это ΡΠ΅Ρ€ΡŒΠ΅Π·Π½Π°Ρ ΠΏΠΎΠ»ΠΎΠΌΠΊΠ° сСрвСра, Ρ‚Π°ΠΊΠΎΠ΅ случаСтся Π½Π΅ Ρ‚Π°ΠΊ часто. ΠŸΡ€ΠΈ этом Ρ‡Π΅Π»ΠΎΠ²Π΅ΠΊ (администратор) вряд Π»ΠΈ успСл Π±Ρ‹ ΠΎΡ‚Ρ€Π΅Π°Π³ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚Π°ΠΊ ΠΆΠ΅ быстро, Ссли Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ½ Π½Π΅ сидСл Π² консоли Π½Π°Π³ΠΎΡ‚ΠΎΠ²Π΅ со скриптом ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ.

Π’Ρ‹Π²ΠΎΠ΄

Как ΠΌΠ½Π΅ каТСтся, Ρ‚Π°ΠΊΠΎΠΉ кластСр Π΄Π°Π΅Ρ‚ колоссальноС прСимущСство для администраторов. По сути, ΡΠ΅Ρ€ΡŒΠ΅Π·Π½Ρ‹Π΅ ΠΏΠΎΠ»ΠΎΠΌΠΊΠΈ ΠΈ Π²Ρ‹Ρ…ΠΎΠ΄Ρ‹ ΠΈΠ· строя сСрвСров Π‘Π” Π½Π΅ Π±ΡƒΠ΄ΡƒΡ‚ Π·Π°ΠΌΠ΅Ρ‚Π½Ρ‹ для прилоТСния ΠΈ, соотвСтствСнно, для ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ. НС придСтся Ρ‡ΠΈΠ½ΠΈΡ‚ΡŒ Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ Π² спСшкС ΠΈ ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π°Ρ‚ΡŒΡΡ Π½Π° Π²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ, сСрвСры ΠΈ Ρ‚.ΠΏ. А Ссли Ρ‚Π°ΠΊΠΎΠ΅ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π² Π²ΠΈΠ΄Π΅ Π³ΠΎΡ‚ΠΎΠ²ΠΎΠ³ΠΎ сСрвиса Π² ΠΎΠ±Π»Π°ΠΊΠ΅, Ρ‚ΠΎ Π½Π΅ Π½ΡƒΠΆΠ½ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ Ρ‚Ρ€Π°Ρ‚ΠΈΡ‚ΡŒ врСмя Π½Π° Π΅Π³ΠΎ ΠΏΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²ΠΊΡƒ. МоТно Π±ΡƒΠ΄Π΅Ρ‚ Π·Π°Π½ΠΈΠΌΠ°Ρ‚ΡŒΡΡ Ρ‡Π΅ΠΌ-Ρ‚ΠΎ поинтСрСснСС.

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