In computing, Chord is a protocol and algorithm for a peer-to-peer distributed hash table. A distributed hash table stores key-value pairs by assigning keys to different computers (known as "nodes"); a node will store the values for all the keys for which it is responsible. Chord specifies how keys are assigned to nodes, and how a node can discover the value for a given key by first locating the node responsible for that key.
Chord is one of the four original distributed hash table protocols, along with CAN, Tapestry, and Pastry. It was introduced in 2001 by Ion Stoica, Robert Morris, David Karger, Frans Kaashoek, and Hari Balakrishnan, and was developed at MIT.[1]
Overview
Nodes and keys are assigned an {displaystyle m} m-bit identifier using consistent hashing. The SHA-1 algorithm is the base hashing function for consistent hashing. Consistent hashing is integral to the robustness and performance of Chord because both keys and nodes (in fact, their IP addresses) are uniformly distributed in the same identifier space with a negligible possibility of collision. Thus, it also allows nodes to join and leave the network without disruption. In the protocol, the term node is used to refer to both a node itself and its identifier (ID) without ambiguity. So is the term key.
Using the Chord lookup protocol, nodes and keys are arranged in an identifier circle that has at most {displaystyle 2^{m}} 2^{m} nodes, ranging from {displaystyle 0} {displaystyle 0} to {displaystyle 2^{m}-1} 2^m - 1. ( {displaystyle m} m should be large enough to avoid collision.)
Each node has a successor and a predecessor. The successor to a node is the next node in the identifier circle in a clockwise direction. The predecessor is counter-clockwise. If there is a node for each possible ID, the successor of node 0 is node 1, and the predecessor of node 0 is node {displaystyle 2^{m}-1} 2^m - 1; however, normally there are "holes" in the sequence. For example, the successor of node 153 may be node 167 (and nodes from 154 to 166 do not exist); in this case, the predecessor of node 167 will be node 153.
The concept of successor can be used for keys as well. The successor node of a key {displaystyle k} k is the first node whose ID equals to {displaystyle k} k or follows {displaystyle k} k in the identifier circle, denoted by {displaystyle successor(k)} successor(k). Every key is assigned to (stored at) its successor node, so looking up a key {displaystyle k} k is to query {displaystyle successor(k)} successor(k).
Since the successor (or predecessor) of a node may disappear from the network (because of failure or departure), each node records a whole segment of the circle adjacent to it, i.e., the {displaystyle r} r nodes preceding it and the {displaystyle r} r nodes following it. This list results in a high probability that a node is able to correctly locate its successor or predecessor, even if the network in question suffers from a high failure rate.
Protocol details
Basic query[edit]
The core usage of the Chord protocol is to query a key from a client (generally a node as well), i.e. to find {displaystyle successor(k)} successor(k). The basic approach is to pass the query to a node's successor, if it cannot find the key locally. This will lead to a {displaystyle O(N)} O(N) query time.
Finger table[edit]
To avoid the linear search above, Chord implements a faster search method by requiring each node to keep a finger table containing up to {displaystyle m} m entries. The {displaystyle i^{th}} i^{th} entry of node {displaystyle n} n will contain {displaystyle successor((n+2^{i-1}),{mod {,}}2^{m})} successor((n+2^{i-1}),mod,2^m). The first entry of finger table is actually the node's immediate successor (and therefore an extra successor field is not needed). Every time a node wants to look up a key {displaystyle k} k, it will pass the query to the closest successor or predecessor (depending on the finger table) of {displaystyle k} k in its finger table (the "largest" one on the circle whose ID is smaller than {displaystyle k} k), until a node finds out the key is stored in its immediate successor.
With such a finger table, the number of nodes that must be contacted to find a successor in an N-node network is {displaystyle O(log N)} O(log N). (See proof below.)
Node join[edit]
Whenever a new node joins, three invariants should be maintained (the first two ensure correctness and the last one keeps querying fast):
Each node's successor points to its immediate successor correctly.
Each key is stored in {displaystyle successor(k)} successor(k).
Each node's finger table should be correct.
To satisfy these invariants, a predecessor field is maintained for each node. As the successor is the first entry of the finger table, we do not need to maintain this field separately any more. The following tasks should be done for a newly joined node {displaystyle n} n:
Initialize node
ในการใช้คอมพิวเตอร์, คอร์ดเป็นโปรโตคอลและอัลกอริทึมสำหรับตารางแฮชแบบ peer-to-peer กระจาย กัญชากระจายร้านค้าตารางคู่ค่าคีย์โดยการกำหนดปุ่มไปยังคอมพิวเตอร์ที่แตกต่างกัน (เรียกว่า "โหนด"); โหนดจะเก็บค่าสำหรับคีย์ทั้งหมดที่มันเป็นความรับผิดชอบ คอร์ดระบุว่ากุญแจที่ได้รับมอบหมายไปยังต่อมน้ำและวิธีโหนดสามารถค้นพบค่าสำหรับคีย์ได้รับเป็นครั้งแรกโดยตำแหน่งโหนดที่รับผิดชอบในการที่สำคัญที่.
คอร์ดเป็นหนึ่งในโปรโตคอลตารางแฮชกระจายเดิมสี่พร้อมกับสามารถ Tapestry และ ขนมปิ้ง มันถูกนำมาใช้ในปี 2001 โดยไอออน Stoica, โรเบิร์ตมอร์ริส, เดวิด Karger ฟรานส์ Kaashoek และฮาริบาลาคและได้รับการพัฒนาที่ MIT. [1]
ภาพรวม
โหนดและคีย์จะกำหนด { displaystyle m} ระบุ M-bit ใช้คร่ำเครียดที่สอดคล้องกัน . อัลกอริทึม SHA-1 เป็นฟังก์ชั่นฐานคร่ำเครียดสำหรับคร่ำเครียดที่สอดคล้องกัน คร่ำเครียดอย่างสม่ำเสมอเป็นส่วนที่สำคัญของความทนทานและประสิทธิภาพของคอร์ดเพราะทั้งสองปุ่มและโหนด (ในความเป็นจริงที่อยู่ IP ของพวกเขา) จะกระจายอย่างสม่ำเสมอในพื้นที่ระบุเช่นเดียวกันกับความเป็นไปได้เล็กน้อยจากการปะทะกัน ดังนั้นจึงยังช่วยให้ต่อมน้ำจะเข้าร่วมและออกจากเครือข่ายได้โดยไม่ต้องหยุดชะงัก ในโปรโตคอลโหนดเป็นคำที่ใช้ในการอ้างถึงทั้งสองโหนดตัวเองและตัวระบุ (ID) โดยไม่คลุมเครือ ดังนั้นเป็นกุญแจสำคัญในคำว่า.
โดยใช้โปรโตคอลค้นหาคอร์ดโหนดและคีย์จะจัดในวงกลมระบุว่ามีมากที่สุด { displaystyle 2 ^ {m}} 2 ^ {m} โหนดตั้งแต่ { displaystyle 0} { displaystyle 0} เป็น { displaystyle 2 ^ {m}} -1 2 ^ M - 1 ({ displaystyle m} เมตรควรมีขนาดใหญ่พอที่จะหลีกเลี่ยงการปะทะ.)
แต่ละโหนดมีทายาทและผู้บุกเบิก ผู้สืบทอดไปยังโหนดเป็นโหนดต่อไปในวงกลมระบุในทิศทางตามเข็มนาฬิกา บรรพบุรุษเป็นทวนเข็มนาฬิกา หากมีโหนดสำหรับแต่ละ ID ที่เป็นไปได้สืบต่อจากโหนด 0 คือโหนดที่ 1 และบรรพบุรุษของโหนด 0 คือโหนด { displaystyle 2 ^ {m}} -1 2 ^ M - 1; แต่ตามปกติมี "หลุม" ในลำดับ ยกตัวอย่างเช่นทายาทของโหนด 153 อาจจะเป็นโหนด 167 (และต่อมน้ำ 154-166 ไม่อยู่); ในกรณีนี้บรรพบุรุษของโหนด 167 จะ 153 โหนด
แนวคิดของทายาทสามารถนำมาใช้สำหรับคีย์เช่นกัน โหนดตัวตายตัวแทนของคีย์ { displaystyle K} k เป็นโหนดแรกที่มี ID เท่ากับ { displaystyle K} K or ดังนี้ { displaystyle K} K ในวงกลมระบุ, แสดงโดย { displaystyle ทายาท (k)} ทายาท (k) ที่สำคัญทุกคนจะได้รับมอบหมายให้ (เก็บไว้ที่) โหนทายาทของตนเพื่อให้มองขึ้นไปคีย์ { displaystyle K} k คือการค้นหา { displaystyle ทายาท (k)} ทายาท (k).
ตั้งแต่ทายาท (หรือบรรพบุรุษ) ของโหนด อาจหายไปจากเครือข่าย (เพราะความล้มเหลวหรือการเดินทาง) ที่แต่ละโหนดบันทึกทั้งส่วนของวงกลมที่อยู่ติดกับมันกล่าวคือ { displaystyle r} โหนด R ก่อนหน้านั้นและ { displaystyle r} โหนด R ต่อไปนี้มัน ผลการค้นหารายการนี้ในโอกาสสูงที่โหนดสามารถที่จะถูกต้องค้นหาทายาทหรือบรรพบุรุษของมันแม้ว่าเครือข่ายในคำถามที่ทนทุกข์ทรมานจากอัตราความล้มเหลวสูง.
พิธีสารรายละเอียด
แบบสอบถามพื้นฐาน [แก้ไข]
การใช้งานหลักของโพรโทคอคอร์ดคือการค้นหา ที่สำคัญจากลูกค้า (โดยทั่วไปโหนดเช่นกัน) คือเพื่อค้นหา { displaystyle ทายาท (k)} ทายาท (k) วิธีการขั้นพื้นฐานคือการผ่านแบบสอบถามไปยังทายาทของโหนดถ้ามันไม่สามารถหาที่สำคัญในประเทศ นี้จะนำไปสู่การ { displaystyle O (n)} O (n) แบบสอบถามเวลา.
ตารางนิ้ว [แก้ไข]
เพื่อหลีกเลี่ยงการค้นหาเชิงเส้นข้างต้นคอร์ดดำเนินวิธีการค้นหาได้เร็วขึ้นโดยกำหนดให้แต่ละโหนดเพื่อให้ตารางนิ้วที่มีถึง { displaystyle m} รายการ M ว่า { displaystyle ฉัน ^ {TH}} ฉัน ^ {TH} รายการของโหนด { displaystyle n} n จะมี { displaystyle ทายาท ((N + 2 ^ {i-1}) { BMOD {, }} 2 ^ {m})} ทายาท ((n + 2 ^ {i-1}) , BMOD , ^ 2 เมตร) รายการแรกของตารางนิ้วเป็นจริงทายาททันทีโหนด (และดังนั้นจึงสนามทายาทพิเศษไม่จำเป็น) เวลาโหนดต้องการที่จะมองขึ้นคีย์ { displaystyle K} K ทุกคนก็จะผ่านแบบสอบถามไปยังผู้สืบทอดที่อยู่ใกล้หรือบรรพบุรุษ (ขึ้นอยู่กับตารางนิ้ว) ของ { displaystyle K} K ในตารางนิ้วของตน (ที่ "ใหญ่ที่สุด "หนึ่งในวงกลมที่มีหมายเลขมีขนาดเล็กกว่า { displaystyle K} k) จนกว่าโหนดพบที่สำคัญคือการเก็บไว้ในทายาทของมันทันที.
ด้วยเช่นตารางนิ้วจำนวนโหนดที่จะต้องได้รับการติดต่อเพื่อหาผู้สืบทอด ในเครือข่าย N-โหนด { displaystyle O ( log n)} O ( log n) (ดูหลักฐานด้านล่าง.)
โหนดเข้าร่วม [แก้ไข]
เมื่อใดก็ตามที่โหนดใหม่เข้าร่วมสามคงที่ควรได้รับการเก็บรักษาไว้ (สองคนแรกให้แน่ใจว่าถูกต้องและคนสุดท้ายที่ช่วยให้การสอบถามเร็ว):
น. ของแต่ละโหนดจุดทายาทผู้สืบทอดของมันทันทีอย่างถูกต้อง
ที่สำคัญแต่ละคนเป็น เก็บไว้ใน { displaystyle ทายาท (k)} ทายาท (k).
ตารางนิ้วของแต่ละโหนดควรถูกต้อง.
เพื่อตอบสนองความคงที่เหล่าฟิลด์บรรพบุรุษจะถูกเก็บไว้สำหรับแต่ละโหนด เป็นผู้สืบทอดเป็นรายการแรกของตารางนิ้วที่เราไม่จำเป็นต้องรักษาข้อมูลนี้แยกใด ๆ เพิ่มเติม งานต่อไปนี้ควรจะทำสำหรับโหนดใหม่เข้าร่วม { displaystyle n} N:
เริ่มต้นโหนด
การแปล กรุณารอสักครู่..

ในการคำนวณ คอร์ดคือโปรโตคอลและขั้นตอนวิธีแบบกระจายสำหรับตารางแฮช . ตารางแฮชกระจายเก็บค่าคีย์คู่ โดยการกำหนดคีย์คอมพิวเตอร์เครื่องอื่น ( เรียกว่า " จุด " ) ; ปมจะเก็บค่าของคีย์ทั้งหมดที่เป็นผู้รับผิดชอบ คอร์ดระบุวิธีการคีย์ให้กับโหนดและโหนดสามารถค้นพบคุณค่าเพื่อให้คีย์โดยก่อนติดตั้งโหนดต้องรับผิดชอบกุญแจนั่นคอร์ดเป็นหนึ่งในสี่เดิมกระจายตารางแฮชโปรโตคอลพร้อมกับสามารถ , พรม , และขนมอบ มันได้รับการแนะนำในปี 2001 โดยไอออน stoica โรเบิร์ตมอร์ริส , เดวิด คาร์เกอร์ , ภาษาฝรั่ง kaashoek และ Hari Balakrishnan , และพัฒนา [ 1 ] ที่ MITรายละเอียดโหนดและคีย์จะกำหนด { M } displaystyle m-bit ระบุใช้ที่สอดคล้องกันการ hashing . ขั้นตอนวิธีการแฮชฟังก์ชัน sha-1 เป็นฐานให้สอดคล้องการ hashing . ที่สอดคล้องการ hashing เป็นหนึ่งเพื่อความทนทานและประสิทธิภาพของคอร์ด เพราะทั้งคีย์และโหนด ( ในความเป็นจริงของพวกเขาที่อยู่ IP ) เป็นจุดกระจายในแบบระบุพื้นที่ที่มีความเป็นไปได้เล็กน้อยจากการปะทะกัน ดังนั้น , มันยังช่วยให้โหนดเข้าและออกจากเครือข่าย โดยไม่มีการหยุดชะงัก ในขั้นตอน ระยะเวลา โหนดถูกใช้เพื่ออ้างถึงทั้งสองโหนดตัวเองและระบุ ( ID ) โดยไม่มีความคลุมเครือ ดังนั้นคำว่ากุญแจการใช้คอร์ดค้นหาโปรโตคอล , โหนดและปุ่มเรียงกันเป็นวงกลม ที่ระบุมีเวลามากที่สุด { displaystyle 2 ^ { M } } 2 ^ { M } { displaystyle โหนดตั้งแต่ 0 } { 0 } { displaystyle displaystyle 2 ^ { M } 1 } 2 ^ - M - 1 ( displaystyle { M } M ควรมีขนาดใหญ่เพียงพอที่จะหลีกเลี่ยงการปะทะกัน )แต่ละโหนดมีผู้สืบทอดและบรรพบุรุษ . ทายาทของโหนดเป็นโหนดถัดไปในพิกัดวงกลมในทิศทางตามเข็มนาฬิกา บรรพบุรุษเป็นเคาน์เตอร์ตามเข็มนาฬิกา หากมีโหนดแต่ละเป็นไปได้ ID , ทายาทของโหนดเป็นโหนด 0 1 และบรรพบุรุษของโหนดเป็นโหนด 0 { displaystyle 2 ^ { M } 1 } 2 ^ - M - 1 ; อย่างไรก็ตาม โดยปกติมี " รู " ในลำดับ ตัวอย่างเช่น ผู้สืบทอดตำแหน่งของโหนดที่โหนดและโหนดจะ 167 จาก 154 ใน 166 ไม่อยู่ ) ; ในกรณีนี้ บรรพบุรุษของโหนดเป็นโหนด 167 153แนวคิดของทายาทสามารถใช้กุญแจเช่นกัน ผู้สืบทอดโหนดของคีย์ { K } K เป็นครั้งแรก displaystyle โหนดที่มี ID เท่ากับ { K } { displaystyle K หรือตาม displaystyle K } K ในตัววงกลม แทน โดย displaystyle ( K ) } { ทายาทผู้สืบทอด ( K ) ทุกคีย์ที่มอบหมายให้ ( อุณหภูมิ ) ของทายาทโหนดเพื่อหากุญแจ { displaystyle K } K คือแบบสอบถาม { displaystyle ทายาทผู้สืบทอด ( K ) } ( K )เพราะผู้สืบทอด ( หรือบรรพบุรุษ ) ของโหนดอาจหายไปจากเครือข่าย ( เนื่องจากความล้มเหลวหรือออกเดินทาง ) , แต่ละโหนดประวัติส่วนทั้งหมดของเวทย์ที่อยู่ติดกันนั้น เช่น displaystyle R } { R โหนดก่อนหน้านี้และ displaystyle R } { R โหนดดังนี้ครับ รายการนี้ผลในความเป็นไปได้สูงที่โหนดสามารถถูกค้นหาของทายาท หรือบรรพบุรุษ แม้ว่าคำถามเครือข่ายในทนทุกข์ทรมานจากอัตราความล้มเหลวสูงรายละเอียด โปรโตคอล[ แก้ไข ] แบบสอบถามเบื้องต้นหลักการใช้งานของคอร์ด ( แบบสอบถามคีย์จากลูกค้า ( โดยทั่วไปโหนดเช่นกัน ) นั่นคือ หา displaystyle ( K ) } { ทายาทผู้สืบทอด ( K ) แนวคิดพื้นฐานคือการส่งแบบสอบถามไปยังทายาทของโหนด หากไม่สามารถหากุญแจสำคัญในประเทศ นี้จะนำไปสู่ { displaystyle O ( n ) } O ( n ) เวลาสอบถามนิ้วโต๊ะ [ แก้ไข ]หลีกเลี่ยงเส้นตรงค้นหาข้างบน คอร์ด ใช้วิธีค้นหาได้เร็วขึ้น โดยให้แต่ละโหนดเก็บตารางนิ้วที่มีถึง { M } M displaystyle รายการ { displaystyle ผม ^ ^ { { th } } ฉันรายการของโหนด TH } { n } n displaystyle จะประกอบด้วย displaystyle ผู้สืบทอด ( N + { 2 ^ { i-1 } ) { mod { } } 2 ^ , { M } ) } ผู้สืบทอด ( ( n + 2 ^ { } mod i-1 ) 2 ^ m ) รายการแรกของตารางนิ้วจริงๆ ของโหนดทันที ( และดังนั้นจึงเป็นทายาทผู้สืบทอดด้านเสริมไม่ต้องการ ) เวลาที่ทุกโหนดที่ต้องการหา คีย์ displaystyle K } { K ก็จะส่งแบบสอบถามไปยังทายาทใกล้หรือบรรพบุรุษ ( ขึ้นอยู่กับนิ้วโต๊ะ ) { displaystyle K } K ในนิ้วโต๊ะ ( " ใหญ่ที่สุด " หนึ่งบนวงกลมซึ่งมีขนาดเล็กกว่า displaystyle ID { K } K ) จนกว่าโหนดพบว่าคีย์จะถูกเก็บไว้ในตำแหน่งของมันทันทีด้วยเช่นนิ้วตาราง จำนวนของจุดที่ต้องมีการติดต่อหาผู้สืบทอดใน n-node เครือข่าย { displaystyle O ( log n ) } O ( log n ) ( ดูหลักฐานด้านล่าง )โหนดร่วม [ แก้ไข ]เมื่อใดก็ตามที่โหนดใหม่รวม 3 ผลยืนยงควรจะรักษา ( สองคนแรกตรวจสอบความถูกต้องและสุดท้ายเก็บข้อมูลได้อย่างรวดเร็ว )ของโหนดในแต่ละจุดของผู้สืบทอดทายาททันทีได้อย่างถูกต้องแต่ละคีย์จะถูกเก็บไว้ใน displaystyle ( K ) } { ทายาทผู้สืบทอด ( K )ของโหนดแต่ละนิ้วโต๊ะควรจะถูกต้องเพื่อตอบสนองผลยืนยงเหล่านี้ บรรพบุรุษเขตมีการรักษาสำหรับแต่ละโหนด ในฐานะทายาท คือ รายการแรกของนิ้วตาราง เราไม่ต้องการการรักษาด้านนี้แยกต่างหากอีก งานต่อไปนี้ควรทำสำหรับโหนดใหม่เข้าร่วม { displaystyle n } N :เริ่มการทำงานของปม
การแปล กรุณารอสักครู่..
