İçeriğe geç
academia.sh

Ders 17 / 21

Konteyner Ağı

Konteynerlerin birbirini bulması ve bulamaması: servis adının hangi sınıra bağlı çözüldüğü, dört servisin iki ağa bölünmesiyle kapanan yol sayısı, yayımlanan kapı ile yalnız ağ içi erişimin ayrılması, dışarı açılan yüzeyin sekiz uçtan bir uca inmesi ve ağ üyeliğinin bir yetkilendirme olmaması.

İçindekiler

Buraya kadar ölçülen her şey tek bir konteynerin kendi sınırları içindeydi: kaynağı, ortam ayarı, yazılabilir katmanı, taktığı dizinler. Oysa ölçüm ağı tek bir program değil. Okuma toplayıcı doğrulayıcıya veri veriyor, doğrulayıcı faturalamayı besliyor, faturalama ile iş emri servisi aynı veriye bakıyor ve dördü ayrı konteynerde koşuyor. Dosya sistemi yalıtıldığında bu dördü birbirini nasıl buluyor.

Sorunun ilginç yanı şudur: yalıtım burada iki yönlü çalışır. Bir konteynerin ötekine ulaşabilmesi gerekir, ama üçüncüsüne ulaşamaması da gerekir. Bu ders erişilebilirliği bir matris olarak kurup iki sayıyı ayrı ayrı ölçer: ağ ayrımı kaç yolu kapatıyor ve dışarıya açılan yüzey kaç uçtan kaç uca iniyor.

Adres Yerine Ad

Bir servisin ötekine ulaşması için adresini bilmesi gerekir. Adres bir makine adı ve bir kapı numarasıdır; makineye bağlıdır, taşınmaz ve 01. derste sayılan ortam farkının bir parçasıdır — o dersteki 14 değişkenden dördü (SAYAC_AG_UCU, OKUMA_KUYRUGU, VERI_UCU, SAHA_UCU) tam olarak bunu taşıyordu.

Konteyner ağının çıkardığı fark budur. Ağa katılan her konteyner bir servis adıyla anılır ve o ad, aynı ağdaki başka bir konteynerin içinden çözülebilir. Ayarda artık bir makine adı durmaz, servisin adı durur; ad her makinede aynıdır. Fark ortamdan çıkmıştır — ama tümüyle değil, çünkü adın çözülüp çözülmeyeceği ağ üyeliğine bağlıdır ve üyelik ortamda tanımlanır.

  • CZ19 — Dört servis var, her biri iki kapı dinliyor: bir arayüz kapısı ve bir ölçüm kapısı.
  • CZ20 — Erişim kuralı tektir: iki uç ancak ortak bir ağa üye olduğunda birbirine ulaşır.
  • CZ21 — Ad çözümü erişimle aynı sınıra bağlıdır; servis adı yalnız ortak ağda çözülür.
  • CZ22 — Bölünmüş düzende ön ağ toplayıcı ile doğrulayıcıyı, arka ağ doğrulayıcı, faturalama ve iş emri servisini içeriyor. Doğrulayıcı ikisine birden üye.
  • CZ23 — Yayımlanan kapı ana makinenin ağ arayüzünde bir uç açıyor; yayımlanmayan kapıya yalnız ağ içinden erişiliyor.
  • CZ24 — Ağ sürücüsü sınıfları birer üyelik düzeni olarak modelleniyor: makineyle ortak düzende bütün servisler tek bir kümededir ve kapıları doğrudan ana makinenin arayüzündedir; ağsız düzende her servis yalnız kendi kümesindedir.
// calisma/ag-matrisi.mjs — ad cozumleme, erisilebilirlik matrisi ve disari acilan yuzey.
// MODELDIR: servisler, aglar ve kapilar kurgu; erisim kurali "ortak ag" olarak modelde tanimli.
const SERVIS = {                                          // CZ19: dort servis, iki kapi (arayuz + olcum)
  toplayici: { kapi: [8081, 9101], ag: ["on"] },
  dogrulayici: { kapi: [8082, 9102], ag: ["on", "arka"] },
  faturalama: { kapi: [8083, 9103], ag: ["arka"] },
  isemri: { kapi: [8084, 9104], ag: ["arka"] },
};
const AD = Object.keys(SERVIS), TUM = AD.flatMap((a) => SERVIS[a].kapi), VARSAYILAN = 8080;
const DUZEN = {                                           // CZ22: uyelik kumesi duzene gore degisiyor
  "tek ag": () => ["ortak"],
  "iki ag": (a) => SERVIS[a].ag,
  "makineyle ortak": () => ["makine"],
  "agsiz": (a) => [a],
};
const DISARI = { "tek ag": 1, "iki ag": 1, "makineyle ortak": TUM.length, "agsiz": 0 };  // CZ23
const ortak = (a, b, d) => DUZEN[d](a).some((x) => DUZEN[d](b).includes(x));             // CZ20

function say(d) {                                         // yonlu ciftler uzerinde sayim
  let acik = 0, kapali = 0;
  for (const a of AD) for (const b of AD) {
    if (a === b) continue;
    if (ortak(a, b, d)) acik += 1; else kapali += 1;
  }
  return { acik, kapali, ad: acik, uc: acik * 2 };         // CZ21: ad cozumu erisimle ayni sinira bagli
}

console.log(`model: ${AD.length} servis, servis basina ${SERVIS.toplayici.kapi.length} kapi, toplam ` +
  `${TUM.length} uc; iki ag duzeninde on = toplayici + dogrulayici, arka = dogrulayici + faturalama + isemri`);
console.log(`\n${"kaynak \\ hedef".padEnd(15)}${AD.map((x) => x.padStart(13)).join("")}${"cozulen ad".padStart(12)}`);
for (const a of AD) {
  const satir = AD.map((b) => (a === b ? "-" : ortak(a, b, "iki ag") ? "cozulur" : "kapali").padStart(13)).join("");
  console.log(`${a.padEnd(15)}${satir}` +
    `${String(AD.filter((b) => b !== a && ortak(a, b, "iki ag")).length).padStart(12)}`);
}

console.log(`\n${"duzen".padEnd(18)}${"acik yol".padStart(10)}${"kapali yol".padStart(12)}` +
  `${"cozulen ad".padStart(12)}${"ag ici uc".padStart(11)}${"disaridan uc".padStart(14)}`);
const r = {};
for (const d of Object.keys(DUZEN)) {
  const k = say(d); r[d] = k;
  console.log(`${d.padEnd(18)}${String(k.acik).padStart(10)}${String(k.kapali).padStart(12)}` +
    `${String(k.ad).padStart(12)}${String(k.uc).padStart(11)}${String(DISARI[d]).padStart(14)}`);
}
const t = r["tek ag"], i = r["iki ag"];
console.log(`ag ayrimi ${t.acik - i.acik} yolu kapatiyor (%${((100 * (t.acik - i.acik)) / t.acik).toFixed(1)}); ` +
  `kapanan ciftler: ${AD.flatMap((a) => AD.filter((b) => a !== b && !ortak(a, b, "iki ag")).map((b) => `${a}->${b}`)).join(", ")}`);
console.log(`dort servis de cerceve varsayilani ${VARSAYILAN} dinleseydi: makineyle ortak duzende ` +
  `${AD.length - new Set(AD.map(() => VARSAYILAN)).size} carpisma, ayri ad alanli duzende 0 carpisma`);

const YAYIM = { "hepsi yayimli": TUM, "yalniz saha arayuzu": [8084], "hicbiri": [] };
console.log(`\n${"yayim secenegi".padEnd(22)}${"disaridan uc".padStart(14)}${"ag icinden uc".padStart(15)}` +
  `${"disa acik oran".padStart(16)}`);
for (const [etiket, y] of Object.entries(YAYIM))
  console.log(`${etiket.padEnd(22)}${String(y.length).padStart(14)}${String(i.uc).padStart(15)}` +
    `${`${y.length}/${TUM.length}`.padStart(16)}`);
console.log(`disari acilan yuzey ${TUM.length} uctan ${YAYIM["yalniz saha arayuzu"].length} uca iniyor; ` +
  `ag icinden erisilebilir uc sayisi ucunde de ${i.uc}, hicbiri kimlik sormuyor`);
model: 4 servis, servis basina 2 kapi, toplam 8 uc; iki ag duzeninde on = toplayici + dogrulayici, arka = dogrulayici + faturalama + isemri

kaynak \ hedef     toplayici  dogrulayici   faturalama       isemri  cozulen ad
toplayici                  -      cozulur       kapali       kapali           1
dogrulayici          cozulur            -      cozulur      cozulur           3
faturalama            kapali      cozulur            -      cozulur           2
isemri                kapali      cozulur      cozulur            -           2

duzen               acik yol  kapali yol  cozulen ad  ag ici uc  disaridan uc
tek ag                    12           0          12         24             1
iki ag                     8           4           8         16             1
makineyle ortak           12           0          12         24             8
agsiz                      0          12           0          0             0
ag ayrimi 4 yolu kapatiyor (%33.3); kapanan ciftler: toplayici->faturalama, toplayici->isemri, faturalama->toplayici, isemri->toplayici
dort servis de cerceve varsayilani 8080 dinleseydi: makineyle ortak duzende 3 carpisma, ayri ad alanli duzende 0 carpisma

yayim secenegi          disaridan uc  ag icinden uc  disa acik oran
hepsi yayimli                      8             16             8/8
yalniz saha arayuzu                1             16             1/8
hicbiri                            0             16             0/8
disari acilan yuzey 8 uctan 1 uca iniyor; ag icinden erisilebilir uc sayisi ucunde de 16, hicbiri kimlik sormuyor

Bu sayılar ölçüm sınıfındadır.

Matrisin Okunması

Birinci tablo, bölünmüş düzende her servisin neyi görebildiğini veriyor. En sağdaki sütun her servisin kaç adı çözebildiğini sayıyor ve dört servis dört ayrı sayı veriyor: toplayıcı 1, doğrulayıcı 3, faturalama 2, iş emri 2.

Toplayıcının satırı en dar olanıdır ve tasarımın kendisidir. Toplayıcı sahadaki sayaçlardan gelen okumaları alır; ölçüm ağının en dışa dönük parçasıdır ve bu yüzden en az şeyi görmelidir. Matriste faturalama ve iş emri sütunları kapali görünüyor — toplayıcının içinden bu iki adın çözülmesi bile mümkün değil. Ad çözülmediği için bağlantı denemesi bir adres bulamadan biter; yani engel bir reddetme değil, bir bilmeme durumudur.

Doğrulayıcının satırı en geniş olanıdır ve o da tasarımdır: iki ağın kesişiminde durur, ön ağdan okuma alır, arka ağa doğrulanmış veri verir. Üç adı da çözer.

Bu ayrım ad çözümlemesinin nasıl çalıştığını da söylüyor. Ad, uygulamanın içinde sabit bir dizgedir ve her makinede aynıdır; onu bir adrese çeviren şey konteynerin bağlı olduğu ağdır. Aynı kod, aynı imaj ve aynı ad, iki ayrı ağ üyeliğiyle iki ayrı sonuç verir — birinde çözülür, ötekinde çözülmez. Ayarda değişen tek şey üyelik satırıdır ve matrisin bütün hücreleri o satırdan türüyor.

Faturalama ile iş emri satırları birbirinin aynısıdır. İkisi de arka ağdadır, birbirini ve doğrulayıcıyı görür, toplayıcıyı görmez. Bu simetri, ağ üyeliğinin bir küme olduğunu gösteriyor: aynı kümedeki iki uç arasında yön ayrımı yoktur, ikisi de birbirini görür.

Ağ Ayrımı Dört Yolu Kapatıyor

İkinci tablonun ilk iki satırı ayrımın kazancını veriyor. Tek ağda dört servis arasında 12 yönlü yol vardır ve hepsi açıktır; 12 adın hepsi çözülür, erişilebilir uç sayısı 24’tür (12 yol çarpı servis başına 2 kapı). İki ağa bölündüğünde açık yol 8’e, çözülen ad 8’e, erişilebilir uç 16’ya iniyor. Ağ ayrımı 12 yolun 4’ünü, yani üçte birini kapatıyor.

Kapanan dört yol da simetrik iki çifttir: toplayıcı ile faturalama, toplayıcı ile iş emri. Bunlar zaten hiç konuşmayan çiftlerdir; ayrımın yaptığı şey konuşmayanların konuşamamasını sağlamaktır. Bu ayrım bedava değildir ve bedeli yazımdadır: tek ağ düzeninde dört üyelik satırı yazılır, iki ağ düzeninde beş — doğrulayıcı iki kez sayılır. Bir ağ tanımı ve bir üyelik satırı karşılığında dört yol kapanıyor.

Bedelin ikinci kalemi tasarım tarafındadır. Ayrımı yapabilmek için ağların hangi servisleri kapsayacağının önceden bilinmesi gerekir ve bu bilgi uygulamanın içinde değil, koşum ayarındadır. Yeni bir servis eklendiğinde hangi ağa gireceği ayrı bir karardır; unutulursa servis kalkar, çalışır ve hiçbir hata vermeden hiç kimseyi bulamaz.

Üç Sürücü Sınıfı, Üç Ayrı Satır

Konteynerin ağa nasıl bağlandığı bir sürücü seçimidir ve tablonun son iki satırı bu seçimin uçlarını gösteriyor. Sürücüler burada tür adıyla anılıyor; her biri bir üyelik düzenine karşılık geliyor.

Ayrı ad alanlı sürücü — ilk iki satır. Her konteynerin kendi ağ ad alanı ve kendi adresi vardır; servis adları çözülür ve dışarıya yalnız yayımlanan uçlar açılır: 1.

Makineyle ortak sürücü — üçüncü satır. Ayrı bir ağ ad alanı verilmez; konteynerler doğrudan makinenin adres uzayında dinler. Sonuçları tabloda üç sütunda birden görünüyor: açık yol 12’ye geri çıkıyor, ağ içi uç 24’e dönüyor ve dışarıdan erişilebilir uç 1’den 8’e fırlıyor. Yayım diye bir karar da kalmıyor, çünkü yayımlanacak bir sınır yoktur — sekiz kapının sekizi zaten makinenin arayüzündedir.

Bu sürücünün ikinci bedeli son satırda hesaplanıyor. Ayrı ad alanı olmadığında kapı numaraları paylaşılan tek bir uzaydan gelir. Dört servis de çerçevesinin varsayılanı olan 8080’i dinleseydi makineyle ortak düzende 3 çarpışma olurdu: biri kapıyı alır, üçü kalkamaz. Ayrı ad alanlı düzende çarpışma sayısı 0’dır, çünkü her konteynerin 8080’i kendi uzayındadır. Ad alanı yalıtımının en somut kazancı budur — servislerin birbirinin kapı numarasını bilmek zorunda olmaması.

Ağsız sürücü — dördüncü satır. Hiçbir üyelik yoktur: 0 açık yol, 0 çözülen ad, 0 uç, dışarıdan 0. Bütün ölçümlerin sıfır olduğu tek satır budur ve kullanışsız değildir. Gecelik toplu iş gibi yalnız takılı bir dizinden okuyup yazan, kimseyi çağırmayan bir konteyner için yalıtım bütçesinin en ucuz noktasıdır: ağ yüzeyi tümüyle kapalıdır ve kapatmanın bedeli sıfırdır, çünkü hiç kullanılmıyordu.

Yayımlanan Kapı ile Ağ İçi Erişim

Üçüncü tablo bambaşka bir sınırı ölçüyor. İlk iki tablo konteynerlerin birbirine erişimini sayıyordu; bu tablo ana makinenin ağ arayüzünden, yani konteyner ağının tümüyle dışından gelen erişimi sayıyor.

Dört servis toplam 8 kapı dinliyor. Hepsi yayımlanırsa ana makinenin arayüzünde 8 uç açılır; yalnız saha ekiplerinin kullandığı arayüz kapısı yayımlanırsa 1 uç açılır; hiçbiri yayımlanmazsa 0. Dışarı açılan yüzey 8 uçtan 1 uca iniyor ve bu iniş sırasında ağ içi erişilebilir uç sayısı sabit kalıyor: üç seçeneğin üçünde de 16.

Tablonun asıl söylediği budur. Yayım kararı ile ağ içi erişim birbirinden bağımsızdır. Bir servis yayımlanmadan da kendi ağındaki herkes tarafından tam olarak eskisi kadar erişilebilir olmayı sürdürür; yayım yalnız ana makinenin arayüzüne bir uç ekler. Ölçüm kapıları buna iyi bir örnektir: dört ölçüm kapısı hiçbir seçenekte yayımlanmıyor ama ağ içinden hepsi erişilebilir.

Ayrım pratikte şuraya oturur: ağ içi erişim servislerin birbiriyle konuşması için, yayım ise ağın dışındaki bir kullanıcı ya da aracın konuşması içindir. İkisini aynı kararla yönetmek, sekiz ucun sekizini de açık bırakmakla biter.

Yüzeyin 8’den 1’e inmesi bir güvenlik kazancıdır ve karşılığı işletme tarafında ödenir. Yayımlanmayan bir kapıya dışarıdan bakılamaz; bir sorunun nedenini anlamak için o kapıya soru sormak gerekiyorsa, soruyu soran şeyin de ağın içinde olması gerekir.

Yalıtımın Delindiği Yer

Üç delik vardır ve üçü de sayıyla görünür.

Birincisi: ağ üyeliği bir yetkilendirme değildir. Bölünmüş düzende ağ içinden erişilebilir 16 uç var ve hiçbiri kimlik sormuyor. Aynı ağdaki bir konteyner, komşusunun yalnız arayüz kapısına değil, ölçüm kapısına da ulaşır. Ağ ayrımı kimin ulaşabileceğini kabaca belirler, ulaşan uç ne isteyebileceğini hiç sınırlamaz.

İkincisi: kapanan dört yol yalnız doğrudan yollardır. Doğrulayıcı iki ağın da üyesidir; ön ağdan gelen bir istek doğrulayıcıya ulaşır ve doğrulayıcı arka ağdaki her şeye ulaşır. Yani toplayıcı ile faturalama arasında kapatılan yol, iki adımda hâlâ kat edilebilir. Ağ ayrımının kapattığı sayı 4’tür; kesişimde duran servis üzerinden dolaşılabilen sayı da 4’tür.

Üçüncüsü: ağ ad alanı ayrıdır ama ana makinenin ağ yığını paylaşılır. Yayımlanan her kapı ana makinenin arayüzünde gerçek bir uç açar ve o uç artık konteyner ağının değil, makinenin kuralları altındadır. Konteynerin içindeki 8084 ile makinenin arayüzündeki uç aynı şey değildir; ikincisi yalıtımın dışındadır.

Özet

  • Konteyner ağı adresi ortamdan çıkarır: ayarda makine adı yerine servis adı durur ve ad her makinede aynıdır. 01. dersteki 14 değişkenden dördü tam olarak bu farkı taşıyordu.
  • Ad çözümü erişimle aynı sınıra bağlıdır: bölünmüş düzende toplayıcı 1, doğrulayıcı 3, faturalama 2, iş emri 2 ad çözüyor. Engel bir reddetme değil, adın çözülmemesidir.
  • Ağ ayrımının kazancı: tek ağda 12 yönlü yol, 12 çözülen ad ve 24 erişilebilir uç varken iki ağda bunlar 8, 8 ve 16’ya iniyor; 4 yol, yani üçte biri kapanıyor. Bedeli bir ağ tanımı ile bir fazladan üyelik satırıdır — dört yerine beş.
  • Üç sürücü sınıfı üç ayrı satırdır: ayrı ad alanlı düzende dışarıdan 1 uç ve 0 kapı çarpışması; makineyle ortak düzende dışarıdan 8 uç, 12 açık yol ve dört servis de 8080 dinleseydi 3 çarpışma; ağsız düzende her ölçüm sıfır.
  • Yayımlanan kapı ile ağ içi erişim bağımsızdır: dışarı açılan yüzey 8 uçtan 1 uca inerken ağ içinden erişilebilir uç sayısı üç seçenekte de 16’da kalıyor.
  • Yalıtımın delindiği yer: ağ üyeliği yetkilendirme değildir — 16 ucun hiçbiri kimlik sormaz; kapanan 4 doğrudan yol, iki ağa birden üye olan doğrulayıcı üzerinden iki adımda kat edilebilir; ve yayımlanan kapı ana makinenin arayüzünde yalıtımın dışında bir uç açar.

Sonraki Adım

Ağ matrisi bir soruyu yanıtladı, bir başkasını açıkta bıraktı. Matris hangi konteynerin hangi uca ulaşabildiğini söylüyor; ulaşan isteğin arkasında kimin durduğunu söylemiyor. Aynı boşluk önceki derste de görülmüştü: takılan dizinde yazma hakkını belirleyen şey konteynerin adı değil, içinde çalışan kullanıcının kimlik numarasıydı ve sekiz düğümün altısı o yüzden kapalıydı. İki ölçüm aynı yere bakıyor. Konteynerin içinde çalışan süreç hangi kullanıcıdır, o kullanıcı ana makinede neye karşılık gelir ve varsayılan bırakıldığında hangi dosyalara erişir? Sonraki ders bu kimliği ölçer: ayrıcalıklı kimlikle kaç dosya açık kalıyor, kimlik değiştirildiğinde hangi işlemler düşüyor ve en az yetkiye geçmenin bedeli kaç girdide sahiplik düzeltmesi ister. Kimliğin taşıdığı yetenekler ise konunun sonuna bırakılır; orada ayrı bir sayı kümesi vardır.

İlerlemeni kaydetmek ve not almak için Giriş yap

Notlarım

Not almak için giriş yapmalısın.

Aramak için yazmaya başlayın.

↑↓ Esc gezin · aç · kapat