AWS ElasticBeanstalk docker-thin-pool bị đầy và gây ra việc gắn lại hệ thống tập tin dưới dạng chỉ đọc?


9

Tôi không thể tìm ra cách AWS thiết lập Docker 'pool mỏng' của họ trên ElasticBeanstalk và cách nó được lấp đầy. Hồ bơi mỏng docker của tôi đang lấp đầy bằng cách nào đó và khiến các ứng dụng của tôi bị sập khi chúng cố ghi vào đĩa.

Đây là từ bên trong container:

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

EBS, trên thực tế, có một đĩa 25 GB được phân bổ cho nó; 1,6 gb là những gì du -sh /trả lại.

Bên ngoài trong EC2, nó bắt đầu vô hại đủ ... (thông qua 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

Tuy nhiên, hệ thống tập tin sẽ sớm gắn kết lại dưới dạng chỉ đọc. thông qua 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

Trở ra trong vùng đất EC2, Docker báo cáo điều này: (từ 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 bỏ thông tin này:

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

Bể bơi mỏng này là gì, tại sao nó lại lấp đầy, và làm thế nào để tôi ngăn chặn nó làm như vậy? Ngoài ra, nếu tôi có hơn 20 GB miễn phí từ bên trong thùng chứa trên ổ đĩa của tôi, tại sao nó lại dừng ghi mới? Theo như tôi có thể nói nó không được kết nối với các tệp mà chương trình của tôi đang ghi.

Cảm ơn bạn!

Câu trả lời:


8

Đề .ebextensionsxuất của David Ellis làm việc cho tôi. Tôi không thể nhận xét về câu trả lời của anh ấy, nhưng tôi muốn thêm rằng bạn có thể tạo một khối EBS mới thay vì sử dụng ảnh chụp nhanh. Để gắn kết dung lượng EBS 40 GB, tôi đã sử dụng như sau:

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

Xem thêm tài liệu này , trong đó có một ví dụ về ánh xạ ổ đĩa EBS 100 GB mới /dev/sdh.

Các truetại các phương tiện kết thúc "xóa trên chấm dứt".

Tôi đã tạo một .ebextensionsthư mục mới chứa một ebs.configtệp có mã ở trên, sau đó nén thư mục đó cùng với Dockerrun.aws.json. Lưu ý rằng tệp Dockerrun phải ở cấp cao nhất của zip, không nằm trong thư mục con.

Để tìm vị trí đàn hồi Beanstalk đang gắn âm lượng, hãy sử dụng lsblktrong trường hợp không thành công. Nó cũng là /dev/xvdczcho tôi, vì vậy có lẽ đó là tiêu chuẩn.


2

Chúng tôi đã gặp vấn đề tương tự. Nguyên nhân sâu xa dường như là Docker không gắn công cụ lưu trữ của nó (được cung cấp mỏng devicemappertheo mặc định trong Elastic Beanstalk) với các discardtùy chọn, lần lượt lấp đầy các khối cho đến khi nó bị hỏng.

Tôi không thể tìm thấy một giải pháp xác định cho vấn đề này, nhưng đây là một cách giải quyết (xem bình luận này ) mà tôi có thể sử dụng trong các trường hợp bị ảnh hưởng:

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

1
Cảm ơn. Tôi đã đi đến kết luận tương tự và cuối cùng đã thay đổi tất cả lưu trữ dữ liệu sang EBS. Tôi nghĩ rằng đó là một chút ngớ ngẩn cho các tập tin thực sự tạm thời / tạm thời (tiếp tục bị ghi đè) nhưng hey bạn có thể làm gì?
std''OrgnlDave

Nó chỉ ra rằng một cronjob cho điều này là trong tài liệu EC2, nhưng nó không được đề cập trong các tài liệu của Beanstalk. Trên Beanstalk, bạn sẽ phải xem liệu bạn có thể thêm một cái móc cho một crontab đặc biệt hay thứ gì đó không.
std''OrgnlDave

Ồ, rất vui được biết! Bạn có phiền sao chép liên kết ở đây như một tài liệu tham khảo?
FX

1
docs.aws.amazon.com/AmazonECS/latest/developerguide/ Tìm kiếm "cắt". Không chính xác là một đề cập đơn giản về một điều rất rõ ràng
std''OrgnlDave

1
@ThomasGrainger .ebextensions tập tin. Một trong những nỗi đau nhất ở mông gây khó chịu có thể tạo ra trên thế giới. Họ chạy trên hệ thống khởi động.
std''OrgnlDave

2

Tôi đã làm theo các đề xuất được cung cấp trên tài liệu AWS và mọi thứ hiện đang hoạt động.
Nhưng tôi đã phải kết hợp hai giải pháp: tăng dung lượng và thêm cronjob để xóa các tệp cũ.
Đây là những gì tôi đã làm.

Đầu tiên, tôi thay đổi âm lượng xvdczđể sử dụng 50GB thay vì 12GB. Đó là bộ lưu trữ mà chúng ta có thể nhìn thấy docker system info. Trong trường hợp của tôi, nó luôn đầy vì tôi tải lên rất nhiều tệp mỗi ngày.

.ebextensions / blockdevice-xvdcz.config

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

Sau khi tôi thêm một cronjob để xóa các tập tin đã xóa mà không được sử dụng nữa. Nó được yêu cầu bởi vì Docker vẫn giữ chúng vì một số lý do. Trong trường hợp của tôi một lần một ngày là đủ. Nếu bạn có nhiều lượt tải lên hơn tôi, bạn có thể định cấu hình cronjob để chạy bao nhiêu lần bạn cần.

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

Nguồn: https://docs.aws.amazon.com/pt_br/elasticbeanstalk/latest/dg/create_deploy_docker.container.console.html#docker-volume


1

Phần docker đàn hồi AWS phần Môi trường Cấu hình tài liệu làm thế nào nó hoạt động:

Để cải thiện hiệu suất, Elastic Beanstalk định cấu hình hai khối lưu trữ Amazon EBS cho các phiên bản EC2 của môi trường Docker của bạn. Ngoài khối lượng gốc được cung cấp cho tất cả các môi trường của Bean Beanalk, một ổ 12GB thứ hai có tên xvdcz được cung cấp để lưu trữ hình ảnh trên môi trường Docker.

Nếu bạn cần thêm dung lượng lưu trữ hoặc tăng IOPS cho hình ảnh Docker, bạn có thể tùy chỉnh dung lượng lưu trữ hình ảnh bằng cách sử dụng tùy chọn cấu hình BlockDeviceMapping trong không gian tên aws: autoscaling: launchconfiguration.

Ví dụ: tệp cấu hình sau tăng kích thước dung lượng lưu trữ lên 100 GB với 500 IOPS được cung cấp:

Ví dụ .ebextensions / blockdevice-xvdcz.config

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

Nếu bạn sử dụng tùy chọn BlockDeviceMappings để định cấu hình khối lượng bổ sung cho ứng dụng của mình, bạn nên bao gồm ánh xạ cho xvdcz để đảm bảo rằng nó được tạo. Ví dụ sau đây định cấu hình hai ổ đĩa, ổ đĩa lưu trữ hình ảnh xvdcz với cài đặt mặc định và ổ đĩa ứng dụng 24 GB bổ sung có tên sdh:

Ví dụ .ebextensions / blockdevice-sdh.config

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

0

Tôi đã đánh đầu chống lại vấn đề này trong hơn một ngày và cuối cùng đã tìm ra nó.

AWS đang sử dụng devicemapperphụ trợ và tạo ra dung lượng SSD 12 GB mà nó gắn và sử dụng cho hình ảnh docker. Bạn phải ghi đè lên âm lượng mà nó sẽ gắn kết thông qua khái niệm tiện ích mở rộng đàn hồi và triển khai thông qua CLI (không có cách nào để thực hiện điều này thông qua GUI của họ, thật không may).

Trong thư mục bạn có Dockerrun.aws.jsontệp của mình , hãy tạo một thư mục được gọi .ebextensionsvà sau đó tạo một tệp kết thúc ở .configbên trong nó. Tôi gọi cho tôi 01.correctebsvolume.config. Sau đó đặt các nội dung sau vào đó:

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

Tôi đã tham gia vào một trong những thất bại của mình được đóng hộp trực tiếp và thấy nó đang được gắn kết /dev/xvdcz. Nó thể khác nhau cho bạn. Các snap-066cZZZZZZZZnhu cầu phải là một ID snapshot hợp lệ. Tôi đã tạo một hình ảnh AMI của trường hợp thất bại và sử dụng ảnh chụp nhanh mà nó đã tạo trong quy trình. Dung 40lượng sẽ là bao nhiêu GB, vì vậy hãy thay thế những gì bạn cần. Tôi không biết những gì truehoặc gp2làm, nhưng chúng đến từ dữ liệu thiết bị khối hình ảnh AMI, vì vậy tôi đã giữ chúng.

Sự kỳ diệu namespaceoption_nameđến từ đây trong tài liệu.


Vậy ... cái này gắn kết khối lượng Docker gốc trên EBS thay vì pool mỏng?
std''OrgnlDave

Docker thinpool được thiết lập để chạy trên một khối lượng EBS (chính xác là 12 GB). Điều này thay thế âm lượng đó bằng một âm lượng lớn hơn và là cách ít xâm lấn nhất để làm cho nó hoạt động.

Ồ, cấu hình thinpool mà Amazon thiết lập là 100 GB, vì vậy đó là giới hạn trên cho câu trả lời này và tôi không chắc liệu điều đó có thể được điều chỉnh hay không.

0

Chỉ cần tăng kích thước của đĩa sẽ không giải quyết được vấn đề, nó sẽ chỉ bị lỗi sau. AWS Khuyến nghị ánh xạ một đĩa mới vào vùng chứa của bạn để mọi tệp tạo / xóa tệp không ảnh hưởng đến Lớp thăm dò Docker.

Tôi hiện đang tìm kiếm nó, tôi chưa thử nghiệm nhưng sự giải quyết mà tôi gặp phải là có cái này trên 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

Đánh giá cao bất kỳ ý kiến.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.