AWS ElasticBeanstalk docker-pool-pool ได้รับความสมบูรณ์และทำให้ระบบไฟล์ติดตั้งใหม่เป็นแบบอ่านอย่างเดียวหรือไม่


10

ฉันไม่สามารถทราบได้ว่า AWS ตั้งค่า 'สระว่ายน้ำแบบบาง' ของ Docker บน ElasticBeanstalk อย่างไรและมันจะถูกเติมเต็มอย่างไร พูลที่บางของนักเทียบท่าของฉันกำลังเติมเต็มอย่างใดและทำให้แอปของฉันพังเมื่อพวกเขาพยายามเขียนลงดิสก์

นี่คือจากภายในคอนเทนเนอร์:

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

ในความเป็นจริงแล้ว EBS นั้นมีดิสก์ขนาด 25GB ที่จัดสรรให้กับมัน 1.6 gb คือ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+ GB ฟรีจากภายในคอนเทนเนอร์บน / ปริมาณของฉันทำไมมันหยุดเขียนใหม่? เท่าที่ฉันสามารถบอกได้ว่าไม่ได้เชื่อมต่อกับไฟล์ที่โปรแกรมของฉันกำลังเขียน

ขอบคุณ!

คำตอบ:


8

.ebextensionsแนะนำโดยเดวิดเอลลิสทำงานให้ฉัน ฉันไม่สามารถแสดงความคิดเห็นกับคำตอบของเขาได้ แต่ฉันต้องการเพิ่มว่าคุณสามารถสร้าง EBS ใหม่ได้แทนที่จะใช้สแนปชอต ในการเมานต์ปริมาณ EGB 40GB ฉันใช้ต่อไปนี้:

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

ดูเพิ่มเติมเอกสารฉบับนี้ซึ่งมีตัวอย่างของการทำแผนที่ไดรฟ์ 100GB EBS /dev/sdhใหม่ไปยัง

trueที่หมายถึงที่สุด "ลบเกี่ยวกับการยุติ"

ฉันสร้างใหม่.ebextensionsไดเรกทอรีที่มีไฟล์ที่มีรหัสข้างต้นแล้วซิปไดเรกทอรีที่ร่วมกันกับฉันebs.config Dockerrun.aws.jsonโปรดทราบว่าไฟล์ Dockerrun จะต้องอยู่ที่ระดับบนสุดของ zip ไม่ใช่ในไดเรกทอรีย่อย

เมื่อต้องการค้นหาตำแหน่ง Elastic Beanstalk กำลังติดตั้งระดับเสียงใช้lsblkบนอินสแตนซ์ที่ล้มเหลว มันก็/dev/xvdczสำหรับฉันด้วยบางทีนั่นอาจเป็นมาตรฐาน


3

เราได้รับผลกระทบจากปัญหาเดียวกัน สาเหตุหลักดูเหมือนว่าจะเป็น Docker ที่ไม่ได้ติดตั้งเครื่องมือเก็บข้อมูล (แบบบางที่กำหนดเป็นdevicemapperค่าเริ่มต้นใน Elastic Beanstalk) ด้วยdiscardตัวเลือกซึ่งจะเติมบล็อกจนกว่ามันจะแตก

ฉันไม่สามารถหาวิธีแก้ไขปัญหานี้ได้อย่างชัดเจน แต่นี่เป็นวิธีแก้ปัญหา (ดูความคิดเห็นนี้ ) ที่ฉันสามารถใช้กับอินสแตนซ์ที่ได้รับผลกระทบ:

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

1
ขอบคุณ ฉันมาถึงข้อสรุปเดียวกันและลงเอยด้วยการเปลี่ยนที่เก็บข้อมูลทั้งหมดเป็น EBS ฉันคิดว่ามันโง่เล็กน้อยสำหรับไฟล์ชั่วคราว / ชั่วคราว (ที่ได้รับการเขียนทับ) แต่เฮ้คุณโออะไร?
std''OrgnlDave

ปรากฎว่า cronjob สำหรับสิ่งนี้อยู่ในเอกสาร EC2 แต่ไม่ได้กล่าวถึงในเอกสาร Beanstalk บน Beanstalk คุณจะต้องดูว่าคุณสามารถเพิ่มตะขอสำหรับ crontab พิเศษหรืออะไรบางอย่าง
std''OrgnlDave

โอ้รู้ดี! คุณคิดจะคัดลอกลิงค์ที่นี่เป็นข้อมูลอ้างอิงหรือไม่
FX

1
docs.aws.amazon.com/AmazonECS/latest/developerguide/… ค้นหา "trim" ไม่ตรงไปตรงมาพูดถึงสิ่งที่ชัดเจนมาก
std''OrgnlDave

1
@ThomasGrainger. ไฟล์ส่วนขยาย หนึ่งในความเจ็บปวดที่สุดในการสร้างสรรค์ที่น่ารำคาญที่สุดในโลก พวกเขาทำงานในการบูตระบบ
std''OrgnlDave

2

ฉันทำตามคำแนะนำที่ให้ไว้ในเอกสาร AWS และตอนนี้ทุกอย่างทำงานได้
แต่ฉันต้องรวมสองโซลูชั่น: เพิ่มพื้นที่และเพิ่ม cronjob เพื่อลบไฟล์เก่า
นี่คือสิ่งที่ฉันทำ

ก่อนอื่นฉันเปลี่ยนระดับเสียงxvdczเพื่อใช้ 50GB แทน 12GB นั่นคือที่เก็บข้อมูลที่เราสามารถเห็นdocker system infoได้ ในกรณีของฉันมันเต็มเสมอเพราะฉันอัปโหลดไฟล์จำนวนมากทุกวัน

.ebextensions / blockdevice-xvdcz.config

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

หลังจากฉันเพิ่ม cronjob เพื่อล้างไฟล์ที่ถูกลบซึ่งไม่ได้ใช้แล้ว มันจำเป็นเพราะ Docker ยังคงเก็บไว้ด้วยเหตุผลบางประการ ในกรณีของฉันวันละครั้งก็เพียงพอแล้ว หากคุณมีการอัปโหลดมากกว่าฉันคุณสามารถกำหนดค่า cronjob เพื่อให้ทำงานได้ตามต้องการ

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

ที่มา: https://docs.aws.amazon.com/pt_br/elasticbeanstalk/latest/dg/create_deploy_docker.container.container.console.html#docker-volumes


1

ส่วน AWS elasticbeanstalk docker Environment Configurationเอกสารวิธีการทำงาน:

เพื่อประสิทธิภาพที่เพิ่มขึ้น Elastic Beanstalk จะกำหนดค่าสองไดรฟ์ข้อมูล Amazon EBS สำหรับอินสแตนซ์ EC2 ของสภาพแวดล้อม Docker ของคุณ นอกเหนือจากการจัดเตรียมปริมาณรูตสำหรับสภาพแวดล้อม Elastic Beanstalk ทั้งหมดปริมาณ 12GB ที่สองชื่อ xvdcz ถูกจัดเตรียมไว้สำหรับที่เก็บรูปภาพบนสภาพแวดล้อม Docker

หากคุณต้องการพื้นที่เก็บข้อมูลเพิ่มขึ้นหรือเพิ่ม IOPS สำหรับอิมเมจ Docker คุณสามารถปรับแต่งไดรฟ์ข้อมูลที่จัดเก็บภาพโดยใช้ตัวเลือกการกำหนดค่า

ตัวอย่างเช่นไฟล์คอนฟิกูเรชันต่อไปนี้เพิ่มขนาดของหน่วยเก็บข้อมูลเป็น 100 GB พร้อม IOPS ที่จัดสรร 500:

ตัวอย่าง. ส่วนขยาย / blockdevice-xvdcz.config

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

หากคุณใช้ตัวเลือก BlockDeviceMappings เพื่อกำหนดค่าปริมาณเพิ่มเติมสำหรับแอปพลิเคชันของคุณคุณควรรวมการจับคู่สำหรับ xvdcz เพื่อให้แน่ใจว่ามันถูกสร้างขึ้น ตัวอย่างต่อไปนี้กำหนดค่าสองโวลุ่มปริมาณการจัดเก็บภาพ xvdcz พร้อมการตั้งค่าเริ่มต้นและแอปพลิเคชันปริมาณ 24 GB เพิ่มเติมชื่อ sdh:

ตัวอย่าง. ส่วนขยาย / blockdevice-sdh.config

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

0

ฉันเอาชนะหัวของฉันกับปัญหานี้มานานกว่าหนึ่งวันและในที่สุดก็คิดออก

AWS ใช้devicemapperแบ็กเอนด์และสร้างโวลุ่ม SSD ขนาด 12GB ที่เมาท์และใช้สำหรับภาพนักเทียบท่า คุณต้องแทนที่ระดับเสียงที่จะเมานต์ผ่านแนวคิดส่วนขยาย elasticbeanstalk และปรับใช้ผ่าน CLI (ไม่มีวิธีการทำเช่นนี้ผ่านทาง GUI ของพวกเขาโชคไม่ดี)

ในไดเรกทอรีที่คุณมี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

ฉัน ssh'ed /dev/xvdczเป็นหนึ่งในของฉันล้มเหลวบรรจุกล่องโดยตรงและพบว่ามันได้รับการติดตั้ง มันอาจจะแตกต่างกันสำหรับคุณ snap-066cZZZZZZZZจะต้องเป็น ID ภาพรวมที่ถูกต้อง ฉันสร้างอิมเมจ AMI ของอินสแตนซ์ที่ล้มเหลวและใช้สแนปชอตที่สร้างขึ้นในกระบวนการ ปริมาณ40จะเป็นเท่าใด GB ดังนั้นจึงควรแทนที่ด้วยสิ่งที่คุณต้องการ ผมไม่ทราบว่าสิ่งที่เป็นtrueหรือgp2ทำ แต่พวกเขามาจากข้อมูลของอุปกรณ์ AMI ภาพบล็อกดังนั้นฉันเก็บไว้

ความมหัศจรรย์namespaceและoption_nameมาจากที่นี่ในเอกสารประกอบ


ดังนั้น ... สิ่งนี้เมานต์ไดรฟ์ข้อมูลระดับรากของ Docker บน EBS แทนที่จะเป็นแบบบาง
std''OrgnlDave

thinpool docker ได้รับการตั้งค่าให้ทำงานบนไดรฟ์ EBS (ขนาด 12GB) สิ่งนี้จะแทนที่โวลุ่มนั้นด้วยขนาดที่ใหญ่กว่าและเป็นวิธีการบุกรุกที่น้อยที่สุดเพื่อให้ใช้งานได้

โอ้การกำหนดค่า thinpool ที่ Amazon ตั้งไว้คือ 100GB ดังนั้นนั่นเป็นข้อ จำกัด สูงสุดสำหรับคำตอบนี้และฉันไม่แน่ใจว่าสามารถปรับได้หรือไม่

0

การเพิ่มขนาดของดิสก์จะไม่สามารถแก้ปัญหาได้ แต่จะเกิดข้อผิดพลาดในภายหลัง AWS แนะนำให้ทำการแมปดิสก์ใหม่เข้ากับคอนเทนเนอร์ของคุณเพื่อให้ไฟล์สร้าง / ลบใด ๆ ไม่ส่งผลกระทบต่อ Layer Poll Poll

ตอนนี้ฉันกำลังดูอยู่ฉันยังไม่ได้ทดสอบ แต่การแก้ปัญหาที่ฉันเจอคือการมีส่วนนี้ใน blockdevice.config

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

ขอบคุณสำหรับความคิดเห็นใด ๆ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.