คุณจะจัดการและปรับใช้พอร์ตของ FreeBSD ในสภาพแวดล้อมขนาดใหญ่ได้อย่างไร


19

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

ฉันได้ตั้งสิ่งต่าง ๆ ดังนี้

  • / usr / ports ถูกแชร์ผ่าน NFS จากหนึ่งโหนด (พร้อม 'portsnap fetch update') ทุกคืน
  • แต่ละโหนดเชื่อมต่อ / usr / พอร์ตพร้อมอ่าน - เขียน
  • ฉันได้ตั้งค่า "WRKDIRPREFIX = / usr / tmp" ใน /etc/make.conf บนทุกโหนด
  • ฉันได้กำหนดค่า Portsnap เพื่อใช้ดัชนีท้องถิ่นโดยเพิ่มต่อไปนี้ใน /usr/local/etc/pkgtools.conf:

ENV['LOCALINDICES'] ||= '/var/db'

ENV['PORTS_INDEX'] ||= ENV['LOCALINDICES'] + '/INDEX.local'

ฉันสามารถรันportupgrade -p packageเพื่อสร้างแพ็คเกจและportupgrade -P packageติดตั้งไบนารีบนโหนดอื่นได้สำเร็จ

แต่บางครั้งฉันก็ได้รับปัญหาต่อไปนี้: /var/db/INDEX.local:23265:dbm_store failed

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


ทางเลือกหนึ่งคือการมีทรีพอร์ตภายในเครื่องเต็มรูปแบบบนทุกโหนด (และอาจเป็นเพียงแค่ติดตั้ง 'distfiles' และ 'แพ็คเกจ') แต่สิ่งนี้รู้สึกเหมือนเป็นการสิ้นเปลืองพื้นที่ขนาดใหญ่ (และไม่ต้องพูดถึงการอัพเดทที่ไม่จำเป็นมากมาย)
vpetersson

vpeterson: นี่เป็นคำถามที่ต้องถาม (ตอนนี้ฉันถูกบล็อกแล้วและ +5 คะแนนและ 3 ดาวแนะนำเราไม่ได้อยู่คนเดียว) อาจล้างคำถามนี้และระบุปัญหาบางอย่างที่คุณพยายามแก้ไข (FWIW มีคนโหวตให้ปิดคำถามของคุณโดยส่วนตัวแล้วฉันอยากเห็นคำถามนี้หรือคำถามที่คล้ายกันมาก)
Stefan Lasiewski

ฉันไม่แน่ใจว่าจะทำให้คำถามชัดเจนขึ้นได้อย่างไร ฉันไม่คิดว่า @ voretaq7 ตอบคำถามจริง แต่แนะนำวิธีอื่น คำถามนี้เกี่ยวกับสิ่งที่หัวข้อแนะนำ - ผู้คนปรับใช้พอร์ตของ FreeBSD อย่างไรในสภาพแวดล้อมแบบมัลติโหนด
vpetersson

คำตอบ:


13

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

เคล็ดลับที่ดีที่สุดของฉัน (ตามลำดับจากน้อยไปหามากโซลูชัน "เลวร้ายที่สุด" เป็น "ดีที่สุด"):


หากคุณกำลังสร้างในแต่ละเจ้าภาพไม่ได้
หากคุณต้องทำอย่าทำผ่าน NFS ด้วยการเมาท์แบบอ่าน - เขียนอย่างที่คุณอธิบาย: โดยปกติคุณสามารถไว้วางใจพอร์ตเพื่อทำสิ่งที่ถูกต้องและไม่เหยียบลงบนทรีพอร์ตหากคุณมีไดเรกทอรีงานสำรอง แต่ดีกว่าเสมอ ปลอดภัยกว่าขออภัย: เรียกใช้ CVS / csup mirror ในพื้นที่และ csup โฮสต์ทั้งหมดของคุณจากกล่องนั้นจากนั้นสร้างภายในเครื่องตามที่คุณต้องการหากเป็นเครื่องเดี่ยว
ใช่ฉันรู้ว่านี่หมายถึงมีพื้นที่ดิสก์มากขึ้นในโฮสต์และอีกขั้นตอนหนึ่ง มันเกือบจะรับประกันว่าจะไม่มีปัญหา
ข้อแม้: คุณอาจต้องการซิงค์ไฟล์การกำหนดค่าแพคเกจ (rsync หรือคล้ายกัน) จาก "โฮสต์การกำหนดค่า" ที่กำหนดไว้เพื่อให้แน่ใจว่าเครื่องแต่ละเครื่องมีความมั่นคง (คุณสามารถ rsync ทรีพอร์ตทั้งพอร์ตได้หากต้องการแทนที่จะใช้ csup บนแต่ละโหนด)


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


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

Caveat:วิธีนี้ใช้งานได้ดีจริง ๆ ถ้าเครื่องของคุณ "เหมือนกัน" - นั่นคือคุณสามารถติดตั้งชุดพอร์ตเดียวกันบนพอร์ตทั้งหมดได้ มันสามารถทำงานได้หากคุณมีที่แตกต่างกันชุดของพอร์ต แต่ที่เพิ่มขึ้นอย่างมากค่าใช้จ่ายในการบริหาร

Disclaimer:sysutils/radmindผมเป็นผู้ดูแลพอร์ตสำหรับ ใช่ฉันชอบมากที่ฉันยอมรับมัน


ทั้งหมดนี้ขึ้นอยู่กับประสบการณ์ของฉันในการจัดการสภาพแวดล้อม FreeBSD ขนาดต่างๆ (ตั้งแต่ 1-2 เครื่องจนถึงมากกว่า 100) เครื่องมือการกำหนดค่า / การจัดการระบบที่ผลักดันและรักษาภาพที่ได้มาตรฐานเป็นวิธีที่ดีที่สุดในการจัดการสิ่งนี้ในประสบการณ์ของฉัน


ตัวชี้ที่ดี ฉันเคยเล่นกับ Puppet มาแล้วและรักมันบน Ubuntu แต่ฉันไม่แน่ใจว่าเล่นกับ FreeBSD ได้ดีแค่ไหน ฉันยังลองดู ถึงแม้จะมี Puppet ก็ตามฉันคิดว่ามันเรียกว่า Portupgrade ซึ่งจะพาเรากลับไปที่ Square หนึ่ง ฉันไม่เห็นวิธีอื่นใดที่สามารถใช้งานได้เนื่องจากจะต้องใช้ pkg_delete / pkg_add หรือ 'pkg_add -f' ซึ่งจะไม่เป็นความคิดที่ดี เท่าที่ฮาร์ดแวร์ไป - พวกเขาทั้งหมดเหมือนกันเพราะพวกเขาทำงานในระบบคลาวด์สาธารณะ (KVM / Qemu)
vpetersson

หากการกำหนดค่าฮาร์ดแวร์และซอฟต์แวร์พื้นฐานของคุณเหมือนกันฉันจะแนะนำบางอย่างเช่น radmind ให้จัดการอิมเมจระบบทั้งหมด Puppet และ Chef เป็นเครื่องมือที่ยอดเยี่ยมอย่างไรก็ตามเมื่อคุณชี้ให้เห็นพวกเขาเรียกไบนารีระบบปฏิบัติการพื้นฐานซึ่งทำให้คุณกลับมาที่การใช้โฮสต์บิลด์และการแจกจ่ายแพ็คเกจ radmind หลีกเลี่ยงสิ่งนี้โดยการจัดการที่ระดับระบบแฟ้ม ("หากไม่ใช่สิ่งที่ควรจะอยู่ที่นี่ให้แทนที่หรือลบออก") แทนที่จะพยายามเป็นผู้ดูแลระบบแทน ("เรียกใช้คำสั่งเหล่านี้ / เปลี่ยนไฟล์เหล่านี้ให้ฉันเพื่อกำหนดค่า กล่อง").
voretaq7

ระบบมีฮาร์ดแวร์เหมือนกัน แต่ไม่มีการกำหนดค่าที่เหมือนกัน ฉันจะต้องมองเข้าไปใน Radmind แต่ฉันไม่แน่ใจว่าเป็นวิธีที่ดีที่สุด การใช้เครื่องมือในตัวควรทำงานกับ IMHO ซึ่งเป็นสาเหตุที่ฉันติดต่อกับชุมชนเพื่อดูว่าฉันพลาดอะไรไปหรือเปล่า ฉันแทบจะไม่สามารถเป็นคนเดียวที่พยายามทำสิ่งนี้
vpetersson

ในตัวเครื่องมือแน่นอนDOทำงานพวกเขาเพียงแค่ต้องมีจำนวนมากของความช่วยเหลือ (สร้างเซิร์ฟเวอร์จำหน่ายในประเทศของแพคเกจอื่น ๆ ) - พวกเขาจะมุ่งมันที่มีต่อการจัดการเครื่องหนึ่งและไม่ได้ขนาดเช่นเดียวกับพวกเขาได้ โปรดทราบว่าฉันออกจากตัวเลือกในการกลิ้งเซิร์ฟเวอร์ freebsd-update ของคุณเอง - ฉันไม่เคยลองทำแบบนี้มานานกว่าระบบพื้นฐาน แต่เป็นไปได้ในทางทฤษฎี ฉันเพียงแค่ติดอยู่กับสิ่งที่ฉันรู้ว่างาน :)
voretaq7

ใช่นั่นเป็นความคิดที่น่าสนใจจริง ๆ ฉันแค่ไม่แน่ใจว่ามันจะทำงานร่วมกับการกระจายพอร์ตแพ็คเกจโดยไม่มีการดัดแปลงมากมาย ฉันอยากรู้จริงๆว่าระบบขนาดใหญ่ดูแลระบบนี้อย่างไรเนื่องจากมีการใช้งานมากมายของ FreeBSD พวกเขาทั้งหมดใช้วิธีแก้ปัญหาของตนเองหรือไม่? ถ้าเป็นเช่นนั้นมันให้ความรู้สึกแปลก ๆ และไม่ค่อยโอเพ่นซอร์ส - ish
vpetersson

6

แปลกที่ไม่มีใครพูดถึงports-mgmt / tinderbox :

Tinderbox เป็นระบบสร้างแพ็คเกจสำหรับพอร์ต FreeBSD ตามสคริปต์ Portbuild อย่างเป็นทางการที่ใช้กับคลัสเตอร์การสร้างจุด Tinderbox เขียนโดย Joe Marcus Clarke

คุณสามารถกำหนดหลายคุก (รุ่นระบบพื้นฐาน) และหลายพอร์ต การรวมกันของคุกและ portstree เรียกว่าการสร้าง คุก Tinderbox ไม่ใช่สิ่งที่เข้าใจกันว่าเป็นคุกใน FreeBSD แต่ในความเป็นจริงแล้วโลกที่ได้รับใน chroot Tinderbox รองรับการติดตามการพึ่งพาโดยอัตโนมัติและสร้างเฉพาะแพ็คเกจที่เปลี่ยนไปนับตั้งแต่การใช้งานครั้งล่าสุด Tinderbox มีการสนับสนุนการแจ้งเตือนทางอีเมลเกี่ยวกับการสร้างที่ล้มเหลว Tinderbox ยังทำงานได้ดีกับ ccache

Tinderbox ได้รับการออกแบบมาเพื่อให้ชุดแพคเกจพอร์ตที่คุณต้องการได้อย่างง่ายดายสำหรับแพลตฟอร์มและสถาปัตยกรรมที่คุณต้องการ Tinderbox เป็นเครื่องมือที่ยอดเยี่ยมสำหรับการทดสอบพอร์ตใหม่และการอัพเกรดพอร์ตโดยเฉพาะอย่างยิ่งสำหรับการทดสอบการขึ้นต่อกันและรายการการบรรจุ นอกจากนี้ยังมีประโยชน์สำหรับการทดสอบพอร์ตใน FreeBSD รุ่นต่างๆเนื่องจากคุณสามารถใช้ FreeBSD 6.X world เป็นคุกใน FreeBSD 7.X / 8.X host

การสลับไปใช้pkgngช่วยให้การปรับใช้แพ็คเกจทำได้ง่ายขึ้นมาก
ลองดูที่ github: https://github.com/pkgng/pkgng


1
แม้ว่าอาจจะมีประโยชน์สำหรับการสร้างแพ็คเกจจริงในสภาพแวดล้อมที่หลากหลาย (หลายเวอร์ชั่นสถาปัตยกรรม ฯลฯ ) แต่ก็ไม่ได้แก้ปัญหาการปรับใช้แพคเกจ
vpetersson

Tinderbox ทำให้แพ็คเกจสามารถใช้งานได้บน HTTP ดังนั้นคุณสามารถรวมสิ่งนี้กับข้อคิดเห็นในคำตอบของ voretaq7 เพื่อรับโซลูชันการปรับใช้ของคุณ (เช่น set PACKAGEROOT/ PACKAGESITEและใช้ radmind หรือ Puppet / Chef)
James O'Gorman

ใช่ แต่การสร้างและแจกจ่ายแพ็คเกจไม่ใช่ปัญหา ฉันสามารถใช้ portupgrade (-p) เพื่อสร้างแพ็คเกจและแจกจ่ายผ่าน NFS (มีหรือไม่มีทรีพอร์ต) ปัญหาคือโมเดลนี้ยังต้องการ a) tree-tree ที่สมบูรณ์แบบในเครื่องหรือ b) tree-tree ที่ถูกเอ็กซ์พอร์ตผ่าน NFS ซึ่งทำให้เรากลับมามีปัญหา
vpetersson

2
Portupgrade จะทำสิ่งที่คุณต้องทำอย่างแน่นอนหากคุณสร้างจากแหล่งที่มาหรือใช้แพ็คเกจไบนารี - pkg_deleteต้องรันก่อนจากนั้นจึงติดตั้งเวอร์ชันใหม่ OpenBSD จัดการสิ่งนี้ได้ดีขึ้นด้วยการรวมตัวเลือกการอัปpkg_addเดต ไม่แน่ใจเกี่ยวกับ Portupgrade แต่ผู้ดูแลพอร์ตสามารถทำงานได้โดยใช้ INDEX และไม่ใช่ทรีพอร์ตแบบเต็ม
James O'Gorman

1
ถูกต้อง แต่ pkg_delete แทบจะไม่เหมาะสม สมมติว่าคุณต้องการอัพเกรด Ruby, Python หรือแพ็คเกจอื่น ๆ ที่จำเป็นสำหรับแพ็คเกจอื่น ๆ จำนวนมาก pkg_delete จะทำให้คุณต้องลบการอ้างอิงทั้งหมดซึ่งแทบจะเป็นตัวเลือกสำหรับระบบที่ใช้งานจริง Portupgrade ไม่ไกลงานที่ดีกับเรื่องนี้อีกครั้ง แต่ก็ดูเหมือนจะไม่ได้ขนาด
vpetersson

3

ฉันจัดการเซิร์ฟเวอร์ FreeBSD กว่า 100 แห่งโดยแบ่งปัน / usr แบบอ่านอย่างเดียวผ่าน NFS ที่ได้รับการปรับแต่งแล้วย้ายฐานข้อมูลแพ็คเกจจาก / var ไปยัง / usr และเชื่อมโยงกับพวกเขา (ไม่จำเป็นอย่างเคร่งครัด แต่เปิดใช้ pkg_info อาจมีไฟล์อื่น ๆ หนึ่งหรือสองไฟล์ที่จำเป็นต้องย้ายในทิศทางเดียวหรืออย่างอื่นและเชื่อมโยงกัน แต่การตั้งค่าทั้งหมดใช้เวลาประมาณหนึ่งชั่วโมงในการคิดออก มันใช้งานได้ดีมาก หากฉันพบปัญหาเกี่ยวกับการปรับมาตราส่วนฉันจะเพิ่มเซิร์ฟเวอร์ NFS เพิ่มเติมและแบ่งปริมาณงาน แต่ไม่เคยเกิดขึ้น ประสิทธิภาพไม่เคยเป็นปัญหาสำหรับฉัน (อันที่จริงแล้วมันยอดเยี่ยม) แต่ฉันคิดว่าคุณสามารถใส่ / usr ของเซิร์ฟเวอร์ NFS (หรือสำเนาของมัน) ลงใน md


การแชร์ไฟล์แพ็กเกจที่สร้างขึ้นบน NFS (ซึ่งเป็นสิ่งที่คุณพูดถึง?) เป็นอีกแนวทางหนึ่งที่สมเหตุสมผล - จากนั้นคุณสามารถใช้หุ่นเชิด (หรือแม้แต่สคริปต์ SSH-and-shell แบบโฮมเมด) เพื่อติดตั้ง / อัพเกรดแพ็คเกจ จากการแบ่งปัน NFS
voretaq7

1

ดูเหมือนว่าไม่มีใครมีทางออกที่ดีในเรื่องนี้ เป็นไปได้มากว่าเกิดจากข้อ จำกัด ในเครื่องมือการขีดเส้นใต้

นี่คือสิ่งที่ฉันคิดขึ้นมา: ฉันทิ้งความคิดที่จะส่งออกทรีพอร์ตทั้งหมด แต่ฉันให้และใส่พอร์ตทรีแบบเต็มบนแต่ละโหนดแทน ฉันเมานต์ 'แพ็คเกจ' ผ่าน NFS (เพื่อเปิดใช้งานการกระจายแพคเกจ)

ฉันตั้งใจจะใช้แคชพร็อกซี (อาจเป็น Squid) เพื่อเร่งกระบวนการ portnap ผมเขียนสั้น ๆโพสต์เกี่ยวกับวิธีการตั้งค่านี้บนบล็อกของฉัน

อ้างอิง:

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