У меня есть сервер с двумя сетевыми интерфейсами - глобальным на eth0 и локальным на eth1 с IP, например 10.181.xx.xx. Запуск Ubuntu 16.04.
Я настроил PostgreSQL для прослушивания этого локального адреса, чтобы другой сервер из сети мог получить к нему доступ.
Проблема в том, что когда я перезагружаю сервер БД, PostgreSQL не может привязаться к этому локальному адресу. Имея это в postgresql.log:
2016-07-01 15:06:09 GMT LOG: could not bind IPv4 socket: Cannot assign requested address
2016-07-01 15:06:09 GMT HINT: Is another postmaster already running on port 5432? If not, wait a few seconds and retry.
2016-07-01 15:06:09 GMT WARNING: could not create listen socket for "10.181.xx.xx"
После выполнения service postgresql restart
все работает.
Как я могу заставить Postgres ждать, пока eth1 не загрузится после перезагрузки, и привязаться к нему?
Посмотрел в /var/log/syslog
и выяснил, что это проблема с systemd
последовательность запуска.
Добавлено
After=network-online.target
линия в /lib/systemd/system/postgresql@.service
к [Unit]
раздел
Вот так это выглядит:
[Unit]
Description=PostgreSQL Cluster %i
ConditionPathExists=/etc/postgresql/%I/postgresql.conf
PartOf=postgresql.service
ReloadPropagatedFrom=postgresql.service
Before=postgresql.service
After=network-online.target
Все заработало - PostgreSQL теперь загружается после подключения сети.
Я столкнулся с той же проблемой, и решение из принятого ответа сработало для меня. Однако я провел дополнительное исследование и выяснил, что в моем случае проблема возникает только в том случае, если я явно укажу IP-адрес в postgresql.conf:
listen_addresses = '10.181.xx.xx'
Когда я изменил конфигурацию для прослушивания всех адресов, проблема исчезла:
listen_addresses = '*'