Если ошибок нет, проводим миграцию данных (если у Вас нет необходимости в копировании файлов в новый кластер, то используйте параметр — link. Будут использованы жесткие ссылки на старый кластер, без копирования):
Идея, стоящая за методом дампа, заключается в генерации текстового файла с командами SQL, которые при выполнении на сервере, пересоздадут базу данных в том же самом состоянии, в котором она была на момент создания дампа. PostgreSQL предоставляет для этой цели программную утилиту pg_dump. Базовый форма команды выглядит так:
pg_dump имя_БД > файл_дампа
то-есть, pg_dump записывает результаты своей работы на стандартный вывод. Далее будет рассмотрено как из этого можно извлечь пользу.
pg_dump является для PostgreSQL обычным клиентским приложением. Процедура резервного копирования может выполняться с любого удалённого компьютера, который имеет доступ к нужной базе данных. Эта утилита должна иметь доступ на чтение всех таблиц базы данных, резервную копию которых вы хотите сделать, так что на практике её почти всегда нужно запускать с правами суперпользователя СУБД.
Чтобы указать, к какому серверу должен подключаться pg_dump, необходимо использовать опцию командной строки -h сервер и -p порт. По умолчанию, в качестве сервера выбирается localhost или тот сервер, что указан в переменной окружения PGHOST. Похожим образом, по умолчанию используется порт, указанный в переменной окружения PGPORT или, если переменная не заданна, то порт, указанный по умолчанию при компиляции.
Как и любое другое клиентское приложение PostgreSQL, pg_dump по умолчанию будет подключаться к базе данных, под пользователем, имя которого совпадает с именем текущего пользователя в операционной системе. Чтобы изменить пользователя необходимо использовать опцию -U, либо установить нужное значение переменной окружения PGUSER.
Важное преимущество pg_dump над другими методами резервного копирования состоит в том, что базы данных, сохраненные при помощи pg_dump, могут быть залиты в более новые версии PostgreSQL, в то время как резервная копия на уровне файловой системы (простое копирование файлов баз данных) являются жёстко зависимыми от версии сервера.
Также, только pg_dump является методом, который будет работать при переносе базы данных на другую машинную архитектуру, например, при переносе с 32-битной на 64-битную версию сервера.
Дампы, создаваемые pg_dump являются внутренне целостными, что означает, что дамп представляет собой снимок базы данных на момент начала запуска pg_dump. pg_dump не блокирует другие операции с базой данных во время своей работы.
Если схема базы данных полагается на OID (например, как внешние ключи), вы должны сказать pg_dump, чтобы в дамп были также включены OID. Чтобы сделать это, используйте опцию командной строки -o.
Команда pg_dump может сохранять резервную копию базы в двух форматах: в формате текстовых файлов, содержащих набор команд SQL и специальный формат дампа. Если PostgreSQL была скомпилирована в системе с установленной библиотекой zlib, то специальный формат дампа будет сжимать данные, которые выдаются в файл вывода. Это приведёт к созданию файла дампа, который по размеру будет похож на дамп, сжатый gzip, но такой формат будет иметь преимущество, потому что позволяет выборочное восстановление таблиц. Следующая команда делает дамп базы данных, используя специальный формат дампа:
pg_dump -Fc имя_БД > имя_файла
В принципе можно сжать и текстовый формат резервной копии используя стандартные инструменты Linux — ипользовать программу сжатия, например gzip:
pg_dump имя_БД | gzip > имя_файла.gz
распаковывая впоследствии сжатый дамп командой:
gunzip -c имя_файла.gz | psql имя_БД
или:
cat имя_файла.gz | gunzip | psql имя_БД
При больших базах данных и нежелании использовать сжатие можно использовать команду split. Команда split позволяет разбивать текстовые файлы на файлы меньшего размера, которые не попадают под ограничения на максимальный размер файла в файловой системе. Например, чтобы нарезать дамп на кусочки по 1 мегабайту:
pg_dump имя_БД | split -b 1m - имя_файла
Загружая впоследствии полученные файлы командой:
cat имя_файла* | psql имя_БД
Восстановление резервных копий баз PostgreSQL
Текстовые файлы резервных копий баз данных PostgreSQL, содержащие команды sql, предназначаются для последующего чтения программой psql, то-есть выполнения сгенерированной последовательности скриптов. Общий вид команды для восстановления дампа:
psql имя_БД < файл_дампа
где файл_дампа — это файл, содержащий вывод команды pg_dump. База данных, заданная параметром имя_БД не будет создана данной командой, так что ее необходимо предварительно создать из шаблона базы template0 перед запуском psql, например, с помощью команды:
createdb -T template0 имя_БД
psql поддерживает опции для указания сервера, к которому осуществляется подключение и имени пользователя, похожие на pg_dump.
Перед восстановлением SQL дампа, все пользователи, которые владеют объектами или имеют права на объекты в базе данных, выгруженной в дамп, должны уже существовать. Если их нет, при восстановлении будут ошибки пересоздания объектов с оригинальными владельцами и/или правами.
По умолчанию, если произойдёт ошибка SQL, программа psql продолжит своё выполнение. Можно запустить psql с установленной переменной ON_ERROR_STOP, чтобы заставить psql в случае возникновения ошибки SQL завершить работу с кодом 3:
psql --set ON_ERROR_STOP=on имя_БД < файл_дампа
В любом случае база данных будет только частично восстановлена. В качестве альтернативы можно задать, что-бы весь дамп должен быть восстановлен в одной транзации, так что восстановление или будет полностью выполненно или полностью не выполнено. Данный режим может быть задан, с помощью опций командной строки -1 или —single-transaction для psql.
Возможность pg_dump и psql писать и читать из конвееров, делают возможным создание дампа базы данных напрямую с одного сервера на другой, например:
Дампы, которые делает pg_dump являются относительными template0. Это означает, что любые языки, процедуры и т.д. добавленные через template1, также попадут в дамп при выполнении pg_dump. В итоге, при восстановлении, если вы использовали специально изменённый template1, вы должны создать пустую базу данных из template0, как показано в примере выше.
После восстановления резервной копии, очень рекомендуется запустить ANALYZE на каждую базу данных для того, чтобы оптимизатор запросов получил нужную статистику.
Специальный формат дампа не является скриптом для psql и должен восстанавливаться с помощью команды pg_restore, например:
pg_restore -d имя_БД имя_файла
Для очень больших баз данных, вам может понадобиться сочетать split с одним из двух других методов.
Резервное копирование всего кластера баз данных PostgreSQL
pg_dump делает дамп только одной базы данных и не включает в дамп информацию о ролях или табличных пространствах (потому что эти данные относятся скорее к уровню кластера, чем к самой базе данных). Для создания резервной копии всего содержимого кластера баз данных, существует программа pg_dumpall. pg_dumpall делает резервную копию каждой базы данных кластера, а также служебные данные уровня кластера, такие как роли и определения табличных пространств. Базовая форма использования этой команды:
pg_dumpall > файл_дампа
Результирующий дамп может быть восстановлен с помощью psql:
psql -f файл_дампа postgres
При восстановлении дампа, сделанного pg_dumpall, всегда необходимо, выполнять восстановление с правами суперпользователя баз данных, потому что они требуются для восстановления ролей и информации о табличных пространствах.
Пример горизонтального масштабирования для распределения запросов между несколькими серверами для повышения отказоустойчивости.
Рассмотрим решение по балансировке нескольких веб-серверов при помощи сервиса HAProxy.
Технические требования
Сервер под балансировщик с двумя сетевыми интерфейсами (Рекомендация. Внешний адрес для связи с внешним миром и локальный для общения между узлами кластера);
Два и более серверов под распределение запросов/трафика;
В примере будет использоваться дистрибутив Linux CentOS 7.
Установка и настройка backend-серверов
В качестве backend-серверов я буду использовать несколько веб-серверов с NGINX и настроенным SSL.
Конфигурацию SSL можно выполнить и на самом балансировщике, а бэкенд сервера оставить работать на 80 порту, но в моем случае я буду использовать режим SSL Pass-Through. Не забываем поместить SSL-сертификаты в директорию /etc/nginx/ssl.
Для того, чтобы принимать реальные IP-адреса клиентов на веб-сервере от HAProxy необходимо добавить proxy_protocol в параметр listen, а также указать реальный адрес откуда разрешить принимать запросы:
Создадим приветственную страницу на обоих веб-серверах touch /srv/www/devservers.network/public_html со следующим содержимым, изменив только номер сервера для его дальнейшего определения:
<!DOCTYPE html>
<html>
<head>
<title>Server #1</title>
</head>
<body>
<h1>This is server #1</h1>
</body>
</html>
Добавляем NGINX в автозагрузку и запускаем сервис.
В качестве сервера балансировки я буду использовать VDS сервер с ресурсами 1 vCPU и 1Gb RAM. При правильной настройке, данных мощностей хватит для обслуживания 10-15к одновременных сессий, чего вполне достаточно для среднестатистического интернет-ресурса.
Установим HAProxy
Пакет HAProxy доступен в базовой репозитории CentOS.
yum install haproxy
Настройка HAProxy
HAProxy обладает очень гибкими настройками и конфигурация может содержать большое количество директив и условий. Конфигурационный файл состоит из нескольких секций. Директивы frontend, backend, listen должны иметь своё имя, к примеру defaults — может, но не обязательно, а такие как global — не должны.
Выполняем конфигурацию HAProxy в файле /etc/haproxy/haproxy.cfg. Рекомендую использовать свой конфигурационный файл, а представленный по умолчанию оставить как резерв.
Секция global
global
log /dev/log local0
chroot /var/lib/haproxy
pidfile /var/run/haproxy.pid
stats timeout 30s
maxconn 4000
user haproxy
group haproxy
daemon
Рассмотрим настройки в директиве global:
log — вести лог в /dev/log сохраняя в local0;
chroot — настройки безопасности, позволяющие работать HAProxy только в указанной директории;
maxconn — максимальное количество соединений на один процесс;
daemon — запуск процесса как демона.
Секция defaults
В секции defaults описываются параметры по умолчанию для всех других секций, следующих за данной. В файле конфигурации может быть несколько секций defaults, в этом случае параметры, описанные в данной секции, будут переопределены в следующей, и будут применяться к секциям, идущим за ней.
log — указывает в какой лог вести запись (global в данном случае означает, что используются параметры, заданные в секции global);
mode — устанавливает протокол взаимодействия, принимает одно из значений: tcp, http, health;
retries — количество попыток соединения с сервером в случае отказа;
option httplog — формат лога, в случае использования HAProxy для проксирования HTTP-запросов (рекомендуется включить данную настройку);
option redispatch — разрешает программе разорвать и переназначить сессию в случае отказа сервера;
contimeout — максимальное время ожидания успешного соединения с сервером.
В примере я использую параметры timeout, которые позволяют более гибко настроить поведение балансировщика. Подробно с доступными параметрами можно ознакомиться в документации к HAProxy
Секция frontend
Укажем HAProxy какие запросы он должен обрабатывать, для этого задаем секцию frontend с именем https-in:
Параметр bind со значением *:443 говорит о том, что HAProxy должен принимать все запросы на 443-й порт. Ещё раз напомню, что в данном примере я использую режим SSL Pass-Through, поэтому настройка SSL на самом HAProxy не выполняется.
Параметр default_backend указывает, какие сервера будут обрабатывать эти запросы. В данном случае — backend-https-servers, именно так необходимо назвать секцию backend.
Секция backend
В этой секции мы задаем алгоритм балансировки (параметр balance) и список серверов-обработчиков (server). В качестве алгоритма балансировки указываем roundrobin.
HAProxy имеет несколько алгоритмов балансировки:
roundrobin — каждый сервер получает запросы пропорционально своему весу, при этом веса серверов могут меняться на лету;
static-rr — то же, что и roundrobin, только изменение весов на лету не даст никакого эффекта;
leastconn — выбирает сервер с наименьшим количеством активных соединений;
first — выбирает первый сервер с доступными слотами для соединения source — на основе хэша IP-адреса отправителя запроса и весов серверов назначается сервер для соединения;
uri — сервер выбирается на основе адреса (без параметров) страницы;
url_param — сервер выбирается на основе GET-параметров запроса;
hdr — сервер выбирается на основе заголовков запроса;
rdp-cookie — сервер выбирается на основе cookie (если они не установлены, то применяется обычный roundrobin);
При перечислении серверов используется следующий формат: ключевое слово server, имя сервера, IP-адрес, дополнительные параметры (в данном случае — проверка статуса хоста и Proxy Protocol, которые позволяет перенаправлять реальные IP-адреса клиента с HAProxy на веб-сервер).
backend backend-https-servers
mode tcp
balance roundrobin
option ssl-hello-chk
server nginx01 10.0.1.3:443 check send-proxy
server nginx02 10.0.1.4:443 check send-proxy
Просмотр статистики HAProxy
Для включения расширенной статистики HAProxy необходимо в конфигурационный файл добавить секцию:
bind :10001 — HAProxy будет ожидать запросы к порту 10001;
stats enable — включить отчёты со статистикой;
stats uri — установка адреса страницы с отчётом;
stats auth — логин и пароль для авторизации на странице со статистикой;
В секции listen указываем HAProxy, что он должен показывать статистику на странице /haproxy_stats на порту 10001 после ввода логина admin и пароля password.
Проверяем.
Переходим по адресу HAProxy (IP-адрес или хостнйем) и просто обновляем страницу. В зависимости от выбранного балансировщиком сервера будем получать ответ This is server #1 либо This is server #2.
Проверяем статистику. Переходим по адресу SITE_NAME:10001/haproxy_stats
На этом всё. Выше рассмотрен самый простой метод балансировки. Более сложная настройка требует грамотно составленного ТЗ и технических данных проекта. HAProxy очень удобный и гибкий в настройке инструмент с помощью которого можно выполнить балансировку и других сервисов, к примеру почтовый сервер, Memcached, Redis и пр.
Пример горизонтального масштабирования для распределения запросов между несколькими серверами для повышения отказоустойчивости.
Рассмотрим решение по балансировке нескольких веб-серверов при помощи сервиса HAProxy.
Технические требования
Сервер под балансировщик с двумя сетевыми интерфейсами (Рекомендация. Внешний адрес для связи с внешним миром и локальный для общения между узлами кластера);
Два и более серверов под распределение запросов/трафика;
В примере будет использоваться дистрибутив Linux CentOS 7.
Установка и настройка backend-серверов
В качестве backend-серверов я буду использовать несколько веб-серверов с NGINX и настроенным SSL.
Конфигурацию SSL можно выполнить и на самом балансировщике, а бэкенд сервера оставить работать на 80 порту, но в моем случае я буду использовать режим SSL Pass-Through. Не забываем поместить SSL-сертификаты в директорию /etc/nginx/ssl.
Для того, чтобы принимать реальные IP-адреса клиентов на веб-сервере от HAProxy необходимо добавить proxy_protocol в параметр listen, а также указать реальный адрес откуда разрешить принимать запросы:
Создадим приветственную страницу на обоих веб-серверах touch /srv/www/devservers.network/public_html со следующим содержимым, изменив только номер сервера для его дальнейшего определения:
<!DOCTYPE html>
<html>
<head>
<title>Server #1</title>
</head>
<body>
<h1>This is server #1</h1>
</body>
</html>
Добавляем NGINX в автозагрузку и запускаем сервис.
В качестве сервера балансировки я буду использовать VDS сервер с ресурсами 1 vCPU и 1Gb RAM. При правильной настройке, данных мощностей хватит для обслуживания 10-15к одновременных сессий, чего вполне достаточно для среднестатистического интернет-ресурса.
Установим HAProxy
Пакет HAProxy доступен в базовой репозитории CentOS.
yum install haproxy
Настройка HAProxy
HAProxy обладает очень гибкими настройками и конфигурация может содержать большое количество директив и условий. Конфигурационный файл состоит из нескольких секций. Директивы frontend, backend, listen должны иметь своё имя, к примеру defaults — может, но не обязательно, а такие как global — не должны.
Выполняем конфигурацию HAProxy в файле /etc/haproxy/haproxy.cfg. Рекомендую использовать свой конфигурационный файл, а представленный по умолчанию оставить как резерв.
Секция global
global
log /dev/log local0
chroot /var/lib/haproxy
pidfile /var/run/haproxy.pid
stats timeout 30s
maxconn 4000
user haproxy
group haproxy
daemon
Рассмотрим настройки в директиве global:
log — вести лог в /dev/log сохраняя в local0;
chroot — настройки безопасности, позволяющие работать HAProxy только в указанной директории;
maxconn — максимальное количество соединений на один процесс;
daemon — запуск процесса как демона.
Секция defaults
В секции defaults описываются параметры по умолчанию для всех других секций, следующих за данной. В файле конфигурации может быть несколько секций defaults, в этом случае параметры, описанные в данной секции, будут переопределены в следующей, и будут применяться к секциям, идущим за ней.
log — указывает в какой лог вести запись (global в данном случае означает, что используются параметры, заданные в секции global);
mode — устанавливает протокол взаимодействия, принимает одно из значений: tcp, http, health;
retries — количество попыток соединения с сервером в случае отказа;
option httplog — формат лога, в случае использования HAProxy для проксирования HTTP-запросов (рекомендуется включить данную настройку);
option redispatch — разрешает программе разорвать и переназначить сессию в случае отказа сервера;
contimeout — максимальное время ожидания успешного соединения с сервером.
В примере я использую параметры timeout, которые позволяют более гибко настроить поведение балансировщика. Подробно с доступными параметрами можно ознакомиться в документации к HAProxy
Секция frontend
Укажем HAProxy какие запросы он должен обрабатывать, для этого задаем секцию frontend с именем https-in:
Параметр bind со значением *:443 говорит о том, что HAProxy должен принимать все запросы на 443-й порт. Ещё раз напомню, что в данном примере я использую режим SSL Pass-Through, поэтому настройка SSL на самом HAProxy не выполняется.
Параметр default_backend указывает, какие сервера будут обрабатывать эти запросы. В данном случае — backend-https-servers, именно так необходимо назвать секцию backend.
Секция backend
В этой секции мы задаем алгоритм балансировки (параметр balance) и список серверов-обработчиков (server). В качестве алгоритма балансировки указываем roundrobin.
HAProxy имеет несколько алгоритмов балансировки:
roundrobin — каждый сервер получает запросы пропорционально своему весу, при этом веса серверов могут меняться на лету;
static-rr — то же, что и roundrobin, только изменение весов на лету не даст никакого эффекта;
leastconn — выбирает сервер с наименьшим количеством активных соединений;
first — выбирает первый сервер с доступными слотами для соединения source — на основе хэша IP-адреса отправителя запроса и весов серверов назначается сервер для соединения;
uri — сервер выбирается на основе адреса (без параметров) страницы;
url_param — сервер выбирается на основе GET-параметров запроса;
hdr — сервер выбирается на основе заголовков запроса;
rdp-cookie — сервер выбирается на основе cookie (если они не установлены, то применяется обычный roundrobin);
При перечислении серверов используется следующий формат: ключевое слово server, имя сервера, IP-адрес, дополнительные параметры (в данном случае — проверка статуса хоста и Proxy Protocol, которые позволяет перенаправлять реальные IP-адреса клиента с HAProxy на веб-сервер).
backend backend-https-servers
mode tcp
balance roundrobin
option ssl-hello-chk
server nginx01 10.0.1.3:443 check send-proxy
server nginx02 10.0.1.4:443 check send-proxy
Просмотр статистики HAProxy
Для включения расширенной статистики HAProxy необходимо в конфигурационный файл добавить секцию:
bind :10001 — HAProxy будет ожидать запросы к порту 10001;
stats enable — включить отчёты со статистикой;
stats uri — установка адреса страницы с отчётом;
stats auth — логин и пароль для авторизации на странице со статистикой;
В секции listen указываем HAProxy, что он должен показывать статистику на странице /haproxy_stats на порту 10001 после ввода логина admin и пароля password.
Проверяем.
Переходим по адресу HAProxy (IP-адрес или хостнйем) и просто обновляем страницу. В зависимости от выбранного балансировщиком сервера будем получать ответ This is server #1 либо This is server #2.
Проверяем статистику. Переходим по адресу SITE_NAME:10001/haproxy_stats
На этом всё. Выше рассмотрен самый простой метод балансировки. Более сложная настройка требует грамотно составленного ТЗ и технических данных проекта. HAProxy очень удобный и гибкий в настройке инструмент с помощью которого можно выполнить балансировку и других сервисов, к примеру почтовый сервер, Memcached, Redis и пр.
Интересно, сколько места занимает Docker в вашей системе Linux?
В основном, все образы Docker, контейнеры и другие связанные с ними сущности находятся в каталоге /var/lib/docker.
Вы можете проверить размер этого каталога и получить общее дисковое пространство, используемое Docker:
$ sudo du -sh /var/lib/docker
4.9G /var/lib/docker
Но это не очень подробно, и вам, возможно, придется углубиться в этот каталог, чтобы увидеть, какой компонент использует какое пространство.
К счастью, Docker предоставил инструменты для получения этой информации в более полезном виде.
Проверка использования дискового пространства Docker
Самый простой, “докеровский” способ узнать, сколько места занимают образы, контейнеры, локальные тома или кэш сборки:
docker system df
При выполнении этой команды (при необходимости используйте sudo) вы получите всю информацию об использовании диска, сгруппированную по компонентам Docker.
$ docker system df
TYPE TOTAL ACTIVE SIZE RECLAIMABLE
Images 4 4 1.065GB 0B (0%)
Containers 4 4 5.705kB 0B (0%)
Local Volumes 7 7 1.108GB 0B (0%)
Build Cache 0 0 0B 0B
Это определенно лучше, чем смотреть на общий размер /var/lib/docker.
Вы можете увидеть, сколько места занимают образы, контейнеры и тома.
Однако это все еще не дает четкого представления о том, какой образ или том занимает больше места.
На самом деле, это так.
Команда df системы docker имеет опцию verbose -v, которая предоставляет все эти детали.
docker system df -v
Вот подробный вывод:
$ docker system df -v
Images space usage:
REPOSITORY TAG IMAGE ID CREATED SIZE SHARED SIZE UNIQUE SIZE CONTAINERS
ghost 4.32.0 b40265427368 8 weeks ago 468.8MB 0B 468.8MB 1
jrcs/letsencrypt-nginx-proxy-companion latest 037cc4751b5a 13 months ago 24.35MB 0B 24.35MB 1
jwilder/nginx-proxy latest 509ff2fb81dd 15 months ago 165MB 0B 165MB 1
mariadb 10.5.3 f5d2bcaf057b 20 months ago 407MB 0B 407MB 1
Containers space usage:
CONTAINER ID IMAGE COMMAND LOCAL VOLUMES SIZE CREATED STATUS NAMES
899cc90e85d9 ghost:4.32.0 "docker-entrypoint.s…" 1 0B 8 weeks ago Up 8 weeks ghost_ghost_6
17b58fdafbce jrcs/letsencrypt-nginx-proxy-companion "/bin/bash /app/entr…" 4 571B 3 months ago Up 2 months letsencrypt-proxy-companion
58f99f46ee03 jwilder/nginx-proxy "/app/docker-entrypo…" 5 5.13kB 3 months ago Up 2 months jwilder-nginx-proxy
fb907286b60e mariadb:10.5.3 "docker-entrypoint.s…" 1 2B 3 months ago Up 2 months ghost_db_1
Local Volumes space usage:
VOLUME NAME LINKS SIZE
ghostdb 1 434.7MB
jwilder-nginx-with-ssl_acme 2 36.09kB
jwilder-nginx-with-ssl_certs 2 25.12kB
jwilder-nginx-with-ssl_dhparam 1 1.525kB
jwilder-nginx-with-ssl_html 2 1.106kB
jwilder-nginx-with-ssl_vhost 2 556B
ghost 1 674MB
Build cache usage: 0B
CACHE ID CACHE TYPE SIZE CREATED LAST USED USAGE SHARED
Проверка размеров образов docker
Если вы просто хотите посмотреть образы Docker и их размеры, вы также можете использовать эту команду:
docker ps --size
Вы должны увидеть столбец SIZE, добавленный к выводу команды:
$ docker ps --size
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES SIZE
1171dcfb7e06 alpine "sleep 10" 10 months ago Up 9 seconds always-policy 0B (virtual 5.61MB)
Проверка размеров запущенных контейнеров
Аналогично, если вы хотите узнать размер запущенных контейнеров Docker, вы можете использовать команду docker ps:
docker ps --size
Вы должны увидеть столбец SIZE, добавленный к выводу команды:
$ docker ps --size
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES SIZE
1171dcfb7e06 alpine "sleep 10" 10 months ago Up 9 seconds always-policy 0B (virtual 5.61MB)
Вы заметили, как вывод говорит 0B, а затем показывает виртуальный размер 5,61 МБ?
Виртуальный размер включает общий базовый образ.
Давайте вернемся к подходу к Linux более конкретно, на примере образа и контейнера Alpine в качестве практического примера.
Использование стандартных команд Linux для анализа использования дискового пространства Docker
Всякий раз, когда вы используете команду docker pull или запускаете команду docker-compose up -d для подготовки запуска приложений, вот как вы смотрите на использование пространства образа, фактически хранящегося на сервере Ubuntu 20.04:
sudo du -sh /var/lib/docker/overlay2/<hash-named-directory>/
Здесь Overlay2 является драйвером хранилища Docker по умолчанию в Ubuntu.
Вы можете подтвердить это, выполнив команду docker info и поискав Storage Driver:
Storage Driver: overlay2
Если оно отличается от вашего, значит, вы используете другой драйвер хранения для Docker.
Аналогично, расположение каталога будет названо в соответствии с тем же драйвером хранения.
Доступность драйвера хранилища зависит от поддержки ядра.
Использование диска конкретного образа
Если вы ищете местоположение конкретных образов, вы можете использовать команду inspect в Docker для извлеченного образа.
Например, я извлек образ alpine с помощью команды docker pull alpine.
Выполните следующую команду для его проверки:
$ docker inspect alpine
После выполнения команды вы заметите три поля в подразделе Data в разделе GraphDriver:
Исходя из вышеприведенной информации, вы можете видеть, что (упомянутый ранее в синтаксисе команды du) в данном случае равен 64c9c0cf8c9cfb0e2168071df0652a317d49f58a68fe86e4a9a525ab9e365e.
Здесь вы можете выполнить следующую команду, чтобы узнать объем пространства, используемого изображением Alpine:
$ sudo du -sh /var/lib/docker/overlay2/64c9c0cf8c9cfb0e2168071df0652a317d49f58a68fe86e4a9a9a525ab9e365e
6.0M /var/lib/docker/overlay2/64c9c0cf8c9cfb0e2168071df0652a317d49f58a68fe86e4a9a9a525ab9e365e
Подобно образам, контейнеры также хранятся в одном каталоге на базе драйвера хранилища.
/var/lib/docker/overlay2
Использование диска конкретным контейнером
Если вы ищете местоположение конкретных контейнеров, вы можете снова использовать команду inspect в Docker для запущенного контейнера.
Например, я запустил контейнер alpine с помощью команды docker run -ti -d alpine.
Запустив команду docker ps, вы увидите, что он запущен:
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
cb341d6a28fa alpine "/bin/sh" 6 seconds ago Up 5 seconds confident_banzai
Здесь контейнер был произвольно назван confident_banzai.
Давайте проверим его:
$ docker inspect confident_banzai
После выполнения вышеуказанной команды вы заметите все четыре поля, упомянутые ранее в подразделе Data в разделе GraphDriver.
В этих местах данные контейнера физически хранятся на хост-системе, как и в случае с образами:
$ sudo du -sh /var/lib/docker/overlay2/d734685e284c92bdcb6063ac292a48813f30f4b0b2dd6fa2882279c569e506a3
32K /var/lib/docker/overlay2/d734685e284c92bdcb6063ac292a48813f30f4b0b2dd6fa2882279c569e506a3
Использование диска конкретного тома
В данном случае существует два типа томов.
Первый – это обычные тома Docker, а второй – bind mounts.
Тома Docker
Если вы ищете местоположение определенных томов, вы можете сначала использовать команду docker volume ls и проверить имя или ID тома.
Скажем, например, я запустил контейнер alpine следующей командой с томом:
docker run -ti -d --name alpine-container -v test-data:/var/lib/app/content alpine
Теперь автоматически будет создан том с именем test-data.
Теперь давайте создадим файл test.md в этом месте:
$ docker exec alpine-container sh -c "touch /var/lib/app/content/test.md"
Убедитесь, что файл действительно был создан:
$ docker exec -ti alpine-container sh
/ # ls /var/lib/app/content/
test.md
/ # exit
Когда вы запустите docker volume ls, в списке появится том с именем test-data:
$ docker volume ls
DRIVER VOLUME NAME
local d502589845f7ae7775474bc01d8295d9492a6c26db2ee2c941c27f3cac4449d1
local e71ee3960cfef0a133d323d146a1382f3e25856480a727c037b5c81b5022cb1b
local test-data
Наконец, вы можете подтвердить фактическое расположение файла на вашей хост-системе:
$ sudo ls -l /var/lib/docker/volumes/test-data/_data
total 0
-rw-r--r-- 1 root root 0 Oct 6 23:20 test.md
Поэтому путь для смонтированного тома всегда находится в каталоге с именем _data внутри соответствующего каталога тома.
Таким образом, вы можете использовать команду du здесь снова для определенных томов!
$ sudo du -sh /var/lib/docker/volumes/test-data/_data
4.0K /var/lib/docker/volumes/test-data/_data
Всегда помните, что нужно записывать имя тома каждый раз, когда вы хотите узнать, сколько места он занимает.
Bind Mounts
Это единственное исключение в Docker, где необходимо использовать подход Linux для мониторинга использования дискового пространства.
В то же время, всегда предпочтительнее сначала остановить работающие контейнеры.
В этом случае смонтированный том с именем test-data станет доступен на стороне контейнера как /var/lib/app/content.
$ sudo du -sh /home/avimanyu/test-data
4.0K /home/avimanyu/test-data
То же самое можно проверить и внутри контейнера:
$ sudo docker exec -ti alpine-container sh
/ # du -sh /var/lib/app/content
4.0K /var/lib/app/content
Как вы можете видеть, оба указанных выше размера одинаковы!
Логи Docker на хосте всегда хранятся в томах.
Используя описанный в этом разделе способ, пользователи также могут сориентироваться и выяснить это, посмотрев на использование дискового пространства томов docker.
Это зависит от приложения и расположения файлов логов в томах приложения.
Бонусные советы
Исходя из того, что вы узнали до сих пор, вполне очевидно, что вы также можете использовать следующую команду для получения данных об использовании диска образами и контейнерами вместе:
sudo du -sh /var/lib/docker/overlay2
Логи Docker на хосте всегда хранятся в томах.
Обычно большой объем Docker, скорее всего, указывает на то, что логи накапливаются и управляются неэффективно.
Используя способ, описанный в разделе “Тома” этой статьи, пользователи также могут сориентироваться и смягчить ситуацию, посмотрев на использование дискового пространства в томах docker.
Это зависит от приложения и расположения файлов журналов в томах приложения.
Резюме
В этом руководстве я использовал общий подход, основанный на Linux, чтобы показать вам, как узнать занятость дискового пространства образов Docker, контейнеров и томов, расположенных на вашем Linux-сервере на уровне хоста.
Вы также узнали, как сделать это предпочтительным (Docker) способом.
Если вы хотите поделиться отзывами, комментариями или предложениями по поводу этого подхода, пожалуйста, оставьте свои мысли в разделе комментариев ниже
В этом коротком руководстве мы рассмотрим, как удалить удаленные или завершенные поды в кластере Kubernetes.Есть много причин, по которым вы можете обнаружить, что некоторые поды находятся в состоянии Evicted и Terminated.В случае eviction это часто происходит в результате нехватки ресурсов на рабочих нодах или ошибки приложения.Terminated может быть результатом уменьшения масштаба приложения или развертывания новой версии приложения, после которой прекращается работа старых подов.Служба kubelet, которая работает на каждом узле кластера, отвечает за состояние eviction подов.Вы можете получить список подов в пространстве имен, застрявших в состоянии Evicted и Terminated, выполнив следующую команду:
kubectl get pods -n namespace | egrep -i 'Terminated|Evicted'
Как удалить поды в Kubernetes
Вы можете удалить эти поды разными способами.
Использование собственных команд kubectl и Bash
Это команды bash с фильтрацией, которые вы можете запустить для принудительного удаления подов в пространстве имен, которые застряли в завершенном состоянии.
# Определение неймспейса
namespace="mynamespace"
# Получаем поды
epods=$(kubectl get pods -n ${namespace} | egrep -i 'Terminated|Evicted' | awk '{print $1 }')
# Удаляем их
for i in ${epods[@]}; do
kubectl delete pod --force=true --wait=false --grace-period=0 $i -n ${namespace}
done
Подтвердите, есть ли еще контейнеры в этом состоянии.
kubectl get pods -n ${namespace} | egrep -i 'Terminated|Evicted'
Удаление всех исключенных и завершенных модулей из всех пространств имен: