İçeriğe geç
academia.sh

Ders 08 / 14

Yönetilen İlişkisel Veritabanı

Elle işletilen bir ilişkisel veritabanı ile yönetilen hizmetin kalem kalem karşılaştırılması: yirmi sekiz kararın kaçının sağlayıcıya devredildiği, kaçının elde kaldığı ve kaçının hiç erişilemez hâle geldiği sayılır, elde kalan kalemlerin kaç tanesinin tek yönlü olduğu ayrılır, devralma penceresi sağlayıcı payı ile uygulama payına bölünüp düşen istek sayısı beş önbellek ömründe ölçülür ve verinin çıkışı mantıksal dışa aktarım süresi ile çıkış ücreti olarak hesaplanır.

İçindekiler

Önceki konu nesnelerin nereye konacağını ve o nesnelere kimin, ne kadar süreyle erişeceğini sayılarla çözdü. Geriye sorulmamış bir şey kaldı: sayaç okumalarının özetlendiği, iş emirlerinin durum değiştirdiği ve fatura belgelerinin bağlandığı sorgulanan veri hâlâ elle kurulmuş bir ilişkisel veritabanında duruyor. O veritabanının makinesi kiralanmış olabilir, ama yedeği alan, yamasını geçen, arıza anında ikinciyi birinci yapan hâlâ bir insan.

Bu dersin sorusu “yönetilen hizmet daha iyi mi” değil. Ölçülecek şey daha dar ve daha somut: veritabanı kiralandığında hangi kararlar el değiştiriyor. Karar üç yere gidebilir — sağlayıcıya devredilir, elde kalır, ya da hiç kimsede kalmaz: erişilemez hâle gelir. Üçüncü küme bu dersin asıl konusudur, çünkü kendi işlettiğin veritabanında böyle bir küme yoktur.

Karar Üç Kümeye Ayrılır

Elle işletilen bir veritabanında yirmi sekiz kalemin yirmi sekizi de eldedir: donanımın hangi diskle kurulacağı da, çekirdek ayarının ne olacağı da. Yönetilen hizmet bu listeyi böler. Devredilen kalemler artık sağlayıcının işidir ve sonucundan o sorumludur. Elde kalan kalemler ayar olarak durur; değiştirilebilir. Erişilemez kalemler ne devredilmiştir ne eldedir: ayar yüzeyinden çıkarılmıştır, sağlayıcı bir sayı seçmiştir ve o sayı görülmez.

Bu ayrım soyut değildir. Bir arıza gecesinde erişilemez sütundaki bir kalem, gecenin ne kadar süreceğini belirler ve o kaleme dokunulamaz.

Kataloğu kurarken tek ölçüt kullanıldı: kalemi değiştirmek için ne yapmak gerekir. Bir istekle değişiyorsa elde, sağlayıcının bir bildirimiyle değişiyorsa devredilmiş, hiçbir yoldan değişmiyorsa erişilemez sayıldı. Sınır kimi kalemlerde incedir — yedekleme sıklığı elde ama yedeğin nasıl alındığı devredilmiş, disk büyütme elde ama küçültme erişilemez. Bu incelik kataloğun kusuru değil, ölçülen şeyin kendisidir: yönetilen hizmet kararları tek parça hâlinde almaz, her kalemi ayrı ayrı böler.

Düzenek

YV1 — kurgu bölgesel ölçüm ağının iş emri veritabanı 220 GB’dir ve saniyede 1.400 istek alır. Bütün sayılar kurgudur. YV2 — sağlık denetimi 5 saniyede bir koşar, üst üste üç başarısız denetim devralmayı tetikler ve ilk denetim arızadan 2,4 saniye sonraya düşer. YV3 — kopyanın birincile yükseltilmesi 20 saniye sürer. YV4 — uygulama tarafında uç nokta adının çözümleme önbelleği T saniye yaşar; on altı uygulama örneğinin yenileme anları T aralığına eşit yayılmıştır. YV5 — her örnek 120 bağlantılık bir havuz taşır, bir bağlantı 25 ms’de kurulur ve sekiz bağlantı koşut kurulabilir. YV6 — çıkış ücreti kurgu birimdir: bölge içi 0, bölgeler arası 2, internet 9 birim/GB. YV2 ve YV3 sağlayıcının, YV4 ve YV5 uygulamanın tarafındadır; ölçüm bu sınırı ortaya çıkarmak için kurulmuştur.

// yv/model.mjs — yonetilen iliskisel veritabani MODELI. Kurgu bolgesel olcum aginin is emri
// veritabani uzerinde tanimli karar katalogu ve devralma zaman cizelgesi. Gercek bir urun ya da
// olcum degil; rastgelelik yoktur, her kosumda ayni sayilar cikar.
// Ucuncu sutun: karar yonetilen hizmette KIMDE. Dorduncu sutun: geri alinabilir mi.
export const KARAR = [
  ["donanim secimi ve yerlesimi", "devredildi", true],
  ["isletim sistemi yamasi", "devredildi", true],
  ["kucuk surum yamasi", "devredildi", true],
  ["yedek alma bicimi", "devredildi", true],
  ["anlik goruntu deposu", "devredildi", true],
  ["zaman noktasina donus altyapisi", "devredildi", true],
  ["bellek havuzu boyutu", "devredildi", true],
  ["cogaltma duzeni", "devredildi", true],
  ["ana surum yukseltme karari", "elde", false],
  ["yama penceresi", "elde", true],
  ["yedekleme sikligi", "elde", true],
  ["yedek saklama suresi", "elde", true],
  ["devralmayi elle tetikleme", "elde", true],
  ["baglanti ust siniri", "elde", true],
  ["planlayici maliyet ayarlari", "elde", true],
  ["listedeki uzantinin kurulmasi", "elde", true],
  ["disk buyutme", "elde", false],
  ["yerlesim bolgesi secimi", "elde", false],
  ["karakter kumesi ve harmanlama", "elde", false],
  ["kabuk erisimi", "erisilemez", null],
  ["dosya sistemi duzeni", "erisilemez", null],
  ["veri dizini yolu", "erisilemez", null],
  ["devralma esigi", "erisilemez", null],
  ["yazma onu gunlugu esigi", "erisilemez", null],
  ["listede olmayan uzanti", "erisilemez", null],
  ["disk kucultme", "erisilemez", null],
  ["gunluk dosyalarina dogrudan erisim", "erisilemez", null],
  ["cekirdek ayari", "erisilemez", null],
];

// Devralma zaman cizelgesi. Saglayicinin belirledigi iki adim sabittir; ucuncu adim uygulamanin
// cozumleyici onbellek omrune (T) baglidir ve ORNEK BASINA degisir.
export const SAGLIK_ARALIK = 5, SAGLIK_FAZ = 2.4, ESIK = 3, YUKSELTME = 20;
export const ORNEK = 16, ISTEK = 1400, HAVUZ = 120, BAGLANTI_MS = 25, KOSUT = 8;

export const algilama = () => SAGLIK_FAZ + (ESIK - 1) * SAGLIK_ARALIK;
export const havuzKurma = () => (HAVUZ * BAGLANTI_MS) / KOSUT / 1000;

// Her uygulama ornegi kendi onbellegini farkli anda yeniler; fazlar T araligina esit yayilmistir.
// Ornek, yukseltme bittikten SONRAKI ilk yenilemede yeni ucu ogrenir, sonra havuzunu kurar.
export function devralma(T) {
  const hazirlik = algilama() + YUKSELTME;
  const ornekler = [];
  for (let i = 0; i < ORNEK; i += 1) {
    const faz = (i * T) / ORNEK;
    const ogrenme = faz + T * Math.max(0, Math.ceil((hazirlik - faz) / T));
    ornekler.push(ogrenme + havuzKurma());
  }
  const dusen = ornekler.reduce((t, x) => t + x * (ISTEK / ORNEK), 0);
  return { hazirlik, enKotu: Math.max(...ornekler),
    ortalama: ornekler.reduce((a, b) => a + b, 0) / ORNEK, dusen: Math.round(dusen) };
}
// yv/olc.mjs — devredilen karar sayimi ve devralma penceresi
import { KARAR, devralma, algilama, havuzKurma, ORNEK, ISTEK, HAVUZ, YUKSELTME } from "./model.mjs";

const s = (x, n) => String(x).padStart(n);
const say = (k) => KARAR.filter(([, v]) => v === k).length;
console.log(`karar katalogu: ${KARAR.length} kalem. Kendi islettigin veritabaninda hepsi elde.\n`);
console.log("yonetilen hizmette      | kalem | pay   | ornek");
console.log("------------------------|-------|-------|--------------------------------------------");
for (const k of ["devredildi", "elde", "erisilemez"]) {
  const liste = KARAR.filter(([, v]) => v === k).map(([a]) => a);
  console.log(`${k.padEnd(23)} | ${s(liste.length, 5)} | ` +
    `${s("%" + (100 * liste.length / KARAR.length).toFixed(1), 5)} | ${liste.slice(0, 2).join(", ")}`);
}
const geriAlinamaz = KARAR.filter(([, v, g]) => v === "elde" && g === false);
console.log(`\nelde kalan ${say("elde")} kalemin ${geriAlinamaz.length} tanesi tek yonludur:`);
for (const [a] of geriAlinamaz) console.log(`  - ${a}`);
console.log(`erisilemez ${say("erisilemez")} kalem, kendi islettiginde ayar; burada hic yok.\n`);

console.log(`devralma: saglik denetimi ile algilama ${algilama().toFixed(1)} sn, yukseltme ` +
  `${YUKSELTME} sn -> saglayici payi ${(algilama() + YUKSELTME).toFixed(1)} sn (sabit).`);
console.log(`havuz kurma ${(havuzKurma() * 1000).toFixed(0)} ms, ${ORNEK} ornek x ${HAVUZ} ` +
  `baglanti = ${ORNEK * HAVUZ} yeni baglanti yeni birincile ayni anda gelir.`);
console.log(`istek hizi ${ISTEK}/sn; devralma boyunca hepsi duser.\n`);
console.log("onbellek omru T | saglayici payi | uygulama payi | kesinti (ort) | kesinti (en kotu) | dusen istek");
console.log("----------------|----------------|---------------|---------------|-------------------|------------");
for (const T of [5, 15, 30, 60, 120]) {
  const r = devralma(T);
  console.log(`${s(T + " sn", 15)} | ${s(r.hazirlik.toFixed(1) + " sn", 14)} | ` +
    `${s((r.ortalama - r.hazirlik).toFixed(1) + " sn", 13)} | ${s(r.ortalama.toFixed(1) + " sn", 13)} | ` +
    `${s(r.enKotu.toFixed(1) + " sn", 17)} | ${s(r.dusen, 11)}`);
}
const a = devralma(5), b = devralma(120);
console.log(`\nkosumdan bagimsiz: saglayici payi ${a.hazirlik.toFixed(1)} sn ile sabit; T 5'ten 120'ye ` +
  `cikinca kesinti ${a.ortalama.toFixed(1)} -> ${b.ortalama.toFixed(1)} sn, dusen istek ` +
  `${a.dusen} -> ${b.dusen}.`);
console.log(`devralma esigi erisilemez oldugu icin algilama suresi kisaltilamaz; kisaltilabilen tek ` +
  `sey uygulama tarafindaki T.`);

// Cikis: anlik goruntu bicimi erisilemez oldugu icin veri ancak MANTIKSAL disa aktarimla cikar.
const BOYUT_GB = 220, OKUMA_MBS = 40, YUKLEME_MBS = 26, TARIFE = { "bolge ici": 0, "bolgeler arasi": 2, "internet": 9 };
const saat = (mbs) => (BOYUT_GB * 1024) / mbs / 3600;
console.log(`\ncikis: ${BOYUT_GB} GB is emri verisi, mantiksal disa aktarim ${OKUMA_MBS} MB/sn, ` +
  `geri yukleme ${YUKLEME_MBS} MB/sn (indeksler yeniden kurulur).`);
console.log(`sure: disa aktarim ${saat(OKUMA_MBS).toFixed(2)} sa + yukleme ${saat(YUKLEME_MBS).toFixed(2)} sa = ` +
  `${(saat(OKUMA_MBS) + saat(YUKLEME_MBS)).toFixed(2)} sa. Anlik goruntu tasinamaz: bicim erisilemez sutunundadir.`);
console.log("hedef            | cikis ucreti (kurgu birim/GB) | toplam (kurgu birim)");
console.log("-----------------|-------------------------------|---------------------");
for (const [ad, birim] of Object.entries(TARIFE))
  console.log(`${ad.padEnd(16)} | ${s(birim, 29)} | ${s(birim * BOYUT_GB, 20)}`);
karar katalogu: 28 kalem. Kendi islettigin veritabaninda hepsi elde.

yonetilen hizmette      | kalem | pay   | ornek
------------------------|-------|-------|--------------------------------------------
devredildi              |     8 | %28.6 | donanim secimi ve yerlesimi, isletim sistemi yamasi
elde                    |    11 | %39.3 | ana surum yukseltme karari, yama penceresi
erisilemez              |     9 | %32.1 | kabuk erisimi, dosya sistemi duzeni

elde kalan 11 kalemin 4 tanesi tek yonludur:
  - ana surum yukseltme karari
  - disk buyutme
  - yerlesim bolgesi secimi
  - karakter kumesi ve harmanlama
erisilemez 9 kalem, kendi islettiginde ayar; burada hic yok.

devralma: saglik denetimi ile algilama 12.4 sn, yukseltme 20 sn -> saglayici payi 32.4 sn (sabit).
havuz kurma 375 ms, 16 ornek x 120 baglanti = 1920 yeni baglanti yeni birincile ayni anda gelir.
istek hizi 1400/sn; devralma boyunca hepsi duser.

onbellek omru T | saglayici payi | uygulama payi | kesinti (ort) | kesinti (en kotu) | dusen istek
----------------|----------------|---------------|---------------|-------------------|------------
           5 sn |        32.4 sn |        2.8 sn |       35.2 sn |           37.6 sn |       49306
          15 sn |        32.4 sn |        7.8 sn |       40.2 sn |           47.3 sn |       56306
          30 sn |        32.4 sn |       15.8 sn |       48.2 sn |           62.3 sn |       67463
          60 sn |        32.4 sn |       29.9 sn |       62.3 sn |           90.4 sn |       87150
         120 sn |        32.4 sn |       61.7 sn |       94.1 sn |          150.4 sn |      131775

kosumdan bagimsiz: saglayici payi 32.4 sn ile sabit; T 5'ten 120'ye cikinca kesinti 35.2 -> 94.1 sn, dusen istek 49306 -> 131775.
devralma esigi erisilemez oldugu icin algilama suresi kisaltilamaz; kisaltilabilen tek sey uygulama tarafindaki T.

cikis: 220 GB is emri verisi, mantiksal disa aktarim 40 MB/sn, geri yukleme 26 MB/sn (indeksler yeniden kurulur).
sure: disa aktarim 1.56 sa + yukleme 2.41 sa = 3.97 sa. Anlik goruntu tasinamaz: bicim erisilemez sutunundadir.
hedef            | cikis ucreti (kurgu birim/GB) | toplam (kurgu birim)
-----------------|-------------------------------|---------------------
bolge ici        |                             0 |                    0
bolgeler arasi   |                             2 |                  440
internet         |                             9 |                 1980

Erişilemez Sütun En Kalabalık İkinci Kümedir

Devredilen kalem sayısı 8, yani kataloğun yüzde 28,6’sı. Yönetilen hizmete geçmenin sattığı şey bu sütundur ve içindekiler gerçekten iş yükünü azaltır: işletim sistemi yaması, küçük sürüm yaması, yedek alma biçimi, çoğaltma düzeni artık başkasının gece nöbetidir.

Beklenmedik olan üçüncü sütundur: 9 kalem, yüzde 32,1. Bu kalemler devredilmedi; ortadan kalktı. Kabuk erişimi yok, veri dizini yolu yok, günlük dosyalarına doğrudan bakılamıyor. Bunların bir kısmı yokluğunda fark edilmez. Bir kısmı, kaybedildiği gün fark edilir: devralma eşiği bu sütundadır. Sağlık denetiminin kaç saniyede bir koştuğu ve kaç başarısızlıktan sonra devralma tetiklendiği okunamaz, ayarlanamaz. Aynı sütunda yazma önü günlüğü eşiği ve listede olmayan uzantı var: uygulamanın ihtiyaç duyduğu bir uzantı sağlayıcının listesinde yoksa, kurulmasının yolu yoktur — kendi işlettiğin veritabanında bu bir paket kurma işidir.

Elde kalan 11 kalem ise yanıltıcı bir rahatlık verir. Dördü tek yönlüdür: ana sürüm yükseltmesinden geri dönülmez, büyütülen disk küçültülmez, seçilen yerleşim bölgesi veri taşımadan değişmez ve karakter kümesiyle harmanlama seçimi tabloları yeniden yazmadan düzeltilmez. Bu dördü kurulum ekranında birer açılır listedir; sonuçları veritabanının ömrü boyunca sürer.

Devralmanın Ölçülen Yanı Kesinti Değil, Kesintinin Kime Ait Olduğudur

Devralma yönetilen hizmetin en çok anlatılan özelliğidir ve genellikle tek bir sayıyla anılır. Tablo o tek sayının iki parçadan oluştuğunu gösteriyor.

Sağlayıcı payı beş satırda da 32,4 saniyedir. Algılama 12,4 saniye (2,4 saniyelik faz artı iki denetim aralığı), yükseltme 20 saniye. Bu sayı hiçbir ayarla değişmez, çünkü onu üreten kalem erişilemez sütunundadır.

Uygulama payı 2,8 saniyeden 61,7 saniyeye çıkıyor. Fark yalnızca uç nokta adının çözümleme önbelleğinin ömründen geliyor. T 5 saniyeyken ortalama kesinti 35,2 saniye ve 49.306 istek düşüyor; T 120 saniyeyken ortalama 94,1 saniye ve 131.775 istek düşüyor. Aynı devralma, aynı sağlayıcı, 2,67 katı kayıp. En kötü örnek sütunu daha da açıktır: T 120’de bir uygulama örneği 150,4 saniye boyunca ölü bir adrese bağlanmayı deniyor.

Buradan çıkan kural devredilen kararın sınırını çiziyor: devralma devredildi, devralmanın uygulamada bittiği an devredilmedi. Havuz satırı da aynı yere bakıyor — on altı örnek ayağa kalktığında yeni birincil 1.920 bağlantı isteğini aynı anda karşılar; bağlantı üst sınırı elde kalan kalemlerdendir ve bu sayının altındaysa devralma, devralmanın kendisiyle biten bir kesintiye dönüşür.

Çıkışın Bedeli Biçimin Kilitli Olmasıdır

Son blok kursun tekrar eden kalemini bu derse uyguluyor. Veriyi başka bir yere taşımak gerektiğinde anlık görüntü işe yaramaz: anlık görüntü biçimi devredilen sütunda alınıp erişilemez sütununda okunamaz hâle gelir. Geriye tek yol kalır, mantıksal dışa aktarım: 220 GB veri 40 MB/sn ile 1,56 saatte çıkar, hedefte 26 MB/sn ile 2,41 saatte yüklenir — indeksler yeniden kurulduğu için yükleme okumadan yavaştır. Toplam 3,97 saat, üstüne çıkış ücreti: bölge içinde 0, bölgeler arasında 440, internet üzerinden 1.980 kurgu birim.

Bu üç sayının oranı kursun sonuna kadar aynı kalacak. Veri girerken hiçbir ücret ödemedi; aynı verinin dışarı çıkması bölge sınırını geçtiği anda ücretlendi. Sürenin kendisi de bir bedeldir: 3,97 saat boyunca ya iki dizge koşut yazılır ve aradaki fark elle kapatılır, ya da iş emri kayıtları donar. Yerleşim bölgesinin tek yönlü kalemler arasında sayılmasının sebebi budur — bölge değiştirmek, bu dört saatlik pencereyi bir kez daha ödemek demektir.

Özet

  • Yirmi sekiz kararın 8’i sağlayıcıya devredildi, 11’i elde kaldı, 9’u erişilemez hâle geldi; üçüncü küme kendi işlettiğin veritabanında yoktur.
  • Elde kalan 11 kalemin 4’ü tek yönlüdür: ana sürüm yükseltmesi, disk büyütme, yerleşim bölgesi ve harmanlama seçimi veri yeniden yazılmadan geri alınmaz.
  • Devralma kesintisinin 32,4 saniyesi sağlayıcının payıdır ve sabittir; devralma eşiği erişilemez olduğu için kısaltılamaz.
  • Uygulama payı 2,8 saniyeden 61,7 saniyeye çıkabiliyor: aynı devralmada düşen istek 49.306’dan 131.775’e, en kötü örnekteki kesinti 37,6 saniyeden 150,4 saniyeye yükseliyor.
  • Anlık görüntü biçimi erişilemez olduğu için çıkış mantıksal dışa aktarıma zorlar: 220 GB için 3,97 saat, artı internet üzerinden 1.980 kurgu birim çıkış ücreti.

Sonraki Adım

Bu ders tek bir birincil veritabanı varsayarak ölçüm yaptı: devralma anında yükü karşılayacak başka bir kopya yoktu, ikinci makine yalnızca beklemedeydi. Oysa iş emri veritabanının istek karışımının büyük bölümü okumadır — sayaç okuma özetleri, fatura sorguları, saha fotoğrafı kütükleri. Bekleyen bir kopyayı okumaya açmak yükü dağıtır, ama o kopya birincilin gerisinde kalır. Sonraki ders bu gecikmeyi tarar ve her değerde kaç okumanın bayat döndüğünü sayar; ardından “kendi yazdığını oku” gereksinimi olan istekleri ayırıp birincile yönlendirmenin kaç isteği kurtardığını ve birincilin yükünü ne kadar artırdığını ölçer.

İ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