Задачка на Postgres
Mar. 6th, 2026 08:30 pmПрилетело мне от неких мурзилок (вместо слова "мурзилка" подставьте конструкцию из трехэтажного мата) весёлое наследство. Пара десятков Postgres-овских серверов, "размазанных" по куче виртуалок в пределах одной технической площадки. Мягко говоря, очень хочется "слить" всё это хозяйство в один "большой" Postgres чтобы его можно было хоть как-то обслуживать. И вроде бы с виду задача не то чтобы сильно сложная: на каждом таком сервере хранится ровно одна база данных, размер которой не превышает 50 ГБайт, а большинство из них по 1...2 ГБайта. Но всё это существенно усугубляется комбинацией из нижеследующих вводных.
- Там CentOS 7 + PostgreSQL 12. Да-да, вот такой давным-давно никем не поддерживаемый тухляк в 2026-м году.
- Это всё крутится в проде и останавливать его больше чем на полчаса нельзя.
- Внутри некоторых из таких баз данных содержатся таблицы с примерно 10...15 миллионами строк, в которых лежат BLOB-ы.
- На хост-машинах установлены обычные 2.5" SAS-овые шпиндели.
Сперва я пошёл "в лоб". pg_dump | pg_restore и всё вот это. Результат не понравился. Всё затыкается на импорте тех самых BLOB-ов: шпиндели "не вывозят". На тестовую "перекачку" самой толстой базы ушло более пяти часов. Такой downtime мне никто никогда не согласует.
Что с этим делать, не очень понятно. В бинарном виде не перегнать, потому что идет объединение нескольких инстансов постгреса в один, к тому же и версии разные. Перегонять "по кускам" теоретически возможно, практически малореально: велик риск напортачить, плюс базы данных не партиционированные и непонятно что там реально нужно, а что просто балласт. Да и человеко-часов на такое уйдёт тоже мама не горюй. Оставить "как есть", просто подняв версию постгреса и перевесить на актуальный дистрибутив? Тоже плохо. Уже сейчас-то это всё поддерживать не возьмешься, а г...но ещё и ширится. И когда в бинарном виде мигрируешь с красных шапок на Debian, у постгреса бьются построенные по строкам индексы, не спрашивайте почему. Тоже так себе вариант.
Пока что на ум приходит только вытащить из закромов of Rодина пару SSDшек, заменить ими шпиндели в каком-нибудь сервере, поотключать все возможные журналы, fsync, synchronous_commit и попробовать ещё раз. Может и случится чудо.
А если не случится, то придется смотреть в сторону логической репликации. Но оно тоже такое... слабопредсказуемое.
Можно было бы долбануться на отличненько и засунуть целиком виртуалку с постгресом-реципиентом в RAM-диск. Но, увы, нет на той площадке настолько толстой железки. То есть сам реципиент допустим ещё как-то влезет, но всё остальное тоже куда-то девать нужно, а некуда.
Шо то фигня, шо это фигня.
Избегайте мурзилок и весёлого наследства.