ตัวเลือกสำหรับ Multisite High Availability กับ Puppet


14

ฉันบำรุงรักษาดาต้าเซ็นเตอร์สองตัวและเนื่องจากโครงสร้างพื้นฐานที่สำคัญของเราเริ่มได้รับการควบคุมผ่านหุ่นมันเป็นสิ่งสำคัญที่การทำงานของหุ่นเชิดในไซต์ที่สองหากไซต์หลักของเราล้มเหลว

ยิ่งไปกว่านั้นการตั้งค่าแบบแอ็คทีฟ / แอคทีฟดังนั้นเซิร์ฟเวอร์ในไซต์ที่สองไม่ได้ทำการสำรวจทั่ว WAN

มีวิธีการมาตรฐานของหุ่นหลายเว็บไซต์ที่มีความพร้อมใช้งานสูงหรือไม่?


1
ฉันเข้าใจคำถามของคุณใช่ไหม คุณกำลังมองหาวิธีที่จะมีต้นแบบหุ่นเชิดในกรณีที่ต้นแบบหุ่นเชิดนั้นไม่พร้อมใช้งาน?
Hrvoje Špoljar

มันขึ้นอยู่กับว่าคุณใช้หุ่นเชิดอย่างไร มีความยืดหยุ่นมาก ตัวอย่างเช่นคุณใช้ configs ที่จัดเก็บไว้หรือไม่?
Zoredache

3
คุณเคยดู "หุ่นเชิดไร้ผู้ชำนาญ" หรือยัง? สาระสำคัญของมันคือแต่ละตัวแทนมีการชำระเงินของรายการและพวกเขาใช้พวกเขาในประเทศ คุณจบลงด้วยgitหรือsvnหรือrsyncหรือระบบควบคุมเวอร์ชันใดก็ตามที่คุณใช้เป็นสิ่งที่คุณต้องการจะขยายออกมากกว่าต้นแบบหุ่นเชิด
Ladadadada

3
เพียงแค่คำใบ้ในการแก้ไขคำถามที่ใช้งานอยู่: คุณสามารถใช้ anycast เพื่อประกาศIP ( "เสมือน" / "บริการ -" ) เดียวกันจากดาต้าเซ็นเตอร์ทั้งคู่ เราทำสิ่งนี้เพื่อแก้ไขปัญหาเซิร์ฟเวอร์ DNS ของเรา ในแต่ละศูนย์ข้อมูล loadbalancer ของเราจะประกาศ IP anycast เดียวกัน การกำหนดเส้นทางของเรานั้นชอบโหลดบาลานเซอร์โลคัล แต่กลับไปที่ดีซีอื่น ๆ ในกรณีที่เกิดความล้มเหลว (~ "ไม่ได้ประกาศ IP คาสต์ใด ๆ อีกต่อไป")
Michuelnik

1
ฉันเห็นหนึ่งในคุณสมบัติใหม่สำหรับ puppet 3.0 คือการรองรับการบันทึก SRVสิ่งที่คน Windows คุ้นเคยเป็นอย่างดีและสามารถช่วยเหลือไซต์ต่างๆได้
sysadmin1138

คำตอบ:


13

หุ่นเชิดจริง ๆ แล้วยืมตัวสวยดีกับสภาพแวดล้อม multi-master กับ caveats ตัวหลัก? หุ่นส่วนต่าง ๆ จำนวนมากต้องการรวมศูนย์ ผู้ให้บริการออกใบรับรอง, คลังโฆษณาและบริการแดชบอร์ด / รายงาน, การกำหนดค่าแฟ้มและการจัดเก็บ - พวกเขาทั้งหมดอยู่ในที่ที่ดีที่สุดในการตั้งค่า (หรือเพียงแค่ต้องการ) ที่มีเพียงที่เดียวสำหรับพวกเขา

แม้ว่ามันจะใช้การได้ค่อนข้างมากในการทำให้ชิ้นส่วนที่เคลื่อนไหวเหล่านั้นทำงานในสภาพแวดล้อมแบบ multi-master ถ้าคุณตกลงกับการสูญเสียฟังก์ชันบางอย่างเมื่อคุณทำเว็บไซต์หลักหายไป


เริ่มจากฟังก์ชั่นพื้นฐานเพื่อรับการรายงานโหนดกับต้นแบบ:

โมดูลและการแสดงออก

ส่วนนี้ง่าย เวอร์ชันควบคุมพวกเขา หากเป็นระบบควบคุมเวอร์ชันแบบกระจายให้ทำการรวมศูนย์และทำให้ข้อมูลตรงกันและปรับเปลี่ยนโฟลว์ push / pull ตามต้องการในไซต์ failover หากเป็นการโค่นล้มคุณอาจต้องการsvnsyncrepo ไปยังไซต์ failover ของคุณ

ผู้ออกใบรับรอง

ทางเลือกหนึ่งที่นี่คือการซิงค์ไฟล์หน่วยงานผู้ออกใบรับรองระหว่างผู้ดูแลระบบเพื่อให้ทุกคนแบ่งปันใบรับรองหลักที่เหมือนกันและสามารถลงชื่อใบรับรองได้ สิ่งนี้ทำให้ฉันหลงทางว่า "ทำผิด";

  • ต้นแบบหนึ่งควรเห็นใบรับรองของตนเองที่นำเสนอในการรับรองความถูกต้องของลูกค้าสำหรับการเชื่อมต่อขาเข้าจากต้นแบบอื่นว่าถูกต้องหรือไม่
  • สิ่งนี้จะทำงานได้อย่างน่าเชื่อถือสำหรับบริการสินค้าคงคลังแดชบอร์ด ฯลฯ หรือไม่
  • คุณจะเพิ่มชื่อ DNS alt ที่ถูกต้องได้อย่างไร

ฉันไม่สามารถพูดได้อย่างตรงไปตรงมาว่าฉันได้ทำการทดสอบตัวเลือกนี้อย่างละเอียดเนื่องจากมันดูน่ากลัว แต่ก็ดูเหมือนว่าหุ่น Labs ไม่ได้มองเพื่อส่งเสริมให้ตัวเลือกนี้ต่อโน้ตที่นี่

ดังนั้นสิ่งที่เหลือไว้ก็คือจะต้องมีผู้เชี่ยวชาญหลักของแคลิฟอร์เนีย ความสัมพันธ์ที่เชื่อถือได้ทั้งหมดยังคงใช้งานได้เมื่อ CA หยุดทำงานเนื่องจากไคลเอนต์และผู้เชี่ยวชาญอื่น ๆ แคชใบรับรอง CA และ CRL (แม้ว่าพวกเขาจะไม่รีเฟรช CRL บ่อยเท่าที่ควร) แต่คุณจะไม่สามารถลงชื่อใบรับรองใหม่ได้จนกว่า คุณได้รับไซต์หลักสำรองหรือคืนค่าต้นแบบ CA จากการสำรองข้อมูลที่ไซต์ failover

คุณจะเลือกนายหนึ่งคนเพื่อทำหน้าที่เป็น CA และปิดการใช้งานปริญญาโทอื่น ๆ ทั้งหมด:

[main]
    ca_server = puppet-ca.example.com
[master]
    ca = false

จากนั้นคุณจะต้องการให้ระบบส่วนกลางนั้นรับปริมาณการรับส่งข้อมูลที่เกี่ยวข้องทั้งหมด มีตัวเลือกน้อยสำหรับสิ่งนี้;

  1. ใช้การSRVสนับสนุนบันทึกใหม่ใน 3.0 เพื่อชี้โหนดเอเจนต์ทั้งหมดไปยังสถานที่ที่เหมาะสมสำหรับ CA -_x-puppet-ca._tcp.example.com
  2. ตั้งค่าca_serverตัวเลือกการกำหนดค่าในpuppet.confตัวแทนทั้งหมด
  3. พร็อกซีการรับส่งข้อมูลทั้งหมดสำหรับคำขอที่เกี่ยวข้องกับ CA จากตัวแทนไปยังต้นแบบที่ถูกต้อง ตัวอย่างเช่นหากคุณใช้งานปรมาจารย์ใน Apache ผ่านทาง Passenger ให้กำหนดค่านี้ใน non-CAs:

    SSLProxyEngine On
    # Proxy on to the CA.
    ProxyPassMatch ^/([^/]+/certificate.*)$ https://puppet-ca.example.com:8140/$1
    # Caveat: /certificate_revocation_list requires authentication by default,
    # which will be lost when proxying. You'll want to alter your CA's auth.conf
    # to allow those requests from any device; the CRL isn't sensitive.
    

และควรทำเช่นนั้น


ก่อนที่เราจะไปยังบริการเสริมข้อความด้านข้าง

ชื่อ DNS สำหรับใบรับรองหลัก

ฉันคิดว่านี่ตรงนี้เป็นเหตุผลที่น่าสนใจที่สุดที่จะย้ายมาที่ 3.0 สมมติว่าคุณต้องการชี้โหนดไปที่ "any ol 'working master"

ภายใต้ 2.7 คุณจะต้องมีชื่อ DNS ทั่วไปเช่นpuppet.example.comและผู้เชี่ยวชาญทุกคนต้องการสิ่งนี้ในใบรับรอง นั่นหมายถึงการตั้งค่าdns_alt_namesในการกำหนดค่าการออกใบรับรองที่พวกเขามีก่อนที่จะถูกกำหนดค่าเป็นต้นแบบการออกใบรับรองอีกครั้งเมื่อคุณต้องการเพิ่มชื่อ DNS ใหม่ลงในรายการ (เช่นถ้าคุณต้องการชื่อ DNS หลายชื่อเพื่อ มีตัวแทนชอบปริญญาโทในเว็บไซต์ของพวกเขา) .. น่าเกลียด

ด้วย 3.0 คุณสามารถใช้SRVบันทึก มอบสิ่งนี้ให้กับลูกค้าของคุณ

[main]
    use_srv_records = true
    srv_domain = example.com

จากนั้นไม่จำเป็นต้องมีใบรับรองพิเศษสำหรับผู้เชี่ยวชาญเพียงแค่เพิ่มระเบียนใหม่ลงในSRVRR ของคุณที่_x-puppet._tcp.example.comและคุณได้รับการตั้งค่าให้เป็นมาสเตอร์สดในกลุ่ม ยังดีกว่าคุณสามารถทำให้ตรรกะการเลือกหลักมีความซับซ้อนมากขึ้น "ต้นแบบการทำงานของ ol ใด ๆ แต่ต้องการหนึ่งในไซต์ของคุณ" โดยการตั้งค่าชุดSRVระเบียนที่แตกต่างกันสำหรับเว็บไซต์ที่แตกต่างกัน ไม่dns_alt_namesจำเป็น


รายงาน / แดชบอร์ด

อันนี้ทำงานได้ดีที่สุดจากส่วนกลาง แต่ถ้าคุณสามารถอยู่ได้โดยปราศจากมันเมื่อไซต์หลักของคุณหยุดทำงานแสดงว่าไม่มีปัญหา เพียงแค่กำหนดค่าอาจารย์ทั้งหมดของคุณด้วยตำแหน่งที่ถูกต้องในการจัดทำรายงาน ..

[master]
    reports = http
    reporturl = https://puppetdash.example.com/reports/upload

.. และคุณพร้อมแล้ว ความล้มเหลวในการอัปโหลดรายงานนั้นไม่ร้ายแรงสำหรับการรันการกำหนดค่า มันจะหายไปถ้าขนมปังของเซิร์ฟเวอร์แดชบอร์ด

สินค้าคงคลังข้อเท็จจริง

อีกสิ่งที่ดีในการติดตั้งแดชบอร์ดของคุณคือการบริการสินค้าคงคลัง ด้วยการfacts_terminusตั้งค่าให้restเป็นที่แนะนำในเอกสารประกอบสิ่งนี้จะเป็นการทำลายการกำหนดค่าจริง ๆ เมื่อบริการสินค้าส่วนกลางหยุดทำงาน เคล็ดลับที่นี่คือใช้inventory_serviceเทอร์มินัสกับผู้เชี่ยวชาญที่ไม่ใช่ศูนย์กลางซึ่งทำให้เกิดความล้มเหลวอย่างงดงาม ..

facts_terminus = inventory_service
inventory_server = puppet-ca.example.com
inventory_port = 8140

ตั้งค่าเซิร์ฟเวอร์สินค้าคงคลังส่วนกลางของคุณเพื่อจัดเก็บข้อมูลสินค้าคงคลังผ่าน ActiveRecord หรือ PuppetDB และควรปรับปรุงให้ทันสมัยเมื่อใดก็ตามที่มีบริการ


ดังนั้น - หากคุณตกลงกับสภาพแวดล้อมการจัดการการกำหนดค่าแบบเปลือยเปล่าที่คุณไม่สามารถใช้ CA เพื่อลงนามในใบรับรองของโหนดใหม่จนกว่าจะได้รับการกู้คืนแล้วสิ่งนี้สามารถใช้ได้ดี - แม้ว่ามันจะดีจริงๆ ถ้าบางส่วนของเหล่านี้เป็นบิตเป็นมิตรมากขึ้นที่จะถูกกระจาย


1
+1 สำหรับสิ่งที่ CA โปรดทราบว่าคุณสามารถซิงค์ / รุ่นควบคุมสารพัดแคลิฟอร์เนียทั้งหมดและไม่เปิดใช้งานสิ่งใด ๆ บนหุ่นกระบอก "สแตนด์บาย" จนกว่าสถานการณ์ความล้มเหลวจะเกิดขึ้น (ณ จุดนี้คุณจะเปิดบิต CA บน "ต้นแบบ" ใหม่ของคุณและอัพเดตSRVเรกคอร์ด ตามSRVบันทึกบันทึกฉันเป็นทางออกที่หรูหราที่สุดที่นี่แม้จะมีความสับสนโดยทั่วไปของฉันที่มีต่อพวกเขา ... )
voretaq7

1
@ voretaq7 เป็นจุดที่ดี - การตั้งค่าล้มเหลวอย่างหมดจดจะมีน้อยกว่า legwork แบบ active / active
เชนแมดเดน

2
ในฐานะที่เป็นภาคผนวกฉันได้มีส่วนร่วมในการปรับปรุงคู่มือการปรับสเกลหลายต้นแบบในเอกสารหุ่นที่มีข้อมูลที่ดีเช่นกัน: docs.puppetlabs.com/guides/scaling_multiple_masters.html
Shane Madden

8

วิธีการ "หุ่นเชิดไร้เดียงสา" ที่ Ladadadada อธิบายคือสิ่งที่ฉันคุ้นเคยมากที่สุด (โดยพื้นฐานแล้วสิ่งที่เราทำกับ radmind ที่ บริษัท ของฉัน) ฉันเดาได้อย่างแม่นยำยิ่งขึ้นว่ามันคือ "ผู้เชี่ยวชาญหลายคนประสานข้อมูลโดยกระบวนการภายนอก" ซึ่งเซิร์ฟเวอร์ใดก็ตามที่สามารถให้บริการ (ในทางทฤษฎี) ให้บริการจักรวาลทั้งหมดของเราในกรณีฉุกเฉิน

ในกรณีเพราะธรรมชาติของ radmind ของเราเราก็rsyncยีนและไฟล์ข้อมูลจากต้นแบบที่ได้รับการอนุมัติไปยังเซิร์ฟเวอร์ radmind แต่ละไซต์ระยะไกลและลูกค้าดึงอัปเดตจากเซิร์ฟเวอร์ที่มีชื่อโฮสต์สั้นradmind(ผ่านความมหัศจรรย์ของการresolv.confประเมินนี้radmind.[sitename].mycompany.com- เสมอท้องถิ่น เซิร์ฟเวอร์ radmind หากเซิร์ฟเวอร์ภายในไม่ทำงานก็ง่ายพอที่จะแทนที่และชี้ไปที่เซิร์ฟเวอร์ของไซต์อื่น ๆ )

กระบวนการ rsync ประเภทนี้อาจทำงานในสถานการณ์ของคุณได้เช่นกัน แต่อาจเป็นวิธีที่ดีที่สุดเมื่อเทียบกับโซลูชันที่ใช้การควบคุมเวอร์ชัน


สำหรับหุ่นเชิดหรือพ่อครัวระบบควบคุมเวอร์ชันนั้นเหมาะสมกว่า rsync แบบง่ายๆด้วยเหตุผลสองสามประการ - สิ่งที่ยิ่งใหญ่ที่คุณควบคุมสคริปต์เวอร์ชันหุ่นเชิด (แทนที่จะเป็นอิมเมจระบบปฏิบัติการทั้งหมดตามที่คุณต้องการ)
ในฐานะที่เป็นประโยชน์เพิ่มเติมของการจัดการแบบควบคุมเวอร์ชันคุณสามารถมีคนหลายคนทำงานในที่เก็บได้ในครั้งเดียว (ชนะอย่างมากสำหรับความเท่าเทียม) คุณจะได้รับประวัติการแก้ไขเป็นหลักโดยไม่เสียค่าใช้จ่ายและถ้ามีคนทำลายสภาพแวดล้อมหุ่นกระบอก กำลังใช้gitคุณอยู่git blameซึ่งมีสิ่งที่มันบอกว่าบนดีบุก)
การแยกสาขาและการรวมความคิดสร้างสรรค์ยังช่วยให้คุณสามารถจัดการการอัปเกรดระบบปฏิบัติการที่สำคัญหรือการเปลี่ยนแปลงอื่น ๆ ภายในกรอบการควบคุมเวอร์ชัน - เมื่อคุณทำให้ถูกต้องเพียงสลับไปที่สาขาใหม่และ (หวังว่า) การผลักดันการผลิต

ฉันกำลังใช้สิ่งนี้ที่นี่หรือไม่ฉันอาจใช้ประโยชน์จาก hooks ล่วงหน้าและการโพสต์คอมมิทในคอมไพล์เพื่อให้แน่ใจว่าการกำหนดค่าหุ่นเชิดนั้นกระทำนั้นมีสติ (ด้านไคลเอนต์) และผลักพวกมันออกไปยังส่วนอื่น ๆ ของจักรวาล คือ (โพสต์ฝั่งเซิร์ฟเวอร์ - อาจเป็นสาเหตุให้เกิดการอัปเดตสภาพแวดล้อมหากนโยบายการปรับใช้ของคุณอนุญาตพฤติกรรมดังกล่าว)

ในแง่ของการนำเซิร์ฟเวอร์ puppetmaster ใหม่มาใช้ในแต่ละไซต์คุณสามารถตรวจสอบสภาพแวดล้อมของหุ่นเชิดกับ puppetmaster ระยะไกลแต่ละตัวและใช้แฮ็ค resolv.conf / hostname ที่ฉันได้อธิบายไว้ข้างต้น สิ่งหลังมีประโยชน์หากคุณต้องการให้ระบบล้มเหลวโดยอัตโนมัติหาก puppetmaster ของหนึ่งเว็บไซต์ระเบิดขึ้น) เพื่อจัดการให้แน่ใจว่าแต่ละไซต์เห็น puppetmaster "ถูกต้อง" และไม่ขัดขวางการเชื่อมโยง WAN ของคุณพยายามรับการอัปเดต


ผู้คนใน Brain Tree Payments ได้รวมเอาโซลูชันการควบคุมเวอร์ชันและ rsync เข้ากับงาน Capistrano ที่กำหนดเอง - โซลูชั่นของพวกเขาดูเหมือนจะถูกอบครึ่งในแง่ที่ว่ามันต้องอาศัยองค์ประกอบเวิร์กโฟลว์ด้วยตนเอง แต่ก็สามารถปรับและอัตโนมัติได้โดยไม่ต้อง งานเยอะเกินไป.
ผู้ทดสอบความหวาดระแวงหวาดระแวงในฉันมีความชื่นชอบในnoopขั้นตอนการตรวจสุขภาพจิตของพวกเขา- กระบวนการเกลียดชังด้วยตนเองที่ฉันต้องการสำหรับระบบอัตโนมัติในระดับหนึ่ง ...

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