Raft'ı bitirmek: ZooKeeper konsensüsünden yerel Lux Quasar'a
Hanzo Datastore, ClickHouse Keeper altındaki NuRaft motorunu Lux Quasar ile değiştirir — lidersiz, kuantum sonrası konsensüs, doğrudan C++ sunucusuna bağlanır — ve çoğaltmanın konuştuğu ZooKeeper API'sini yerinde bırakır.

Bu sayfada
Hanzo Datastore çoğaltılmış tabloları bugün ClickHouse'un yaptığı gibi koordine eder: sunucu sürecinin içinde Raft çalıştıran, gömülü, ZooKeeper ile uyumlu bir Keeper. Çalışır. Yığındaki son klasik, liderli ve kuantum öncesi bileşen de odur. Bu yazı onu nasıl bitirdiğimizi anlatır — ve «ZK'yi öldürmek» çoğaltmayı yeniden yazmak değildir.
Keeper'ı ayrıştırmak: API ve motor
«ZooKeeper'ı değiştir» dendiğinde ilk tepki, her Replicated*MergeTree öğesine dokunmak gerektiğini düşünmektir. Dokunmanıza gerek yok, çünkü ClickHouse Keeper zaten tek bir demonun içinde örülmüş iki ayrılabilir şeydir:
-
ZooKeeper API — sıralı düğümler, sürümler ve watch'lar içeren doğrusallaştırılabilir bir anahtar-değer ağacı. Kaynakta bu
KeeperStorage'dır,KeeperStateMachineile sarılır (src/Coordination/KeeperStateMachine.h,class IKeeperStateMachine : public nuraft::state_machine). Bu sözleşmedir. Her çoğaltılmış tablo, hersystem.zookeepersorgusu, her lider seçimi bunu konuşur. -
Konsensüs motoru — yazma isteklerinin akışını alan, düğümlerin bir kuorumunu sıraları üzerinde anlaşmaya vardıran ve sonra durum makinesinde
commit(log_idx, data)çağıran şey, hem de kararlaştırılan sırayla. Bugün bu NuRaft'tır:KeeperServer::launchRaftServer(src/Coordination/KeeperServer.cpp) birnuraft::raft_server, birasio_service, birKeeperStateManagerve birKeeperLogStorekurar.
Temiz gözlem — Rich Hickey'ninki — KeeperStateMachine'in zaten genel konsensüs arayüzüne karşı yazılmış olmasıdır (nuraft::state_machine: pre_commit, commit, rollback, anlık görüntüler). Altında Raft olduğunu bilmez ve umursamaz. Motor, API'ye kaynaklanmış bir yer değil, değiştirebileceğiniz bir değerdir.
Öyleyse: durum makinesini tutun, motoru değiştirin. Çoğaltmanın dayandığı ZooKeeper API'si olduğu gibi kalır. Ölenler NuRaft, lider seçimi ve ayrı bir Raft kuorumu çalıştırma zorunluluğudur.
Yerine ne geçiyor
Motor Quasar olur — Lux içinden lidersiz, DAG tabanlı, kuantum sonrası konsensüs. Quasar'ın buradaki işi Raft'ın işiyle aynıdır: bir günlüğün sırası üzerinde anlaşmak ve bir girdinin ne zaman kesin olduğunu bildirmek. Fark, anlaşmanın biçimindedir — devredilecek tek bir lider yok, klasik imzalar yerine ML-DSA imzaları var ve kesinlik sabit bir dönemin çoğunluğu değil, bir güven eşiğidir.
Can alıcı nokta: Quasar, süreç olarak çağırdığımız bir Go servisi değildir. C++'a hazır bir ABI ile yerel bir C motoru getirir (libluxconsensus). Datastore sunucusu C++'tır. Motor bu yüzden aynı sürecin içine bağlanır — sidecar yok, bir koordinatöre ağ sıçraması yok, çalışma zamanında ikinci bir dil yok.
Dikiş kanıtlandı — gerçek durum makinesine karşı
Bu bir taslak değil ve artık bir model de değil. ClickHouse sunucusunun gerçek kütüphanesini (libdbms.a) bağlayan ve üretim KeeperStateMachine<KeeperMemoryStorage> sınıfını süren bir program kurduk — ReplicatedMergeTree'in koordine olduğu sınıfın ta kendisi — tümüyle Quasar üzerinde, sıralama yolunda NuRaft yok. Datastore ağacında src/Coordination/examples/keeper_quasar_poc.cpp yolunda durur ve gerçek bir Linux konağında derlenip çalışır (aarch64, clang-21).
Akış, dağıtıcının NuRaft'ı bugün nasıl sürdüğüne sadıktır — iki evre, istek eklendiğinde preprocess ve konsensüs sırayı kilitlediğinde 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
On istekli bir ReplicatedMergeTree koordinasyon dizisine karşı çalıştırıldığında — replika kaydı, blok numarası artışları, lider seçimi — her isteği önceden işler, Quasar üzerinden sıralar, kesinleştirir, gerçek KeeperStorage içine commit eder ve oluşan ağacın tam doğru olduğunu, her birinin bir kez, konsensüs sırasında uygulandığını doğrular:
== REAL Keeper state machine reached consensus on Quasar — zero Raft, zero ZK ensemble ==
Altında, libluxconsensus bağlayıp tek bir bloğu kesinleştiren asgari C ABI gösterimi durur (pkg/c/examples/cpp_consumer.cpp, make test-cpp) — aynı motor, ClickHouse bağımlılığı olmadan. İkisi de yeniden üretilebilir; Datastore örneği isteğe bağlıdır (-DENABLE_EXAMPLES=1 -DLUXCONSENSUS_DIR=...) ve normal bir derlemenin parçası değildir.
Keeper'a bire bir eşleyin:
| Keeper / NuRaft bugün | Quasar yereli |
|---|---|
nuraft::raft_server günlüğü sıralar | lux_chain_t günlüğü sıralar |
KeeperLogStore / Changelog | Quasar'ın DAG günlüğü |
| Raft lider seçimi | lidersiz güven oylaması |
state_machine->commit(idx, data) | aynı çağrı, is_accepted üzerinde ateşlenir |
| klasik imzalar, sabit dönemli lider | ML-DSA imzaları, lider yok |
| işletilecek ayrı bir ZK/Keeper kuorumu | süreç içinde, sunucunun içinde konsensüs |
KeeperStateMachine::commit birleşim noktasıdır. NuRaft onu bugün çağırır; Quasar sürücüsü yarın aynı yöntemi çağırır. Durum makinesi farkı anlayamaz — ve bunu bir değiş tokuş yapan, yeniden yazım yapmayan özellik tam olarak budur.
Neden «kuantum sonrası»ndan öte önemli
- Lider yok. Raft'ta dönem başına seçilmiş tek bir lider vardır; düşmesi, yeniden seçime kadar yazmaları durdurur. Quasar'ın lidersiz anlaşması bu hat başı bağımlılığını kaldırır.
- Koşturulacak ikinci bir kuorum yok. Koordinasyon, hazırladığınız, izlediğiniz ve yedeğini aldığınız ayrı bir sistem olmaktan çıkar. Sunucunun kendisidir.
- Yapısı gereği kuantum sonrası. Anlaşmayı koruyan imzalar klasik eğriler değil ML-DSA'dır, bu yüzden gelecekteki bir kuantum hasım konsensüs iletilerini taklit edemez.
- Tek bir taşıma öyküsü. Yönün geri kalanıyla birleşir — şimdi yerel TCP/HTTP, sonra ZAP ve zincirlerin kullandığı aynı Lux ilkelleri.
Dürüst durum
Yukarıdaki mimari gerçektir ve kanıt artık üretim KeeperStateMachine üzerinde çalışır — bir model üzerinde değil —, gerçek bir Linux konağında derlenmiş ve yeşildir. Kalan, motorun içindeki değiş tokuştur: Quasar konsensüs arka ucunu NuRaft'ın yanında KeeperServer içine almak, onu varsayılan yapmak ve sonra KeeperServer'ın yaptığı geri kalanı — anlık görüntüler, kurtarma, oturum zaman aşımı, yeniden yapılandırma — Coordination test takımının tümü yeşilken onun üzerine taşımak. Bu gerçek iştir ve commit yolunu kanıtladığımız gün size Raft gitti demeyeceğiz. Size dikişin gerçek tiplere karşı tuttuğunu, birleşim noktasının KeeperStateMachine::commit olduğunu ve oyunun tamamının orada olduğunu söylüyoruz.
İndiğinde contrib/NuRaft/ ve Raft motoru ağaçtan çıkar. ZooKeeper API'si, çoğaltma onu konuştuğu sürece kalır. Son kuantum öncesi bileşen, tek bir MergeTree dokunulmadan böyle bitirilir.
- Datastore: github.com/hanzoai/datastore
- Lux konsensüsü: github.com/luxfi/consensus
Devamını oku

Hanzo Datastore ile tanışın: kuantum sonrasına hazır bir OLAP motoru
ClickHouse türevli sütunlu bir ambar. Hanzo S3 üzerinde depolama ile hesaplama ayrıldı, profil güdümlü ve bağlama zamanı eniyilemesiyle bellek yaklaşık yarıya indi, gRPC söküldü ve lidersiz kuantum sonrası eşgüdüme giden bir yol açıldı.

Yönlendirici, kayıt defterinin kendisidir
Hanzo Cloud'da depoya girmiş bir OpenAPI dosyası yoktur. Canlı rota tablosu kaynaktır, üç biçimde yansıtılır ve herhangi bir izdüşüm kayarsa bir birebir eşleme testi derlemeyi düşürür. İstek anında süreç başına üretilen, 963 yol üzerinde 1,362 işlem.

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.