ยุติ Raft ในกระบวนการเดียวกัน: จากฉันทามติ ZooKeeper สู่ Lux Quasar ที่เชื่อมแบบเนทีฟ
Hanzo Datastore เปลี่ยนเครื่องยนต์ NuRaft ใต้ ClickHouse Keeper เป็น Lux Quasar ซึ่งเป็นฉันทามติไร้ผู้นำยุคหลังควอนตัมที่ลิงก์ตรงเข้าไปในเซิร์ฟเวอร์ C++ พร้อมคง ZooKeeper API ที่การทำสำเนาพูดด้วยไว้เหมือนเดิม

ในหน้านี้
Hanzo Datastore ประสานตารางที่ทำสำเนาในวันนี้แบบที่ ClickHouse ทำ: Keeper ที่ฝังในตัว เข้ากันได้กับ ZooKeeper และรัน Raft ภายในกระบวนการของเซิร์ฟเวอร์ มันใช้ได้ และมันยังเป็นชิ้นส่วนคลาสสิกชิ้นสุดท้ายที่อิงผู้นำและอยู่ก่อนยุคควอนตัมในสแต็กนี้ บทความนี้อธิบายว่าเราจะยุติมันอย่างไร และทำไม "ยุติ ZK" จึง ไม่ หมายถึงการเขียนการทำสำเนาใหม่
แยก Keeper: ส่วนต่อประสานกับเครื่องยนต์
สัญชาตญาณเมื่อได้ยินว่า "แทนที่ ZooKeeper" คือการนึกว่าต้องไปแตะทุก Replicated*MergeTree คุณไม่ต้องทำ เพราะ ClickHouse Keeper เป็นสองสิ่งที่แยกจากกันได้อยู่แล้ว แต่ถักเข้าด้วยกันในดีมอนตัวเดียว:
-
ZooKeeper API — ต้นไม้คีย์-ค่าที่เรียงลำดับเชิงเส้นได้ พร้อมโหนดลำดับ เวอร์ชัน และวอตช์ ในซอร์สสิ่งนี้คือ
KeeperStorageซึ่งถูกห่อโดยKeeperStateMachine(src/Coordination/KeeperStateMachine.h,class IKeeperStateMachine : public nuraft::state_machine) นี่คือ สัญญา ทุกตารางที่ทำสำเนา ทุกคิวรีsystem.zookeeperทุกการเลือกผู้นำ พูดด้วยสิ่งนี้ -
เครื่องยนต์ฉันทามติ — สิ่งที่รับสายคำขอเขียน ให้โควรัมของโหนดตกลงลำดับ แล้วเรียก
commit(log_idx, data)บนเครื่องสถานะตามลำดับที่ตกลงนั้น วันนี้สิ่งนั้นคือ NuRaft:KeeperServer::launchRaftServer(src/Coordination/KeeperServer.cpp) สร้างnuraft::raft_server,asio_service,KeeperStateManager, และKeeperLogStore
ข้อสังเกตที่สะอาด ข้อสังเกตแบบ Rich Hickey คือ KeeperStateMachine ถูกเขียนไว้กับส่วนต่อประสานฉันทามติ ทั่วไป อยู่แล้ว (nuraft::state_machine: pre_commit, commit, rollback, สแนปช็อต) มันไม่รู้และไม่สนว่า Raft อยู่ข้างใต้ เครื่องยนต์เป็นค่าที่สลับได้ ไม่ใช่จุดที่เชื่อมติดเข้ากับ API
ดังนั้น: เก็บเครื่องสถานะไว้ เปลี่ยนเครื่องยนต์ ZooKeeper API ที่การทำสำเนาพึ่งพาอยู่รอดโดยไม่ถูกแตะ สิ่งที่ตายคือ NuRaft การเลือกผู้นำ และเงื่อนไขที่ต้องรันโควรัม Raft แยกต่างหาก
อะไรมาแทน
เครื่องยนต์กลายเป็น Quasar — ฉันทามติไร้ผู้นำ อิง DAG ยุคหลังควอนตัม จาก Lux งานของ Quasar ที่นี่เหมือนงานของ Raft: ตกลงลำดับของล็อก และส่งสัญญาณเมื่อรายการหนึ่งสิ้นสุด ความต่างอยู่ที่วิธีตกลง ไม่มีผู้นำเดียวให้สลับเมื่อล้ม ลายเซ็น ML-DSA แทนลายเซ็นคลาสสิก และความสิ้นสุดแบบขีดความเชื่อมั่นแทนเสียงข้างมากของเทอมคงที่
สำคัญยิ่งคือ Quasar ไม่ใช่บริการ Go ที่เราเรียกออกไปข้างนอก มันส่งเครื่องยนต์ C เนทีฟพร้อม ABI ที่พร้อมสำหรับ C++ (libluxconsensus) เซิร์ฟเวอร์ Datastore เป็น C++ ดังนั้นเครื่องยนต์ลิงก์ เข้ากระบวนการเดียวกัน ไม่มีไซด์คาร์ ไม่มีการกระโดดเครือข่ายไปหาผู้ประสาน ไม่มีภาษาที่สองตอนรันไทม์
รอยต่อพิสูจน์แล้ว กับเครื่องสถานะจริง
นี่ไม่ใช่ภาพร่าง และไม่ใช่โมเดลอีกต่อไป เราสร้างโปรแกรมที่ลิงก์ไลบรารีเซิร์ฟเวอร์ ClickHouse ตัวจริง (libdbms.a) และขับ KeeperStateMachine<KeeperMemoryStorage> ของโปรดักชัน ซึ่งเป็นคลาสเดียวกับที่ ReplicatedMergeTree ใช้ประสาน ทั้งหมดบน Quasar โดย NuRaft ไม่อยู่ในเส้นทางจัดลำดับ มันอยู่ในต้นไม้ Datastore ที่ src/Coordination/examples/keeper_quasar_poc.cpp และถูกสร้างพร้อมรันบนโฮสต์ Linux จริง (aarch64, clang-21)
ลำดับงานซื่อตรงต่อวิธีที่ดิสแพตเชอร์ขับ NuRaft ในวันนี้ สองช่วง คือ preprocess เมื่อคำขอถูกต่อท้าย และ commit เมื่อฉันทามติสรุปลำดับ:
state_machine->preprocess(rfs, /*lock_mutex*/ true); // append-time, pre-consensus (≙ nuraft pre_commit)
auto buf = IKeeperStateMachine::getZooKeeperLogEntry(rfs); // the real ZooKeeper log entry
lux_chain_add_block(chain, &blk); // the entry rides Quasar (the slot raft_server occupies)
lux_consensus_process_vote(...); // validators agree — no leader
lux_consensus_is_accepted(chain, id, &accepted);
state_machine->commit(height, *buf); // finality → the real KeeperStorage mutates, in order
เมื่อรันกับลำดับประสานสิบคำขอของ ReplicatedMergeTree ได้แก่การลงทะเบียนเรพลิกา การเพิ่มหมายเลขบล็อก และการเลือกผู้นำ มันประมวลผลก่อนทุกคำขอ จัดลำดับผ่าน Quasar สรุป แล้วคอมมิตเข้า KeeperStorage จริง และยืนยันว่าต้นไม้ที่ได้ถูกต้องตรงทุกประการ แต่ละรายการครั้งเดียว ตามลำดับฉันทามติ:
== REAL Keeper state machine reached consensus on Quasar — zero Raft, zero ZK ensemble ==
ข้างใต้คือการสาธิต C-ABI ขนาดเล็กสุด (pkg/c/examples/cpp_consumer.cpp, make test-cpp) ที่ลิงก์ libluxconsensus และสรุปบล็อกเดียว เป็นเครื่องยนต์เดียวกัน โดยไม่พึ่ง ClickHouse ทั้งสองทำซ้ำได้ ตัวอย่างของ Datastore เป็นทางเลือก (-DENABLE_EXAMPLES=1 -DLUXCONSENSUS_DIR=...) และไม่เคยเป็นส่วนของบิลด์ปกติ
จับคู่เข้ากับ Keeper ทีละคู่:
| Keeper / NuRaft วันนี้ | เนทีฟบน Quasar |
|---|---|
nuraft::raft_server จัดลำดับล็อก | lux_chain_t จัดลำดับล็อก |
KeeperLogStore / Changelog | ล็อก DAG ของ Quasar |
| การเลือกผู้นำของ Raft | การโหวตความเชื่อมั่นไร้ผู้นำ |
state_machine->commit(idx, data) | การเรียกเดียวกัน ยิงเมื่อ is_accepted |
| ลายเซ็นคลาสสิก ผู้นำแบบเทอมคงที่ | ลายเซ็น ML-DSA ไม่มีผู้นำ |
| โควรัม ZK/Keeper แยกต่างหากสำหรับเดินเครื่อง | ฉันทามติในกระบวนการ ในเซิร์ฟเวอร์ |
KeeperStateMachine::commit คือจุดเชื่อม NuRaft เรียกมันวันนี้ ตัวขับ Quasar จะเรียกเมธอดเดียวกันพรุ่งนี้ เครื่องสถานะแยกความต่างไม่ออก และนั่นคือคุณสมบัติที่ทำให้สิ่งนี้เป็นการสลับ ไม่ใช่การเขียนใหม่
ทำไมเรื่องนี้จึงสำคัญเกินกว่า "หลังควอนตัม"
- ไม่มีผู้นำ Raft มีผู้นำที่ได้รับเลือกหนึ่งคนต่อเทอม ความล้มเหลวของเขาหยุดการเขียนจนกว่าจะเลือกใหม่ ข้อตกลงไร้ผู้นำของ Quasar เอาการพึ่งหัวคิวนั้นออก
- ไม่มีโควรัมที่สองให้เดินเครื่อง การประสานเลิกเป็นระบบแยกที่คุณต้องจัดหา เฝ้าดู และสำรอง มันคือตัวเซิร์ฟเวอร์
- หลังควอนตัมโดยโครงสร้าง ลายเซ็นที่ปกป้องข้อตกลงคือ ML-DSA ไม่ใช่เส้นโค้งคลาสสิก ดังนั้นคู่ต่อสู้ควอนตัมในอนาคตปลอมข้อความฉันทามติไม่ได้
- เรื่องขนส่งเรื่องเดียว มันประกอบกับทิศทางที่เหลือ TCP/HTTP เนทีฟตอนนี้ ZAP ถัดไป และพรีมิทีฟ Lux ชุดเดียวกับที่เชนใช้
สถานะที่พูดตรง
สถาปัตยกรรมข้างบนเป็นของจริง และบทพิสูจน์ตอนนี้รันกับ KeeperStateMachine ของโปรดักชัน ไม่ใช่โมเดล สร้างและผ่านบนโฮสต์ Linux จริง สิ่งที่เหลือคือการสลับในเครื่องยนต์: นำแบ็กเอนด์ฉันทามติ Quasar เข้าไป ข้างใน KeeperServer คู่กับ NuRaft ทำให้มันเป็นค่าเริ่มต้น แล้วย้ายสิ่งที่ KeeperServer ทำที่เหลือ สแนปช็อต การกู้คืน การหมดอายุเซสชัน การปรับโครง ขึ้นไปบนมันโดยชุดทดสอบ Coordination ทั้งชุดเป็นสีเขียว นั่นคืองานจริง และเราจะไม่บอกว่า Raft หายไปในวันที่พิสูจน์เส้นทางคอมมิต เราบอกว่ารอยต่อทนต่อชนิดจริง จุดเชื่อมคือ KeeperStateMachine::commit และนั่นคือทั้งเกม
เมื่อมันลงสู่ต้นไม้ contrib/NuRaft/ และเครื่องยนต์ Raft จะออกจากต้นไม้ ZooKeeper API อยู่ต่อตราบใดที่การทำสำเนายังพูดด้วยมัน นั่นคือวิธียุติชิ้นส่วนก่อนควอนตัมชิ้นสุดท้ายโดยไม่แตะ MergeTree สักตัว
- Datastore: github.com/hanzoai/datastore
- ฉันทามติ Lux: github.com/luxfi/consensus
อ่านต่อ

ขอแนะนำ Hanzo Datastore: เอนจิน OLAP แบบคอลัมน์ที่พร้อมสำหรับยุคหลังควอนตัม
คลังข้อมูลแบบคอลัมน์ที่สืบทอดจาก ClickHouse สร้างใหม่โดยแยกที่เก็บข้อมูลออกจากการคำนวณบน Hanzo S3 ปรับให้เหมาะด้วยโปรไฟล์และตอนลิงก์จนหน่วยความจำเหลือราวครึ่งหนึ่ง ถอด gRPC ออกแล้ว และมีเส้นทางสู่การประสานงานแบบไม่มีผู้นำในยุคหลังควอนตัม

เราเตอร์คือรีจิสทรี
Hanzo Cloud ไม่มีไฟล์ OpenAPI ที่เช็คอินไว้ ตารางเส้นทางที่กำลังทำงานคือแหล่งที่มา ถูกฉายสามทาง และการทดสอบการสมนัยสองทางทำให้บิลด์ล้มถ้าภาพฉายใดเลื่อน 1,362 การดำเนินการบน 963 เส้นทาง สร้างต่อโปรเซสในเวลาที่มีคำขอ

Jin 2.0: The Next Generation of Multimodal AI
Announcing Jin 2.0, a major upgrade to our unified multimodal AI architecture with expanded capabilities and improved performance.