PostgreSQL: Чи можу я робити pg_start_backup () наживо, запускаючи db під навантаженням?


19

Наша встановлена ​​реплікація зламана ("запитуваний сегмент WAL вже видалений" під час простою) Ми не можемо легко знову зупинити майстер.

Чи можемо ми зробити

  1. pg_start_backup(),
  2. rsync ${PGDATA}/ господар раба,
  3. pg_stop_backup()

... поки головний postgresql все ще знаходиться під повним навантаженням? (Або pg_start_backup()призведе до

  • столові замки,
  • Блоки вводу / виводу,
  • невідповідності,
  • пожежна тривога,
  • повільна реакція db

Іншими словами, чи pg_start_backup()вплине це на наш додаток?


Ви перевірили документи ? Там написано: "За замовчуванням pg_start_backup може тривати довгий час. Це відбувається тому, що він виконує контрольну точку, а введення / виведення, необхідне для контрольної точки, буде розповсюджуватися протягом значного періоду часу, за замовчуванням половина вашої міжконтрольної точки інтервал (див. параметр конфігурації checkpoint_completion_target). Це зазвичай те, що ви хочете, оскільки це мінімізує вплив на обробку запитів. " Що це означає на практиці (і у вашому випадку), не зовсім зрозуміло.
dezso

Відповіді:


11

pg_start_backupбуде виконувати контрольний пункт, як відзначає dezso. Це має вплив, але ваша база даних в будь-якому разі виконує контрольно-пропускні пункти досить регулярно, і це потрібно робити, щоб вони функціонували, тому вони, очевидно, не є проблемою для вас. Рання контрольна точка означає, що накопичено менше даних, це означає, що якщо що-небудь з пункту пропуску pg_start_backupбуде мати менший вплив, ніж зазвичай.

Де потрібно потурбуватися - це rsync або еквівалентний pg_basebackupкрок. Читання вводу-виводу з цього не буде занадто поганим, оскільки воно є послідовним, але воно, ймовірно, значно пошкодить продуктивність вводу-виводу вашої бази даних, а також буде витісняти гарячі дані з кешу оперативної пам'яті на користь менше дані, що використовуються, спричиняючи обмоложення кешу, оскільки необхідні дані потім зачитуються знову.

Ви можете використовувати niceта ioniceдопомогти обмежити вплив вводу / виводу (але не вплив кешу); однак, це коштує. Резервне копіювання займе більше часу, і поки ви не завершите створення резервної копії та запустіть pg_stop_backupвашу систему, - наскільки я це зрозумів - накопичуючи WAL, вона не може видалити, накопичуючи борг на контрольній точці для великого контрольного пункту в кінці запуску резервного копіювання, і накопичує таблицю та індекс роздуватися, оскільки він не може очистити мертві ряди. Таким чином, ви дійсно не можете дозволити собі резервне копіювання назавжди, особливо якщо у вас дуже високі столики.

Зрештою, важко сказати, чи можна безпечно використовувати pg_start_backupта pg_stop_backupдля гарячих резервних копій у вашому оточенні. Більшість людей може, але якщо ви близько до того, що може зробити ваше обладнання, ви маєте жорсткі вимоги до термінів, не можете дозволити собі ризик стійлості, і у вас дуже високі столики, а також дуже великі столи, це може бути клопітно. .

На жаль, вам дуже потрібно це протестувати і побачити.

Якщо ви можете, можливо, варто надіслати CHECKPOINTатомний знімок обсягу, на якому базується ваша база даних, замість цього використовуйте LVM, інструменти вашого SAN, EBS або все, що вам потрібно. Якщо ви можете це зробити, ви можете скопіювати знімок у своє дозвілля. Цей підхід не підходить для використання базового резервного копіювання для PITR / теплого режиму очікування / гарячого режиму очікування, але він цілком гарний для статичної резервної копії та значно менший вплив на систему. Це можна зробити, лише якщо ваші знімки є атомними, і вся ваша база даних, включаючи WAL, є на одному томі.

Одна з можливостей, яку я ще не дослідив, - це поєднання двох підходів. Мені здається, що хтось міг ( неперевірений і, можливо, неправильний і небезпечний , я ще не знаю):

  • pg_start_backup
  • Запуск знімків усіх просторів таблиць, основного даних-даних та тома xlog
  • pg_stop_backup
  • Скопіюйте WAL до остаточного архіву з pg_stop_backup
  • Скопіюйте дані з томових знімків

По суті, ідея полягає в тому, щоб зменшити, скільки часу доводиться БД затримувати свої контрольно-пропускні пункти, взявши точний час кожного тома, який ви можете скопіювати у вільний час.


Зрозумівши, що pg_start_backup () здебільшого є "контрольованою контрольною точкою", ми заслужили впевненість просто спробувати. Здається, вплив на працюючу програму був незначним. (головний головний datadir на SSD) :-) "Неперевірена та, можливо, небезпечна" ідея, яку ви запропонували, трохи вище нашого рівня компетентності та потягу до пригод.
Даніель

О, і ми не зробили rsync з першої спроби. Тому що ми насправді хотіли бачити додаткове навантаження на майстра. Оскільки нам ніколи не потрібен другий запуск rsync, все добре. Ми щось з цього навчилися.
Даніель

7

Це копання могили, але я маю щось тут виправити.

У попередній відповіді зазначено:

Ви можете використовувати nice та ionice, щоб зменшити вплив вводу / виводу (але не вплив кеша); однак, це коштує. Резервне копіювання займе більше часу, і поки ви не завершите резервне копіювання та не запустіть файл pg_stop_backup, ваша система - наскільки я це зрозумів - накопичуючи WAL, вона не може видалити, накопичуючи борг на контрольній точці для великої контрольної точки в кінці запуску резервного копіювання, і накопичує таблицю та покажчик, тому що він не може очистити мертві рядки. Таким чином, ви дійсно не можете дозволити собі резервне копіювання назавжди, особливо якщо у вас дуже високі столики.

Що це не так. Система збереже кількість WAL, вказану у вашій конфігурації (див . Онлайн-документацію ). Отже, тим вище значення між:

  • (2 + checkpoint_completion_ratio) * checkpoint_segments + 1
  • wal_keep_segments

Давайте уявимо цей випадок:

  • резервне копіювання займає багато часу, оскільки для копіювання є сотні концертів
  • у вас невелике збереження WAL (наприклад, контрольні_сегменти до 3)
  • у вас немає налаштування архівації WAL

то після ініціювання "pg_start_backup ()" ваші WAL файли будуть обертатися під час резервного копіювання. Коли ваша резервна копія буде завершена, ви спробуєте відновити її в іншому двигуні бази даних. Двигун при запуску запитає принаймні файл WAL, створений при видачі "pg_start_backup ()".

pg_start_backup 
-----------------
B/D0020F18
(1 row)

База даних не приймає завантажуватися, поки ви не надасте файл WAL "0000000x0000000B000000D0" (де x - ваш TimelineID ). Цей файл WAL є найнижчим мінімумом для завантаження системи. Звичайно, лише з цим файлом ви втратите дані, оскільки решта даних розташовані у файлах WAL, яких у вас немає, але, принаймні, у вас буде працювати двигун бази даних.

Таким чином, або ви повинні зробити WAL-архівування, або потрібно зберегти потрібні файли WAL самостійно, але Postgresql не зробить це за вас.


3
Дуже добре спостереження. Цього можна уникнути, pg_basebackup --xlog-method=streamхоча якщо я не помиляюся.
tomorrow__

2
Так, оскільки PG 9.2, ви можете передавати WAL за допомогою базової резервної копії. Він відкриє другий потік, тому вам потрібно max_wal_sendersвстановити мінімум на 2. Це хороший спосіб уникнути проблеми "відсутній WAL" в кінці резервного копіювання.
стерфілд

4

Що стосується мого досвіду роботи з PostgreSQL, то це відносно безпечна робота, якщо ви не маєте на цей момент дійсно великого впливу на продуктивність. Якщо у вас є, то краще тимчасово призупинити написання від усіх своїх клієнтів.

У мене був лише один критичний випадок, коли синхронізував мого хазяїна з рабом під навантаженням, і це було спричинено вбивцею OOM (так, ви дійсно повинні ЦІЛЬКО відключити OOM Killer на вузлах бази даних, я цього дня не знав).

Тому я відновив базу даних з нічного резервного копіювання і віддав postgres всі сегменти WAL з каталогу pg_archive для відтворення (просто скопіював їх у папку pg_xlog). Все пройшло нормально, але час простою був неминучий.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.