Ders 06 / 12
Alan Adı Sistemi
Adın adrese çevrilmesini yürüten dağıtık veritabanı, kökten yetkiliye uzanan çözümleme zinciri ve yaşam süresine dayalı önbellekleme.
İçindekiler
Önceki ders adın yapısını ve yetkinin nasıl devredildiğini kurdu. Kayıt kuruluşunun adın adresini değil, yalnızca “bu adı şu sunuculara sorun” bilgisini tuttuğu söylenmişti.
Bu ders o sormayı yürüten düzeni ele alır: alan adı sistemi (domain name system).
Sorulacak soru, ornek.test adının bir adrese nasıl çevrildiği ve bu çevirinin her istekte
neden baştan yapılmadığıdır.
Neden Tek Bir Dosya Değil
Adları adreslere eşleyen bir dosya tutmak, ağdaki makine sayısı azken yapılan şeydi. Her makine bu dosyanın bir kopyasını taşırdı; bir ad eklendiğinde dosya güncellenir ve herkese dağıtılırdı.
Bu düzenin üç ayrı sınırı vardır ve üçü de ölçekle ilgilidir. Dosya, ad sayısıyla orantılı olarak büyür. Her değişiklik tüm kopyaların yenilenmesini gerektirir; değişiklik sıklığı makine sayısıyla artar. Ve tek bir dosya, tek bir yetkili demektir: her ad talebinin aynı noktadan geçmesi gerekir.
Alan adı sistemi bu üç sınırı da hiyerarşiyi kullanarak aşar. Veritabanı bölünür, her bölümün yetkisi ayrı bir tarafa devredilir ve hiç kimse bütünü tutmaz.
Zincirdeki Roller
Çözümlemede dört ayrı rol bulunur.
Sağlayıcı (stub resolver), isteği yapan makinenin içindedir. Uygulamanın bir adı adrese çevirme çağrısı, işletim sistemindeki bu bileşene gider. Kendisi çözümleme yapmaz; soruyu bir çözümleyiciye iletir ve yanıtı bekler.
Çözümleyici (recursive resolver), işi üstlenen sunucudur. Genellikle erişim sağlayıcının ya da kuruluşun işlettiği bir sunucudur. Yanıtı bulmak için gereken tüm adımları o yürütür ve önbelleği o tutar.
Kök sunucular, hiyerarşinin tepesindedir. Adreslerin kendisini bilmezler; yalnızca her üst düzey adın hangi sunuculara devredildiğini bilirler.
Yetkili sunucular (authoritative server), bir adın yanıtlarını asıl olarak tutan
sunuculardır. ornek.test için yetkili sunucu, ad sahibinin belirlediği sunucudur ve
önceki derste anlatılan kayıt sırasında bildirilen de budur.
Çözümleme Zinciri
ornek.test adı önbellekte hiç bulunmadığı varsayımıyla, sorgu şu adımları izler:
- Uygulama, işletim sistemindeki sağlayıcıdan
ornek.testadresini ister. - Sağlayıcı soruyu çözümleyiciye iletir ve yanıtı bekler.
- Çözümleyici bir kök sunucuya sorar. Kök, adresi bilmez;
testüst düzey adının yetkisinin hangi sunuculara devredildiğini söyler. - Çözümleyici o sunuculardan birine sorar. O da adresi bilmez;
ornek.testadının yetkisinin hangi sunuculara devredildiğini söyler. - Çözümleyici yetkili sunucuya sorar ve adresi alır.
- Yanıt sağlayıcıya, oradan uygulamaya döner.
İş bölümü, iki farklı sorgu biçimini ayırır. Sağlayıcının çözümleyiciye sorduğu soru özyinelemelidir (recursive): “bu adın yanıtını bul ve bana getir.” Çözümleyicinin kök ve ara sunuculara sorduğu sorular yinelemelidir (iterative): “bunu biliyorsan söyle, bilmiyorsan kime soracağımı söyle.”
Bu ayrım tesadüfi değildir. Kök ve üst düzey sunucular, gelen her soru için başkasına sorup yanıtı derlemek zorunda olsaydı, yükleri taşınamaz olurdu. Ara sunucuların yaptığı iş tek bir adımdır ve sabit maliyetlidir; derleme işi tek bir çözümleyicide toplanır.
Her adımda alınan yanıtın “adresi bilmiyorum, şuna sor” biçiminde olması, önceki dersteki yetki devrinin doğrudan yansımasıdır. Zincirin uzunluğu, adın etiket sayısıyla değil, yetkinin kaç kez devredildiğiyle belirlenir.
Bir Kaydın Biçimi
Sorgulama araçlarıyla bu yanıtlar doğrudan görülebilir. Aşağıdaki komut, makinenin kendisini gösteren adı sorgular; yanıt yerel olarak üretildiği için her yerde aynıdır.
dig +noall +answer localhost A
localhost. 0 IN A 127.0.0.1
Bu tek satır, bir kaydın beş alanını gösterir:
| Alan | Örnekteki değer | Anlamı |
|---|---|---|
| Ad | localhost. |
Kaydın ait olduğu ad; sondaki nokta kökü belirtir |
| Yaşam süresi | 0 |
Yanıtın saniye cinsinden önbellekte tutulabileceği süre |
| Sınıf | IN |
Adres ailesi; internet için her zaman bu değer |
| Tür | A |
Kaydın türü; A bir IPv4 adresi taşır |
| Veri | 127.0.0.1 |
Kaydın içeriği |
Aynı komut gerçek bir alan adı için çalıştırıldığında biçim aynı kalır, değerler değişir. Bu kursta gerçek bir adın çıktısı verilmemiştir: yaşam süresi sorgunun ne zaman yapıldığına, dönen adres ise sorgunun nereden yapıldığına bağlıdır. İkisi de sayfaya yazıldığı anda eskimeye başlar. Komutu kendiniz çalıştırdığınızda göreceğiniz beş alan yukarıdakilerle aynı olacaktır.
Kayıt türlerinin ayrıntısı sonraki dersin konusudur.
Önbellekleme ve Yaşam Süresi
Yukarıdaki zincir her istekte baştan yürütülseydi, tek bir sayfa açmak birden çok ağ gidiş–dönüşü gerektirirdi ve kök sunucular dünyadaki her sorguyu görürdü. Sistemi işletilebilir kılan, yanıtların saklanmasıdır.
Her kayıt, kendisiyle birlikte bir yaşam süresi (time to live) taşır: yanıtın kaç saniye boyunca yeniden sorulmadan kullanılabileceği. Çözümleyici yanıtı bu süre boyunca önbelleğinde tutar ve aynı soru geldiğinde zinciri yürütmeden yanıtlar.
Süreyi belirleyen, yanıtı veren yetkili sunucudur; yani ad sahibidir. Bu, ad sahibine doğrudan bir denetim verir ve bir ödünleşimi yönetmesini gerektirir.
Aşağıdaki program bu davranışı gösterir. Saat dışarıdan verildiği için çıktı her çalıştırmada aynıdır.
class AdOnbellegi: """TTL ile sinirli ad->adres onbellegi. Saat disaridan verilir.""" def __init__(self) -> None: self.kayitlar: dict[str, tuple[str, int]] = {} self.yukari_sorgu_sayisi = 0 def cozumle(self, ad: str, simdi: int, ttl: int, adres: str) -> str: kayit = self.kayitlar.get(ad) if kayit is not None and kayit[1] > simdi: return f"onbellekten (kalan TTL: {kayit[1] - simdi})" self.yukari_sorgu_sayisi += 1 self.kayitlar[ad] = (adres, simdi + ttl) return f"yukari sorgu (yeni TTL: {ttl})" onbellek = AdOnbellegi() for saniye in [0, 100, 250, 300, 400]: sonuc = onbellek.cozumle("ornek.test", simdi=saniye, ttl=300, adres="192.0.2.10") print(f"t={saniye:>3}s {sonuc}") print(f"toplam yukari sorgu: {onbellek.yukari_sorgu_sayisi}")
t= 0s yukari sorgu (yeni TTL: 300) t=100s onbellekten (kalan TTL: 200) t=250s onbellekten (kalan TTL: 50) t=300s yukari sorgu (yeni TTL: 300) t=400s onbellekten (kalan TTL: 200) toplam yukari sorgu: 2
Beş çözümleme isteği, yalnızca iki yukarı sorguya yol açtı. Gerçek bir çözümleyicide aynı kaydı çok sayıda kullanıcı paylaştığı için oran çok daha keskindir.
Ödünleşim şudur:
- Uzun yaşam süresi, yukarı sorguları azaltır ve yanıtları hızlandırır. Buna karşılık bir değişiklik yapıldığında eski yanıt, süre dolana kadar kullanımda kalır.
- Kısa yaşam süresi, değişikliğin çabuk yayılmasını sağlar. Buna karşılık sorgu yükünü ve ortalama yanıt süresini artırır.
Bunun işletme pratiğindeki karşılığı doğrudandır: bir sunucu taşınacaksa, taşınmadan önce yaşam süresi düşürülür, taşınma yapılır, yayılma tamamlandıktan sonra süre geri yükseltilir. Süre önceden düşürülmezse, eski adres önbelleklerde eski sürenin uzunluğu kadar yaşamaya devam eder.
Bu, ders boyunca dikkat edilmesi gereken bir sonucu doğurur: bir alan adı değişikliği aynı anda her yerde görünmez. Farklı kullanıcılar, önbelleklerinin durumuna göre bir süre farklı yanıtlar alır. Bu bir arıza değil, önbelleklemenin tanımı gereğidir.
Yanıtı olumsuz olan sorgular da saklanır. Var olmayan bir ad sorulduğunda “böyle bir ad yok” yanıtı da bir süre önbellekte tutulur; yeni oluşturulan bir adın hemen görünmemesinin nedeni budur.
Önbellek tek bir yerde değildir. İşletim sistemindeki sağlayıcı, çözümleyici ve isteği yapan uygulamanın kendisi ayrı ayrı önbellek tutabilir. Bir adın çözümlenmesindeki gecikmenin ya da eskimiş bir yanıtın hangi katmandan geldiğini saptamak, bu yüzden katmanları ayrı ayrı incelemeyi gerektirir.
Özet
- Adları tek bir dosyada tutmak ölçeklenmez; alan adı sistemi veritabanını hiyerarşiye göre böler ve her bölümün yetkisini devreder.
- Çözümleme zinciri kökten başlar, üst düzey ad sunucusuna, oradan yetkili sunucuya iner; her adımda alınan yanıt bir sonraki adresi değil, bir sonraki yetkiliyi gösterir.
- Sağlayıcı çözümleyiciye özyinelemeli sorar; çözümleyici ara sunuculara yinelemeli sorar. Bu iş bölümü kök ve üst düzey sunucuların yükünü sabit tutar.
- Bir kayıt ad, yaşam süresi, sınıf, tür ve veri alanlarından oluşur.
- Yaşam süresi ad sahibince belirlenir ve sorgu yükü ile değişikliğin yayılma hızı arasındaki ödünleşimi yönetir.
- Önbellekleme çok katmanlıdır ve olumsuz yanıtları da kapsar; bir değişiklik her yerde aynı anda görünmez.
Sonraki Adım
Bu ders bir kaydın beş alanını gösterdi ve tür alanını A örneğiyle geçti. Oysa bir adın
altında yalnızca adres tutulmaz: başka bir ada yönlendirme, posta yönlendirmesi, doğrulama
metinleri ve yetki bildirimleri de aynı düzende saklanır. Sonraki ders bu türleri, hangi
soruna yanıt verdiklerini ve aralarındaki birleşim kurallarını ele alacak.
İlerlemeni kaydetmek ve not almak için Giriş yap
Notlarım
Not almak için giriş yapmalısın.