Hanzo betasına katıl, ücretli her planda %50 indirim kazan

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:

  1. 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, KeeperStateMachine ile sarılır (src/Coordination/KeeperStateMachine.h, class IKeeperStateMachine : public nuraft::state_machine). Bu sözleşmedir. Her çoğaltılmış tablo, her system.zookeeper sorgusu, her lider seçimi bunu konuşur.

  2. 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) bir nuraft::raft_server, bir asio_service, bir KeeperStateManager ve bir KeeperLogStore kurar.

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ünQuasar yereli
nuraft::raft_server günlüğü sıralarlux_chain_t günlüğü sıralar
KeeperLogStore / ChangelogQuasar'ın DAG günlüğü
Raft lider seçimilidersiz güven oylaması
state_machine->commit(idx, data)aynı çağrı, is_accepted üzerinde ateşlenir
klasik imzalar, sabit dönemli liderML-DSA imzaları, lider yok
işletilecek ayrı bir ZK/Keeper kuorumusü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.

Yorumlar

Yorum yapmak için Hanzo ID ile giriş yap.

Yorumlar yükleniyor…

Devamını oku