У нас есть конфигурация репликации master-slave, как показано ниже.
На главном устройстве:
postgresql.conf
имеет репликацию, сконфигурированную следующим образом (строка комментария выведена для краткости):
max_wal_senders = 1
wal_keep_segments = 8
В подчиненном устройстве:
Тот же postgresql.conf
как на главном. recovery.conf
выглядит следующим образом:
standby_mode = 'on'
primary_conninfo = 'host=master1 port=5432 user=replication password=replication'
trigger_file = '/tmp/postgresql.trigger.5432'
Когда это было первоначально установлено, мы выполнили несколько простых тестов и подтвердили, что репликация работает. Однако, когда мы выполнили начальную загрузку данных, только некоторые данные сделали ее ведомому.
Теперь ведомый журнал заполняется сообщениями, которые выглядят следующим образом:
< 2015-01-23 23:59:47.241 EST >LOG: started streaming WAL from primary at F/52000000 on timeline 1
< 2015-01-23 23:59:47.241 EST >FATAL: could not receive data from WAL stream: ERROR: requested WAL segment 000000010000000F00000052 has already been removed
< 2015-01-23 23:59:52.259 EST >LOG: started streaming WAL from primary at F/52000000 on timeline 1
< 2015-01-23 23:59:52.260 EST >FATAL: could not receive data from WAL stream: ERROR: requested WAL segment 000000010000000F00000052 has already been removed
< 2015-01-23 23:59:57.270 EST >LOG: started streaming WAL from primary at F/52000000 on timeline 1
< 2015-01-23 23:59:57.270 EST >FATAL: could not receive data from WAL stream: ERROR: requested WAL segment 000000010000000F00000052 has already been removed
После некоторого анализа и помощи на IRP-канале #postgresql я пришел к выводу, что подчиненный не может идти в ногу с мастером. Мое предложенное решение выглядит следующим образом.
На главном устройстве:
- Установить
max_wal_senders=5
- Установите
wal_keep_segments=4000
. Да, я знаю, что это очень высоко, но я бы хотел следить за ситуацией и видеть, что происходит. У меня есть место на хозяине.
В подчиненном устройстве:
- Сохраните файлы конфигурации в каталоге данных (т.е.
pg_hba.conf pg_ident.conf postgresql.conf recovery.conf
) - Очистите каталог данных (
rm -rf /var/lib/pgsql/9.3/data/*
). Это, по-видимому, требуетсяpg_basebackup
. - Выполните следующую команду:
pg_basebackup -h master -D /var/lib/pgsql/9.3/data --username=replication --password
Я что-то пропустил? Есть ли лучший способ обновить ведомый без необходимости перезагрузки всех данных?
Любая помощь очень ценится.