ПишСм Π² PostgreSQL Π½Π° субсвСтовой: 1 host, 1 day, 1TB

НСдавно я рассказал, ΠΊΠ°ΠΊ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ‚ΠΈΠΏΠΎΠ²Ρ‹Ρ… Ρ€Π΅Ρ†Π΅ΠΏΡ‚ΠΎΠ² ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ SQL-запросов Β«Π½Π° Ρ‡Ρ‚Π΅Π½ΠΈΠ΅Β» ΠΈΠ· PostgreSQL-Π±Π°Π·Ρ‹. БСгодня ΠΆΠ΅ Ρ€Π΅Ρ‡ΡŒ ΠΏΠΎΠΉΠ΄Π΅Ρ‚ ΠΎ Ρ‚ΠΎΠΌ, ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Π±ΠΎΠ»Π΅Π΅ эффСктивной запись Π² Π‘Π” Π±Π΅Π· использования ΠΊΠ°ΠΊΠΈΡ…-Π»ΠΈΠ±ΠΎ Β«ΠΊΡ€ΡƒΡ‚ΠΈΠ»ΠΎΠΊΒ» Π² ΠΊΠΎΠ½Ρ„ΠΈΠ³Π΅ β€” просто ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ ΠΎΡ€Π³Π°Π½ΠΈΠ·ΠΎΠ²Π°Π² ΠΏΠΎΡ‚ΠΎΠΊΠΈ Π΄Π°Π½Π½Ρ‹Ρ….

ПишСм Π² PostgreSQL Π½Π° субсвСтовой: 1 host, 1 day, 1TB

#1. Π‘Π΅ΠΊΡ†ΠΈΠΎΠ½ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅

Π‘Ρ‚Π°Ρ‚ΡŒΡ ΠΏΡ€ΠΎ Ρ‚ΠΎ, ΠΊΠ°ΠΊ ΠΈ Π·Π°Ρ‡Π΅ΠΌ стоит ΠΎΡ€Π³Π°Π½ΠΈΠ·ΠΎΠ²Ρ‹Π²Π°Ρ‚ΡŒ ΠΏΡ€ΠΈΠΊΠ»Π°Π΄Π½ΠΎΠ΅ сСкционированиС Β«Π² Ρ‚Π΅ΠΎΡ€ΠΈΠΈΒ» ΡƒΠΆΠ΅ Π±Ρ‹Π»Π°, здСсь ΠΆΠ΅ Ρ€Π΅Ρ‡ΡŒ ΠΏΠΎΠΉΠ΄Π΅Ρ‚ ΠΎ ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠ΅ примСнСния Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ΠΎΠ² Π² Ρ€Π°ΠΌΠΊΠ°Ρ… нашСго сСрвиса ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€ΠΈΠ½Π³Π° сотСн PostgreSQL-сСрвСров.

Β«Π”Π΅Π»Π° Π΄Π°Π²Π½ΠΎ ΠΌΠΈΠ½ΡƒΠ²ΡˆΠΈΡ… Π΄Π½Π΅ΠΉ…Β»

Π˜Π·Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎ, ΠΊΠ°ΠΊ ΠΈ всякий MVP, наш ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ стартовал ΠΏΠΎΠ΄ достаточно нСбольшой Π½Π°Π³Ρ€ΡƒΠ·ΠΊΠΎΠΉ β€” ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€ΠΈΠ½Π³ осущСствлялся Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для дСсятка Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ ΠΊΡ€ΠΈΡ‚ΠΈΡ‡Π½Ρ‹Ρ… сСрвСров, всС Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ Π±Ρ‹Π»ΠΈ ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ компактны… Но врСмя шло, отслСТиваСмых хостов ΡΡ‚Π°Π½ΠΎΠ²ΠΈΠ»ΠΎΡΡŒ всС большС, ΠΈ ΠΏΠΎΠΏΡ‹Ρ‚Π°Π²ΡˆΠΈΡΡŒ Π² ΠΎΡ‡Π΅Ρ€Π΅Π΄Π½ΠΎΠΉ Ρ€Π°Π· Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ с ΠΎΠ΄Π½ΠΎΠΉ ΠΈΠ· Ρ‚Π°Π±Π»ΠΈΡ† Ρ€Π°Π·ΠΌΠ΅Ρ€ΠΎΠΌ 1.5TB, ΠΌΡ‹ поняли, Ρ‡Ρ‚ΠΎ ΠΆΠΈΡ‚ΡŒ Ρ‚Π°ΠΊ дальшС Ρ…ΠΎΡ‚ΡŒ ΠΈ ΠΌΠΎΠΆΠ½ΠΎ, Π½ΠΎ ΠΎΡ‡Π΅Π½ΡŒ ΡƒΠΆ Π½Π΅ΡƒΠ΄ΠΎΠ±Π½ΠΎ.

Π’Ρ€Π΅ΠΌΠ΅Π½Π° Π±Ρ‹Π»ΠΈ ΠΏΠΎΡ‡Ρ‚ΠΈ Ρ‡Ρ‚ΠΎ Π±Ρ‹Π»ΠΈΠ½Π½Ρ‹Π΅, Π°ΠΊΡ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹ΠΌΠΈ Π±Ρ‹Π»ΠΈ Ρ€Π°Π·Π½Ρ‹Π΅ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Ρ‹ PostgreSQL 9.x, поэтому всС сСкционированиС ΠΏΡ€ΠΈΡˆΠ»ΠΎΡΡŒ Π΄Π΅Π»Π°Ρ‚ΡŒ Β«Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽΒ» β€” Ρ‡Π΅Ρ€Π΅Π· наслСдованиС Ρ‚Π°Π±Π»ΠΈΡ† ΠΈ Ρ‚Ρ€ΠΈΠ³Π³Π΅Ρ€Ρ‹ Ρ€ΠΎΡƒΡ‚ΠΈΠ½Π³Π° с динамичСским EXECUTE.

ПишСм Π² PostgreSQL Π½Π° субсвСтовой: 1 host, 1 day, 1TB
ΠŸΠΎΠ»ΡƒΡ‡ΠΈΠ²ΡˆΠ΅Π΅ΡΡ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ оказалось достаточно ΡƒΠ½ΠΈΠ²Π΅Ρ€ΡΠ°Π»ΡŒΠ½Ρ‹ΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΌΠΎΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ ΡΡ‚Ρ€Π°Π½ΡΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π΅Π³ΠΎ Π½Π° всС Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹:

  • Π‘Ρ‹Π»Π° объявлСна пустая «заголовочная» Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠ°Ρ Ρ‚Π°Π±Π»ΠΈΡ†Π°, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΠΎΠΏΠΈΡΡ‹Π²Π°Π»ΠΈΡΡŒ всС Π½ΡƒΠΆΠ½Ρ‹Π΅ индСксы ΠΈ Ρ‚Ρ€ΠΈΠ³Π³Π΅Ρ€Ρ‹.
  • Π—Π°ΠΏΠΈΡΡŒ с Ρ‚ΠΎΡ‡ΠΊΠΈ зрСния ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π° ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΠ»Π°ΡΡŒ Π² Β«ΠΊΠΎΡ€Π½Π΅Π²ΡƒΡŽΒ» Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ, Π° Π²Π½ΡƒΡ‚Ρ€ΠΈ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ‚Ρ€ΠΈΠ³Π³Π΅Ρ€Π° Ρ€ΠΎΡƒΡ‚ΠΈΠ½Π³Π° BEFORE INSERT запись «физичСски» Π²ΡΡ‚Π°Π²Π»ΡΠ»Π°ΡΡŒ Π² Π½ΡƒΠΆΠ½ΡƒΡŽ ΡΠ΅ΠΊΡ†ΠΈΡŽ. Если Ρ‚Π°ΠΊΠΎΠΉ Π΅Ρ‰Π΅ Π½Π΅ Π±Ρ‹Π»ΠΎ β€” ΠΌΡ‹ Π»ΠΎΠ²ΠΈΠ»ΠΈ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ ΠΈ …
  • … с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ CREATE TABLE ... (LIKE ... INCLUDING ...) ΠΏΠΎ ΡˆΠ°Π±Π»ΠΎΠ½Ρƒ Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΎΠΉ Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ создавалась сСкция с ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠ΅ΠΌ Π½Π° Π½ΡƒΠΆΠ½ΡƒΡŽ Π΄Π°Ρ‚Ρƒ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€ΠΈ ΠΈΠ·Π²Π»Π΅Ρ‡Π΅Π½ΠΈΠΈ Π΄Π°Π½Π½Ρ‹Ρ… Ρ‡Ρ‚Π΅Π½ΠΈΠ΅ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΠ»ΠΎΡΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² Π½Π΅ΠΉ.

PG10: пСрвая ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠ°

Но сСкционированиС Ρ‡Π΅Ρ€Π΅Π· наслСдованиС Π±Ρ‹Π»ΠΎ историчСски Π½Π΅ ΠΎΡ‡Π΅Π½ΡŒ приспособлСно для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с Π°ΠΊΡ‚ΠΈΠ²Π½Ρ‹ΠΌ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠΌ записи ΠΈΠ»ΠΈ большим количСством сСкций-ΠΏΠΎΡ‚ΠΎΠΌΠΊΠΎΠ². НапримСр, ΠΌΠΎΠΆΠ½ΠΎ Π²ΡΠΏΠΎΠΌΠ½ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ Π²Ρ‹Π±ΠΎΡ€Π° Π½ΡƒΠΆΠ½ΠΎΠΉ сСкции ΠΈΠΌΠ΅Π» ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚ΠΈΡ‡Π½ΡƒΡŽ ΡΠ»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈ 100+ сСкциях Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚, сами ΠΏΠΎΠ½ΠΈΠΌΠ°Π΅Ρ‚Π΅ как…

Π’ PG10 эту ΡΠΈΡ‚ΡƒΠ°Ρ†ΠΈΡŽ сильно ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π»ΠΈ, Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π² ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΡƒ Π½Π°Ρ‚ΠΈΠ²Π½ΠΎΠ³ΠΎ сСкционирования. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ ΠΌΡ‹ сходу ΠΏΠΎΠΏΡ€ΠΎΠ±ΠΎΠ²Π°Π»ΠΈ Π΅Π³ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΡ‚ΡŒ сразу послС ΠΌΠΈΠ³Ρ€Π°Ρ†ΠΈΠΈ Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π°, но…

Как Π²Ρ‹ΡΡΠ½ΠΈΠ»ΠΎΡΡŒ послС пСрСкапывания ΠΌΠ°Π½ΡƒΠ°Π»Π°, Π½Π°Ρ‚ΠΈΠ²Π½ΠΎ сСкционированная Ρ‚Π°Π±Π»ΠΈΡ†Π° Π² этой вСрсии:

  • Π½Π΅ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ описаниС индСксов
  • Π½Π΅ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ Π½Π° Π½Π΅ΠΉ Ρ‚Ρ€ΠΈΠ³Π³Π΅Ρ€ΠΎΠ²
  • Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ сама Π½ΠΈΡ‡ΡŒΠΈΠΌ Β«ΠΏΠΎΡ‚ΠΎΠΌΠΊΠΎΠΌΒ»
  • Π½Π΅ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ INSERT ... ON CONFLICT
  • Π½Π΅ ΡƒΠΌΠ΅Π΅Ρ‚ ΠΏΠΎΡ€ΠΎΠΆΠ΄Π°Ρ‚ΡŒ ΡΠ΅ΠΊΡ†ΠΈΡŽ автоматичСски

Π‘ΠΎΠ»ΡŒΠ½ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ² ΠΏΠΎ Π»Π±Ρƒ граблями, ΠΌΡ‹ поняли, Ρ‡Ρ‚ΠΎ Π±Π΅Π· ΠΌΠΎΠ΄ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ прилоТСния ΠΎΠ±ΠΎΠΉΡ‚ΠΈΡΡŒ Π½Π΅ удастся, ΠΈ ΠΎΡ‚Π»ΠΎΠΆΠΈΠ»ΠΈ дальнСйшиС исслСдования Π½Π° ΠΏΠΎΠ»Π³ΠΎΠ΄Π°.

PG10: Π²Ρ‚ΠΎΡ€ΠΎΠΉ шанс

Π˜Ρ‚Π°ΠΊ, ΠΌΡ‹ Π½Π°Ρ‡Π°Π»ΠΈ Ρ€Π΅ΡˆΠ°Ρ‚ΡŒ возникшиС ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ ΠΏΠΎ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ:

  1. ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Ρ‚Ρ€ΠΈΠ³Π³Π΅Ρ€Ρ‹ ΠΈ ON CONFLICT Π½Π°ΠΌ оказались ΠΊΠΎΠ΅-Π³Π΄Π΅ всС-Ρ‚Π°ΠΊΠΈ Π½ΡƒΠΆΠ½Ρ‹, для ΠΈΡ… ΠΎΡ‚Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ сдСлали ΠΏΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΎΡ‡Π½ΡƒΡŽ прокси-Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ.
  2. Избавились ΠΎΡ‚ Β«Ρ€ΠΎΡƒΡ‚ΠΈΠ½Π³Π°Β» Π² Ρ‚Ρ€ΠΈΠ³Π³Π΅Ρ€Π°Ρ… β€” Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ ΠΎΡ‚ EXECUTE.
  3. ВынСсли ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎ Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ-шаблон со всСми индСксами, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ½ΠΈ Π΄Π°ΠΆΠ΅ Π½Π΅ присутствовали Π½Π° прокси-Ρ‚Π°Π±Π»ΠΈΡ†Π΅.

ПишСм Π² PostgreSQL Π½Π° субсвСтовой: 1 host, 1 day, 1TB
НаконСц, послС всСго этого, ΡƒΠΆΠ΅ Π½Π°Ρ‚ΠΈΠ²Π½ΠΎ отсСкционировали ΠΎΡΠ½ΠΎΠ²Π½ΡƒΡŽ Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ. Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ Π½ΠΎΠ²ΠΎΠΉ сСкции ΠΏΠΎΠΊΠ° Ρ‚Π°ΠΊ ΠΈ ΠΎΡΡ‚Π°Π»ΠΎΡΡŒ Π½Π° совСсти прилоТСния.

«Пилим» словари

Как ΠΈ Π² любой аналитичСской систСмС, Ρƒ нас Ρ‚ΠΎΠΆΠ΅ Π±Ρ‹Π»ΠΈ Β«Ρ„Π°ΠΊΡ‚Ρ‹Β» ΠΈ Β«Ρ€Π°Π·Ρ€Π΅Π·Ρ‹Β» (словари). Π’ нашСм случаС, Π² этом качСствС выступали, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Ρ‚Π΅Π»ΠΎ «шаблона» ΠΎΠ΄Π½ΠΎΡ‚ΠΈΠΏΠ½Ρ‹Ρ… ΠΌΠ΅Π΄Π»Π΅Π½Π½Ρ‹Ρ… запросов ΠΈΠ»ΠΈ тСкст самого запроса.

Β«Π€Π°ΠΊΡ‚Ρ‹Β» Ρƒ нас Π±Ρ‹Π»ΠΈ отсСкционированы ΠΏΠΎ дням ΡƒΠΆΠ΅ Π΄Π°Π²Π½ΠΎ, поэтому ΠΌΡ‹ спокойно удаляли ΡƒΡΡ‚Π°Ρ€Π΅Π²ΡˆΠΈΠ΅ сСкции, ΠΈ ΠΎΠ½ΠΈ Π½Π°ΠΌ Π½Π΅ мСшали (Π»ΠΎΠ³ΠΈ ΠΆΠ΅!). А Π²ΠΎΡ‚ со словарями ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»Π°ΡΡŒ бСда…

НС ΡΠΊΠ°Π·Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΈΡ… оказалось ΠΎΡ‡Π΅Π½ΡŒ ΠΌΠ½ΠΎΠ³ΠΎ, Π½ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π½ΠΎ Π½Π° 100TB Β«Ρ„Π°ΠΊΡ‚ΠΎΠ²Β» получился ΡΠ»ΠΎΠ²Π°Ρ€ΡŒ Π½Π° 2.5TB. Из Ρ‚Π°ΠΊΠΎΠΉ Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ ΡƒΠ΄ΠΎΠ±Π½ΠΎ Π½ΠΈΡ‡Π΅Π³ΠΎ Π½Π΅ ΠΏΠΎΡƒΠ΄Π°Π»ΡΠ΅ΡˆΡŒ, Π½Π΅ соТмСшь Π·Π° Π°Π΄Π΅ΠΊΠ²Π°Ρ‚Π½ΠΎΠ΅ врСмя, Π΄Π° ΠΈ запись Π² Π½Π΅Π΅ постСпСнно ΡΡ‚Π°Π½ΠΎΠ²ΠΈΠ»Π°ΡΡŒ всС ΠΌΠ΅Π΄Π»Π΅Π½Π½Π΅Π΅.

Π’Ρ€ΠΎΠ΄Π΅ ΡΠ»ΠΎΠ²Π°Ρ€ΡŒβ€¦ Π² Π½Π΅ΠΌ каТдая запись Π΄ΠΎΠ»ΠΆΠ½Π° Π±Ρ‹Ρ‚ΡŒ прСдставлСна Ρ€ΠΎΠ²Π½ΠΎ ΠΎΠ΄ΠΈΠ½ раз… ΠΈ это ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ, Π½ΠΎ!.. Никто Π½Π΅ ΠΌΠ΅ΡˆΠ°Π΅Ρ‚ Π½Π°ΠΌ ΠΈΠΌΠ΅Ρ‚ΡŒ ΠΏΠΎ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΠΌΡƒ ΡΠ»ΠΎΠ²Π°Ρ€ΡŽ Π½Π° ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ дСнь! Π”Π°, это приносит ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΡƒΡŽ ΠΈΠ·Π±Ρ‹Ρ‚ΠΎΡ‡Π½ΠΎΡΡ‚ΡŒ, Π·Π°Ρ‚ΠΎ позволяСт:

  • ΠΏΠΈΡΠ°Ρ‚ΡŒ/Ρ‡ΠΈΡ‚Π°Ρ‚ΡŒ быстрСС Π·Π° счСт мСньшСго Ρ€Π°Π·ΠΌΠ΅Ρ€Π° сСкции
  • ΠΏΠΎΡ‚Ρ€Π΅Π±Π»ΡΡ‚ΡŒ мСньшС памяти Π·Π° счСт Ρ€Π°Π±ΠΎΡ‚Ρ‹ с Π±ΠΎΠ»Π΅Π΅ ΠΊΠΎΠΌΠΏΠ°ΠΊΡ‚Π½Ρ‹ΠΌΠΈ индСксами
  • Ρ…Ρ€Π°Π½ΠΈΡ‚ΡŒ мСньшС Π΄Π°Π½Π½Ρ‹Ρ… Π·Π° счСт возмоТности быстрого удалСния ΡƒΡΡ‚Π°Ρ€Π΅Π²ΡˆΠΈΡ…

Π’ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ всСго комплСкса мСроприятий Π½Π°Π³Ρ€ΡƒΠ·ΠΊΠ° ΠΏΠΎ CPU ΡΠΎΠΊΡ€Π°Ρ‚ΠΈΠ»Π°ΡΡŒ Π½Π° ~30%, ΠΏΠΎ диску β€” Π½Π° ~50%:

ПишСм Π² PostgreSQL Π½Π° субсвСтовой: 1 host, 1 day, 1TB
ΠŸΡ€ΠΈ этом ΠΌΡ‹ ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠΈΠ»ΠΈ ΠΏΠΈΡΠ°Ρ‚ΡŒ Π² Π±Π°Π·Ρƒ Ρ€ΠΎΠ²Π½ΠΎ Ρ‚ΠΎ ΠΆΠ΅ самоС, просто с мСньшСй Π½Π°Π³Ρ€ΡƒΠ·ΠΊΠΎΠΉ.

#2. Π­Π²ΠΎΠ»ΡŽΡ†ΠΈΡ ΠΈ Ρ€Π΅Ρ„Π°ΠΊΡ‚ΠΎΡ€ΠΈΠ½Π³ Π‘Π”

Π˜Ρ‚Π°ΠΊ, ΠΌΡ‹ ΠΎΡΡ‚Π°Π½ΠΎΠ²ΠΈΠ»ΠΈΡΡŒ Π½Π° Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Ρƒ нас Π½Π° ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ дСнь Π΅ΡΡ‚ΡŒ своя сСкция с Π΄Π°Π½Π½Ρ‹ΠΌΠΈ. БобствСнно, CHECK (dt = '2018-10-12'::date) β€” ΠΈ Π΅ΡΡ‚ΡŒ ΠΊΠ»ΡŽΡ‡ сСкционирования ΠΈ условиС попадания записи Π² ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΡƒΡŽ ΡΠ΅ΠΊΡ†ΠΈΡŽ.

ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ всС ΠΎΡ‚Ρ‡Π΅Ρ‚Ρ‹ Π² нашСм сСрвисС строятся Π² Ρ€Π°Π·Ρ€Π΅Π·Π΅ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠΉ Π΄Π°Ρ‚Ρ‹, Ρ‚ΠΎ ΠΈ индСксы Π΅Ρ‰Π΅ с «нСсСкционированных Π²Ρ€Π΅ΠΌΠ΅Π½Β» для Π½ΠΈΡ… Π±Ρ‹Π»ΠΈ всС Ρ‚ΠΈΠΏΠ° (Π‘Π΅Ρ€Π²Π΅Ρ€, Π”Π°Ρ‚Π°, Π¨Π°Π±Π»ΠΎΠ½ ΠΏΠ»Π°Π½Π°), (Π‘Π΅Ρ€Π²Π΅Ρ€, Π”Π°Ρ‚Π°, Π£Π·Π΅Π» ΠΏΠ»Π°Π½Π°), (Π”Π°Ρ‚Π°, Класс ошибки, Π‘Π΅Ρ€Π²Π΅Ρ€),…

Но Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ Π½Π° ΠΊΠ°ΠΆΠ΄ΠΎΠΉ сСкции ΠΆΠΈΠ²ΡƒΡ‚ свои экзСмпляры ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ Ρ‚Π°ΠΊΠΎΠ³ΠΎ индСкса… И Π² Ρ€Π°ΠΌΠΊΠ°Ρ… ΠΊΠ°ΠΆΠ΄ΠΎΠΉ сСкции Π΄Π°Ρ‚Π° β€” константа… ΠŸΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ΡΡ, Ρ‡Ρ‚ΠΎ Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ ΠΌΡ‹ Π² ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ‚Π°ΠΊΠΎΠΉ индСкс банально вписываСм константу Π² качСствС ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈΠ· ΠΏΠΎΠ»Π΅ΠΉ, Ρ‡Ρ‚ΠΎ Π΄Π΅Π»Π°Π΅Ρ‚ большС ΠΈ Π΅Π³ΠΎ объСм, ΠΈ врСмя поиска ΠΏΠΎ Π½Π΅ΠΌΡƒ, Π½ΠΎ Π½Π΅ приносит Π½ΠΈΠΊΠ°ΠΊΠΎΠ³ΠΎ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π°. Π‘Π°ΠΌΠΈ сСбС оставили Π³Ρ€Π°Π±Π»ΠΈ, упс…

ПишСм Π² PostgreSQL Π½Π° субсвСтовой: 1 host, 1 day, 1TB
НаправлСниС ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΎΡ‡Π΅Π²ΠΈΠ΄Π½ΠΎ β€” просто ΡƒΠ±ΠΈΡ€Π°Π΅ΠΌ ΠΏΠΎΠ»Π΅ с Π΄Π°Ρ‚ΠΎΠΉ ΠΈΠ· всСх индСксов Π½Π° сСкционированных Ρ‚Π°Π±Π»ΠΈΡ†Π°Ρ…. ΠŸΡ€ΠΈ Π½Π°ΡˆΠΈΡ… ΠΎΠ±ΡŠΠ΅ΠΌΠ°Ρ… Π²Ρ‹ΠΈΠ³Ρ€Ρ‹Ρˆ β€” порядка 1TB/нСдСлю!

А Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ Π΄Π°Π²Π°ΠΉΡ‚Π΅ Π·Π°ΠΌΠ΅Ρ‚ΠΈΠΌ, Ρ‡Ρ‚ΠΎ этот Ρ‚Π΅Ρ€Π°Π±Π°ΠΉΡ‚ Π΅Ρ‰Π΅ Π½Π°Π΄ΠΎ Π±Ρ‹Π»ΠΎ ΠΊΠ°ΠΊ-Ρ‚ΠΎ Π·Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ. Π’ΠΎ Π΅ΡΡ‚ΡŒ ΠΌΡ‹ Π΅Ρ‰Π΅ ΠΈ диск Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ Π³Ρ€ΡƒΠ·ΠΈΡ‚ΡŒ мСньшС! На этой ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ΅ Ρ…ΠΎΡ€ΠΎΡˆΠΎ Π²ΠΈΠ΄Π΅Π½ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½Ρ‹ΠΉ эффСкт ΠΎΡ‚ ΠΏΡ€ΠΎΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΉ чистки, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΠΌΡ‹ посвятили нСдСлю:

ПишСм Π² PostgreSQL Π½Π° субсвСтовой: 1 host, 1 day, 1TB

#3. Β«Π Π°Π·ΠΌΠ°Π·Ρ‹Π²Π°Π΅ΠΌΒ» ΠΏΠΈΠΊΠΎΠ²ΡƒΡŽ Π½Π°Π³Ρ€ΡƒΠ·ΠΊΡƒ

Одна ΠΈΠ· Π±ΠΎΠ»ΡŒΡˆΠΈΡ… Π±Π΅Π΄ Π½Π°Π³Ρ€ΡƒΠΆΠ΅Π½Π½Ρ‹Ρ… систСм β€” это избыточная синхронизация ΠΊΠ°ΠΊΠΈΡ…-Ρ‚ΠΎ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ Ρ‚ΠΎΠ³ΠΎ Π½Π΅ Ρ‚Ρ€Π΅Π±ΡƒΡŽΡ‰ΠΈΡ…. Иногда Β«ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ Π½Π΅ Π·Π°ΠΌΠ΅Ρ‚ΠΈΠ»ΠΈΒ», ΠΈΠ½ΠΎΠ³Π΄Π° Β«Ρ‚Π°ΠΊ Π±Ρ‹Π»ΠΎ ΠΏΡ€ΠΎΡ‰Π΅Β», Π½ΠΎ Ρ€Π°Π½ΠΎ ΠΈΠ»ΠΈ ΠΏΠΎΠ·Π΄Π½ΠΎ приходится ΠΎΡ‚ Π½Π΅Π΅ ΠΈΠ·Π±Π°Π²Π»ΡΡ‚ΡŒΡΡ.

ΠŸΡ€ΠΈΠ±Π»ΠΈΠΆΠ°Π΅ΠΌ ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰ΡƒΡŽ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ β€” ΠΈ Π²ΠΈΠ΄ΠΈΠΌ, Ρ‡Ρ‚ΠΎ диск Ρƒ нас Β«ΠΊΠ°Ρ‡Π°Π΅Ρ‚Β» ΠΏΠΎ Π½Π°Π³Ρ€ΡƒΠ·ΠΊΠ΅ с Π΄Π²ΡƒΠΊΡ€Π°Ρ‚Π½ΠΎΠΉ Π°ΠΌΠΏΠ»ΠΈΡ‚ΡƒΠ΄ΠΎΠΉ ΠΌΠ΅ΠΆΠ΄Ρƒ сосСдними отсчСтами, Ρ‡Π΅Π³ΠΎ явно «статистичСски» Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ ΠΏΡ€ΠΈ Ρ‚Π°ΠΊΠΎΠΌ количСствС ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ:

ПишСм Π² PostgreSQL Π½Π° субсвСтовой: 1 host, 1 day, 1TB

Π”ΠΎΠ±ΠΈΡ‚ΡŒΡΡ этого достаточно просто. Π£ нас Π½Π° ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€ΠΈΠ½Π³ Π±Ρ‹Π»ΠΎ Π·Π°Π²Π΅Π΄Π΅Π½ΠΎ ΡƒΠΆΠ΅ ΠΏΠΎΡ‡Ρ‚ΠΈ 1000 сСрвСров, ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ обрабатываСтся ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹ΠΌ логичСским ΠΏΠΎΡ‚ΠΎΠΊΠΎΠΌ, Π° ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΏΠΎΡ‚ΠΎΠΊ сбрасываСт Π½Π°ΠΊΠΎΠΏΠ»Π΅Π½Π½ΡƒΡŽ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ для ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠΈ Π² Π±Π°Π·Ρƒ с ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠΉ ΠΏΠ΅Ρ€ΠΈΠΎΠ΄ΠΈΡ‡Π½ΠΎΡΡ‚ΡŒΡŽ, ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π½ΠΎ Ρ‚Π°ΠΊ:

setInterval(sendToDB, interval)

ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΠ° Ρ‚ΡƒΡ‚ кроСтся Ρ€ΠΎΠ²Π½ΠΎ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ всС ΠΏΠΎΡ‚ΠΎΠΊΠΈ ΡΡ‚Π°Ρ€Ρ‚ΡƒΡŽΡ‚ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π½ΠΎ Π² ΠΎΠ΄Π½ΠΎ врСмя, поэтому ΠΌΠΎΠΌΠ΅Π½Ρ‚Ρ‹ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠΈ Ρƒ Π½ΠΈΡ… ΠΏΠΎΡ‡Ρ‚ΠΈ всСгда ΡΠΎΠ²ΠΏΠ°Π΄Π°ΡŽΡ‚ Β«Π΄ΠΎ Ρ‚ΠΎΡ‡ΠΊΠΈΒ». Упс β„–2…

К ΡΡ‡Π°ΡΡ‚ΡŒΡŽ, правится это достаточно Π»Π΅Π³ΠΊΠΎ, Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ΠΌ «случайной» Ρ€Π°Π·Π±Π΅ΠΆΠΊΠΈ ΠΏΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ:

setInterval(sendToDB, interval * (1 + 0.1 * (Math.random() - 0.5)))

#4. ΠšΡΡˆΠΈΡ€ΡƒΠ΅ΠΌ, Ρ‡Ρ‚ΠΎ Π½ΡƒΠΆΠ½ΠΎ ΠΌΠΎΠΆΠ½ΠΎ

Π’Ρ€Π΅Ρ‚ΡŒΡ традиционная ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ° highload β€” отсутствиС кэша Ρ‚Π°ΠΌ, Π³Π΄Π΅ ΠΎΠ½ ΠΌΠΎΠ³ Π±Ρ‹ Π±Ρ‹Ρ‚ΡŒ.

НапримСр, ΠΌΡ‹ сдСлали Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Π°Π½Π°Π»ΠΈΠ·Π° Π² Ρ€Π°Π·Ρ€Π΅Π·Π΅ ΡƒΠ·Π»ΠΎΠ² ΠΏΠ»Π°Π½Π° (всС эти Seq Scan on users), Π½ΠΎ сразу ΠΏΠΎΠ΄ΡƒΠΌΠ°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΎΠ½ΠΈ, Π² массС, ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²Ρ‹Π΅ β€” Π·Π°Π±Ρ‹Π»ΠΈ.

НСт, ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎ, Π² Π±Π°Π·Ρƒ Π½ΠΈΡ‡Π΅Π³ΠΎ ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎ Π½Π΅ ΠΏΠΈΡˆΠ΅Ρ‚ΡΡ, это отсСкаСт Ρ‚Ρ€ΠΈΠ³Π³Π΅Ρ€ с INSERT ... ON CONFLICT DO NOTHING. Но Π΄ΠΎ Π±Π°Π·Ρ‹-Ρ‚ΠΎ эти Π΄Π°Π½Π½Ρ‹Π΅ Π΄ΠΎΠ»Π΅Ρ‚Π°ΡŽΡ‚ всС Ρ€Π°Π²Π½ΠΎ, Π΄Π° Π΅Ρ‰Π΅ ΠΈ лишнСС Ρ‡Ρ‚Π΅Π½ΠΈΠ΅ для ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ ΠΊΠΎΠ½Ρ„Π»ΠΈΠΊΡ‚Π° Π΄Π΅Π»Π°Ρ‚ΡŒ приходится. Упс β„–3…

Π Π°Π·Π½ΠΈΡ†Π° ΠΏΠΎ количСству отправляСмых Π² Π±Π°Π·Ρƒ записСй Π΄ΠΎ/послС Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ ΠΊΡΡˆΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡ β€” ΠΎΡ‡Π΅Π²ΠΈΠ΄Π½Π°:

ПишСм Π² PostgreSQL Π½Π° субсвСтовой: 1 host, 1 day, 1TB

А это β€” ΡΠΎΠΏΡƒΡ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π΅ ΠΏΠ°Π΄Π΅Π½ΠΈΠ΅ Π½Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ Π½Π° Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π΅:

ПишСм Π² PostgreSQL Π½Π° субсвСтовой: 1 host, 1 day, 1TB

Π˜Ρ‚ΠΎΠ³ΠΎ

Β«Π’Π΅Ρ€Π°Π±Π°ΠΉΡ‚-Π²-сутки» Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π·Π²ΡƒΡ‡ΠΈΡ‚ ΡΡ‚Ρ€Π°ΡˆΠ½ΠΎ. Если Π²Ρ‹ всС Π΄Π΅Π»Π°Π΅Ρ‚Π΅ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ, Ρ‚ΠΎ это всСго лишь 2^40 Π±Π°ΠΉΡ‚ / 86400 сСкунд = ~12.5MB/s, Ρ‡Ρ‚ΠΎ Π΄Π΅Ρ€ΠΆΠ°Π»ΠΈ Π΄Π°ΠΆΠ΅ Π½Π°ΡΡ‚ΠΎΠ»ΡŒΠ½Ρ‹Π΅ IDE-Π²ΠΈΠ½Ρ‚Ρ‹. πŸ™‚

А Ссли ΡΠ΅Ρ€ΡŒΠ΅Π·Π½ΠΎ, Ρ‚ΠΎ Π΄Π°ΠΆΠ΅ ΠΏΡ€ΠΈ дСсятикратном «пСрСкосС» Π½Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ Π² Ρ‚Π΅Ρ‡Π΅Π½ΠΈΠ΅ суток, Π²Ρ‹ спокойно ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΡƒΠ»ΠΎΠΆΠΈΡ‚ΡŒΡΡ Π² возмоТности соврСмСнных SSD.

ПишСм Π² PostgreSQL Π½Π° субсвСтовой: 1 host, 1 day, 1TB

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