Bu konu benim için çok eğitici oldu. Amaç da oydu zaten. :)
Bu garipliğin nedenini sonunda anladım.
Buradaki amaç N adet veriyi üçer kopya olarak saklamak ve böylece düğüm kayıpları karşısında veri kaybı şansını azaltmaktı. Benim aklıma ilk gelen yöntem, her veriyi çaprazlama olarak kendi asıl düğümünde sıfırıncı veri konumuna, bir komşu düğümde birinci veri konumuna, ve iki komşu düğümde ikinci veri konumuna yerleştirmek oldu. Yani, N'nin 6 olduğu durumda 0'dan 5'e kadar 6 veriyi şöyle yerleştirmeyi düşünmüştüm:
'
düğümler: 0 1 2 3 4 5
===========
veri 0 -> 0 1 2 3 4 5
veri 1 -> 5 0 1 2 3 4
veri 2 -> 4 5 0 1 2 3
'
Üzerinde konuşmak kolay olsun diye de 0 numaralı düğüme 0 değerini, vs. yerleştirdim. Dikkat ederseniz, 0 verisi 0,0 dan sağ aşağıya doğru çaprazlama yazılmış. Sağ taraflarında yeterli komşuları olmayan 4 ve 5 verileri de tekrar başa dönüp 0 ve 1 verilerine yazılmışlar.
Tekrarlama pahasına, böylece bir veya iki düğüm bozulduğunda (kaybedildiğinde) hiç veri kaybetmiyoruz çünkü her veri üç farklı düğümde yaşıyor. Örneğin, bozuk olan düğümlerdeki verileri X ile gösteriyorum:
'
X 1 X 3 4 5
X 0 X 2 3 4
X 5 X 1 2 3
'
Görüldüğü gibi, 0'dan 5'e kadar bütün veriler yine de korunmuş durumdalar. Öte yandan, aradaki düğümü de bozduğumuzda 0'ın son kopyası da kaybedilmiş olur:
'
X X X 3 4 5
X X X 2 3 4
X X X 1 2 3
'
Yani, 0 verisinin hiç kopyası yok ama diğer beş veri okunabiliyor.
Şimdi burada bir karar vermek veya bir soru sormak gerek: Saklanan verilerden teki bile kaybedilmiş olsa bütün veri çöpe mi gidiyor yoksa geri kalanlar yine de kullanılabiliyor mu? Bunun cevabı programa göre değişir. Ben kendimce tek veri kaybında bile hepsi çöpe gitmiştir diye düşünüyorum.
Altının üçlü kombinasyonu 20 olduğundan 3 düğüm kaybı için 20 farklı durum düşünebiliriz. Bu durumlardan 6 tanesi 6 farklı verinin kaybolmasına neden olur:
'
-
0 kaybedilir:
X X X 3 4 5
X X X 2 3 4
X X X 1 2 3
-
1 kaybedilir:
0 X X X 4 5
5 X X X 3 4
4 X X X 2 3
-
2 kaybedilir:
0 1 X X X 5
5 0 X X X 4
4 5 X X X 3
-
3 kaybedilir:
0 1 2 X X X
5 0 1 X X X
4 5 0 X X X
-
4 kaybedilir:
X 1 2 3 X X
X 0 1 2 X X
X 5 0 1 X X
-
5 kaybedilir:
X X 2 3 4 X
X X 1 2 3 X
X X 0 1 2 X
'
Buraya kadar mantıklı. Tam bu kadarını anlamışken ve programı yazıp sonuçların da beklediğim gibi çıktıklarını görmüşken biraz daha gerçekçi olmaya karar verdim ve belki de bu düğümler örneğin gerçek hayattaki sunucuları ve diskleri temsil ediyorlardır diye düşündüm. Dolayısıyla, birisi bozulunca komşusunun bozulma olasılığı da yüksektir diye düşünüp verilerin kopyalarını bir komşu atlayarak yazmaya karar verdim:
'
düğümler: 0 1 2 3 4 5
===========
veri 0 -> 0 1 2 3 4 5
veri 1 -> 4 5 0 1 2 3
veri 2 -> 2 3 4 5 0 1
'
Görüldüğü gibi, 0 numaralı veri bu sefer birer düğüm atlayarak 0, 2, ve 4 düğümlerine yazılmış.
İşte şaşırtıcı sonucu da tam bu noktada aldım: Bir komşu atlayınca benim kabul ettiğim anlamdaki veri kaybı olasılığı 3 kat azaldı! Nasıl olabilirdi? Tabii ki veri kaybetmiş olmak için yine de üç düğüm kaybı gerekiyordu ve yine toplam 6 veri olduğuna göre 20 durum arasından 6 tanesi veri kaybına neden olmalıydı ama öyle olmuyordu!
Sonunda, yukarıdaki veri dağılımına biraz daha dikkatlice bakınca uyandım: Veri kopyalarını öyle dağıtınca 0, 2, ve 4 verileri aynı üç düğümü paylaşıyorlar. (Aynı biçimde; geri kalan 1, 3, ve 5 verileri de geri kalan üç düğümü paylaşıyorlar.)
Dolayısıyla, 0'ın kaybedildiği durum 2 ve 4'ün kaybedildiği durumları da kapsıyor ve 1'in kaybedildiği durum da 3 ve 5'in kaybedildiği durumları kapsıyor:
'
-
0, 2, ve 4 kaybedilir:
X 1 X 3 X 5
X 5 X 1 X 3
X 3 X 5 X 1
-
1, 3, ve 5 kaybedilir:
0 X 2 X 4 X
4 X 0 X 2 X
2 X 4 X 0 X
'
Hepsi o: Veri kaybına neden olan başka durum yok. Sonuçta, 20 durum arasında veri kaybedilen yalnızca 2 durum oluyor! :) Bir anlamda, daha önceden üç farklı durumun verdiği hasar tek durumda yoğunlaştırılmış diye düşünülebilir.
Programı hep yan yana üç düğüm 3 veriyi paylaşacak biçimde değiştireceğim:
'
düğümler: 0 1 2 3 4 5
===========
veri 0 -> 0 1 2 3 4 5
veri 1 -> 2 0 1 5 3 4
veri 2 -> 1 2 0 4 5 3
'
Üçe tam bölünmeyen durumlarda da sona kalan 4 veya 5 düğümü ise ilk programdaki kurala göre dağıtacağım. Aşağıda 0, 1, ve 2 ortak çalışıyorlar ve geri kalan dördü de kendi aralarında ortaklar:
'
düğümler: 0 1 2 3 4 5 6
=============
veri 0 -> 0 1 2 3 4 5 6
veri 1 -> 2 0 1 6 3 4 5
veri 2 -> 1 2 0 5 6 3 4
'
Ali
--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]