แนวปฏิบัติที่ดีที่สุด / รูปแบบสำหรับการซิงโครไนซ์ข้อมูลแบบสองทาง


52

บ่อยครั้งในงานของฉันแนวคิดเกี่ยวกับการซิงโครไนซ์ข้อมูลแบบ 2 ทางระหว่างระบบฐานข้อมูลทำให้ข้อมูลเกิด ตัวอย่างคลาสสิกคือระบบ CRM ที่แตกต่างกันสองระบบ (เช่น Raiser's Edge และ Salesforce) และจำเป็นต้องมีการซิงค์ข้อมูลผู้ติดต่อสองทางระหว่างกัน

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

ตัวอย่างเช่นคุณต้องระวัง:

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

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


สิ่งที่คุณอธิบายฟังดูค่อนข้างใกล้เคียงกับระบบฐานข้อมูล Federated - ถูกต้องหรือไม่
ริ้น

@gnat: ขอบคุณสำหรับการเชื่อมโยงความกังวลบางอย่างคล้ายกัน (เช่นการจัดการกับความแตกต่าง) แต่ฉันกำลังพูดถึงการซิงค์ชุดย่อยของข้อมูลจากฐานข้อมูลสองฐานข้อมูลในขณะที่ดูเหมือนจะเพิ่มเติมเกี่ยวกับการสร้างมุมมองแบบบูรณาการทุกอย่าง ในหลาย ๆ dbs
codeulike

1
7 ปีต่อมา 50 upvotes แต่เพียง 1 คำตอบที่ดี จะต้องมีรูปแบบการทำข้อมูลให้ตรงกันบางอย่างหรือวิธีปฏิบัติที่ดีที่สุดออกมา?
codeulike

คำตอบ:


8

ใช่เป็นปัญหายาก underestimated ง่าย และอาจมีงานเยอะ ถ้าคุณอยู่บนเทคโนโลยี Microsoft คุณอาจต้องการที่จะมีลักษณะที่ไมโครซอฟท์ซิงค์กรอบที่นี่และที่นี่


1
ขอบคุณที่น่าสนใจ ฉันได้ยิน Ms Sync Framework แต่ไม่ได้ตระหนักว่ามันเป็นแบบทั่วไป มันเป็นรูปแบบการจัดการปัญหาการซิงค์โดยทั่วไป
codeulike

2
Microsoft Sync Framework ถูกแทนที่ด้วย Microsoft Sync Framework Toolkit
Tomas Kubes

ฉันผิดหวังกับเอกสารที่ไม่ชัดเจนโดยเฉพาะสำหรับผู้ให้บริการข้อมูลที่ไม่ใช่ SQL-Server ADO.NET ซึ่งเป็นกรณีของฉัน นอกจากนี้ที่ทำงานของฉันกำลังมองหาบางอย่างที่ไม่ต้องการเพิ่มตารางโครงสร้างพื้นฐาน / เปลี่ยนแปลงสภาพแวดล้อมการผลิต ดังนั้นฉันจะทิ้งอันนี้
Veverke

0

มีหลายทฤษฎีเกี่ยวกับการซิงโครไนซ์ฐานข้อมูลไซต์ระยะไกล เริ่มแรกด้วย INSERT การจัดการอันนี้เป็นเรื่องง่ายเนื่องจากคุณสามารถสร้าง ID ที่ไม่ซ้ำกันสำหรับทุกไซต์ (ตัวอย่างเช่นชื่อเริ่มต้นของชื่อไซต์ + ID (หมายเลข): ​​site_a_177 เทียบกับ site_b_53)

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


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

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