จะอัพเดทรายชื่อเซิร์ฟเวอร์ upstream ของ nginx โดยอัตโนมัติอย่างไรเมื่อ aws ec2 hostname เปลี่ยนแปลงหรือเพิ่มขึ้น?


16

ฉันต้องการตั้งค่าการรับสัญญาณอัตโนมัติใน AWS ฉันไม่ต้องการใช้ Elastic Load Balancer

การเข้าระบบอัตโนมัติใน Amazon สร้างอินสแตนซ์ EC2 อย่างต่อเนื่องระหว่างความต้องการเพิ่มขึ้นเพื่อรักษาประสิทธิภาพและลดลงโดยอัตโนมัติในระหว่างการขับกล่อมความต้องการเพื่อลดต้นทุน

เนื่องจากอินสแตนซ์ EC2 นี้ถูกสร้างขึ้นโดยอัตโนมัติชื่อโฮสต์ของพวกเขาจึงไม่รู้จัก NGINX

ฉันรู้และมีการตั้งค่าอัปสตรีมในอินสแตนซ์ nginx ถึง 10 EC2 แล้ว

ฉันต้องการที่จะเพิ่ม / อัปเดต / ลบชื่อเซิร์ฟเวอร์โดยอัตโนมัติไปยังการกำหนดค่า nginx ของฉันเมื่อการเพิ่ม / ปรับปรุง / ลบอินสแตนซ์ EC2 ของการปรับอัตโนมัติ


1
คุณต้องลบ "การรับสัญญาณอัตโนมัติ" ออกจากคำถามของคุณ การแปลงสัญญาณอัตโนมัติเป็นคำ AWS ฉันคิดว่าสิ่งที่คุณหมายถึงคือคุณต้องการปรับขนาด (แนวนอน) โดยอัตโนมัติโดยเพิ่มโหนดต้นน้ำเพิ่มเติมให้กับ nginx ของคุณซึ่งทำหน้าที่เป็น LB และคุณจะถามวิธีแก้ไขการกำหนดค่า nginx โดยอัตโนมัติเมื่อมีการเพิ่ม / ลบ / แก้ไขโหนดต้นน้ำ หากเป็นเช่นนั้นโปรดแก้ไขคำถามของคุณตามนั้น
talonx

ดีจริงฉันรู้ว่า autoscalling คืออะไรและฉันจะบอกว่า ฉันต้องการผสมทั้งสองอย่าง ฉันจะอัปเดตคำถาม
Luis Lobo Borobia

1
คำถามนี้ชัดเจนขึ้นในตอนนี้โดยเจตนา ฉันต้องการโหวตให้เปิดใหม่ แต่ฉันไม่เห็นตัวเลือก - เดาว่าฉันยังมีตัวแทนไม่เพียงพอ
talonx

ขอบคุณ @talonx ฉันหวังว่าคนอื่นสามารถ upvote เพื่อค้นหาคำตอบของฉัน
Luis Lobo Borobia

1
ฉันคิดว่าคุณสามารถรวมการแจ้งเตือนอัตโนมัติของ AWS (จัดส่งโดยใช้ SNS) โดยสมมติว่ามันคืนชื่อโฮสต์ของอินสแตนซ์ที่สร้างขึ้น / ยกเลิกใหม่ - และหนึ่งในบุคคลที่สาม nginx APIs เพื่ออัปเดตและโหลดการกำหนดค่า nginx ของคุณอีกครั้ง ขออภัยที่คลุมเครือ - ฉันไม่ค่อยคุ้นเคยกับ API การแปลงสัญญาณอัตโนมัติ
talonx

คำตอบ:


7

สิ่งนี้สามารถทำได้โดยใช้ Amazon SDK (ฉันเกือบเสร็จแล้วจะวางไว้บน github) ใช้ประโยชน์จาก SNS, EC2 และบริการตรวจสอบอัตโนมัติ

ฉันได้ทำตามขั้นตอนด้านล่างเพื่อบรรลุสิ่งนี้:

  1. เปิดใช้งานการแจ้งเตือน HTTP และสมัครสมาชิกเว็บเซิร์ฟเวอร์ของฉัน
  2. เพิ่ม lifecycle-hook ที่มีการเต้นของหัวใจ 1 นาที (เพื่อรอ 1 นาทีก่อนที่จะยกเลิก) ไปยังกลุ่มการปรับค่าอัตโนมัติของฉันสำหรับการยกเลิกเซิร์ฟเวอร์
  3. สร้างไฟล์ดัชนีเพื่อวิเคราะห์ข้อความเพื่อตรวจสอบว่าเป็นข้อความประเภทใด (เช่นเรียกใช้หรือสิ้นสุด)
  4. เมื่อประเภทของเหตุการณ์ตัดสินใจแล้วฉันจะถาม EC2 เพื่อรับไอพีส่วนตัวของอินสแตนซ์
  5. ในกรณีที่เรียกใช้การรอจนถึงส่วนหัว 200 จะได้รับจากนั้นเพิ่ม ip ลงใน nginx config และโหลดซ้ำ
  6. ในกรณีของ Terminate ให้ลบ IP ออกจาก config และโหลด nginx

กรุณาค้นหาสคริปต์ได้ที่นี่https://github.com/singhupendra/aws-autoscale


โอกาสใดที่คุณโพสต์สิ่งนี้บน Github? ฉันพยายามทำสิ่งเดียวกันและความช่วยเหลือใด ๆ ก็จะได้รับการชื่นชม
แอรอน


2

ขอบคุณ @talonx ฉันได้ทำการวิจัยแล้ว Amazon Autoscale มี api เพื่อค้นหาสถานะกลุ่มการหมุนอัตโนมัติในปัจจุบันและระบุสมาชิก มันจะส่งคืนรหัสอินสแตนซ์ ( http://docs.aws.amazon.com/AutoScaling/latest/DeveloperGuide/api_requests.html#query-example ) จากนั้นคุณสามารถใช้เครื่องมืออธิบายเพื่อรับชื่อเซิร์ฟเวอร์ ( http: // docs .aws.amazon.com / AWSEC2 / ล่าสุด / CommandLineReference / ApiReference-cmd-DescribeInstances.html ) และในที่สุดก็สร้างไฟล์รวม upstream ฉันรู้สึกถึงการแจ้งเตือนอัตโนมัติเพื่อเริ่มกระบวนการที่ทำงานเหล่านี้

ฉันยังไม่ได้ใช้มัน แต่เป็นวิธีที่จะไป

ท่านสามารถใช้ Autocaling ด้วย SNS http://docs.aws.amazon.com/AutoScaling/latest/DeveloperGuide/ASGettingNotifications.html


นี่เป็นสิ่งที่ฉันทำ ฉันเขียนสคริปต์ทับทิมที่ทำงานทุก ๆ N นาที การใช้ AWS SDK นั้นจะทำการสอบถามสมาชิกของ ASG และใช้แม่แบบ ERB ที่สร้างการกำหนดค่าใหม่ หากการกำหนดค่าใหม่แตกต่างจากการตั้งค่าปัจจุบันมันจะคัดลอกลงในตำแหน่งและบอก daemon (haproxy ในกรณีของฉัน) เพื่อโหลดการตั้งค่าใหม่ โปรดทราบว่าอินสแตนซ์ยังคงอยู่ใน ASG สักระยะหลังจากที่ถูกยกเลิกดังนั้นให้แน่ใจว่า instance.status ==: กำลังทำงานอยู่ โปรดทราบว่าหากใช้เวลา N นาทีหลังจากเปิดตัวอินสแตนซ์เพื่อให้บริการตามคำขออย่าใช้ขณะนี้> instance.launch_time + N.
Mark Wagner

ขอบคุณ @ MarkWagner มีความเป็นไปได้ไหมที่คุณสามารถแชร์สคริปต์นั้นที่ไหนสักแห่ง? สรุปสาระสำคัญ GitHub? ขอบคุณ!
Luis Lobo Borobia

คุณมีโชคกับสคริปต์นี้ไหม? มีตัวอย่างเกี่ยวกับ GitHub หรือที่อื่น ๆ ?
แอรอน

ไม่ แต่ตอนนี้ nginx-plus (รุ่นที่จำหน่ายได้แล้ว) จะให้สิ่งนี้มากขึ้น
Luis Lobo Borobia

1

ฉันยังไม่ได้ดำเนินการนี้เลยตัวเอง แต่ฉันกำลังมองหาในการใช้On-the-fly เสียใหม่ของNginx พลัส ฉันคิดว่า AMI หรือการจัดการการกำหนดค่า (Puppet, Salt หรืออื่น ๆ ) ที่ตั้งค่าอินสแตนซ์ของกลุ่มการปรับขนาดอัตโนมัติสามารถเข้าถึง NGiNX reconfiguraiton API (อาจผ่านทางชื่อโดเมน Route53 ภายในดังนั้นจึงไม่มี IP คงที่ จำเป็นต้องใช้) และเพิ่มตัวเองในคลัสเตอร์อัพสตรีมสำหรับพร็อกซีย้อนกลับ หลังจากการตรวจสุขภาพในตัวของ NGiNX นั้นจะเข้ามาแทนที่อินสแตนซ์ [เพิ่ม] นั้นแล้ววางลงในกรณีที่ไม่สามารถใช้งานได้ ดูเหมือนว่าจะเป็นวิธีการแก้ปัญหาที่สะอาดที่สุดและไม่มีความล่าช้าในการเพิ่มอินสแตนซ์และแทบจะไม่เกิดความล่าช้าใด ๆ ในการวางเนื่องจาก NGiNX Plus มีการตรวจสุขภาพนอกวง

วิธีนี้หลีกเลี่ยงความจำเป็นในการตั้งค่าระบบค้นหาอัตโนมัติ (กงสุล, Serf หรืออื่น ๆ ) ซึ่งสำหรับการตั้งค่าขนาดเล็กมักจะดูเหมือนว่าค่าใช้จ่ายมากทั้งในแง่ของการตั้งค่า / การจัดการเช่นเดียวกับ EC2 อินสแตนซ์ที่ต้องการ ตัวอย่างเช่นกงสุลต้องการอย่างน้อยสามอินสแตนซ์ที่จะมีเสถียรภาพ Serf อาจทำงานบนอินสแตนซ์ ASG ด้วยตนเอง แต่ยังคงมีค่าใช้จ่ายในการบำรุงรักษาและถ้า ASG ลดระดับลงเหลือหนึ่งหรือสองอินสแตนซ์คุณจะสูญเสียโควรัม

ท้ายที่สุดนี้สามารถใช้ร่วมกับการแจ้งเตือนอัตโนมัติของการเปลี่ยนแปลงกลุ่มการปรับอัตโนมัติอาจบนเซิร์ฟเวอร์ NGiNX ที่ใช้ / สำหรับการปรับสมดุลโหลด ผู้ฟังที่ถูกกระตุ้นโดยการแจ้งเตือนดังกล่าว (ซึ่งอาจเป็นสิ่งที่ Upendra อ้างถึงด้วย) สามารถเพิ่มอินสแตนซ์ใหม่ให้กับ NGiNX ได้ทันทีผ่าน API การปรับเปลี่ยน On-the-fly นอกเหนือจากค่าใช้จ่ายของ NGiNX Plus สิ่งนี้ทำให้สงสัยว่าทำไมทุกคนจะใช้ Elastic Load Balancer กับปัญหามากมายในตอนแรก

แก้ไข 2015/12/07: ngx_openresty 's Balancer โดยหลัว ( เห็นนี้ด้าย GitHub ) เสนอวิธีการแก้ปัญหาแหล่งอื่นที่เป็นไปได้เปิดให้บริการสำหรับร้อนเพิ่ม / ลบเซิร์ฟเวอร์จากกลุ่มต้นน้ำ Nginx ฉันยังไม่ได้ทดลองกับตัวเอง แต่ต้องการเพิ่มการกล่าวถึงที่นี่สำหรับทุกคนที่สะดุดในโพสต์นี้

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