Я не могу понять, как AWS настраивает свой «тонкий пул» Docker на ElasticBeanstalk и как он заполняется. Мой тонкий пул докера как-то заполняется и вызывает сбой моих приложений при попытке записи на диск.
Это изнутри контейнера:
>df -h
> /dev/xvda1 25G 1.4G 24G 6%
На самом деле EBS имеет выделенный диск объемом 25 ГБ; 1,6 ГБ - это то, что du -sh /
возвращается.
Снаружи в EC2 он начинается достаточно безобидно ... (через lvs
)
LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert
docker-pool docker twi-aot--- 11.86g 37.50 14.65
Тем не менее, файловая система будет вскоре перемонтирована как доступная только для чтения. через dmesg:
[2077620.433382] Buffer I/O error on device dm-4, logical block 2501385
[2077620.437372] EXT4-fs warning (device dm-4): ext4_end_bio:329: I/O error -28 writing to inode 4988708 (offset 0 size 8388608 starting block 2501632)
[2077620.444394] EXT4-fs warning (device dm-4): ext4_end_bio:329: I/O error [2077620.473581] EXT4-fs warning (device dm-4): ext4_end_bio:329: I/O error -28 writing to inode 4988708 (offset 8388608 size 5840896 starting block 2502912)
[2077623.814437] Aborting journal on device dm-4-8.
[2077649.052965] EXT4-fs error (device dm-4): ext4_journal_check_start:56: Detected aborted journal
[2077649.058116] EXT4-fs (dm-4): Remounting filesystem read-only
Вернувшись в страну экземпляров EC2, Докер сообщает об этом: (с docker info
)
Pool Name: docker-docker--pool
Pool Blocksize: 524.3 kB
Base Device Size: 107.4 GB
Backing Filesystem: ext4
Data file:
Metadata file:
Data Space Used: 12.73 GB
Data Space Total: 12.73 GB
Data Space Available: 0 B
Metadata Space Used: 3.015 MB
Metadata Space Total: 16.78 MB
Metadata Space Available: 13.76 MB
Thin Pool Minimum Free Space: 1.273 GB
LVS сбрасывает эту информацию:
--- Logical volume ---
LV Name docker-pool
VG Name docker
LV UUID xxxxxxxxxxxxxxxxxxxxxxxxxxxx
LV Write Access read/write
LV Creation host, time ip-10-0-0-65, 2017-03-25 22:37:38 +0000
LV Pool metadata docker-pool_tmeta
LV Pool data docker-pool_tdata
LV Status available
# open 2
LV Size 11.86 GiB
Allocated pool data 100.00%
Allocated metadata 17.77%
Current LE 3036
Segments 1
Allocation inherit
Read ahead sectors auto
- currently set to 256
Block device 253:2
Что это за тонкий пул, почему он заполняется, и как мне его остановить? Кроме того, если на моем / томе есть 20+ ГБ свободного пространства внутри контейнера, почему это останавливает новые записи? Насколько я могу судить, он не связан с файлами, в которые пишут мои программы.
Спасибо!
источник
Я следовал предложениям, представленным в документации AWS, и теперь все работает.
Но мне пришлось объединить два решения: увеличить пространство и добавить cronjob для удаления старых файлов.
Вот что я сделал.
Во-первых, я изменил громкость,
xvdcz
чтобы использовать 50 ГБ вместо 12 ГБ. Это хранилище, на котором мы можем видетьdocker system info
. В моем случае это всегда было полно, потому что я загружаю много файлов каждый день..ebextensions / BlockDevice-xvdcz.config
После того, как я добавил cronjob, чтобы очистить мои удаленные файлы, которые больше не использовались. Это было необходимо, потому что Докер по какой-то причине все еще хранил их. В моем случае достаточно одного раза в день. Если у вас больше загрузок, чем у меня, вы можете настроить cronjob для запуска сколько раз вам нужно.
.ebextensions / cronjob.config
Источник: https://docs.aws.amazon.com/pt_br/elasticbeanstalk/latest/dg/create_deploy_docker.container.console.html#docker-volumes
источник
Секция док-станции AWSasticbeanstalk Environment Configuration описывает, как она работает:
источник
Я бился головой с этой проблемой более суток и наконец понял это.
AWS использует
devicemapper
бэкэнд и создает том SSD объемом 12 ГБ, который он монтирует и использует для образов докеров. Вы должны переопределить том, который он будет монтировать, используя концепцию расширений эластичных бобов, и развернуть его через CLI (к сожалению, это невозможно сделать с помощью их графического интерфейса).В каталоге у вас есть
Dockerrun.aws.json
файл, создайте каталог с именем,.ebextensions
а затем создайте файл, который заканчивается.config
внутри него. Я позвонил мой01.correctebsvolume.config
. Затем поместите туда следующее содержимое:option_settings: - namespace: aws:autoscaling:launchconfiguration option_name: BlockDeviceMappings value: /dev/xvdcz=snap-066cZZZZZZZZ:40:true:gp2
Я прямо в одну из своих неудачных коробок и обнаружил, что она крепится
/dev/xvdcz
. Это может отличаться для вас. Вsnap-066cZZZZZZZZ
должен быть действительным снимок ID. Я создал образ AMI неисправного экземпляра и использовал снимок, созданный в процессе.40
, Сколько ГБ будет объем, поэтому замена в том, что вам нужно. Я не знаю, чтоtrue
илиgp2
делать, но они пришли из данных устройства блочного изображения AMI, поэтому я сохранил их.Волшебство
namespace
иoption_name
пришло отсюда в документацию.источник
Простое увеличение размера диска не решит проблему, а приведет к ошибке позже. AWS рекомендует сопоставить новый диск с вашим контейнером, чтобы любой создаваемый файл / файл удаления не влиял на слой опроса Docker.
Я в настоящее время смотрю на это, я еще не проверял, но решение, с которым я сталкиваюсь, имеет это на моем blockdevice.config
Ценю любые комментарии.
источник