การโต้ตอบกับข้อมูลโดยใช้ฐานข้อมูล / เซิร์ฟเวอร์หลายตัว


18

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

ตัวอย่างเช่น

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

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

@ AnnaLear - ฉันคิดว่ามันขึ้นอยู่กับคำตอบ ณ จุดนี้ฉันสนใจด้านแอปพลิเคชันของปัญหามากขึ้นดังนั้นสำหรับตอนนี้ฉันคิดว่ามันน่าจะดีกว่าที่นี่
VirtuosiMedia

@AnnaLear ack เห็นด้วยกับ OP ถ้าพวกเขาต้องการรหัสเฉพาะแอป
jcolebrand

คำตอบ:


13

ตกลงมาทำลายมันกัน:

  • ตัวเชื่อมถูกสร้างขึ้นระหว่างสองตารางในหลายฐานข้อมูลอย่างไร (ตัวอย่างรหัสที่นี่จะเป็นประโยชน์)

ตรงนี้ค่อนข้างตรงไปตรงมา วัตถุ SQL มีที่ใดก็ได้จากแบบแผนการตั้งชื่อส่วนหนึ่งถึงสี่:

Servername.databasename.schemaname.tablename

หากตารางทั้งหมดของคุณอยู่บนเซิร์ฟเวอร์เดียวกันบนฐานข้อมูลเดียวกันโดยมีเจ้าของ / สคีมาเหมือนกันคุณสามารถละเว้นสามส่วนแรกและใช้สิ่งที่คุณคุ้นเคยมากที่สุดในการ:

Select a.*,b.* from 
tableA a inner join 
tableB b on a.col1=b.col1

หากหนึ่งในตารางของคุณอยู่ในฐานข้อมูลอื่นและทั้งคู่ใช้สคีมาเริ่มต้นสำหรับฐานข้อมูลของคุณคุณเพียงเพิ่มฐานข้อมูลลงในตารางที่สอง:

Select a.*,b.* from 
tableA a inner join 
databaseC..tableB b on a.col1 = b.col1

หากคุณอยู่ในฐานข้อมูลที่สามแตกต่างจากอย่างใดอย่างหนึ่งที่คุณกำลังสอบถามคุณใช้ชื่อฐานข้อมูลทั้งสองอย่างชัดเจน:

Select a.*,b.* from 
databaseD..tableA a inner join 
databaseC..tableB b on a.col1 = b.col1

หากคุณใช้ schema และ / หรือเจ้าของอื่น ๆ คุณสามารถเพิ่มสิ่งเหล่านี้ใน:

Select a.*,b.* from 
databaseD.john.tableA a inner join 
databaseC.accounting.tableB b on a.col1 = b.col1

และสุดท้ายถ้าคุณระมัดระวังมากและมีเหตุผลที่ดีมากคุณสามารถเข้าร่วมตาราง (มักจะเล็ก) บนเซิร์ฟเวอร์อื่น:

Select a.* from 
databaseD.john.TableA a inner join 
ATLANTA.databaseC.accounting.tableB b on a.col1 = b.col1
  • เวลาที่จะย้ายเกินกว่าการตั้งค่าเซิร์ฟเวอร์ 1 / ฐานข้อมูล 1? การทำเช่นนี้ต้องทำกันมากแค่ไหน? มีกลยุทธ์พิเศษสำหรับการติดตามตารางใดในฐานข้อมูลใดบ้าง

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

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

ว่าเมื่อใด / เพราะเหตุใดจึงต้องย้ายเกินฐานข้อมูลเดียว โดยปกติแล้วเป็นการผสมผสานระหว่างกฎเกณฑ์ทางธุรกิจการเมืองและ / หรือเหตุผลทางเทคนิค

ตัวอย่างเช่นที่ทำงานฉันมีฐานข้อมูล 16 แห่งกระจายอยู่ทั่วเซิร์ฟเวอร์ 4 แห่ง เรามี MainDB, ImageDB, ReferencetableDB, HighvolumeTransactionDB, ReportingDB, StagingDB, ProcessingDB, ArchiveDB, FinancialDB ในการให้ตัวอย่างว่าทำไมพวกเขาถึงแตกต่าง:

  • FinancialDB ข้อมูลที่ละเอียดอ่อน
  • Image DB, ข้อกำหนดหน่วยเก็บข้อมูลและการกู้คืนที่แตกต่างกันโดยเฉพาะ
  • ReferenceDB ธุรกรรมต่ำอ่านสูง
  • ReportingDB ต้องอ่านสูงมากต้องถูกเรียกคืน / ทำซ้ำไปยังสภาพแวดล้อมอื่น ๆ ซึ่งแตกต่างจากข้อมูลอื่น ๆ มากมาย
  • StagingDB ไม่มีอะไรถาวรเพียงแค่เพิ่มอุณหภูมิ tempdb ที่เราสามารถควบคุมได้มากขึ้น
  • MainDB อินเทอร์เฟซกับ DBs อื่น ๆ ทั้งหมด แต่ต้องการการสำรองข้อมูลที่แตกต่างดังนั้น ... เราจึงแยกออก
  • ตาราง HighVolumeTransaction (ซึ่งค่อนข้างชั่วคราว) ไปยังฐานข้อมูลของตนเองเพื่อรักษาขนาดการสำรองข้อมูลที่เหมาะสม
  • เก็บถาวรข้อมูลเดียวกันจำนวนมากจากหน้าหลักและการรายงาน แต่ด้วยระยะเวลาการเก็บรักษาที่ยาวนานขึ้นและการสืบค้นที่ยากขึ้นจะส่งผลให้ข้อมูลลึก หากสิ่งนี้ยังคงถูกรวมเข้ากับหลัก / การรายงานมันจะทำให้ระบบของเราชะงัก

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

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

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

วิธีปกติ (หรืออย่างน้อยที่สุดปกติของฉัน) วิธีการคือเข้าถึงฐานข้อมูลหลักหนึ่งหรือสองฐานเสมอ

จากนั้นสร้างมุมมองลงในฐานข้อมูลอื่น ๆ ตามความจำเป็นรวมกับการเชื่อมต่อกับฐานข้อมูลผ่านขั้นตอนการจัดเก็บ

ดังนั้นเพื่ออธิบาย:

สมมติว่าคุณต้องการได้รับข้อมูลประชากรของลูกค้าข้อมูลการขายและเครดิตบาลานซ์และกระจายไปทั่วทั้งสามตารางใน MainDB

ดังนั้นคุณจึงโทรออกจากแอพของคุณ:

Select c.ClientName, c.ClientAddress, s.totalSales,f.CreditBlance from
Clients c join Sales s on c.clientid = s.clientid inner join AccountReceivable f on 
c.clientid=f.clientid where c.clientid = @clientid

น่ากลัว อย่างไรก็ตามตอนนี้เมื่อใดก็ตามที่เราเปลี่ยนชื่อคอลัมน์หรือเปลี่ยนชื่อ / ย้ายตารางคุณต้องอัปเดตรหัสแอป ดังนั้นแทนที่จะทำสองสิ่ง:
สร้างลูกค้าการขายมุมมอง AccountReceivables (คุณจะไม่ใช้ Select * แต่ฉันกำลังสาธิตที่นี่)

Use MainDB
GO
Create view v_Clients as select * from Clients
Create view v_Sales as select * from Sales
Create view v_AccountReceivable as select * from AccountReceivable
Go

จากนั้นเราจะสร้างโพรซีเดอร์ที่เก็บไว้ spGetClientSalesAR

Create proc spGetClientSalesAR @clientID int
as
Select c.ClientName as ClientName, 
       c.ClientAddress as ClientAddress, 
       s.totalSales as TotalSales, 
       f.CreditBlance as CreditBalance 
from
v_Clients c join v_Sales s 
    on c.clientid = s.clientid 
inner join v_AccountReceivable f 
    on c.clientid=f.clientid 
where c.clientid = @clientid

และให้แอพของคุณเรียกว่า

ตราบใดที่ฉันไม่ได้เปลี่ยนอินเทอร์เฟซบน proc ที่เก็บไว้ฉันสามารถทำอะไรก็ได้ที่ฉันต้องทำกับฐานข้อมูลส่วนหลังเพื่อขยายหรือย่อขนาด

ในที่สุดฉันก็สามารถทำให้ MainDB เก่าของฉันเป็นเพียงแค่กระบวนการเก็บและมุมมองที่เก็บไว้แบบ shelled ซึ่งภายใต้มุมมองเหล่านั้นที่เราสร้างขึ้นดูเหมือนว่า:

Create view v_Clients as select * from ServerX.DatabaseY.dbo.Clients
Create view v_Sales as select * from ServerQ.DatabaseP.dbo.Sales
Create view v_AccountReceivable as select * from ServerJ.DatabaseK.dbo.AccountReceivable

และแอปของคุณจะไม่มีทางรู้ถึงความแตกต่าง (สมมติว่ามีท่อที่รวดเร็วและมีการจัดเตรียมข้อมูลที่ดีในหมู่สิ่งอื่น ๆ )

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


TetonSig - ขอบคุณสำหรับคำตอบ ฉันไม่สามารถตอบกลับคำถามได้ทันเวลาเพื่อให้รางวัลแก่คุณเต็มจำนวน (ฉันกำลังเดินทาง) แต่ฉันสร้างเงินรางวัลใหม่สำหรับคำถามนั้นและจะสามารถมอบรางวัลให้คุณได้ใน 24 ชั่วโมง
VirtuosiMedia

ว้าวขอบคุณ. ฉันขอขอบคุณที่. มันสนุกมากที่ได้ตอบคำถาม
TetonSig

5

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


3

ตัวเชื่อมถูกสร้างขึ้นระหว่างสองตารางในหลายฐานข้อมูลอย่างไร (ตัวอย่างรหัสที่นี่จะเป็นประโยชน์)

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

มีกลยุทธ์พิเศษสำหรับการติดตามตารางใดในฐานข้อมูลใดบ้าง

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

หากคุณแยกฐานข้อมูลอย่างมีเหตุผลและไม่ใช่แค่ทางกายภาพการแมปที่กำหนดใน DAL หรือ ORM ของคุณจะประกาศว่าตารางใดอยู่ในฐานข้อมูลใด

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

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

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

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

เวลาที่จะย้ายเกินกว่าการตั้งค่าเซิร์ฟเวอร์ 1 / ฐานข้อมูล 1? การทำเช่นนี้ต้องทำกันมากแค่ไหน?

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

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

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


+1 - ฉันไม่ได้พิจารณา NoSQL จริงๆ แต่สิ่งนี้มีประโยชน์เหมือนกันทุกประการ ขอบคุณ
VirtuosiMedia

1

มีการกำหนดค่าการจำลองแบบที่สำคัญสามประเภทสำหรับฐานข้อมูล:

  • Master-Slave
  • โท-Master
  • เอกฉันท์

ตัวอย่างของ Master-Slave: MySQL master + MySQL slaves, MongoDB

ตัวอย่าง Master-Master: CouchDB, Cassandra, Riak

ตัวอย่างฉันทามติ: ScalienDB

... เพื่อชื่อไม่กี่

เหล่านี้มีลักษณะแตกต่างกัน Master-slave configs อนุญาตให้สลาฟโหนดติดต่อกับมาสเตอร์ได้ในอัตราสูงสุดขณะที่ให้บริการการร้องขอการอ่านอย่างรวดเร็วในขณะที่เซิร์ฟเวอร์หลักรับผิดชอบความสมบูรณ์ของข้อมูล เนื่องจากการเขียนทั้งหมดไปที่ต้นแบบจึงไม่มีการล็อกการโต้แย้งเนื่องจากตัวเขียนที่ค่อนข้างช้าตัวเดียวกำลังบล็อกผู้อ่านจำนวนมาก แต่ในทางกลับกันเซิร์ฟเวอร์ทาสนั้นในที่สุดก็สอดคล้องกันและคุณไม่ได้รับการแยกธุรกรรมรับรองว่าคุณจะต้อง จากการอ่านจากอาจารย์เท่านั้น (อ่านเพิ่มเติม; ACID vs BASE, ระดับการแยกธุรกรรม, การจำลองฐานข้อมูล, MVCC / การแยก: Snapshot, การจำลองแบบของทรานแซคชัน)

Master-Master อนุญาตให้เขียนได้เสมอดังนั้นคุณมีสิทธิ์หลายอย่างในสิ่งที่เป็นจริง สิ่งนี้อาจจะใช่หรือไม่ใช่ปัญหาขึ้นอยู่กับสิ่งที่แอปพลิเคชันของคุณกำลังทำอยู่ แต่ถ้าคุณเขียนข้อมูลที่ขัดแย้งกันคุณอาจได้ผลลัพธ์หลายครั้งในครั้งถัดไปที่คุณอ่านคีย์ / แถว / คอลัมน์ที่คุณจะต้องรวมกับตรรกะแอปพลิเคชันและ บันทึกกลับไปที่ฐานข้อมูล (การอ่านเพิ่มเติม: CAP-theorem, การจำลองแบบ CouchDB, การจำลอง Riak, hashing ที่สอดคล้องกัน, Bitcask & StormDB, Quorum- w / MongoDB ในการแบ่งเครือข่าย, รวมกลยุทธ์การแก้ปัญหา)

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

อื่น ๆ การอ่าน: (หนังสือ: 'องค์ประกอบของการคำนวณแบบกระจาย', นาฬิกาแบบเวกเตอร์, เวกเตอร์รุ่น, เวกเตอร์เมทริกซ์, นาฬิกาเชิงตรรกะ, เบเกอรี่อัลกอริทึม, นาฬิกาต้นไม้ช่วงเวลา, นักแสดงและการเขียนโปรแกรมและเครื่องปฏิกรณ์เชิงปฏิกิริยา, หน่วยความจำ ความผิดพลาดของการคำนวณแบบกระจาย, โพรโทคอลซุบซิบ, ส่วนขยายโพรโทคอล gossip ต่อต้านแคสแซนดร้า, ตารางแฮชแบบกระจาย, เอกสารเกี่ยวกับการรวมข้อมูลในการตั้งค่าแบบกระจาย, สถาปัตยกรรม ZooKeeper, InfoQ- การนำเสนอ ที่เริ่มต้นทุกสิ่ง NoSQL, การจัดคิว, การจัดกลุ่มที่มีความพร้อมใช้งานสูง Rabbitmq)

ฉันหวังว่าฉันจะให้อาหารเพื่อคิด :) คุณสามารถติดตามฉันได้ที่ Twitter @ Henrikfeldt หากคุณต้องการทวีตเกี่ยวกับสิ่งนี้เช่นกัน


1

ตกลงดังนั้นนี่คือมุมมองอื่นเกี่ยวกับความยืดหยุ่น

เรามาพูดคุยกันว่ามันหมายถึงอะไรสำหรับข้อมูล, ความหมายของพฤติกรรมและความหมายของการใช้ตรรกะ

โดยปกติเมื่อมีกิจการหนึ่งเข้าไปในดินแดนของแอพพลิเคชั่นขององค์กร แน่นอนว่าการเลเยอร์เป็นสิ่งที่เกิดขึ้นในคอมพิวเตอร์เช่นในเครือข่ายสแต็ค (โมเดล ISO) หรือในกราฟิก (Photoshop) หรือใน SOA (บริการอาจเรียกว่าพี่น้องหรือเด็ก ๆ

อย่างไรก็ตามประเภทของเลเยอร์เฉพาะที่ถูกทารุณกรรมโดยไม่คำนึงถึงสิ่งที่เคยเป็นเช่น 'GUI', 'Business Logic Layer' และ 'Data Access Layer' ฉันหมายความว่าใช่ความคิดนั้นดีในหลักการเหมือนกับลัทธิคอมมิวนิสต์นั้นดีในหลักการ แต่ในความเป็นจริงมันไม่ใช่

มาดูกันว่าทำไม อาร์กิวเมนต์ที่ฉันจะใช้เป็นเรื่องเกี่ยวกับการแต่งงานกัน; คะแนนจากชั้นหนึ่งที่สัมผัสกับจุดที่ชั้นอื่น เมื่อใดก็ตามที่คุณเริ่มสร้างแอพเลเยอร์ n-tier aka ในโหมดเริ่มต้นแบบ enterprisey ที่ผู้คนเข้ามาพวกเขาจะสร้างจุดติดต่อหลายจุดระหว่างเลเยอร์

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

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

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

เปรียบเทียบสิ่งนี้กับ n-tier ที่คุณจะต้องเปลี่ยน call-path ในเลเยอร์แอปพลิเคชันของคุณใน 'call' ที่เลเยอร์ของคุณไปจนถึงฐานข้อมูล - ตัวอย่างเช่น 'ลูกค้าทอง' เป็น polymorphically superset ของ 'ลูกค้าทั่วไป' และเนื่องจากเราใช้ 'table-per-subclass' เราจำเป็นต้องรู้เกี่ยวกับสิ่งนี้ในขณะนี้ว่า data (เอนทิตี) กำลังข้ามเลเยอร์ ทั้งในเลเยอร์ที่เรียกว่า 'ตรรกะทางธุรกิจ' และในชั้นข้อมูลซึ่งจริงๆแล้วเป็นการประหยัด

มันไม่สามารถปรับขนาดได้หรือดีที่สุดจากมุมมองการคำนวณ

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

ถูกต้องดังนั้นด้วยคำพูดดังกล่าวที่ออกไป; มีวิธีอื่นอีกไหม?

มีคำย่อที่เกลียดชังที่เรียกว่า 'SOA' คือสถาปัตยกรรมเชิงบริการ แน่นอนว่าTomas Erls ของโลกจะให้คุณใช้เลเยอร์ทั้งหมด แต่ใช้ XML และ SOAP แทน

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

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

เนื่องจากคุณแยกส่วนบริการออกจากการดำเนินการจริงที่คุณต้องการดำเนินการตอนนี้คุณจึงสามารถเพิ่มบริการได้หลายบริการ อันที่จริงแล้วนี่คือวิธีที่ Netflix ทำ มีลักษณะที่นำเสนอเหล่านี้: http://www.slideshare.net/adrianco/global-netflix-platform http://www.slideshare.net/adrianco/global-netflix-platform พวกเขากำลังดี!


0

มีฐานข้อมูล SQL (ACID) ใหม่ในรุ่นเบต้าที่อ้างว่ามีคุณสมบัติการขยายขนาดยืดหยุ่น มีโปรแกรมเบต้าฟรีที่เกิดขึ้นในขณะนี้และฉันขอแนะนำให้คุณดูมันเรียกว่า NuoDB

เห็นได้ชัดว่ามันมีประสิทธิภาพสูงกว่า MySQL แม้ในเครื่องที่มีเธรดเดียว


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