การพัฒนาแอปคลัสเตอร์

ฉันไม่แน่ใจว่าคำถามนี้อยู่ที่ไหน (หรืออย่างไร) ดังนั้นฉันหวังว่าใครสักคนที่นี่จะช่วยชี้ทิศทางที่ถูกต้องให้กับฉัน

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

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

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

การรักษาสถานะในฐานข้อมูลก็ไม่ใช่ทางเลือกเช่นกัน เนื่องจากฐานข้อมูลกลายเป็นคอขวดและเป็นจุดหนึ่งของความล้มเหลว

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

ในกรณีที่เกี่ยวข้อง ฉันใช้ .NET Core และ c# เพื่อการพัฒนา

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


comment
เพื่อชี้แจงให้กระจ่าง การนินทาคลัสเตอร์ของ Akka.NET นั้นมีไว้เพื่อติดตามสถานะของคลัสเตอร์เท่านั้น เช่น รู้ว่าโหนดจะพร้อมใช้งานเมื่อใด โหนดเหล่านั้นตายเมื่อใด ฯลฯ โดยจะ ไม่ ประสานสถานะนักแสดงใด ๆ ให้กับคุณ . การส่งข้อความและการตรวจสอบให้แน่ใจว่าสถานะตรงกันภายในผู้ดำเนินการในคลัสเตอร์ของคุณจะเป็นความรับผิดชอบของคุณทั้งหมด มีวิธีการต่างๆ มากมายที่คุณสามารถใช้เพื่อบรรลุเป้าหมายนี้ IIRC Petabridge มีบล็อกโพสต์เกี่ยวกับเรื่องนี้ (และบทความ Akka.NET อื่นๆ ที่เป็นประโยชน์)   -  person easuter    schedule 17.11.2016


คำตอบ (1)


คุณมีปัญหาใหญ่ ฉันคิดว่าวิธีที่คุณคิดเกี่ยวกับปัญหาเป็นปัญหาที่ใหญ่กว่า มาดูพื้นฐานบางอย่างกันดีกว่า

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

ดังนั้น เพื่อแก้ไขปัญหาของคุณ คุณสามารถใช้เซิร์ฟเวอร์ที่ใหญ่กว่าได้

หรือคุณสามารถใช้การจัดกลุ่ม

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

แต่สังเกตจากตัวอย่างของฉัน มดมีขนาดเล็กมาก... มดตัวเดียวจะอุ้มช้างทั้งตัวไม่ได้ คุณสามารถอุ้มช้างทั้งตัวได้ถ้ามดทุกตัวทำงานร่วมกัน แต่คุณประสบปัญหาพร้อมกันและล็อคกันไม่ได้ (คุณต้องประสานงานกับมด)

มดได้แสดงให้เราเห็นวิธีที่ดีกว่ามากในการจัดการกับเรื่องนี้ พวกเขาจะหยิบช้างชิ้นหนึ่งมาจัดการกับปัญหาเป็นชิ้นเล็กๆ

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

วิธีแก้ไขปัญหาของคุณคือการคิดวิธีแก้ปัญหาใหม่ และดูว่าคุณสามารถแบ่งปัญหาออกเป็นส่วนย่อยๆ ได้หรือไม่

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

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

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

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

การจัดกลุ่มควรเป็นวิธีแก้ปัญหาสำหรับคุณ แต่เฉพาะในกรณีที่คุณสามารถดึงแนวคิดเรื่องกระจกออกไปจากใจได้

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

โชคดี... คุณได้สรุปปัญหาที่น่าเกรงขามซึ่งฉันได้เห็นคนที่จบปริญญาวิศวกรรมซอฟต์แวร์ล้มเหลวในการแก้ไข

person Karell Ste-Marie    schedule 17.11.2016