Prompt dan konteks
Beberapa pekerja tanpa keadaan mesti mempunyai tepat satu instans yang menjalankan tugas penyelesaian berjadual pada satu masa. Pekerja boleh mengalami kerosakan (crash), mula semula, dijeda (pause), atau terpisah dalam rangkaian, dan sistem tidak boleh membiarkan dua pekerja menulis untuk tempoh yang berpanjangan. Reka bentuk pemilihan pemimpin dengan penyelaras (coordinator), pajakan (lease), pembaharuan, pemagaran (fencing), failover, dan sempadan operasi. Terasnya ialah penyelarasan penulis tunggal (single-writer) yang selamat, bukan sekadar mutex.
Perkara yang diuji oleh penemu duga
Menentukan keselamatan (safety) dan keaktifan (liveness)
Safety bermaksud paling banyak satu pemimpin bagi setiap penggal (term) diterima oleh sumber; liveness bermaksud calon yang sihat akhirnya mengambil alih selepas pajakan lama disahkan tamat tempoh. Sekatan minoriti tidak boleh mengumumkan pemimpin baharu hanya untuk mengekalkan ketersediaan.
Memilih penyelaras dengan semantik konsensus
Rekod pemimpin memerlukan compare-and-set yang boleh dilinearkan (linearizable), pajakan, dan semantik pantau (watch), seperti etcd. TTL Redis atau jam tempatan sahaja tidak dapat membuktikan bahawa pemimpin lapuk tidak dapat menulis.
Mencegah penulisan lapuk (stale writes)
Selepas pajakan tamat tempoh, proses lama mungkin pulih dan meneruskan kerja. Setiap penulisan hiliran (downstream) mesti membawa token pemagaran yang meningkat secara monotonik, dan sumber mesti menolak token yang lebih lama untuk mengelakkan kerosakan split-brain.
Soalan untuk dijelaskan terlebih dahulu
- Bolehkah tugas dijalankan dua kali, atau adakah hiliran mesti menerima tepat satu pelaksanaan yang disiri?
- Adakah pemilihan ini bersifat global, bagi setiap penyewa (tenant), bagi setiap syard (shard), atau bagi setiap tugas?
- Apakah masa failover dan tetingkap jeda yang boleh diterima?
- Berapa banyak domain kegagalan penyelaras dan apakah kuorum/sandaran yang tersedia?
- Bolehkah sumber hiliran mengesahkan token pemagaran dan pulih secara idempoten?
- Adakah peristiwa watch, sejarah audit, amaran, dan pemindahan manual diperlukan?
Jawapan 30 saat
“Saya akan menentukan skop pemilihan dan bajet kegagalan terlebih dahulu, kemudian menyimpan rekod pemimpin yang dipajak dalam penyelaras linearizable yang disokong konsensus. Calon-calon bersaing dengan kemas kini cipta-atau-banding (create-or-compare) transaksional; pemenang mendapat penggal pemagaran yang lebih tinggi dan memperbaharuinya dalam tempoh TTL. Kegagalan pembaharuan menghentikan kerja baharu dan penulisan. Setiap penulisan hiliran mengesahkan penggal tersebut, jadi pemimpin lapuk yang pulih tidak boleh menulis. Watch hanya mempercepatkan percubaan CAS baharu. Saya akan memantau penggal, kependaman pembaharuan, masa failover, penolakan pemagaran, duplikasi, dan kesihatan kuorum.”
Jawapan mendalam langkah demi langkah
Tentukan rekod penggal
Simpan election_name, leader_id, lease_id, term, metadata calon, dan cap masa. Penggal atau token pemagaran mesti meningkat secara monotonik dan diperuntukkan secara atomik oleh penyelaras, bukan dijana daripada jam klien.
Pilih penyelaras dan syarat penulisan
Calon mencipta rekod efemeral yang disokong pajakan; transaksi linearizable hanya boleh menulis apabila kunci tidak wujud. Jika pemimpin wujud, calon memantau (watch) kunci tersebut dan mencuba semula. API pemilihan etcd membolehkan peserta bersaing pada satu nama pemilihan dengan satu pemimpin yang berjaya pada satu masa.
Perbaharui dan gagal secara tertutup (fail closed)
Pemimpin memperbaharui melalui gelung kekal hidup (keepalive) yang bebas. Tamat masa pembaharuan, kehilangan sambungan, jeda proses, atau keabnormalan jam tempatan memindahkannya kepada suspect, di mana ia berhenti menerima kerja baharu dan penulisan hiliran. Ia tidak boleh terus bekerja dengan yakin semasa terputus sambungan daripada penyelaras.
Kendalikan failover
Calon tidak boleh memutuskan bahawa pemimpin lama telah mati hanya daripada TTL tempatannya. Ia mesti memerhatikan penamatan atau pemadaman pajakan yang disahkan oleh penyelaras, kemudian bersaing dengan CAS. Masa failover ialah jumlah TTL, pengesanan, dan kelewatan penjadualan, jadi tetapkan had dengan margin jitter.
Tambah token pemagaran
Pemimpin baharu memperoleh penggal yang lebih tinggi dan melampirkannya pada kemas kini pangkalan data, mesej, atau permintaan API luaran. Sumber menyimpan token tertinggi yang diterima dan menolak token yang lebih rendah. Ini menyekat penulisan berbahaya walaupun proses lama belum berhenti.
Kendalikan sekatan dan split brain
Sekatan minoriti tidak boleh mengeluarkan penggal baharu. Calon yang tidak dapat mencapai kuorum penyelaras mesti berhenti atau kekal baca sahaja. Selepas menyambung semula, pemimpin lama mesti membaca semula penggal semasa dan bersaing semula dan bukannya mempercayai keadaan yang dicache.
Pseudokod
~~~text campaign(): lease = coordinator.grant(ttl) result = coordinator.txn(key absent -> put(candidate, lease, next_term)) if result.succeeded: token = result.term keepalive(lease) runwithfencing(token) else: watch(key)
onkeepalivefailureorexpiry: stopnewwork() stopdownstreamwrites() ~~~
Kerumitan, pemulihan, dan kebolehcerapan
Setiap pemilihan dan pembaharuan melibatkan perjalanan ulang-alik penyelaras; lebih banyak calon menambah beban watch dan cuba semula, jadi gunakan pengunduran eksponen (exponential backoff) dengan jitter. Rekodkan pemimpin semasa, penggal, RTT pembaharuan, penamatan pajakan, tempoh pemilihan, penolakan pemagaran, tugas pendua, dan kesihatan kuorum untuk membina semula peralihan penggal.
| Mekanisme | Menyelesaikan | Masih diperlukan |
|---|---|---|
| CAS Linearizable | Menghalang dua pemenang | Kuorum penyelaras |
| Keepalive pajakan | Mengesan kegagalan proses | Pengendalian jeda dan sekatan |
| Token pemagaran | Menolak penulisan lapuk | Pengesahan hiliran yang tahan lama |
| Watch dan backoff | Mempercepatkan failover dan mengurangkan beban | Tidak boleh menggantikan bukti keselamatan |
Jawapan model
“Saya akan menyimpan rekod pemimpin yang dipajak dalam penyelaras yang disokong konsensus dengan transaksi linearizable. Calon-calon bersaing dengan mencipta rekod hanya jika ia tiada; pemenang menerima penggal yang meningkat secara monotonik dan memperbaharuinya dalam tempoh TTL. Jika pembaharuan gagal, ia serta-merta menghentikan tugas baharu dan penulisan hiliran. Setiap penulisan pangkalan data, mesej, atau panggilan luaran membawa token pemagaran, dan sumber menolak token di bawah nilai tertinggi yang diterimanya, jadi pemimpin lama yang dijeda atau disekat tidak boleh terus menulis. Minoriti tidak boleh mengeluarkan penggal baharu, manakala watch hanya mengurangkan kelewatan pemilihan. Saya akan memantau RTT pembaharuan, penggal, tempoh failover, penolakan pemagaran, tugas pendua, dan kuorum, dengan suis pemati (kill switch) manual.”
Kesilapan lazim
Hanya menggunakan Redis TTL
Tamat tempoh pajakan dan pemerhatian penamatan oleh klien bukanlah perkara yang sama. Kelewatan rangkaian dan jeda boleh menyebabkan dua klien percaya bahawa mereka boleh bekerja. Gunakan penyelarasan linearizable berserta pemagaran hiliran.
Menganggap pajakan sebagai perlindungan penulisan
Pajakan membantu mengesan kegagalan tetapi tidak dapat menghentikan proses lama secara serta-merta. Tanpa pengesahan token, pemimpin lapuk boleh menulis ganti hasil pemimpin baharu.
Menjana penggal daripada masa tempatan
Jam boleh hanyut (drift), melompat, atau dijeda. Penyelaras mesti memperuntukkan dan mengekalkan penggal secara atomik.
Memaksa pengambilalihan semasa sekatan
Minoriti tidak dapat mengesahkan keadaan pemimpin lama. Pengambilalihan secara paksa mewujudkan split-brain; reka bentuk yang selamat menerima kehilangan ketersediaan yang singkat.
Membiarkan peristiwa watch menentukan keselamatan
Watch boleh tertangguh, hilang, atau disambung semula. Ia sepatutnya mencetuskan pembacaan semula dan CAS, bukan menggantikan pembacaan dan penulisan linearizable.
Mengabaikan keidempotenan tugas
Pemilihan yang betul tidak menghalang duplikasi selepas kerosakan atau penghantaran semula mesej. Tugas memerlukan kunci keidempotenan, rekod kemajuan, atau transaksi yang boleh dimainkan semula.
Soalan susulan dan respons
Bagaimanakah pemilihan pemimpin berbeza daripada kunci teragih (distributed lock)?
Kunci melindungi bahagian kritikal (critical section); pemilihan mengekalkan peranan penyelaras yang berpanjangan dengan penggal, pembaharuan, watch, pemagaran, dan failover. Kedua-duanya boleh berkongsi penyelaras, tetapi permukaan keselamatan pemilihan adalah lebih luas.
Bagaimanakah anda harus memilih TTL?
Tampung RTT pembaharuan biasa, jeda GC atau penjadual, jitter rangkaian, dan SLO failover. TTL yang pendek menyebabkan churn; TTL yang panjang melambatkan pengambilalihan. Tentukur dengan suntikan kerosakan (fault injection).
Mengapakah sumber mesti menyemak token pemagaran?
Penyelaras tidak dapat menghentikan setiap proses lapuk secara serta-merta. Penolakan di pihak sumber menyekat penulisan berbahaya semasa proses itu masih hidup.
Apakah yang berlaku apabila kluster etcd kehilangan kuorum?
Ia tidak dapat melakukan komit bagi penggal baharu atau keadaan pajakan; pemimpin semasa mesti menghentikan penulisan selepas ia tidak dapat memperbaharui pajakan. Calon-calon bersaing semula selepas kuorum kembali.
Bagaimanakah anda mengendalikan jeda pemimpin yang panjang?
Pembaharuan gagal semasa jeda dan calon baharu boleh mengambil alih. Apabila proses lama bersambung, token lamanya ditolak dan ia mesti menyertai semula pemilihan.
Bagaimanakah anda menguji split-brain?
Suntik jeda proses, sekatan rangkaian, lompatan jam, dan kegagalan penyelaras. Sahkan bahawa hanya satu token bagi setiap penggal diterima untuk penulisan, dan periksa tempoh failover serta rekod penolakan.