AWS ElasticBeanstalk docker-thin-pool semakin penuh dan menyebabkan pemasangan kembali filesystem sebagai read-only?


10

Saya tidak tahu bagaimana AWS mengatur 'kumpulan tipis' Docker mereka di ElasticBeanstalk dan bagaimana pengisiannya. Kumpulan tipis buruh pelabuhan saya sedang mengisi entah bagaimana dan menyebabkan aplikasi saya mogok ketika mereka mencoba menulis ke disk.

Ini dari dalam wadah:

>df -h
>     /dev/xvda1                  25G  1.4G   24G   6%

EBS, pada kenyataannya, memiliki disk 25GB yang dibagikan; 1,6 gb adalah apa yang du -sh /dikembalikan.

Di luar di EC2, itu dimulai dengan cukup tidak berbahaya ... (via 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

Namun, sistem file akan segera dipasang kembali sebagai hanya-baca. via 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

Kembali keluar di EC2 instance-land, Docker melaporkan ini: (dari 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 membuang info ini:

  --- 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

Apa kumpulan tipis ini, mengapa mengisi, dan bagaimana saya menghentikannya? Juga, jika saya memiliki 20+ GB gratis dari dalam wadah di / volume saya, mengapa itu berhenti menulis baru? Sejauh yang saya tahu itu tidak terhubung ke file yang menulis program saya.

Terima kasih!

Jawaban:


8

The .ebextensionsdisarankan oleh David Ellis bekerja untuk saya. Saya tidak dapat mengomentari jawabannya, tetapi saya ingin menambahkan bahwa Anda dapat membuat volume EBS baru alih-alih menggunakan snapshot. Untuk memasang volume EBS 40GB, saya menggunakan yang berikut ini:

option_settings:
  - namespace: aws:autoscaling:launchconfiguration
    option_name: BlockDeviceMappings
    value: /dev/xvdcz=:40:true

Lihat juga dokumentasi ini , yang memiliki contoh pemetaan volume EBS 100GB baru /dev/sdh.

The truepada akhirnya berarti "delete on terminate".

Saya membuat .ebextensionsdirektori baru yang berisi ebs.configfile dengan kode di atas, lalu zip direktori itu bersama dengan saya Dockerrun.aws.json. Perhatikan bahwa file Dockerrun harus berada di tingkat atas zip, bukan di dalam subdirektori.

Untuk menemukan di mana Elastic Beanstalk memasang volume, gunakan lsblkcontoh yang gagal. Itu juga /dev/xvdczuntuk saya, jadi mungkin itu standar.


2

Kami terkena masalah yang sama. Akar penyebabnya adalah Docker yang tidak memasang mesin penyimpanannya (disediakan devicemappersecara bawaan di Elastic Beanstalk) dengan discardopsi - opsi, yang pada gilirannya mengisi blok sampai rusak.

Saya tidak dapat menemukan solusi yang pasti untuk ini, tetapi di sini ada solusi (lihat komentar ini ) yang dapat saya gunakan pada contoh yang terpengaruh:

docker ps -qa | xargs docker inspect --format='{{ .State.Pid }}' | xargs -IZ fstrim /proc/Z/root/

1
Terima kasih. Saya sampai pada kesimpulan yang sama dan akhirnya mengubah semua penyimpanan data ke EBS. Saya pikir itu agak konyol untuk file sementara / yang benar-benar sementara (yang terus ditimpa) tapi hei apa yang bisa Anda lakukan?
std''OrgnlDave

Ternyata cronjob untuk ini ada dalam dokumentasi EC2, tetapi tidak disebutkan dalam dokumentasi Beanstalk. Di Beanstalk Anda harus melihat apakah Anda bisa menambahkan kail untuk crontab khusus atau apa.
std''OrgnlDave

Senang tahu! Maukah Anda menyalin tautan di sini sebagai referensi?
FX

1
docs.aws.amazon.com/AmazonECS/latest/developerguide/... cari "trim". Tidak secara langsung menyebutkan hal yang sangat jelas
std''OrgnlDave

1
@ThomasGrainger .ebextensions file. Salah satu yang paling menyakitkan di pantat mungkin adalah kreasi yang mengganggu di dunia. Mereka berjalan pada boot sistem.
std''OrgnlDave

2

Saya mengikuti saran yang diberikan pada dokumentasi AWS dan semuanya berfungsi sekarang.
Tapi saya harus menggabungkan dua solusi: menambah ruang dan menambahkan cronjob untuk menghapus file lama.
Inilah yang saya lakukan.

Pertama, saya mengubah volume xvdczuntuk menggunakan 50GB, bukan 12GB. Itu penyimpanan yang bisa kita lihat docker system info. Dalam kasus saya, selalu penuh karena saya mengunggah banyak file setiap hari.

.ebextensions / blockdevice-xvdcz.config

option_settings:
  aws:autoscaling:launchconfiguration:
    BlockDeviceMappings: /dev/xvdcz=:50:true

Setelah saya menambahkan cronjob untuk membersihkan file yang dihapus saya yang tidak digunakan lagi. Itu diperlukan karena Docker masih menyimpannya untuk beberapa alasan. Dalam kasus saya sekali sehari sudah cukup. Jika Anda memiliki lebih banyak unggahan daripada saya, Anda dapat mengonfigurasi cronjob untuk menjalankan berapa kali Anda perlu.

.ebextensions / cronjob.config

files:
    "/etc/cron.d/mycron":
        mode: "000644"
        owner: root
        group: root
        content: |
            0 23 * * * root /usr/local/bin/remove_old_files.sh

     "/usr/local/bin/remove_old_files.sh":
        mode: "000755"
        owner: root
        group: root
        content: |
            #!/bin/bash
            docker ps -q | xargs docker inspect --format='{{ .State.Pid }}' | xargs -IZ sudo fstrim /proc/Z/root/
            exit 0

 commands:
    remove_old_cron:
        command: "rm -f /etc/cron.d/*.bak"

Sumber: https://docs.aws.amazon.com/pt_br/elasticbeanstalk/latest/dg/create_deploy_docker.container.console.html#docker-volumes


1

AWS elasticbeanstalk docker bagian Konfigurasi Lingkungan mendokumentasikan cara kerjanya:

Untuk meningkatkan kinerja, Elastic Beanstalk mengkonfigurasi dua volume penyimpanan Amazon EBS untuk instance EC2 lingkungan Docker Anda. Selain volume root yang disediakan untuk semua lingkungan Elastic Beanstalk, volume 12GB kedua bernama xvdcz disediakan untuk penyimpanan gambar di lingkungan Docker.

Jika Anda membutuhkan lebih banyak ruang penyimpanan atau peningkatan IOPS untuk gambar Docker, Anda dapat menyesuaikan volume penyimpanan gambar dengan menggunakan opsi konfigurasi BlockDeviceMapping di aws: autoscaling: launchconfiguration namespace.

Misalnya, file konfigurasi berikut ini meningkatkan ukuran volume penyimpanan menjadi 100 GB dengan 500 IOPS yang disediakan:

Contoh .ebextensions / blockdevice-xvdcz.config

option_settings:
  aws:autoscaling:launchconfiguration:
    BlockDeviceMappings: /dev/xvdcz=:100::io1:500

Jika Anda menggunakan opsi BlockDeviceMappings untuk mengonfigurasi volume tambahan untuk aplikasi Anda, Anda harus menyertakan pemetaan untuk xvdcz untuk memastikan bahwa itu dibuat. Contoh berikut mengonfigurasi dua volume, volume penyimpanan gambar xvdcz dengan pengaturan default dan volume aplikasi 24 GB tambahan bernama sdh:

Contoh .ebextensions / blockdevice-sdh.config

option_settings:
  aws:autoscaling:launchconfiguration:
    BlockDeviceMappings: /dev/xvdcz=:12:true:gp2,/dev/sdh=:24

0

Saya memukuli kepala saya terhadap masalah ini selama lebih dari satu hari dan akhirnya menemukan jawabannya.

AWS menggunakan devicemapperbackend dan menciptakan volume SSD 12GB yang dipasang dan digunakan untuk gambar buruh pelabuhan. Anda harus mengganti volume yang akan dipasang melalui konsep ekstensi elasticbeanstalk dan menggunakan via CLI (sayangnya, tidak ada cara untuk melakukan ini melalui GUI mereka).

Di direktori Anda memiliki Dockerrun.aws.jsonfile Anda , buat direktori bernama .ebextensionsdan kemudian buat file yang berakhir di .configdalamnya. Saya menelepon milik saya 01.correctebsvolume.config. Kemudian letakkan konten berikut di sana:

option_settings: - namespace: aws:autoscaling:launchconfiguration option_name: BlockDeviceMappings value: /dev/xvdcz=snap-066cZZZZZZZZ:40:true:gp2

Saya ssh'ed ke salah satu kotak gagal saya langsung dan menemukan itu sedang memuncak /dev/xvdcz. Ini mungkin berbeda untuk Anda. The snap-066cZZZZZZZZkebutuhan untuk menjadi ID snapshot valid. Saya membuat gambar AMI dari instance yang gagal dan menggunakan snapshot yang dibuatnya dalam proses. Jumlah 40GB akan menjadi berapa, jadi gantilah dengan apa yang Anda butuhkan. Saya tidak tahu apa trueatau apa yang gp2dilakukan, tetapi mereka berasal dari data perangkat blok gambar AMI, jadi saya menyimpannya.

Keajaiban namespacedan option_namedatang dari sini dalam dokumentasi.


Jadi ... ini me-mount volume Docker root pada EBS bukannya pool tipis?
std''OrgnlDave

Docker thinpool diatur untuk dijalankan pada volume EBS (tepatnya 12GB). Ini menggantikan volume itu dengan yang lebih besar, dan merupakan cara yang paling tidak invasif untuk membuatnya bekerja.

Oh, konfigurasi thinpool yang disiapkan Amazon adalah untuk 100GB, jadi itulah batas atas untuk jawaban ini, dan saya tidak yakin apakah itu dapat disesuaikan.

0

Hanya meningkatkan ukuran disk tidak akan menyelesaikan masalah, itu hanya akan terjadi kesalahan nanti. AWS merekomendasikan pemetaan disk baru ke wadah Anda sehingga setiap file buat / hapus file tidak mempengaruhi Layer Poller Docker.

Saya sedang mencari di sana, saya belum diuji tetapi soluction yang saya temui adalah memiliki ini di blockdevice.config saya

commands:
  01mount:
    command: "mount /dev/sdh /tmp"
option_settings:
  aws:autoscaling:launchconfiguration:
    BlockDeviceMappings: /dev/xvda=:16:true:gp2,/dev/xvdcz=:12:true:gp2,/dev/sdh=:12:true:ephemeral0

Hargai komentar apa pun.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.