Score:2

ปริมาณ GlusterFS หยุดทำงาน / บล็อกหลังจากเข้าถึงไฟล์เซสชัน PHP จากคอนเทนเนอร์ PHP Docker ได้อย่างรวดเร็ว

ธง in

2021-10-05 คำถามและข้อความที่ได้รับการปรับปรุงหลังจากการวิเคราะห์เพิ่มเติม โดยแยกออกเป็นกรณีน้อยที่สุด

คำอธิบายสั้น

คลัสเตอร์ Nomad / Consul กำลังทำงาน โดยมี Traefik (พร้อมการกำหนดค่าขั้นต่ำ) เป็นงานระบบในไคลเอนต์ Nomad แต่ละเครื่อง มีเซิร์ฟเวอร์ nomad 3 เครื่อง, เซิร์ฟเวอร์กงสุล 3 เครื่อง, ลูกค้า nomad 3 เครื่อง และเซิร์ฟเวอร์ Gluster 3 เครื่อง ณ จุดนี้ การตั้งค่าคล้ายกับสิ่งนี้มาก บทความเกี่ยวกับการจัดตั้งคลัสเตอร์ Nomad / Consul

รูปภาพและไซต์พื้นฐานทำงานได้ดี

ปัญหา

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

งานโหลดได้ดีและลงทะเบียนใน Consul, Traefik และ Nomad หน้าขนาดเล็ก (มีการอ้างอิงน้อย) ทำงานได้ดี

เมื่อใดก็ตามที่หน้ามีการโหลดการพึ่งพามากเกินไป Apache จะหยุดการเชื่อมต่อเฉพาะเหล่านั้น

เมื่อฉันเปิดหน้าต่างเบราว์เซอร์ใหม่ที่ไม่ระบุตัวตน และไปที่ URL หน้าหลักและการอ้างอิงประมาณ 10-15 รายการจะโหลดขึ้น ส่วนที่เหลืออยู่ในสถานะรอดำเนินการในเบราว์เซอร์ สถานะของเบราว์เซอร์ยังคง 'หมุน' (ในขณะที่กำลังโหลด) การปิดหน้าต่างและเปิดหน้าต่างใหม่ทำให้ฉันสามารถดำเนินการซ้ำได้

ฉันได้ระบุปัญหาแล้วว่าไดเร็กทอรีเซสชัน PHP ถูกแมป (ผ่าน Docker) กับไดเร็กทอรีบนเมานต์ GlusterFS

การย้ายการแมปไดรฟ์ข้อมูลไปยังไดเร็กทอรีอื่นที่เป็นโฮสต์บนเซิร์ฟเวอร์เดียวกันจะช่วยขจัดปัญหาและโหลดไซต์ตามที่ควรจะเป็น

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

คำถาม: ปัญหานี้อาจเกิดจากปัญหาการกำหนดค่า Gluster หรือวิธีการกำหนดค่าการเมานต์ /etc/fstab. โปรดช่วยแก้ไขปัญหานี้!

การแยกตัว

ไดเร็กทอรีเซสชัน PHP ถูกตั้งค่าเป็น /var/php_session ในรูปภาพ config PHP และแมปใน Nomad / Docker to /data/storage/test/php_sessions.

เดอะ /data/storage/test/php_sessions ไดเรกทอรีเป็นของผู้ใช้ 20,000 เพื่อให้แน่ใจว่าโหนดทั้งหมดสามารถเข้าถึงเซสชัน PHP เดียวกันได้:

client:/data/storage/test$ ls -ln
drwxr-xr-x 2 20000 20000 6 ต.ค. 5 14:53 น. php_sessions
drwxr-xr-x 2 20000 20000 6 ต.ค. 5 14:53 อัปโหลด

เมื่อเปลี่ยนการแมปวอลุ่มเร่ร่อน (ใน /etc/nomad/nomad.hcl) จาก:

ลูกค้า {

  host_volume "เซสชันการทดสอบ" {
    เส้นทาง = "/data/storage/test/php_sessions"
    read_only = เท็จ
  }

}

ถึง

ลูกค้า {

  host_volume "เซสชันการทดสอบ" {
    เส้นทาง = "/tmp/php_sessions"
    read_only = เท็จ
  }

}

(และมั่นใจว่า. /tmp/php_sessions เป็นของผู้ใช้ 20,000 ด้วย)

ทุกอย่างทำงานได้อีกครั้ง

ข้อมูลรายละเอียด (เพิ่มเติมตามคำขอ)

เนื้อหาของ /etc/fstab:

LABEL=cloudimg-rootfs / ext4 ค่าเริ่มต้น 0 1
LABEL=UEFI /boot/efi vfat ค่าเริ่มต้น 0 1
gluster-01, gluster-02, gluster-03:/storage /data/storage glusterfs _netdev,defaults,direct-io-mode=disable,rw

Dockerfile สำหรับภาพไซต์:

จาก php:7.4.1-apache
ENV APACHE_DOCUMENT_ROOT /var/www/htdocs
เวิร์คดีอาร์ /var/www

RUN docker-php-ext-install mysqli pdo_mysql

# ทำให้รูต Apache สามารถกำหนดค่าได้
RUN sed -ri -e 's!/var/www/html!${APACHE_DOCUMENT_ROOT}!g' /etc/apache2/sites-available/*.conf
RUN sed -ri -e 's!/var/www/!${APACHE_DOCUMENT_ROOT}!g' /etc/apache2/apache2.conf /etc/apache2/conf-available/*.conf

# ฟังพอร์ต 1080 โดยค่าเริ่มต้นสำหรับผู้ใช้ที่ไม่ใช่รูท
RUN sed -ri 's/ฟัง 80/ฟัง 1080/g' /etc/apache2/ports.conf
RUN sed -ri 's/:80/:1080/g' /etc/apache2/sites-enabled/*

# ใช้การตั้งค่าของตัวเอง
คัดลอกข้อมูล/000-default.conf /etc/apache2/sites-enabled/

# เปิดใช้งานการผลิต ini
RUN cp /usr/local/etc/php/php.ini-production /usr/local/etc/php/php.ini

RUN a2enmod เขียนใหม่ && a2enmod remoteip

COPY --from=composer:latest /usr/bin/composer /usr/local/bin/composer
คัดลอก --chown=www-data:www-data /var/www

RUN /usr/local/bin/composer --no-cache --no-ansi --no-interaction ติดตั้ง

# สุดท้ายเพิ่มการเปลี่ยนแปลงความปลอดภัย
คัดลอกข้อมูล/changes.ini /usr/local/etc/php/conf.d/

ไฟล์ Nomad ถูกแยกออกเป็นสิ่งที่ทำให้เกิดปัญหา: โดยมีแผนงาน Nomad ดังต่อไปนี้:

งาน "ทดสอบ" {
  ศูนย์ข้อมูล = ["dc1"]

  กลุ่ม "การทดสอบระยะ" {
    นับ = 1

    เครือข่าย {
      พอร์ต "php_http" {
        ถึง = 1080
      }
    }

    ปริมาณ "การทดสอบเซสชัน" {
      พิมพ์ = "โฮสต์"
      read_only = เท็จ
      ที่มา = "การทดสอบเซสชัน"
    }

    ปริมาณ "ทดสอบการอัปโหลด" {
      พิมพ์ = "โฮสต์"
      read_only = เท็จ
      ที่มา = "ทดสอบอัพโหลด"
    }

    บริการ {
      ชื่อ = "การทดสอบการแสดงละคร"
      พอร์ต = "php_http"

      แท็ก = [
        "traefik.enable=true",
        "traefik.http.routers.test.php_staging.rule=Host(`staging.xxxxxx.com`)",
      ]

      ตรวจสอบ {
        พิมพ์ = "tcp"
        พอร์ต = "php_http"
        ช่วงเวลา = "5s"
        หมดเวลา = "2 วินาที"
      }
    }

    งาน "ทดสอบ" {
      ไดรเวอร์ = "นักเทียบท่า"
      ผู้ใช้ = "20,000"

      กำหนดค่า {
        รูปภาพ = "นักเทียบท่า-repo:5000/ทดสอบ/ทดสอบ:ล่าสุด"
        พอร์ต = ["php_http"]
      }

      ปริมาณ_เมานต์ {
        ปริมาณ = "การทดสอบเซสชัน"
        ปลายทาง = "/var/php_sessions"
        read_only = เท็จ
      }

      ปริมาณ_เมานต์ {
        ปริมาณ = "ทดสอบการอัปโหลด"
        ปลายทาง = "/var/upload"
        read_only = เท็จ
      }

      แม่แบบ {
        ข้อมูล = <<EOF
1.2.3.4
อฟ

        ปลายทาง = "local/trusted-proxys.lst"
      }
    }
  }
}
Ярослав Рахматуллин avatar
คุณกำลังอธิบายถึงสภาพแวดล้อมที่ซับซ้อนและปัญหาที่ยากที่จะทำซ้ำ เนื่องจากเราไม่สามารถเข้าถึงแอปพลิเคชัน PHP เฉพาะของคุณได้ คำถามเช่นนี้ยากที่จะตอบ หากต้องการเพิ่มโอกาสในการได้รับคำตอบ ให้ลองจำกัดขอบเขตของคำถามหรืออธิบายว่าเกณฑ์ความสำเร็จสำหรับคำตอบคืออะไรอย่างไรก็ตาม ฉันมีความคิดบางอย่างเกี่ยวกับสาเหตุของปัญหา โปรดระบุ data/000-default.conf และภาพรวมที่กระชับ/น้อยที่สุดของการตั้งค่า traefik, nomad และกงสุล (มากกว่าแค่ไฟล์ปรับแต่งที่กล่าวถึงแล้ว)
Paul avatar
in flag
ขอบคุณ @ЯÑоÑÐ»Ð°Ð²Ð Ð°Ñ Ð¼Ð°ÑÑллин ฉันได้แยกประเด็นเพิ่มเติมแล้ว สาเหตุมาจากไดเร็กทอรีเซสชัน PHP ในอิมเมจถูกแมปกับไดเร็กทอรีบนวอลุ่ม GlusterFS บนโฮสต์ หวังว่าจะมีคนสามารถบอกวิธีแก้ไขปัญหานี้ให้ฉันได้!

โพสต์คำตอบ

คนส่วนใหญ่ไม่เข้าใจว่าการถามคำถามมากมายจะปลดล็อกการเรียนรู้และปรับปรุงความสัมพันธ์ระหว่างบุคคล ตัวอย่างเช่น ในการศึกษาของ Alison แม้ว่าผู้คนจะจำได้อย่างแม่นยำว่ามีคำถามกี่ข้อที่ถูกถามในการสนทนา แต่พวกเขาไม่เข้าใจความเชื่อมโยงระหว่างคำถามและความชอบ จากการศึกษาทั้ง 4 เรื่องที่ผู้เข้าร่วมมีส่วนร่วมในการสนทนาด้วยตนเองหรืออ่านบันทึกการสนทนาของผู้อื่น ผู้คนมักไม่ตระหนักว่าการถามคำถามจะมีอิทธิพลหรือมีอิทธิพลต่อระดับมิตรภาพระหว่างผู้สนทนา