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