Какие проблемы могут возникнуть в Patroni при заливке большого объема данных ночью
Что проверяют
Понимаете ли вы, что Patroni сам данные не льёт: он следит за PostgreSQL и держит лидерство через DCS (etcd, Consul, ZooKeeper). Проблемы ночной заливки возникают на стыке WAL, реплик, диска и механизма лидерства. Следом спрашивают, как бы вы такую заливку спланировали.
Как отвечать
Разложите по цепочке последствий:
- всплеск WAL: массовый
INSERTилиCOPYгенерирует гигабайты журнала. При превышенииmax_wal_sizeчекпойнты идут чаще, а после каждого растёт объём full page writes, то есть журнала становится ещё больше; - отставание реплик: реплики не успевают проигрывать WAL. Patroni не повысит реплику, отставшую больше
maximum_lag_on_failover(по умолчанию 1 МБ), поэтому при падении мастера посреди заливки автоматического failover может не случиться; - синхронный режим: при
synchronous_mode: trueкаждый коммит ждёт синхронную реплику, и заливка упирается в её скорость; - переполнение диска: Patroni по умолчанию создаёт слоты репликации, и отставшая реплика держит WAL на мастере.
pg_walрастёт, место кончается, PostgreSQL останавливается; - ложный failover: если под нагрузкой etcd или сам Patroni не успевает продлить ключ лидера за
ttl(по умолчанию 30 секунд), мастер понижается прямо посреди заливки.
Что делать: грузить через COPY пачками с коммитами, а не одной транзакцией; держать etcd на отдельных быстрых дисках; следить за pg_stat_replication и pg_replication_slots; после заливки запустить ANALYZE. Параметры вроде max_wal_size меняются через patronictl edit-config, а не правкой файла на узле.
Где спотыкаются
Правят postgresql.conf руками. Patroni управляет конфигурацией из DCS и перезапишет изменения, а узлы разъедутся по настройкам.
Считают, что асинхронная реплика заливке не мешает. Мешает через слот: мастер хранит весь WAL, пока реплика его не заберёт.
Предлагают для скорости лить в UNLOGGED-таблицу и забывают, что такие таблицы не реплицируются и очищаются после сбоя. На новом мастере этих данных просто не будет.