PostgreSQL: Ρ‡Ρ‚ΠΎ Π½ΡƒΠΆΠ½ΠΎ Π·Π½Π°Ρ‚ΡŒ ΠΎ счётчикС Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΉ

Π‘Ρ‚Π°Ρ‚ΡŒΡ ΠΏΠΎΠ³Ρ€ΡƒΠΆΠ°Π΅Ρ‚ Π² слоТности счСтчика Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΉ PostgreSQL ΠΈ MVCC Π² условиях высокой Π½Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ. Π Π°Π·Π±Π΅Ρ€ΠΈΡ‚Π΅ΡΡŒ, ΠΏΠΎΡ‡Π΅ΠΌΡƒ 32-Π±ΠΈΡ‚Π½Ρ‹Π΅ xid ΡΠΎΠ·Π΄Π°ΡŽΡ‚ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ ΠΈ ΠΊΠ°ΠΊ 64-Π±ΠΈΡ‚Π½Ρ‹Π΅ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Ρ‹ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΉ Ρ€Π΅ΡˆΠ°ΡŽΡ‚ ΠΈΡ….

ОблоТка: PostgreSQL: Ρ‡Ρ‚ΠΎ Π½ΡƒΠΆΠ½ΠΎ Π·Π½Π°Ρ‚ΡŒ ΠΎ счётчикС Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΉ

МногиС Π³ΠΎΠ΄Ρ‹ ΡΡ‡ΠΈΡ‚Π°Π»ΠΎΡΡŒ, Ρ‡Ρ‚ΠΎ PostgreSQL Π½Π΅ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ΠΈΡ‚ для систСм с высокой Π½Π°Π³Ρ€ΡƒΠ·ΠΊΠΎΠΉ. Но Π½Π° ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠ΅ всё Ρ‡Π°Ρ‰Π΅ Π²ΡΡ‚Ρ€Π΅Ρ‡Π°ΡŽΡ‚ΡΡ ситуации, ΠΊΠΎΠ³Π΄Π° Π΄Π°ΠΆΠ΅ ΠΊΡ€ΡƒΠΏΠ½Ρ‹Π΅ ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΠΈ Π²Ρ‹Π±ΠΈΡ€Π°ΡŽΡ‚ ΠΈΠΌΠ΅Π½Π½ΠΎ эту Π‘Π£Π‘Π”. Π’ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅, всё большС внимания удСляСтся вопросам ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ ΠΈ ΠΌΠ°ΡΡˆΡ‚Π°Π±ΠΈΡ€ΡƒΠ΅ΠΌΠΎΡΡ‚ΠΈ PostgreSQL. Один ΠΈΠ· Ρ‚Π°ΠΊΠΈΡ… вопросов β€” счётчик Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΉ, ΠΎ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ΠΌΡ‹ сСгодня ΠΈ ΠΏΠΎΠ³ΠΎΠ²ΠΎΡ€ΠΈΠΌ.

Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ счётчик Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΉ ΠΈ Π·Π°Ρ‡Π΅ΠΌ ΠΎΠ½ Π½ΡƒΠΆΠ΅Π½?

PostgreSQL ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ многовСрсионности (MVCC) благодаря ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌΡƒ Ρ‡ΠΈΡ‚Π°ΡŽΡ‰ΠΈΠ΅ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈ Π½Π΅ Π±Π»ΠΎΠΊΠΈΡ€ΡƒΡŽΡ‚ ΠΏΠΈΡˆΡƒΡ‰ΠΈΠ΅, ΠΈ Π½Π°ΠΎΠ±ΠΎΡ€ΠΎΡ‚. КаТдая транзакция Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ со своСй вСрсиСй Π΄Π°Π½Π½Ρ‹Ρ…, Π° доступ рСгулируСтся ΠΏΡ€Π°Π²ΠΈΠ»Π°ΠΌΠΈ видимости.

Π§Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ½ΡΡ‚ΡŒ, ΠΊΠ°ΠΊ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½ΠΈΡ€ΡƒΠ΅Ρ‚ MVCC, ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²ΡŒΡ‚Π΅, Ρ‡Ρ‚ΠΎ Ρƒ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ Π±Π°Π·Ρ‹ Π΅ΡΡ‚ΡŒ свой Β«ΠΌΠΎΠΌΠ΅Π½Ρ‚Π°Π»ΡŒΠ½Ρ‹ΠΉ снимок» Π΄Π°Π½Π½Ρ‹Ρ…. Когда Π²Ρ‹ Π½Π°Ρ‡ΠΈΠ½Π°Π΅Ρ‚Π΅ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ, Π²Ρ‹ Π²ΠΈΠ΄ΠΈΡ‚Π΅ состояниС Π΄Π°Π½Π½Ρ‹Ρ… Π½Π° этот ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹ΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ. ИзмСнСния, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π΄Π΅Π»Π°ΡŽΡ‚ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΠΈ, Π½Π΅ Π²Π»ΠΈΡΡŽΡ‚ Π½Π° ваш снимок, ΠΏΠΎΠΊΠ° Π²Ρ‹ Π½Π΅ Π·Π°Π²Π΅Ρ€ΡˆΠΈΡ‚Π΅ свою ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΡŽ ΠΈ Π½Π΅ Π½Π°Ρ‡Π½Π΅Ρ‚Π΅ Π½ΠΎΠ²ΡƒΡŽ. Π­Ρ‚ΠΎ позволяСт нСскольким ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡΠΌ ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ Ρ‡ΠΈΡ‚Π°Ρ‚ΡŒ ΠΈ ΠΈΠ·ΠΌΠ΅Π½ΡΡ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅, Π½Π΅ мСшая Π΄Ρ€ΡƒΠ³ Π΄Ρ€ΡƒΠ³Ρƒ.

MVCC Π² PostgreSQL Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ ΠΏΠΎΡ…ΠΎΠΆΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

  • КаТдая транзакция β€” это ΠΊΠ°ΠΊ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹ΠΉ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ, Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‰ΠΈΠΉ с Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚ΠΎΠΌ. Вранзакция Π²ΠΈΠ΄ΠΈΡ‚ «снимок» Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ… Π½Π° ΠΌΠΎΠΌΠ΅Π½Ρ‚ своСго Π½Π°Ρ‡Π°Π»Π°. 
  • Когда транзакция измСняСт Π΄Π°Π½Π½Ρ‹Π΅, ΠΎΠ½Π° Π½Π΅ пСрСзаписываСт старыС. ВмСсто этого создаётся новая вСрсия ΠΈΠ·ΠΌΠ΅Π½Ρ‘Π½Π½Ρ‹Ρ… строк.

КаТдая вСрсия строки ΠΈΠΌΠ΅Π΅Ρ‚ ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Π΅ ΠΌΠ΅Ρ‚ΠΊΠΈ:

  • xmin β€” ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈ, которая создала Π²Π΅Ρ€ΡΠΈΡŽ.
  • xmax β€” ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈ, которая ΡƒΠ΄Π°Π»ΠΈΠ»Π° (ΠΈΠ»ΠΈ ΠΎΠ±Π½ΠΎΠ²ΠΈΠ»Π°) Π²Π΅Ρ€ΡΠΈΡŽ. Если строка Π΅Ρ‰Ρ‘ Π½Π΅ ΡƒΠ΄Π°Π»Π΅Π½Π°, xmax пустой.

Когда транзакция Ρ‡ΠΈΡ‚Π°Π΅Ρ‚ Π΄Π°Π½Π½Ρ‹Π΅, PostgreSQL опрСдСляСт, ΠΊΠ°ΠΊΡƒΡŽ Π²Π΅Ρ€ΡΠΈΡŽ строки Π΅ΠΉ ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ, Π½Π° основС ΠΏΡ€Π°Π²ΠΈΠ» видимости:

  • транзакция Π²ΠΈΠ΄ΠΈΡ‚ строки, созданныС Π΄ΠΎ Π΅Ρ‘ Π½Π°Ρ‡Π°Π»Π° (xmin мСньшС Π΅Ρ‘ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Π°), ΠΈ Π½Π΅ ΠΏΠΎΠΌΠ΅Ρ‡Π΅Π½Π½Ρ‹Π΅ ΠΊΠ°ΠΊ ΡƒΠ΄Π°Π»Ρ‘Π½Π½Ρ‹Π΅ (xmax пустой ΠΈΠ»ΠΈ большС Π΅Ρ‘ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Π°);
  • транзакция Π²ΠΈΠ΄ΠΈΡ‚ строки, созданныС Сю самой;
  • транзакция Π½Π΅ Π²ΠΈΠ΄ΠΈΡ‚ строки, созданныС транзакциями, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π°Ρ‡Π°Π»ΠΈΡΡŒ ΠΏΠΎΠ·ΠΆΠ΅ Π½Π΅Ρ‘ (xmin большС Π΅Ρ‘ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Π°).

ΠŸΡ€ΠΈΠΌΠ΅Ρ€:

Допустим, Ρƒ нас Π΅ΡΡ‚ΡŒ Ρ‚Π°Π±Π»ΠΈΡ†Π° users с Π΄Π°Π½Π½Ρ‹ΠΌΠΈ:

			id  | name  | age

β€”|β€”β€”-|β€”-

1   | Alice  | 30

2  | Bob   | 25
		

1. Вранзакция 1 (xid=100) начинаСтся ΠΈ Ρ‡ΠΈΡ‚Π°Π΅Ρ‚ Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ Она Π²ΠΈΠ΄ΠΈΡ‚ ΠΎΠ±Π΅ строки, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ ΠΎΠ½ΠΈ Π±Ρ‹Π»ΠΈ созданы Π΄ΠΎ Π΅Ρ‘ Π½Π°Ρ‡Π°Π»Π°, ΠΈ xmax Ρƒ Π½ΠΈΡ… пустой.

2. Вранзакция 2 (xid=105) начинаСтся ΠΈ обновляСт возраст Alice Π½Π° 31. PostgreSQL Π½Π΅ пСрСзаписываСт строку Alice, Π° создаёт Π½ΠΎΠ²ΡƒΡŽ Π²Π΅Ρ€ΡΠΈΡŽ:

			id | name  | age | xmin | xmax

β€”|β€”β€”-|—–|β€”β€”|—–

1   | Alice   | 30  | …      | 105

1   | Alice   | 31   | 105  |

2   | Bob    | 25  | …      |
		

3. ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ Ρƒ старой вСрсии Alice xmax Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ Ρ€Π°Π²Π΅Π½ 105 (ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈ 2), Π° Ρƒ Π½ΠΎΠ²ΠΎΠΉ вСрсии xmin Ρ€Π°Π²Π΅Π½ 105.

4. Вранзакция 1 снова Ρ‡ΠΈΡ‚Π°Π΅Ρ‚ Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ. Она ΠΏΠΎ-ΠΏΡ€Π΅ΠΆΠ½Π΅ΠΌΡƒ Π²ΠΈΠ΄ΠΈΡ‚ ΡΡ‚Π°Ρ€ΡƒΡŽ Π²Π΅Ρ€ΡΠΈΡŽ Alice (возраст 30), ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ новая вСрсия Π±Ρ‹Π»Π° создана Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠ΅ΠΉ, которая Π½Π°Ρ‡Π°Π»Π°ΡΡŒ ΠΏΠΎΠ·ΠΆΠ΅ (105 > 100), Π° старая ΠΏΠΎΠΌΠ΅Ρ‡Π΅Π½Π° ΠΊΠ°ΠΊ удалённая Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠ΅ΠΉ с большим Π½ΠΎΠΌΠ΅Ρ€ΠΎΠΌ.

5. Вранзакция 2 фиксируСтся.

6. Вранзакция 3 (xid=110) начинаСтся ΠΈ Ρ‡ΠΈΡ‚Π°Π΅Ρ‚ Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΎΠ½Π° Π²ΠΈΠ΄ΠΈΡ‚ Π½ΠΎΠ²ΡƒΡŽ Π²Π΅Ρ€ΡΠΈΡŽ Alice (возраст 31), ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ транзакция 2, которая Π΅Ρ‘ создала, ΡƒΠΆΠ΅ зафиксирована, ΠΈ Π΅Ρ‘ xid мСньшС Ρ‡Π΅ΠΌ Ρƒ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈ 3.

Π’Π°ΠΆΠ½ΠΎ: Π½ΠΎΠΌΠ΅Ρ€Π° Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΉ (xid) Π½Π΅ стоит ΡΡ€Π°Π²Π½ΠΈΠ²Π°Ρ‚ΡŒ ΠΊΠ°ΠΊ ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹Π΅ числа («большС» ΠΈΠ»ΠΈ «мСньшС»). ΠšΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½Π΅Π΅ Π³ΠΎΠ²ΠΎΡ€ΠΈΡ‚ΡŒ Β«ΡΡ‚Π°Ρ€ΡˆΠ΅Β» ΠΈΠ»ΠΈ «младшС». Π”Π΅Π»ΠΎ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Π½ΠΎΠΌΠ΅Ρ€Π° Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΉ ΡΡ€Π°Π²Π½ΠΈΠ²Π°ΡŽΡ‚ΡΡ ΠΏΠΎ ΠΌΠΎΠ΄ΡƒΠ»ΡŽ 232, образуя ΠΊΠΎΠ»ΡŒΡ†ΠΎ. Π’Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈ, ΠΎΡ‚ΡΡ‚Π°ΡŽΡ‰ΠΈΠ΅ ΠΎΡ‚ Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΉ Π½Π° 231 Π½Π°Π·Π°Π΄, ΡΡ‡ΠΈΡ‚Π°ΡŽΡ‚ΡΡ Β«ΡΡ‚Π°Ρ€ΡˆΠ΅Β» (Β«Π² ΠΏΡ€ΠΎΡˆΠ»ΠΎΠΌΒ»), Π° Π½Π° 231 Π²ΠΏΠ΅Ρ€Ρ‘Π΄ β€” «младшС» (Β«Π² Π±ΡƒΠ΄ΡƒΡ‰Π΅ΠΌΒ»).

ΠŸΡ€Π΅Π΄ΡΡ‚Π°Π²ΡŒΡ‚Π΅ сСбС ΠΊΡ€ΡƒΠ³:

  • тСкущая транзакция β€” это Ρ‚ΠΎΡ‡ΠΊΠ° Π½Π° ΠΊΡ€ΡƒΠ³Π΅;
  • Β«ΠΏΡ€ΠΎΡˆΠ»Ρ‹Π΅Β» Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈ β€” это Ρ‚ΠΎΡ‡ΠΊΠΈ слСва ΠΎΡ‚ Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΉ, Ссли Π΄Π²ΠΈΠ³Π°Ρ‚ΡŒΡΡ ΠΏΡ€ΠΎΡ‚ΠΈΠ² часовой стрСлки;
  • Β«Π±ΡƒΠ΄ΡƒΡ‰ΠΈΠ΅Β» Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈ β€” Ρ‚ΠΎΡ‡ΠΊΠΈ справа.

КаТдая запись Π² Π±Π°Π·Π΅ Π΄Π°Π½Π½Ρ‹Ρ… ΠΈΠΌΠ΅Π΅Ρ‚ слуТСбныС поля xmin ΠΈ xmax. Π’ xmin записываСтся Π½ΠΎΠΌΠ΅Ρ€ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈ, создавшСй запись, Π° Π² xmax β€” Π½ΠΎΠΌΠ΅Ρ€ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈ, ΡƒΠ΄Π°Π»ΠΈΠ²ΡˆΠ΅ΠΉ Π΅Ρ‘. Π£Ρ‡Π΅Ρ‚ΠΎΠΌ этих Π½ΠΎΠΌΠ΅Ρ€ΠΎΠ² ΠΈ занимаСтся счСтчик Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΉ.

Как развивался счётчик Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΉ

Π”ΠΎ вСрсии PostgreSQL 8.2 ΠΏΡ€ΠΈ достиТСнии максимального значСния счётчика Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΉ (ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π½ΠΎ 4 ΠΌΠΈΠ»Π»ΠΈΠ°Ρ€Π΄Π°) PostgreSQL просто Β«ΠΏΠ°Π΄Π°Π»Β». Π§Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠΈΡ‚ΡŒ Ρ€Π°Π±ΠΎΡ‚Ρƒ, Π½ΡƒΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Π΄Π°ΠΌΠΏ Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ… ΠΈ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Π΅Ρ‘ Π·Π°Π½ΠΎΠ²ΠΎ.

Π’ вСрсии 8.2 появился ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ цикличСского пСрСзапуска счётчика. Для этого Π² Ρ„ΠΎΠ½ΠΎΠ²ΠΎΠΌ Ρ€Π΅ΠΆΠΈΠΌΠ΅ запускаСтся процСсс очистки (VACUUM).

Как это Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚:

  1. Β«Π—Π°ΠΌΠΎΡ€ΠΎΠ·ΠΊΠ°Β» старых Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΉ: Когда Π½Π° VACUUM пСрСдаётся Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ счётчик Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΉ скоро пСрСполнится, ΠΎΠ½ Π½Π°Ρ‡ΠΈΠ½Π°Π΅Ρ‚ ΠΏΠΎΠΌΠ΅Ρ‡Π°Ρ‚ΡŒ старыС Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈ ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹ΠΌ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ΠΎΠΌ FrozenTransactionId. По сути, VACUUM Π³ΠΎΠ²ΠΎΡ€ΠΈΡ‚: Β«Π­Ρ‚ΠΈ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈ Π½Π°ΡΡ‚ΠΎΠ»ΡŒΠΊΠΎ старыС, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ считаСм ΠΈΡ… Π·Π°ΠΌΠΎΡ€ΠΎΠΆΠ΅Π½Π½Ρ‹ΠΌΠΈ. ΠœΡ‹ всСгда Π±ΡƒΠ΄Π΅ΠΌ ΡΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ ΠΈΡ… ΡΡ‚Π°Ρ€ΡˆΠ΅ Π»ΡŽΠ±Ρ‹Ρ… Π΄Ρ€ΡƒΠ³ΠΈΡ… Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΉ.Β»
  2. Π‘Ρ‡Ρ‘Ρ‚Ρ‡ΠΈΠΊ эпох: Π§Ρ‚ΠΎΠ±Ρ‹ PostgreSQL Π·Π½Π°Π», сколько Ρ€Π°Π· счётчик ΡƒΠΆΠ΅ «пСрСзапускался», ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ счётчик эпох. ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ€Π°Π·, ΠΊΠΎΠ³Π΄Π° счётчик Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΉ Π΄ΠΎΡ…ΠΎΠ΄ΠΈΡ‚ Π΄ΠΎ ΠΊΠΎΠ½Ρ†Π° ΠΈ Π½Π°Ρ‡ΠΈΠ½Π°Π΅Ρ‚ Π·Π°Π½ΠΎΠ²ΠΎ, счётчик эпох увСличиваСтся Π½Π° Π΅Π΄ΠΈΠ½ΠΈΡ†Ρƒ.
  3. ЦикличСский пСрСзапуск: ПослС Ρ‚ΠΎΠ³ΠΎ ΠΊΠ°ΠΊ VACUUM Β«Π·Π°ΠΌΠΎΡ€ΠΎΠ·ΠΈΡ‚Β» старыС Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈ, счётчик Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΉ ΠΌΠΎΠΆΠ΅Ρ‚ бСзопасно Π½Π°Ρ‡Π°Ρ‚ΡŒ ΡΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ Π·Π°Π½ΠΎΠ²ΠΎ с Ρ‚Ρ€Ρ‘Ρ…. PostgreSQL Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ Π·Π½Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ всС Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈ с ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ΠΎΠΌ FrozenTransactionId ΡΡ‚Π°Ρ€ΡˆΠ΅ Π»ΡŽΠ±Ρ‹Ρ… Π΄Ρ€ΡƒΠ³ΠΈΡ… Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΉ, Π΄Π°ΠΆΠ΅ Ссли ΠΈΡ… Π½ΠΎΠΌΠ΅Ρ€Π° мСньшС.

Π­Ρ‚ΠΎ Ρ€Π΅ΡˆΠΈΠ»ΠΎ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ «падСния», Π½ΠΎ Π²ΠΎΠ·Π½ΠΈΠΊΠ»Π° новая: Ссли VACUUM Π½Π΅ успСваСт ΠΎΡ‚Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ воврСмя, сСрвСр ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒΡΡ ΠΈ ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΎΠ²Π°Ρ‚ΡŒ запуска Π² монопольном Ρ€Π΅ΠΆΠΈΠΌΠ΅ для очистки, Ρ‡Ρ‚ΠΎ Π²Π΅Π΄Ρ‘Ρ‚ ΠΊ ΠΏΡ€ΠΎΡΡ‚ΠΎΡŽ.

Π’ Ρ‡Ρ‘ΠΌ ΠΆΠ΅ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ°?

Π‘Π°ΠΌ ΠΏΠΎ сСбС ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ счётчика Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΉ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Ρ…ΠΎΡ€ΠΎΡˆΠΎ. ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΠ° Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΠΎΠ½ создавался, ΠΊΠΎΠ³Π΄Π° 32-Π±ΠΈΡ‚Π½ΠΎΠ΅ число (Π±ΠΎΠ»Π΅Π΅ 4 ΠΌΠΈΠ»Π»ΠΈΠ°Ρ€Π΄ΠΎΠ²) казалось ΠΎΠ³Ρ€ΠΎΠΌΠ½Ρ‹ΠΌ. БСйчас ΠΆΠ΅, Π² систСмах с высокой Π½Π°Π³Ρ€ΡƒΠ·ΠΊΠΎΠΉ (Ρ€Π΅Ρ‚Π΅ΠΉΠ», ΠΊΡ€ΡƒΠΏΠ½Ρ‹Π΅ Π·Π°Π²ΠΎΠ΄Ρ‹, госучрСТдСния), счётчик ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΠ±ΠΎΡ€Π°Ρ‡ΠΈΠ²Π°Ρ‚ΡŒΡΡ Ρ€Π°Π· Π² сутки.

Π”ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ слоТности:

Π‘Ρ€Π΅Π΄ΠΈ слуТСбных Π΄Π°Π½Π½Ρ‹Ρ… записи Π΅ΡΡ‚ΡŒ ΠΏΠΎΠ»Π΅ Ρ„Π»Π°Π³ΠΎΠ². Для старых записСй Π½ΡƒΠΆΠ½ΠΎ пСриодичСски Π·Π°ΠΏΡƒΡΠΊΠ°Ρ‚ΡŒ VACUUM FREEZE, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΠΎΠΌΠ΅Ρ‡Π°Π΅Ρ‚ ΠΈΡ… ΠΊΠ°ΠΊ Β«Π·Π°ΠΌΠΎΡ€ΠΎΠΆΠ΅Π½Π½Ρ‹Π΅Β» (FrozenTransactionId).

Для ΡΡ‚Π°Π±ΠΈΠ»ΡŒΠ½ΠΎΠΉ Ρ€Π°Π±ΠΎΡ‚Ρ‹ Π½ΡƒΠΆΠ½ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹:

  • Ρ€Π°Π·Π½ΠΈΡ†Π° ΠΌΠ΅ΠΆΠ΄Ρƒ Π½ΠΎΠΌΠ΅Ρ€ΠΎΠΌ Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΉ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈ ΠΈ Π½ΠΎΠΌΠ΅Ρ€ΠΎΠΌ самой старой записи Π½Π΅ ΠΏΡ€Π΅Π²Ρ‹ΡˆΠ°Π»Π° 2^32;
  • VACUUM FREEZE выполнялся Π΄ΠΎ Π½Π°Ρ€ΡƒΡˆΠ΅Π½ΠΈΡ ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ условия.

Π’ Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠΌ ΠΌΠΈΡ€Π΅ это слоТно:

  • Β«Π΄ΠΎΠ»Π³ΠΈΠ΅Β» Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈ ΠΌΠ΅ΡˆΠ°ΡŽΡ‚ VACUUM FREEZE;
  • слоТно ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ, ΠΊΠΎΠ³Π΄Π° транзакция «долгая», Π° ΠΊΠΎΠ³Π΄Π° «зависшая»;
  • нСпонятно, ΠΊΠΎΠ³Π΄Π° Π±ΠΈΡ‚ΡŒ Ρ‚Ρ€Π΅Π²ΠΎΠ³Ρƒ ΠΈΠ·-Π·Π° исчСрпания ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ΠΎΠ²;
  • администратор Π‘Π” нСсёт ΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²Π΅Π½Π½ΠΎΡΡ‚ΡŒ Π·Π° ΠΏΠΎΡ‚Π΅Ρ€ΠΈ бизнСса ΠΈΠ·-Π·Π° своих дСйствий.

Если Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΎΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ кластСр Π‘Π”, Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ Π΅Π³ΠΎ Π² монопольном Ρ€Π΅ΠΆΠΈΠΌΠ΅ ΠΈ ΠΏΠΎΠ΄ΠΎΠΆΠ΄Π°Ρ‚ΡŒ нСсколько часов, эта ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ° вас Π½Π΅ касаСтся. Но Π² систСмах с высокими трСбованиями ΠΊ доступности простой β€” нСдопустим.

ΠžΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎ стоит ΡƒΠΏΠΎΠΌΡΠ½ΡƒΡ‚ΡŒ Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ…, Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π΄ΠΎΠ±Π°Π²Π»ΡΡŽΡ‚ΡΡ (insert-only). Π’ Π½ΠΈΡ… VACUUM всё Ρ€Π°Π²Π½ΠΎ запускаСтся для Β«Π·Π°ΠΌΠΎΡ€ΠΎΠ·ΠΊΠΈΒ» старых записСй.

РСшСниС: 64-Π±ΠΈΡ‚Π½Ρ‹Π΅ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Ρ‹ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΉ

Казалось Π±Ρ‹, простоС Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ β€” ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΡ‚ΡŒ Ρ€Π°Π·ΠΌΠ΅Ρ€ счётчика Π΄ΠΎ 64 Π±ΠΈΡ‚. Но это слоТно:

  • вСсь ΠΊΠΎΠ΄ PostgreSQL ΠΎΠΆΠΈΠ΄Π°Π΅Ρ‚ Β«Π²ΠΈΠ΄Π΅Ρ‚ΡŒΒ» 32-Π±ΠΈΡ‚Π½Ρ‹Π΅ числа;
  • Π² ΠΊΠ°ΠΆΠ΄ΠΎΠΌ ΠΊΠΎΡ€Ρ‚Π΅ΠΆΠ΅ (записи) хранятся xmin ΠΈ xmax. Π£Π²Π΅Π»ΠΈΡ‡Π΅Π½ΠΈΠ΅ ΠΈΡ… Ρ€Π°Π·ΠΌΠ΅Ρ€Π° с 8 Π΄ΠΎ 16 Π±Π°ΠΉΡ‚ Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΡ‚ Ρ€Π°Π·ΠΌΠ΅Ρ€ Π±Π°Π·Ρ‹.

ΠœΡ‹ Π² Postgres Professional Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Π°Π»ΠΈ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ 64-Π±ΠΈΡ‚Π½Ρ‹Ρ… ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ΠΎΠ² Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΉ (xid), ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΠ² ΠΈΡ… количСство Π΄ΠΎ 18 446 744 073 709 551 615 (264). Π­Ρ‚ΠΎ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π²ΠΎ ΠΌΠ½ΠΎΠ³ΠΈΡ… Ρ„ΠΎΡ€ΠΊΠ°Ρ… PostgreSQL. ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΠ° пСрСполнСния счётчика становится гипотСтичСской (ΠΏΡ€ΠΈ высокой Π½Π°Π³Ρ€ΡƒΠ·ΠΊΠ΅ 64-Π±ΠΈΡ‚Π½Ρ‹ΠΉ счётчик исчСрпаСтся ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π½ΠΎ Ρ‡Π΅Ρ€Π΅Π· 400 Π»Π΅Ρ‚).

ΠŸΠ°Ρ‚Ρ‡ с Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠ΅ΠΉ Π±Ρ‹Π» ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠ΅Π½ сообщСству PostgreSQL, Π½ΠΎ ΠΏΠΎΠΊΠ° Π½Π΅ принят ΠΈΠ·-Π·Π° Π΅Π³ΠΎ слоТности. Однако ΠΌΠ½ΠΎΠ³ΠΈΠ΅ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ Ρ„ΠΎΡ€ΠΊΠΎΠ² PostgreSQL ΡƒΠΆΠ΅ заявили ΠΎ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ΅ 64-Π±ΠΈΡ‚Π½Ρ‹Ρ… xid Π² своих дистрибутивах.

ЦСль Postgres Professional β€” Π½Π΅ ΠΏΡ€ΠΎΠ΄Π²ΠΈΠ³Π°Ρ‚ΡŒ свой Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ ΠΊΠ°ΠΊ СдинствСнно Π²Π΅Ρ€Π½Ρ‹ΠΉ, Π° ΠΏΡ€ΠΈΠ²Π»Π΅Ρ‡ΡŒ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ ΠΊ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ΅ ΠΈ ΡΡ‚ΠΈΠΌΡƒΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ сообщСство ΠΊ поиску ΠΎΠΏΡ‚ΠΈΠΌΠ°Π»ΡŒΠ½ΠΎΠ³ΠΎ Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ. ΠŸΠ΅Ρ€Π²Π°Ρ Ρ‡Π°ΡΡ‚ΡŒ ΡƒΠ΄Π°Π»Π°ΡΡŒ: идСя ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»Π° Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅. Но Π²Π½Π΅Π΄Ρ€Π΅Π½ΠΈΠ΅ Ρ‚Π°ΠΊΠΈΡ… ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ β€” Π΄ΠΎΠ»Π³ΠΈΠΉ процСсс. Рост Π½Π°Π³Ρ€ΡƒΠ·ΠΎΠΊ Π½Π° Π‘Π£Π‘Π” Π²ΠΎ всём ΠΌΠΈΡ€Π΅ ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Π²Π°ΠΆΠ½ΠΎΡΡ‚ΡŒ этой ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹.

ΠœΡ‹ надССмся, Ρ‡Ρ‚ΠΎ PostgreSQL смоТСт Π°Π΄Π°ΠΏΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΊ растущим Π½Π°Π³Ρ€ΡƒΠ·ΠΊΠ°ΠΌ ΠΈ ΡƒΠΊΡ€Π΅ΠΏΠΈΡ‚ΡŒ свои ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ Π½Π° Ρ€Ρ‹Π½ΠΊΠ΅.

Π Π΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡƒΠ΅ΠΌ