เศษอะไรและเหตุใดจึงสำคัญ


196

ฉันคิดว่าฉันเข้าใจว่าการเรียงลำดับข้อมูลของคุณ (เศษ) เป็นเรื่องง่ายที่จะจัดการกับมวลรวมที่เข้าใจได้ง่ายในบริบท ถูกต้องหรือไม่

ปรับปรุง : ฉันเดาว่าฉันกำลังดิ้นรนที่นี่ ในความคิดของฉันระดับการสมัครไม่ควรมีการกำหนดธุรกิจที่ควรเก็บข้อมูล ที่ดีที่สุดมันควรจะเป็นชิ้นส่วนของลูกค้า คำตอบทั้งสองตอบสิ่งที่ไม่ใช่เหตุผลสำคัญ มันมีความหมายอะไรที่นอกเหนือจากประสิทธิภาพที่เห็นได้ชัด? กำไรเหล่านี้เพียงพอที่จะชดเชยการละเมิด MVC หรือไม่ เศษส่วนใหญ่มีความสำคัญในการใช้งานขนาดใหญ่มากหรือใช้กับเครื่องชั่งขนาดเล็กหรือไม่


1
หนึ่งในการสัมมนาผ่านเว็บเหล่านี้จะเป็นประโยชน์หรือไม่ vimeo.com/26742356 slideshare.net/rightscale/… vimeo.com/32541189

คำตอบ:


193

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

จากWikipedia :

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

ข้อมูลเพิ่มเติมเกี่ยวกับการแยกชิ้นส่วน:

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

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

บางทีตัวอย่างนี้ด้วยรหัส Java ทำให้ค่อนข้างชัดเจน (เกี่ยวกับโครงการHibernate Shards ) วิธีนี้จะทำงานในสถานการณ์โลกแห่งความจริง

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


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

6
ฉันพยายามเข้าใจมานานแล้วว่ามันแตกต่างจากการแบ่งพาร์ติชันแนวนอนอย่างไรและลิงก์ในคำตอบของคุณก็พิสูจน์ได้ว่าไม่แตกต่าง ดังที่มีคนพูดถึงความคิดเห็นในโพสต์ของ Theo Schlossnagle "... ถ้าคุณมาจากวัฒนธรรมฐานข้อมูลแบบดั้งเดิมคุณกำลังทำการแบ่งพาร์ติชันในแนวนอนถ้าคุณมาจาก Web Cultur ก็คือ 'Sharding' ... "
andreister

@ andreister จากสิ่งที่ฉันกำลังอ่านการใช้ความแตกต่างของแนวคิดคือมันถูกกำหนดโดยการปรับสเกลแนวนอนข้ามหลายโลจิคัลหรือโหนดทางกายภาพ (ในกรณีที่มีความเข้าใจของฉัน (mySQL) หลายฐานข้อมูล การแบ่งพาร์ติชันตามแนวนอนเป็นคำเฉพาะที่น้อยกว่าซึ่ง "Sharding" เป็นชุดย่อย อีกครั้งโดยใช้ mySQL เป็นตัวอย่างพาร์ติชัน mySQL จะถูกจัดการโดยอินสแตนซ์ db เดียวซึ่งโปร่งใส 100% สำหรับแอปพลิเคชัน วิธีการแบ่งส่วนจะเกี่ยวข้องกับพร็อกซีหรือแอปพลิเคชันที่เลือกตัวอย่างที่ชาญฉลาด
NateDSaint

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

บทความ wiki ที่คุณอ้างถึงนั้นมีความแตกต่างกันเล็กน้อยระหว่างคำสองคำนี้ การแบ่งพาร์ติชันในแนวนอนจะแยกตารางตั้งแต่หนึ่งตารางขึ้นไปโดยปกติภายในอินสแตนซ์เดียวของสคีมาและเซิร์ฟเวอร์ฐานข้อมูล / *** / Sharding มีมากกว่านี้: แบ่งพาร์ติชั่นของตารางที่เป็นปัญหาในลักษณะเดียวกัน en.wikipedia.org/wiki/…
Peeter Kokk

38

หากคุณมีข้อซักถามไปยัง DBMS ซึ่งสถานที่นั้นค่อนข้าง จำกัด (กล่าวว่าผู้ใช้จะทำการเลือกโดยเลือกด้วย 'where ชื่อผู้ใช้ = $ my_username') คุณควรใส่ชื่อผู้ใช้ทั้งหมดที่ขึ้นต้นด้วย AM บนเซิร์ฟเวอร์เดียวและจาก NZ ทั้งหมด ในที่อื่น ๆ ด้วยวิธีนี้คุณจะได้รับการไต่ระดับเชิงเส้นสำหรับบางข้อความค้นหา

เรื่องสั้นสั้น ๆ : การเรียงลำดับนั้นเป็นกระบวนการของการกระจายตารางไปยังเซิร์ฟเวอร์ที่แตกต่างกันเพื่อสร้างสมดุลให้กับโหลดทั้งสองเท่ากัน

แน่นอนมันซับซ้อนมากขึ้นในความเป็นจริง :)


การเรียงลำดับจึงมีผลต่อการออกแบบข้อมูลที่คุณกำลังจัดเก็บ ... ขออภัยถ้าฉันไม่ค่อยเข้าใจ
ojblass

นี่ไม่ใช่การแบ่งพาร์ติชันในแนวนอนใช่ไหม
harunurhan

18

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

ทำไมเราต้องมีระบบกระจาย

  • availablity เพิ่มขึ้น
  • การขยายตัวที่ง่ายขึ้น
  • เศรษฐศาสตร์: ค่าใช้จ่ายน้อยลงในการสร้างเครือข่ายคอมพิวเตอร์ขนาดเล็กที่มีพลังของคอมพิวเตอร์ขนาดใหญ่เพียงเครื่องเดียว

คุณสามารถอ่านเพิ่มเติมได้ที่นี่: ข้อดีของฐานข้อมูลแบบกระจาย

การแบ่งส่วนช่วยให้บรรลุระบบกระจายได้อย่างไร

คุณสามารถแบ่งพาร์ติชันดัชนีการค้นหาลงในพาร์ติชัน N และโหลดแต่ละดัชนีบนเซิร์ฟเวอร์แยกต่างหาก หากคุณสอบถามเซิร์ฟเวอร์หนึ่งเครื่องคุณจะได้ผลลัพธ์ 1 / Nth ดังนั้นเพื่อให้ได้ชุดผลลัพธ์ที่สมบูรณ์ระบบการค้นหาแบบกระจายทั่วไปใช้ตัวรวบรวมที่จะรวบรวมผลลัพธ์จากแต่ละเซิร์ฟเวอร์และรวมเข้าด้วยกัน ผู้รวบรวมรวบรวมแจกจ่ายแบบสอบถามไปยังเซิร์ฟเวอร์แต่ละเครื่อง โปรแกรมรวบรวมนี้เรียกว่าMapReduceในคำศัพท์ข้อมูลขนาดใหญ่ กล่าวอีกนัยหนึ่งระบบที่แจกจ่าย = การแบ่งส่วน + MapReduce (แม้ว่าจะมีสิ่งอื่นเช่นกัน)

การแสดงภาพด้านล่าง ระบบกระจาย


7

เศษส่วนใหญ่มีความสำคัญในการใช้งานขนาดใหญ่มากหรือใช้กับเครื่องชั่งขนาดเล็กหรือไม่?

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

นอกจากนี้ในอนาคตอาจจะเป็นสิ่งที่สนุกและน่าตื่นเต้นเหมือน "ก้อนเมฆ" ของวัตถุขนาดใหญ่ที่ลบข้อ จำกัด ด้านประสิทธิภาพที่อาจเกิดขึ้นใช่ไหม? :)


คุณสามารถแบ่งปันสถานการณ์ที่คุณจำเป็นต้องมีการแบ่งปัน
Gagan Burde

4

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

สถานที่ที่สามารถใช้การแบ่งส่วนอื่นได้คือลดความขัดแย้งในเอนทิตีข้อมูล เป็นสิ่งสำคัญโดยเฉพาะอย่างยิ่งเมื่อสร้างระบบที่ปรับขนาดได้เพื่อระวังข้อมูลเหล่านั้นที่เขียนบ่อยเพราะเป็นคอขวดเสมอ ทางออกที่ดีคือการแยกออกเอนทิตีเฉพาะนั้นและเขียนลงในสำเนาหลายชุดจากนั้นอ่านผลรวม ตัวอย่างของ "เคาน์เตอร์ sharded ตัวนับ GAE นี้: http://code.google.com/appengine/articles/sharding_counters.html


7
<< Sharding ได้รับการประดิษฐ์ขึ้นโดยวิศวกร google >> - ไม่จริง Google ก่อตั้งขึ้นในปี 1998 scholar.google.com ค้นหาเอกสารจากยุค 80 เช่น "การทิ้งข้อมูลที่ล้าสมัยในระบบฐานข้อมูลที่จำลองแบบ" ... ระบบสำหรับข้อมูลที่มีการจำลองซ้ำสูง (SHARD) ที่ CCA ... ฉันจำคนได้ยินได้ พูดคุยเกี่ยวกับเศษที่กลับมาแล้ว
Krazy Glew

3

Sharding ทำได้มากกว่าการแบ่งพาร์ติชันตามแนวนอน ตามที่บทความวิกิพีเดีย ,

การแบ่งพาร์ติชันในแนวนอนจะแยกตารางตั้งแต่หนึ่งตารางขึ้นไปโดยปกติภายในอินสแตนซ์เดียวของสคีมาและเซิร์ฟเวอร์ฐานข้อมูล มันอาจมีข้อได้เปรียบโดยการลดขนาดดัชนี (และพยายามค้นหา) หากมีบางวิธีที่ชัดเจนแข็งแรงโดยปริยายในการระบุว่าพาร์ทิชันแถวใดจะพบแถวโดยไม่ต้องค้นหาดัชนีเช่นคลาสสิก ตัวอย่างของตาราง 'CustomersEast' และ 'CustomersWest' ซึ่งรหัสไปรษณีย์ของพวกเขาระบุไว้แล้วว่าจะพบที่ใด

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

นอกจากนี้

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


1

ในความคิดของฉันระดับการสมัครไม่ควรมีการกำหนดธุรกิจที่จะเก็บข้อมูล

นี่เป็นกฎที่ดี แต่เหมือนว่าสิ่งต่าง ๆ ส่วนใหญ่ไม่ถูกต้องเสมอไป

เมื่อคุณทำสถาปัตยกรรมของคุณคุณเริ่มต้นด้วยความรับผิดชอบและความร่วมมือ เมื่อคุณกำหนดสถาปัตยกรรมการทำงานของคุณคุณต้องสมดุลกองกำลังที่ไม่ทำงาน

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


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