#postgresql #docker
#postgresql #docker
Вопрос:
Мы создали образ debian docker с postgresql для запуска одного из наших сервисов. База данных предназначена для внутреннего использования в контейнере и не требует сопоставления портов. Я полагаю, что он установлен apt-get
через файл Dockerbuild.
Мы часто останавливаем и запускаем эту службу, и из-за медленного запуска базы данных возникает проблема с производительностью. Несмотря на то, что он пуст, требуется около 20 секунд, чтобы принять соединение при первом запуске образа docker. Журнал выглядит следующим образом :
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
amp;amp; 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
amp;amp; psql --command "CREATE USER root WITH SUPERUSER [...];"
amp;amp; psql --command "CREATE EXTENSION postgis; CREATE EXTENSION plpython3u;" --dbname [dbname]
amp;amp; psql --command "CREATE EXTENSION postgis_sfcgal;" --dbname [dbname]
amp;amp; psql --command "CREATE EXTENSION postgis; CREATE EXTENSION plpython3u;" --dbname grass_backend
WORKDIR [...]
Конец файла после workdir, что означает, что я предполагаю, что база данных не закрыта должным образом
Ответ Я правильно остановил postgresql внутри установки docker. Теперь он запускается на 15 секунд быстрее. Спасибо за ответ
Комментарии:
1. находятся ли фактические файлы базы данных на внешнем томе docker?
2. Можете ли вы опубликовать файл dockerfile? Что произойдет, если вы включите ipv6? brunomgalmeida.wordpress.com/2015/07/23 /…
3. @jcuypers Нет, это не так
4. @ArthurHavlicek Да, как уже говорилось в одном из ответов, быстрый запуск или остановка и / или подключение перезапускаемых экземпляров через docker / kubernetes / … может привести к тому, что база данных окажется в несогласованном состоянии. Я рекомендую поместить его на определенный том docker и правильно закрыть экземпляры postgress.
Ответ №1:
Учитывая строку database system was not properly shut down; automatic recovery in progress
, которая определенно объясняет медленный запуск, пожалуйста, не отключайте службу, отправьте команду stop и дождитесь ее правильного закрытия.
Пожалуйста, обратите внимание, что система может остановить процесс, если его остановка займет много времени, это произойдет в случае 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
Комментарии:
1. Я склонен полагать, что это ответ, я проведу тест, когда смогу (возможно, завтра)
2. @ArthurHavlicek не могли бы вы поделиться с нами, что исправило это для вас? Я вроде бы дал несколько вариантов в своем ответе!
3. Остановка postgresql в установочном файле docker сделала это. Я отредактировал основной пост, чтобы помочь другим пользователям.