Медленный запуск postgresql в контейнере Docker - PullRequest
2 голосов
/ 19 апреля 2019

Мы создали образ докера Debian с помощью postgresql для запуска одного из наших сервисов. База данных предназначена для внутреннего использования контейнера и не требует сопоставления портов. Я полагаю, что он установлен через apt-get в файле Dockerbuild.

Мы часто останавливаем и запускаем эту службу, и из-за проблем с производительностью база данных запускается медленно. Несмотря на то, что пусто, требуется более 20 секунд, чтобы принять соединение при первом запуске образа докера. Журнал выглядит следующим образом:

2019-04-05 13:05:30.924 UTC [19] LOG:  could not bind IPv6 socket: Cannot assign requested address
2019-04-05 13:05:30.924 UTC [19] HINT:  Is another postmaster already running on port 5432? If not, wait a few seconds and retry.
2019-04-05 13:05:30.982 UTC [20] LOG:  database system was shut down at 2019-04-05 12:57:16 UTC
2019-04-05 13:05:30.992 UTC [20] LOG:  MultiXact member wraparound protections are now enabled
2019-04-05 13:05:30.998 UTC [19] LOG:  database system is ready to accept connections
2019-04-05 13:05:30.998 UTC [24] LOG:  autovacuum launcher started
2019-04-05 13:05:31.394 UTC [26] [unknown]@[unknown] LOG:  incomplete startup packet
2019-04-19 13:21:58.974 UTC [37] LOG:  could not bind IPv6 socket: Cannot assign requested address
2019-04-19 13:21:58.974 UTC [37] HINT:  Is another postmaster already running on port 5432? If not, wait a few seconds and retry.
2019-04-19 13:21:59.025 UTC [38] LOG:  database system was interrupted; last known up at 2019-04-05 13:05:34 UTC
2019-04-19 13:21:59.455 UTC [39] [unknown]@[unknown] LOG:  incomplete startup packet
2019-04-19 13:21:59.971 UTC [42] postgres@postgres FATAL:  the database system  is starting up
[...]
2019-04-19 13:22:15.221 UTC [85] root@postgres FATAL:  the database system is starting up
2019-04-19 13:22:15.629 UTC [38] LOG:  database system was not properly shut down; automatic recovery in progress
2019-04-19 13:22:15.642 UTC [38] LOG:  redo starts at 0/14EEBA8
2019-04-19 13:22:15.822 UTC [38] LOG:  invalid record length at 0/24462D0: wanted 24, got 0
2019-04-19 13:22:15.822 UTC [38] LOG:  redo done at 0/24462A8
2019-04-19 13:22:15.822 UTC [38] LOG:  last completed transaction was at log time 2019-04-05 13:05:36.602318+00
2019-04-19 13:22:16.084 UTC [38] LOG:  MultiXact member wraparound protections are now enabled
2019-04-19 13:22:16.094 UTC [37] LOG:  database system is ready to accept connections
2019-04-19 13:22:16.094 UTC [89] LOG:  autovacuum launcher started
2019-04-19 13:22:21.528 UTC [92] root@test LOG:  could not receive data from client: Connection reset by peer
2019-04-19 13:22:21.528 UTC [92] root@test LOG:  unexpected EOF on client connection with an open transaction

Предлагаете ли вы исправить эту проблему при запуске?

РЕДАКТИРОВАТЬ: Некоторые просили dockerfile, вот соответствующие строки

RUN apt-get update \
 && apt-get install -y --force-yes \
    postgresql-9.6-pgrouting \
    postgresql-9.6-postgis-2.3 \
    postgresql-9.6-postgis-2.3-scripts \
    [...]

# Download, compile and install GRASS 7.2
[...]

USER postgres
# Create a database 'grass_backend' owned by the "root" role.
RUN /etc/init.d/postgresql start \
&& psql --command "CREATE USER root WITH SUPERUSER [...];" \
&& psql --command "CREATE EXTENSION postgis; CREATE EXTENSION plpython3u;" --dbname [dbname] \
 && psql --command "CREATE EXTENSION postgis_sfcgal;" --dbname [dbname] \
 && psql --command "CREATE EXTENSION postgis; CREATE EXTENSION plpython3u;" --dbname grass_backend

WORKDIR [...]

Конец файла после workdir, то есть, я думаю, база данных не была правильно закрыта

Ответ Я правильно остановил postgresql внутри установки докера. Теперь он запускается на 15 секунд быстрее. Спасибо за ответ

1 Ответ

4 голосов
/ 22 апреля 2019

Учитывая строку database system was not properly shut down; automatic recovery in progress, которая определенно объясняет медленный запуск, пожалуйста, не закрывайте службу, отправьте команду остановки и дождитесь ее правильного закрытия.

Обратите внимание, что система может уничтожитьпроцесс, если для его остановки требуется много времени, это произойдет в случае postgresql, если к нему все еще сохраняются соединения (возможно, из вашего приложения).Если вы отключите все соединения и остановитесь, postgresql сможет относительно быстро остановиться.

Также убедитесь, что вы остановили службу postgresql внутри контейнера перед его отключением.

TCP будет задерживатьсяподключения на некоторое время, если вы запускаете и останавливаете в быстрой последовательности без надлежащей остановки службы внутри, что объясняет вашу ошибку, объясняющую, почему порт недоступен, обычно служба может запускаться / останавливаться на моей машине очень быстро, если ничего не подключенок нему.

3 цикла запуска-остановки postgresql на моей машине (у меня есть 2 базы данных приличного размера)

$ time bash -c 'for i in 1 2 3; do /etc/init.d/postgresql-11 restart; done'
 * Stopping PostgreSQL 11 (this can take up to 92 seconds) ...                        [ ok ]
 * /run/postgresql: correcting mode
 * Starting PostgreSQL 11 ...                                                         [ ok ]
 * Stopping PostgreSQL 11 (this can take up to 92 seconds) ...                        [ ok ]
 * /run/postgresql: correcting mode
 * Starting PostgreSQL 11 ...                                                         [ ok ]
 * Stopping PostgreSQL 11 (this can take up to 92 seconds) ...                        [ ok ]
 * /run/postgresql: correcting mode
 * Starting PostgreSQL 11 ...                                                         [ ok ]

real    0m1.188s
user    0m0.260s
sys     0m0.080s
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...