AWS ElasticBeanstalk docker-thin-pool पूर्ण हो रही है और केवल-पठन के रूप में फाइलसिस्टम के पुन: माउंट का कारण बन रही है?


10

मैं यह पता नहीं लगा सकता कि एडब्ल्यूएस ने इलास्टिकबैनस्टॉक पर अपने डॉकटर 'थिन पूल' की स्थापना कैसे की और इसे कैसे भरा जा रहा है। मेरा डॉकटर पतला पूल किसी तरह भर रहा है और जब वे डिस्क पर लिखने की कोशिश करते हैं तो मेरे ऐप्स क्रैश हो जाते हैं।

यह कंटेनर के अंदर से है:

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

ईबीएस, वास्तव में, इसे करने के लिए एक 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+ जीबी मुफ्त है, तो यह नए लेखन को क्यों रोकता है? जहां तक ​​मैं बता सकता हूं कि यह उन फाइलों से जुड़ा नहीं है जिन्हें मेरे प्रोग्राम लिख रहे हैं।

धन्यवाद!

जवाबों:


8

.ebextensionsडेविड एलिस ने सुझाव दिया कि मेरे लिए काम किया। मैं उनके उत्तर पर टिप्पणी करने में असमर्थ हूं, लेकिन मैं यह जोड़ना चाहता था कि आप स्नैपशॉट का उपयोग करने के बजाय एक नया ईबीएस वॉल्यूम बना सकते हैं। 40GB EBS वॉल्यूम माउंट करने के लिए, मैंने निम्नलिखित का उपयोग किया:

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 फ़ाइल ज़िप के शीर्ष स्तर पर होनी चाहिए, न कि किसी उपनिर्देशिका के अंदर।

यह पता लगाने के लिए कि इलास्टिक बीनस्टॉक वॉल्यूम कहां से बढ़ रहा है, lsblkअसफल उदाहरण पर उपयोग करें । यह /dev/xvdczमेरे लिए भी था , इसलिए शायद यही मानक है।


3

हम एक ही मुद्दे की चपेट में आ गए। मूल कारण यह प्रतीत होता है कि डॉकर अपने स्टोरेज इंजन ( devicemapperएलास्टिक बीनस्टॉक में डिफ़ॉल्ट रूप से पतले-प्रोविजन किए हुए) को discardविकल्पों के साथ नहीं बढ़ा रहा है , जो ब्लॉक को तब तक भरता है जब तक कि वह टूट न जाए।

मैं इसका कोई निश्चित समाधान नहीं ढूंढ पा रहा था, लेकिन यहां एक समाधान है ( इस टिप्पणी को देखें ) जिसे मैं प्रभावित होने पर उपयोग करने में सक्षम था:

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

1
धन्यवाद। मैं एक ही निष्कर्ष पर आया और ईबीएस पर सभी डेटा स्टोरेज को बदलना समाप्त कर दिया। मुझे लगता है कि यह वास्तव में क्षणिक / अस्थायी फ़ाइलों के लिए थोड़ा मूर्खतापूर्ण है (जो कि ओवरराइट हो रही है) लेकिन हे क्या आप ओ कर सकते हैं?
std''OrgnlDave

यह पता चला है कि इसके लिए एक क्रोनजोब EC2 प्रलेखन में है, लेकिन यह बर्नस्टॉक डॉक्स में उल्लेख नहीं किया गया है। बीनस्टॉक पर आपको यह देखना होगा कि क्या आप एक विशेष क्रॉस्टब या कुछ के लिए हुक जोड़ सकते हैं।
std''OrgnlDave

ओह, जानकर अच्छा लगा! क्या आप संदर्भ के रूप में यहां लिंक की नकल करना चाहेंगे?
एफएक्स

1
docs.aws.amazon.com/AmazonECS/latest/developerguide/… "ट्रिम" खोजें। बिल्कुल स्पष्ट बात का सीधा-सीधा उल्लेख नहीं
std''OrgnlDave

1
@ThomasGrainger .ebextensions फ़ाइलें। दुनिया में संभावित कष्टप्रद बट में सबसे अधिक दर्द में से एक। वे सिस्टम बूटअप पर चलते हैं।
std''OrgnlDave

2

मैंने AWS प्रलेखन पर दिए गए सुझावों का पालन किया और अब सब कुछ काम कर रहा है।
लेकिन मुझे दो समाधानों को संयोजित करना था: अंतरिक्ष को बढ़ाना और पुरानी फाइलों को हटाने के लिए क्रोनजोब को जोड़ना।
यहाँ मैंने क्या किया है।

सबसे पहले, मैंने xvdcz12GB के बजाय 50GB का उपयोग करने के लिए वॉल्यूम बदल दिया । यही वह स्टोरेज है जिसे हम देख सकते हैं docker system info। मेरे मामले में यह हमेशा भरा हुआ था क्योंकि मैं हर दिन बहुत सारी फाइलें अपलोड करता हूं।

.ebextensions / blockdevice-xvdcz.config

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

के बाद मैं अपने हटाए गए फ़ाइलों को साफ करने के लिए एक क्रोनजॉब जोड़ा, जो अब उपयोग नहीं किए गए थे। इसकी आवश्यकता थी क्योंकि डॉकर ने अभी भी उन्हें किसी कारण से रखा। मेरे मामले में दिन में एक बार यह पर्याप्त है। यदि आपके पास मेरे से अधिक अपलोड हैं, तो आप कितनी बार आपको आवश्यकता है चलाने के लिए क्रोनजॉब को कॉन्फ़िगर कर सकते हैं।

.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.console.html#docker-volumes


1

AWS इलास्टबिनस्टॉक docker अनुभाग पर्यावरण विन्यास दस्तावेज यह कैसे काम करता है:

बेहतर प्रदर्शन के लिए, इलास्टिक बीनस्टॉक आपके डॉकर पर्यावरण के EC2 उदाहरणों के लिए दो अमेज़ॅन ईबीएस भंडारण संस्करणों को कॉन्फ़िगर करता है। सभी इलास्टिक बीनस्टॉक वातावरण के लिए प्रावधान किए गए रूट वॉल्यूम के अलावा, एक दूसरे 12 जीबी की मात्रा जिसका नाम xvdcz है, को डॉकर वातावरण पर छवि भंडारण के लिए प्रावधान किया गया है।

यदि आपको डॉकर चित्रों के लिए अधिक संग्रहण स्थान या बढ़े हुए IOPS की आवश्यकता है, तो आप aws: autoscaling: launchconfiguration namespace में BlockDeviceMapping कॉन्फ़िगरेशन विकल्प का उपयोग करके छवि भंडारण की मात्रा को अनुकूलित कर सकते हैं।

उदाहरण के लिए, निम्न कॉन्फ़िगरेशन फ़ाइल 500 प्रावधानित IOPS के साथ संग्रहण वॉल्यूम का आकार 100 GB तक बढ़ाती है:

उदाहरण .ebextensions / blockdevice-xvdcz.config

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

यदि आप अपने एप्लिकेशन के लिए अतिरिक्त वॉल्यूम को कॉन्फ़िगर करने के लिए BlockDeviceMappings विकल्प का उपयोग करते हैं, तो आपको यह सुनिश्चित करने के लिए कि यह बनाया गया है, xvdcz के लिए एक मैपिंग शामिल करना चाहिए। निम्न उदाहरण दो खंडों को कॉन्फ़िगर करता है, डिफ़ॉल्ट भंडारण के साथ छवि भंडारण की मात्रा xvdcz और sdh नाम का एक अतिरिक्त 24 GB अनुप्रयोग वॉल्यूम:

उदाहरण .ebextensions / blockdevice-sdh.config

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

0

मैंने एक दिन के लिए इस समस्या के खिलाफ अपना सिर पीटा और आखिरकार इसका पता लगा लिया।

AWS devicemapperबैकएंड का उपयोग कर रहा है और एक 12GB SSD वॉल्यूम बनाता है जिसे वह डॉक छवियों के लिए माउंट और उपयोग करता है। आपको उस वॉल्यूम को ओवरराइड करना होगा जो इसे इलास्टिनबैंक एक्सटेंशन एक्सटेंशन कॉन्सेप्ट के माध्यम से माउंट करेगा और सीएलआई के माध्यम से तैनात किया जाएगा (उनके जीयूआई के माध्यम से ऐसा करने का कोई तरीका नहीं है, दुर्भाग्य से)।

जिस डायरेक्टरी में आपकी 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जरूरत है एक वैध स्नैपशॉट आईडी किया जाना है। मैंने असफल उदाहरण की एक एएमआई छवि बनाई और इस प्रक्रिया में बनाए गए स्नैपशॉट का उपयोग किया। यह 40है कि कितने GB की मात्रा होगी, इसलिए आपको जिस चीज़ की आवश्यकता है, उसमें स्थानापन्न करें। मुझे नहीं पता कि क्या करें trueया न gp2करें, लेकिन वे एएमआई इमेज ब्लॉक डिवाइस डेटा से आए थे, इसलिए मैंने उन्हें रखा।

जादू namespaceऔर प्रलेखन में यहाँoption_name से आते हैं ।


तो ... यह पतले पूल के बजाय ईबीएस पर रूट डोकर की मात्रा को मापता है?
std''OrgnlDave

डॉक पतले को ईबीएस वॉल्यूम (बिल्कुल 12GB) पर चलाने के लिए सेट किया गया है। यह उस आयतन को बड़े पैमाने पर बदल देता है, और इसे काम करने के लिए सबसे कम-आक्रामक तरीका है।

ओह, थिनपूल कॉन्फ़िगरेशन अमेज़ॅन सेट अप 100GB के लिए है, इसलिए यह इस उत्तर के लिए ऊपरी सीमा है, और मुझे यकीन नहीं है कि अगर इसे समायोजित किया जा सकता है।

0

बस डिस्क का आकार बढ़ाने से समस्या हल नहीं होगी, यह सिर्फ बाद में त्रुटि होगी। AWS आपके कंटेनर में एक नई डिस्क को मैप करने की सिफारिश करता है ताकि कोई भी फ़ाइल / डिलीट फाइल डॉकटर पोल लेयर को प्रभावित न करे।

मैं वर्तमान में इस पर देख रहा हूँ, मैंने अभी तक परीक्षण नहीं किया है, लेकिन जो सॉल्यूशन मुझे आता है वह मेरे ब्लॉकदेवीस पर है।

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

किसी भी टिप्पणी की सराहना करें।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.