<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Hakan İSMAİL</title>
    <description>The latest articles on DEV Community by Hakan İSMAİL (@hakanbaban53).</description>
    <link>https://dev.to/hakanbaban53</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3593379%2F63770104-9eda-408d-bbe7-f9d3072ffe6e.jpeg</url>
      <title>DEV Community: Hakan İSMAİL</title>
      <link>https://dev.to/hakanbaban53</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/hakanbaban53"/>
    <language>en</language>
    <item>
      <title># HA Manager: Watchdog, Fencing ve Node Affinity (Modül 3)</title>
      <dc:creator>Hakan İSMAİL</dc:creator>
      <pubDate>Mon, 17 Aug 2026 05:59:07 +0000</pubDate>
      <link>https://dev.to/hakanbaban53/-ha-manager-watchdog-fencing-ve-node-affinity-modul-3-3fng</link>
      <guid>https://dev.to/hakanbaban53/-ha-manager-watchdog-fencing-ve-node-affinity-modul-3-3fng</guid>
      <description>&lt;p&gt;&lt;strong&gt;Seri:&lt;/strong&gt; Proxmox VE Cluster ve Corosync&lt;/p&gt;




&lt;p&gt;Modül 1'de bir node çökünce VM'in kendiliğinden hiçbir yerde açılmadığını göstermiştim; cluster kurmak otomatik yüksek erişilebilirlik demek değildi. Bu modülde o boşluğu dolduran parçaya geçiyorum: HA Manager. Watchdog tabanlı fencing'i, gerçek bir node çökmesinde recovery'nin saniye saniye nasıl işlediğini, ve bir node affinity kuralının beklediğimden çok daha proaktif davrandığını, hepsini gerçekten test ederek öğrendim.&lt;/p&gt;

&lt;p&gt;Bu modülde her adımı hem terminalden hem web arayüzünden gösteriyorum; ikisi aynı API'yi kullanıyor, ama bazen birini görmek diğerini daha iyi anlamana yardımcı oluyor.&lt;/p&gt;




&lt;h2&gt;
  
  
  HA Manager Nedir?
&lt;/h2&gt;

&lt;p&gt;Proxmox VE'nin HA stack'i, Pacemaker gibi harici bir araç gerektirmiyor; kendi başına çalışan bir çözüm. İki daemon var: &lt;strong&gt;pve-ha-lrm&lt;/strong&gt; (Local Resource Manager), her node'da çalışıp o node'daki servisleri kontrol ediyor; &lt;strong&gt;pve-ha-crm&lt;/strong&gt; (Cluster Resource Manager), cluster genelinde kararlar alıyor, sadece bir node'da aktif "master" olabiliyor.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Fencing&lt;/strong&gt;, bir node arızalandığında onun gerçekten "offline" olduğundan emin olma süreci. Bu kritik, çünkü fence edilmemiş bir node hâlâ shared storage'a erişebiliyor olabilir; aynı VM'i başka bir node'da başlatmak, iki node'un aynı diske aynı anda yazmasına yol açabilir. Proxmox, harici fencing donanımı gerektirmeyen bir yöntem kullanıyor: &lt;strong&gt;watchdog timer tabanlı self-fencing&lt;/strong&gt;. &lt;code&gt;ha-manager&lt;/code&gt;, watchdog timer'ı düzenli olarak resetliyor; bir arıza nedeniyle bu reset gerçekleşmezse, timer node'u otomatik olarak reboot ediyor.&lt;/p&gt;

&lt;p&gt;Burada altta yatan tasarım felsefesi ilginç: node'un "belki çalışıyordur, belki bozuktur" gibi belirsiz bir durumda kalmasına izin verilmiyor, doğrudan tam bir reboot'a zorlanıyor. Mantığı şu: bir node yarım yamalak, tutarsız bir durumda çalışmaya devam ederse (örneğin ağı kopmuş ama diski hâlâ yazabiliyorsa), bu durum veri bozulmasına yol açabilir; oysa node tamamen durursa, en azından zarar vermeye devam etmiyor. Yanlış çalışmaya devam etmektense hiç çalışmamak, burada bilinçli bir güvenlik tercihi.&lt;/p&gt;




&lt;h2&gt;
  
  
  Uygulama 1: Watchdog'u Doğrulamak
&lt;/h2&gt;

&lt;p&gt;Nested lab'ımda donanım watchdog yok, Proxmox varsayılan olarak &lt;code&gt;softdog&lt;/code&gt; kernel modülüne düşüyor:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cat&lt;/span&gt; /etc/default/pve-ha-manager
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight conf"&gt;&lt;code&gt;&lt;span class="c"&gt;# select watchdog module (default is softdog)
#WATCHDOG_MODULE=ipmi_watchdog
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Satır yorumlu, yani varsayılan (&lt;code&gt;softdog&lt;/code&gt;) kullanılıyor. Doğrulamak için ilk denediğim komut boş döndü:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;lsmod | &lt;span class="nb"&gt;grep &lt;/span&gt;watchdog
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;(boş çıktı)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Bir an modülün yüklü olmadığını düşündüm. Ama hata bendeydi: "softdog" kelimesi harfi harfine "watchdog" içermiyor. Doğrusu:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;lsmod | &lt;span class="nb"&gt;grep &lt;/span&gt;dog
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;softdog                12288  2
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Modül yüklü. &lt;code&gt;/dev/watchdog&lt;/code&gt; ve &lt;code&gt;/dev/watchdog0&lt;/code&gt; cihazları da mevcuttu:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;ls&lt;/span&gt; &lt;span class="nt"&gt;-la&lt;/span&gt; /dev/watchdog&lt;span class="k"&gt;*&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="go"&gt;crw------- 1 root root  10, 130 Aug 15 07:41 /dev/watchdog
crw------- 1 root root 243,   0 Aug 15 07:41 /dev/watchdog0
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Uygulama 2: VM'i HA'ya Eklemek
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ha-manager add vm:100 &lt;span class="nt"&gt;--state&lt;/span&gt; started
ha-manager status
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;quorum OK
master pve-a (active, ...)
fencing armed (CRM watchdog active)
lrm pve-a (active, watchdog active, ...)
lrm pve-b (idle, watchdog standby, ...)
lrm pve-c (idle, watchdog standby, ...)
service vm:100 (pve-a, started)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Aynı işlem web arayüzünden de yapılabiliyor: &lt;code&gt;Datacenter → HA → Resources&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fwhczpptwnowhb95w27sn.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fwhczpptwnowhb95w27sn.png" alt="Datacenter → HA → Resources ekranı, boş kaynak listesi" width="800" height="297"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;"Add" butonuna basıp VM'i ve başlangıç durumunu (&lt;code&gt;started&lt;/code&gt;) seçiyorsun:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fxdghrlgru3ielpprdl0m.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fxdghrlgru3ielpprdl0m.png" alt="Add HA Resource diyaloğu - VM 100 ve state seçimi" width="599" height="221"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Dikkat çeken bir detay: &lt;code&gt;pve-a&lt;/code&gt; hem VM'i barındırıyor hem de CRM master'ı. Bu, sıradaki testi daha ilginç kılıyor; &lt;code&gt;pve-a&lt;/code&gt;'yı çökertince sadece VM'in taşınıp taşınmayacağını değil, cluster'ın yeni bir master seçip seçemeyeceğini de gözlemleyeceğim.&lt;/p&gt;




&lt;h2&gt;
  
  
  Uygulama 3: Gerçek Bir Çökme, Saniye Saniye
&lt;/h2&gt;

&lt;p&gt;Host'tan ping'i başlattım:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ping 192.168.122.251
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F5nvdcyorvxynjaxshda2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F5nvdcyorvxynjaxshda2.png" alt="Ping başlatma - terminal görüntüsü" width="641" height="195"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Sonra &lt;code&gt;pve-a&lt;/code&gt;'yı fiziksel host'tan çökerttim:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;virsh destroy pve-a
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ping çıktısı Modül 1/2'deki tanıdık deseni tekrarladı: önce sessiz paket kaybı, sonra gateway'in aktif "Destination Host Unreachable" demesi.&lt;/p&gt;

&lt;p&gt;İlk kontrolüm (çökmeden ~10 saniye sonra), &lt;code&gt;pve-b&lt;/code&gt;'den:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ha-manager status
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;quorum OK
master pve-c (active, ...)
fencing armed (CRM watchdog active)
lrm pve-a (active, watchdog active, ...)
lrm pve-b (idle, watchdog standby, ...)
lrm pve-c (idle, watchdog standby, ...)
service vm:100 (pve-a, started)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Yeni master seçimi hızlı gerçekleşmişti (&lt;code&gt;master pve-c&lt;/code&gt; olmuştu), ama VM henüz taşınmamıştı; bu, sürecin ortasında bir "anlık fotoğraf". Birkaç dakika sonra aynı komutu tekrar çalıştırdım:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ha-manager status
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;quorum OK
master pve-c (active, ...)
fencing armed (CRM watchdog active)
lrm pve-a (old timestamp - dead?, watchdog standby, ...)
lrm pve-b (active, watchdog active, ...)
lrm pve-c (idle, watchdog standby, ...)
service vm:100 (pve-b, started)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F9fe627x7bmb9r5usln5a.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F9fe627x7bmb9r5usln5a.png" alt="HA Status ekranı - vm:100 pve-b'de started, lrm pve-a " width="800" height="328"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;VM gerçekten &lt;code&gt;pve-b&lt;/code&gt;'ye taşınmış. &lt;code&gt;lrm pve-a&lt;/code&gt;'nın durumu da ilginçti: sistem bile kesin konuşmuyor, "old timestamp - dead?" diye soru işaretiyle yazıyor.&lt;/p&gt;

&lt;h3&gt;
  
  
  Tam Zaman Çizelgesi
&lt;/h3&gt;

&lt;p&gt;Tahmin etmek yerine &lt;code&gt;pve-c&lt;/code&gt;'nin (master) CRM loglarına baktım:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;journalctl &lt;span class="nt"&gt;-u&lt;/span&gt; pve-ha-crm &lt;span class="nt"&gt;--since&lt;/span&gt; &lt;span class="s2"&gt;"19:46:00"&lt;/span&gt; &lt;span class="nt"&gt;--until&lt;/span&gt; &lt;span class="s2"&gt;"19:50:00"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;19:46:53  node 'pve-a': state changed from 'online' =&amp;gt; 'unknown'
19:47:43  service 'vm:100': state changed from 'started' to 'fence'
19:47:43  node 'pve-a': state changed from 'unknown' =&amp;gt; 'fence'
19:48:43  successfully acquired lock 'ha_agent_pve-a_lock'
19:48:43  fencing: acknowledged - got agent lock for node 'pve-a'
19:48:43  service 'vm:100': state changed from 'fence' to 'recovery'
19:48:43  recover service 'vm:100' from fenced node 'pve-a' to node 'pve-b'
19:48:43  service 'vm:100': state changed from 'recovery' to 'started'  (node = pve-b)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;pve-a&lt;/code&gt;'yı çökerttiğim an ~19:46:33'tü. Üç net faz ortaya çıktı:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Algılama (~20 saniye):&lt;/strong&gt; çökme → &lt;code&gt;online =&amp;gt; unknown&lt;/code&gt; (19:46:53). Corosync'in kaybı fark edip CRM'e bildirmesi.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Fence kararı (tam 50 saniye):&lt;/strong&gt; &lt;code&gt;unknown&lt;/code&gt; → &lt;code&gt;fence&lt;/code&gt; (19:47:43). Muhtemelen ani bir yanlış pozitiften kaçınmak için bekletilen bir politika süresi.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Watchdog güvenlik beklemesi (tam 60 saniye):&lt;/strong&gt; &lt;code&gt;fence&lt;/code&gt; → lock alındı, VM &lt;code&gt;pve-b&lt;/code&gt;'de başladı (19:48:43). Bu rakam tesadüf değil; watchdog'un kendi kendini resetleyeceği tam süreyi (tipik 60 saniye) bekliyor, "belki node hâlâ hayatta ve VM'i çalıştırıyordur" ihtimalini sıfırlıyor.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Toplam: ~130 saniye&lt;/strong&gt; (&lt;code&gt;virsh destroy&lt;/code&gt;'dan VM'in yeni node'da çalışmasına kadar).&lt;/p&gt;




&lt;h2&gt;
  
  
  Uygulama 4: Double-Start'ın Yapısal Olarak İmkansız Olduğunu Kanıtlamak
&lt;/h2&gt;

&lt;p&gt;En kritik soru: &lt;code&gt;pve-a&lt;/code&gt; geri gelince VM'i ikinci kez başlatmaya çalışacak mı? İki node'un aynı diske aynı anda yazması gerçek bir felaket senaryosu olurdu.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;virsh start pve-a
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Boot tamamlandıktan sonra, &lt;code&gt;pve-a&lt;/code&gt;'da:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;qm status 100
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Configuration file 'nodes/pve-a/qemu-server/100.conf' does not exist
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Bu, Modül 1'de gördüğüm birebir aynı hata mesajı, ama tamamen farklı bir anlamda. Modül 1'de bu, "kimse bu VM'i başlatmayacak" demekti. Burada ise: fencing + recovery süreci, VM'in config dosyasını pmxcfs üzerinden &lt;strong&gt;gerçekten &lt;code&gt;pve-b&lt;/code&gt;'nin dizinine taşımış&lt;/strong&gt;. &lt;code&gt;pve-a&lt;/code&gt;'da böyle bir dosya artık hiç yok. Bu, double-start'ı sadece "önlenmiş" değil, yapısal olarak &lt;strong&gt;imkansız&lt;/strong&gt; kılıyor: &lt;code&gt;pve-a&lt;/code&gt; geri gelse bile, elinde VM'i başlatacak bir config bile bulamıyor.&lt;/p&gt;

&lt;p&gt;Bunu iki node'dan bağımsız olarak doğruladım. &lt;code&gt;pve-b&lt;/code&gt;'de:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pvecm status
ha-manager status
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Nodes:            3
Quorate:          Yes
Total votes:      5
Quorum:           3
Flags:            Quorate Qdevice
...
quorum OK
master pve-c (active, ...)
fencing armed (CRM watchdog active)
lrm pve-a (idle, watchdog standby, ...)
lrm pve-b (active, watchdog active, ...)
lrm pve-c (idle, watchdog standby, ...)
service vm:100 (pve-b, started)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;pve-a&lt;/code&gt;'da, aynı anda:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pvecm status
ha-manager status
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Nodes:            3
Quorate:          Yes
Total votes:      5
Quorum:           3
Flags:            Quorate Qdevice
...
quorum OK
master pve-c (active, ...)
fencing armed (CRM watchdog active)
lrm pve-a (idle, watchdog standby, ...)
lrm pve-b (active, watchdog active, ...)
lrm pve-c (idle, watchdog standby, ...)
service vm:100 (pve-b, started)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Birebir tutarlı: 5 oy, 3 node, &lt;code&gt;vm:100 (pve-b, started)&lt;/code&gt;, fencing armed. &lt;code&gt;lrm pve-a&lt;/code&gt;, hiçbir manuel müdahale gerekmeden, kendiliğinden "old timestamp - dead?" durumundan "idle"a döndü.&lt;/p&gt;




&lt;h2&gt;
  
  
  Uygulama 5: Node Affinity, Beklediğimden Daha Proaktif
&lt;/h2&gt;

&lt;p&gt;Her şey sağlıklıyken, VM'in tercihen &lt;code&gt;pve-a&lt;/code&gt;'da kalmasını söyleyen bir kural tanımladım:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ha-manager rules add node-affinity prefer-pve-a &lt;span class="nt"&gt;--resources&lt;/span&gt; vm:100 &lt;span class="nt"&gt;--nodes&lt;/span&gt; pve-a
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Aynı işlem web arayüzünden: &lt;code&gt;Datacenter → HA → Rules&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fulv3bjhimy5k6u23opl9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fulv3bjhimy5k6u23opl9.png" alt="Datacenter → HA → Rules ekranı" width="800" height="328"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;"Add" → "Node Affinity Rule" diyip kaynağı ve tercih edilen node'u seçiyorsun:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fhjabul0g2kl0o7wup8ht.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fhjabul0g2kl0o7wup8ht.png" alt="Add Node Affinity Rule diyaloğu - vm:100, pve-a" width="598" height="492"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Beklentim şuydu: bu kural sadece bir sonraki arıza/recovery anında devreye girer, halihazırda sağlıklı çalışan bir servisi kendiliğinden taşımaz. Yanılmışım.&lt;/p&gt;

&lt;p&gt;Kuralı ekledikten saniyeler sonra, tekrar baktığımda:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ha-manager status
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;service vm:100 (pve-b, migrate)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F0xpf0zurvfdo19crnj7j.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F0xpf0zurvfdo19crnj7j.png" alt="HA Status - vm:100 migrate durumunda" width="796" height="52"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;VM zaten taşınmaya başlamıştı; hem de &lt;code&gt;fence&lt;/code&gt; ya da &lt;code&gt;relocate&lt;/code&gt; değil, &lt;strong&gt;&lt;code&gt;migrate&lt;/code&gt;&lt;/strong&gt; durumunda; yani VM durdurulup yeniden başlatılmadı, gerçek bir canlı migration tetiklendi. ~25-30 saniye sonra, tekrar:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ha-manager status
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;service vm:100 (pve-a, started)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fagkajtw8ogryf1cp2qm6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fagkajtw8ogryf1cp2qm6.png" alt="HA Status - vm:100 pve-a'da started" width="796" height="52"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Tamamlanmıştı. Hiçbir arıza olmadan, ben sadece bir tercih tanımladığım için, HA Manager kendiliğinden mevcut durumu istenen duruma yakınsatmış. Bu, HA Manager'ın sadece &lt;strong&gt;reaktif&lt;/strong&gt; (arızaya tepki veren) değil, aynı zamanda &lt;strong&gt;proaktif&lt;/strong&gt; (deklare edilen tercihe kendiliğinden yaklaşan) bir sistem olduğunu gösterdi; bunu önceden bilmiyordum, test etmeden öğrenemezdim.&lt;/p&gt;

&lt;p&gt;Son doğrulama:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;qm status 100
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;status&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;running&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pvecm status
ha-manager status
ha-manager rules list
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Nodes:            3
Quorate:          Yes
Total votes:      5
Quorum:           3
...
service vm:100 (pve-a, started)
...
┌──────────────┐
│ rule         │
╞══════════════╡
│ prefer-pve-a │
└──────────────┘
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Tamamen tutarlı: VM çalışıyor, cluster quorate, kural hâlâ kayıtlı.&lt;/p&gt;




&lt;h2&gt;
  
  
  Genel Değerlendirme
&lt;/h2&gt;

&lt;p&gt;Bu modülde üç şey beni özellikle şaşırttı.&lt;/p&gt;

&lt;p&gt;Birincisi, fencing'in üç net fazlı, toplamda ~130 saniyelik bir süreç olması. "HA var, arıza olunca hemen düzelir" gibi belirsiz bir beklentim vardı; gerçekte sistem, her biri ayrı bir amaca hizmet eden (algılama, yanlış pozitiften kaçınma, watchdog güvenlik payı) üç ayrı bekleme süresinden geçiyor. Bu, hız değil, güvenlik önceliğiyle tasarlanmış bir sistem.&lt;/p&gt;

&lt;p&gt;İkincisi, &lt;code&gt;pve-a&lt;/code&gt;'nın config dosyasının gerçekten &lt;code&gt;pve-b&lt;/code&gt;'ye taşınmış olması. Double-start korumasını "kilitli bir mekanizma" gibi hayal etmiştim; gerçekte çok daha basit ve zarif: VM'i başlatacak bilgi artık orada yok, o yüzden başlatılamıyor.&lt;/p&gt;

&lt;p&gt;Üçüncüsü, node affinity kuralının proaktif davranışı. Bu, testin planımı tersine çevirdiği bir andı; "muhtemelen böyle çalışır" diye düşünüp geçebilirdim, ama gerçekten test edince tam tersini gördüm. Modül 2'de de benzer bir şey olmuştu (split-brain'i tetiklemeye çalışıp başaramamak); bu serinin tekrar eden bir teması gibi görünüyor: varsayımlarım, gerçek testlerden daha az güvenilir çıkıyor.&lt;/p&gt;

&lt;p&gt;Bir sonraki modülde, HA Manager'ı biraz daha zorlayacağım: birden fazla VM ile resource affinity kurallarını (aynı node'da tutma/ayrı tutma), ve CRS'in (Cluster Resource Scheduler) yük dengeleme davranışını test edeceğim.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Bu seri, resmi Proxmox VE dokümantasyonundan (pve.proxmox.com) derleniyor. Buradaki gözlemler bir homelab ortamına dayanıyor; production kararları için resmi dokümantasyon ve deneyimli sistem yöneticileri referans alınmalıdır.&lt;/em&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Quorum Kaybını Tetiklemek, QDevice Kurmak ve Shared Storage'a Geçmek (Modül 2)</title>
      <dc:creator>Hakan İSMAİL</dc:creator>
      <pubDate>Fri, 14 Aug 2026 07:03:26 +0000</pubDate>
      <link>https://dev.to/hakanbaban53/quorum-kaybini-tetiklemek-qdevice-kurmak-ve-shared-storagea-gecmek-modul-2-pma</link>
      <guid>https://dev.to/hakanbaban53/quorum-kaybini-tetiklemek-qdevice-kurmak-ve-shared-storagea-gecmek-modul-2-pma</guid>
      <description>&lt;p&gt;&lt;strong&gt;Seri:&lt;/strong&gt; Proxmox VE Cluster ve Corosync&lt;/p&gt;




&lt;p&gt;Modül 1'de cluster'ı kurdum, canlı migration'ın çalıştığını kanıtladım, ve bir node çökünce VM'in kendiliğinden başka bir yerde açılmadığını gösterdim. Bu modülde asıl arkasındaki mekanizmaya iniyorum: quorum. Ne zaman kaybediliyor, pmxcfs'i nasıl etkiliyor, QDevice bu denklemi nasıl değiştiriyor, ve "quorum'u zorla" demenin (&lt;code&gt;pvecm expected&lt;/code&gt;) gerçekten ne kadar tehlikeli olduğunu, kendim tetiklemeye çalışarak öğrendim. Sona da, Modül 1'de yarım kalan bir şeyi tamamladım: gerçek bir shared storage kurup, migration'ın &lt;code&gt;--with-local-disks&lt;/code&gt; olmadan nasıl çalıştığını gösterdim.&lt;/p&gt;

&lt;p&gt;Bu modülde bir hipotezimin yanlış çıktığını da saklamayacağım; yanlış çıkması, doğru sonuçtan daha fazla şey öğretti.&lt;/p&gt;




&lt;h2&gt;
  
  
  Quorum Nedir, Neden Var?
&lt;/h2&gt;

&lt;p&gt;Quorum, dağıtık bir sistemde bir işlemi (özellikle konfigürasyon değişikliği) gerçekleştirmek için gereken minimum oy sayısı. Proxmox VE'de her node varsayılan olarak bir oy taşıyor. Formül basit: &lt;code&gt;quorum = floor(toplam_oy / 2) + 1&lt;/code&gt;. Ağ bölünmesi (partition) olduğunda, sadece çoğunluğa sahip taraf işlemeye devam edebiliyor; bu, split-brain'i (iki tarafın da "ben doğruyum" deyip aynı kaynağı bağımsız yönetmeye çalışmasını) önlüyor.&lt;/p&gt;

&lt;p&gt;3 node'lu cluster'ımızda quorum eşiği 2 (3'ün çoğunluğu). Bir node izole olursa, kalan iki node çoğunluğu oluşturduğu için çalışmaya devam ediyor; izole olan tek node ise azınlıkta kalıp durabiliyor.&lt;/p&gt;




&lt;h2&gt;
  
  
  Uygulama 1: Quorum Kaybını Gerçekten Tetiklemek
&lt;/h2&gt;

&lt;p&gt;Bunu Modül 1'deki node çökertme testinden farklı yapmak istedim: orada tüm node'u (&lt;code&gt;virsh destroy&lt;/code&gt;) öldürmüştüm, burada sadece Corosync ağını kesip node'u canlı tutuyorum; management ağı hâlâ açık, SSH ile erişebiliyorum.&lt;/p&gt;

&lt;p&gt;Fiziksel host'tan &lt;code&gt;pve-c&lt;/code&gt;'nin corosync-net arayüzünü düşürdüm:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;virsh domif-setlink pve-c vnet15 down
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;pve-c&lt;/code&gt;'de:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pvecm status
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Nodes:            1
Quorate:          No
Total votes:      1
Quorum:           3 Activity blocked
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Beklendiği gibi: tek başına kalan &lt;code&gt;pve-c&lt;/code&gt;, quorum eşiğini (3, bu noktada QDevice henüz yoktu) karşılayamıyor.&lt;/p&gt;

&lt;p&gt;pmxcfs'e yazmayı denedim:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;touch&lt;/span&gt; /etc/pve/test-readonly.txt
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="go"&gt;touch: cannot touch '/etc/pve/test-readonly.txt': Permission denied
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Modül 1'de gördüğüm "read-only file system" davranışının bir başka görünümü; burada hata mesajı farklı (&lt;code&gt;Permission denied&lt;/code&gt; vs &lt;code&gt;Read-only file system&lt;/code&gt;) ama sonuç aynı: quorum'suz bir node, konfigürasyona yazamıyor.&lt;/p&gt;

&lt;p&gt;Çoğunluk tarafında (&lt;code&gt;pve-a&lt;/code&gt;, iki node) durum farklıydı: &lt;code&gt;Quorate: Yes&lt;/code&gt; olarak kaldı, hiç kesinti yaşamadı. Bu, quorum mekanizmasının tam olarak tasarlandığı gibi çalıştığının kanıtı: azınlık durur, çoğunluk devam eder.&lt;/p&gt;

&lt;p&gt;Ağı geri açtım (&lt;code&gt;up&lt;/code&gt;), birkaç saniye içinde cluster kendiliğinden 3/3 quorate'e döndü.&lt;/p&gt;




&lt;h2&gt;
  
  
  Uygulama 2: QDevice'i Devreye Almak
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;qdevice-1&lt;/code&gt; VM'ine Modül 0'da zaten &lt;code&gt;corosync-qnetd&lt;/code&gt; paketini kurmuştum, ama hiç yapılandırmamıştım. Şimdi gerçekten devreye alma zamanı.&lt;/p&gt;

&lt;h3&gt;
  
  
  Beklenmedik Uyarı: Odd Node Count
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pvecm qdevice setup 192.168.122.20
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Clusters with an odd node count are not officially supported!
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Bu beni şaşırttı. Araştırınca öğrendim: &lt;code&gt;pvecm&lt;/code&gt;, node sayısı tek olduğunda varsayılan olarak duruyor. Sebep, QDevice'in iki farklı algoritması var: çift node sayısı için varsayılan &lt;code&gt;ffsplit&lt;/code&gt; (her node'a eşit davranıp QDevice'e her zaman tam 1 oy veren), tek node sayısı için ise &lt;code&gt;--force&lt;/code&gt; ile devreye giren &lt;code&gt;lms&lt;/code&gt; (Last Man Standing). 3 node'lu cluster'ım tek sayı olduğu için bu uyarıyı tetikledi.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pvecm qdevice setup 192.168.122.20 &lt;span class="nt"&gt;--force&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Bu sefer kurulum tamamlandı: sertifikalar üç node'a da dağıtıldı, &lt;code&gt;corosync-qdevice.service&lt;/code&gt; her node'da otomatik enable + start edildi.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;lms&lt;/code&gt; Algoritmasının Etkisini Doğrulamak
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pvecm status
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Expected votes:   5
Total votes:      5
Quorum:           3
Membership information
    Nodeid      Votes    Qdevice Name
0x00000001          1    A,V,NMW 10.10.10.11
0x00000002          1    A,V,NMW 10.10.10.12
0x00000003          1    A,V,NMW 10.10.10.13 (local)
0x00000000          2            Qdevice
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Burada dikkatimi çeken şey: Qdevice satırında &lt;strong&gt;2 oy&lt;/strong&gt; var, 1 değil. &lt;code&gt;ffsplit&lt;/code&gt;'te QDevice her zaman 1 oy verirken, &lt;code&gt;lms&lt;/code&gt;'de &lt;strong&gt;N-1 oy&lt;/strong&gt; veriyor (N = node sayısı). Bizim durumumuzda 3-1=2. &lt;code&gt;corosync.conf&lt;/code&gt;'a bakınca bunu doğruladım:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight hocon"&gt;&lt;code&gt;&lt;span class="nl"&gt;quorum&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;device&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;model&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;net&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;net&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;algorithm&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;lms&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;host&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;192.168.122.20&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;tls&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;on&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Toplam matematik: 3 node × 1 + QDevice × 2 = &lt;strong&gt;5 oy&lt;/strong&gt;, quorum eşiği &lt;strong&gt;3&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  Uygulama 3: QDevice'in Değerini Kanıtlamak
&lt;/h2&gt;

&lt;p&gt;Modül 1'de, tek bir node çoğunluğu asla oluşturamıyordu. QDevice'in asıl var oluş sebebi, bunu belirli senaryolarda değiştirmek. Test ettim: iki node'u &lt;strong&gt;aynı anda&lt;/strong&gt; çökerttim.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;virsh destroy pve-b
&lt;span class="nb"&gt;sudo &lt;/span&gt;virsh destroy pve-c
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Tek kalan &lt;code&gt;pve-a&lt;/code&gt;'da:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pvecm status
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Nodes:            1
Total votes:      3
Quorum:           3
Quorate:          Yes
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Matematik: &lt;code&gt;pve-a&lt;/code&gt; (1 oy) + QDevice (2 oy) = 3, eşik de 3. &lt;strong&gt;Quorate: Yes.&lt;/strong&gt; QDevice olmadan bu imkansız olurdu; tek bir node kendi başına asla çoğunluk oluşturamaz.&lt;/p&gt;

&lt;p&gt;Kanıtı tamamlamak için:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;touch&lt;/span&gt; /etc/pve/qdevice-test.txt
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Başarılı oldu; dosya &lt;code&gt;/etc/pve&lt;/code&gt; altında göründü. Modül 1'deki "tek node = read-only" bulgusunun tam tersi; burada tek node ama QDevice sayesinde quorate, pmxcfs yazılabilir.&lt;/p&gt;

&lt;p&gt;İki node'u da geri getirdim, birkaç dakika içinde cluster tam olarak (5 oy, 3 node) toparlandı.&lt;/p&gt;




&lt;h2&gt;
  
  
  Uygulama 4: Split-Brain'i Tetiklemeye Çalışmak
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;pvecm expected&lt;/code&gt; komutu, bir node'u zorla "quorate" göstermenin bir yolu; teoride tehlikeli, çünkü izole bir node kendini haklı sanıp bağımsız kararlar almaya başlayabilir. Bunu bilerek tetiklemeye çalıştım.&lt;/p&gt;

&lt;h3&gt;
  
  
  İlk Deneme: Yanlış Anlaşılan Bir Hata
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;pve-c&lt;/code&gt;'yi izole ettim, ama &lt;code&gt;down&lt;/code&gt; komutundan hemen sonra yanlışlıkla &lt;code&gt;up&lt;/code&gt;'ı da çalıştırdım; izolasyon çok kısa sürdü. &lt;code&gt;pve-c&lt;/code&gt;'de:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pvecm expected 1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Hiçbir hata almadım, ama sonraki denemede (hem &lt;code&gt;pve-c&lt;/code&gt;'de hem &lt;code&gt;pve-a&lt;/code&gt;'da):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Unable to set expected votes: CS_ERR_INVALID_PARAM
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;İlk başta bunun QDevice'e özgü bir kısıtlama olduğunu düşündüm. Yanılmışım. Gerçek sebep daha basit: &lt;code&gt;votequorum_setexpected&lt;/code&gt; API'si, &lt;strong&gt;sadece zaten quorum'suz olan bir partition'ı kurtarmak için&lt;/strong&gt; çalışıyor; zaten quorate olan bir partition'ın oy eşiğini manuel düşürmene izin vermiyor. Bizim denemelerimiz, node zaten (kısa izolasyondan sonra ya da QDevice'in sağladığı fazladan oyla) quorate durumdayken yapıldığı için reddedildi. Bu, QDevice'in özel bir davranışı değil, corosync'in her zaman var olan bir güvenlik kuralı.&lt;/p&gt;

&lt;h3&gt;
  
  
  İkinci Deneme: Doğru İzolasyon
&lt;/h3&gt;

&lt;p&gt;Bu sefer &lt;code&gt;pve-c&lt;/code&gt;'yi gerçekten izole tuttum, geri açmadım:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;virsh domif-setlink pve-c vnet15 down
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;pve-c&lt;/code&gt;'de doğruladım:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Nodes:            1
Quorate:          No
Total votes:      1
Quorum:           3
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Gerçekten quorum'suz. Şimdi:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pvecm expected 1
pvecm status
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Beklenmedik bir şey oldu:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Expected votes:   3
Quorum:           2
Quorate:          No
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;1 istedim, sistem 3 verdi.&lt;/strong&gt; Ve &lt;code&gt;pve-c&lt;/code&gt; (1 oy) bu yeni eşiği (2) bile karşılayamadığı için &lt;code&gt;Quorate: No&lt;/code&gt; kaldı, &lt;code&gt;touch&lt;/code&gt; yine &lt;code&gt;Permission denied&lt;/code&gt; verdi.&lt;/p&gt;

&lt;h3&gt;
  
  
  Bu Neden Oldu?
&lt;/h3&gt;

&lt;p&gt;Bunu araştırdım. Proxmox'un kurucu geliştiricilerinden Thomas Lamprecht, 2018 tarihli bir mailing list yazışmasında Corosync'in &lt;code&gt;expected_votes&lt;/code&gt; davranışını şöyle açıklıyor:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Highest expected can not be smaller then the actual online quorate nodes."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Yani Corosync, &lt;code&gt;expected_votes&lt;/code&gt; değerini &lt;strong&gt;online ve quorate node sayısının altında tutmuyor&lt;/strong&gt;. Thomas'ın verdiği örneğe göre, manuel olarak &lt;code&gt;expected_votes: 16&lt;/code&gt; ayarlanmışsa ve 28 node online/quorate durumdaysa, Corosync 16 yerine 28'i kullanıyor. Bunu kabaca şu şekilde ifade ediyor:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;expected = max(user_set_expected, #nodes_quorate_online)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ancak online/quorate node sayısı manuel olarak belirlenen değere eşit veya daha düşükse, Corosync'in bu değeri koruması mümkün. Thomas ayrıca &lt;code&gt;last_man_standing&lt;/code&gt; etkinleştirildiğinde, yeterli node kaldığı sürece belirli bir süre sonunda &lt;code&gt;highest expected&lt;/code&gt; değerinin aşağı doğru yeniden hesaplanabileceğini belirtiyor. &lt;a href="https://lists.proxmox.com/pipermail/pve-user/2018-October/013641.html?utm_source=chatgpt.com" rel="noopener noreferrer"&gt;Proxmox Lists&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Bunun QDevice'in &lt;code&gt;lms&lt;/code&gt; algoritmasından kaynaklandığını düşünüyorum; muhtemelen QDevice'in oy hesaplaması sağlıklı kalabilsin diye &lt;code&gt;expected_votes&lt;/code&gt;'un cluster'da tanımlı gerçek node sayısının (3) altına hiç düşürülmesine izin verilmiyor, o an kaç node'un online olduğundan bağımsız olarak. Ama bunu kaynak koda bakmadan kesin olarak iddia edemem; bu, dokümante edilmiş bir davranıştan çok, gözlemlenip mantıklı görünen bir çıkarım.&lt;/p&gt;

&lt;p&gt;Sonuç ne olursa olsun, pratik etkisi net: &lt;strong&gt;split-brain'i kasıtlı olarak tetiklemeye çalıştım, QDevice'li ortamda başaramadım.&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Toparlamak
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pvecm expected 5
&lt;span class="nb"&gt;sudo &lt;/span&gt;virsh domif-setlink pve-c vnet15 up
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Birkaç saniye sonra cluster tam olarak (5 oy, 3 node, Quorate: Yes) geri döndü.&lt;/p&gt;




&lt;h2&gt;
  
  
  Uygulama 5: Shared Storage ile Migration'ı Yeniden Denemek
&lt;/h2&gt;

&lt;p&gt;Modül 1'de canlı migration'ı test ederken &lt;code&gt;--with-local-disks&lt;/code&gt; flag'ini kullanmak zorunda kalmıştım; çünkü VM'in diski shared storage'da değil, sadece kaynak node'un yerel LVM'sindeydi. Bir arkadaşımın önerisiyle bunu düzeltmeye karar verdim: gerçek bir SAN/NAS kurmak yerine, kendi laptop'umu (CachyOS host) NFS sunucusu olarak kullanıp bunu üç node'a paylaşımlı storage olarak eklemek.&lt;/p&gt;

&lt;p&gt;Baştan söylemek isterim: bu, gerçek bir shared storage değil, homelab için taklit edilmiş bir tanesi. Kullandığım &lt;code&gt;no_root_squash&lt;/code&gt; ve &lt;code&gt;insecure&lt;/code&gt; export seçenekleri, gerçek bir ortamda asla böyle bırakılmaz; root'un uzaktan tam yetkiyle yazmasına izin veriyor, güvenlik açısından savunmasız. Burada sadece lab kolaylığı için var.&lt;/p&gt;

&lt;h3&gt;
  
  
  NFS Sunucusunu Host'ta Kurmak
&lt;/h3&gt;

&lt;p&gt;CachyOS (Arch tabanlı) olduğu için paket ismi Debian'dan farklı; tek paket hem sunucu hem client araçlarını içeriyor:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;pacman &lt;span class="nt"&gt;-S&lt;/span&gt; nfs-utils
&lt;span class="nb"&gt;sudo mkdir&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; /srv/nfs/proxmox-shared
&lt;span class="nb"&gt;sudo chown &lt;/span&gt;nobody:nobody /srv/nfs/proxmox-shared
&lt;span class="nb"&gt;sudo chmod &lt;/span&gt;777 /srv/nfs/proxmox-shared
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;/etc/exports&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight conf"&gt;&lt;code&gt;/&lt;span class="n"&gt;srv&lt;/span&gt;/&lt;span class="n"&gt;nfs&lt;/span&gt;/&lt;span class="n"&gt;proxmox&lt;/span&gt;-&lt;span class="n"&gt;shared&lt;/span&gt; &lt;span class="m"&gt;192&lt;/span&gt;.&lt;span class="m"&gt;168&lt;/span&gt;.&lt;span class="m"&gt;122&lt;/span&gt;.&lt;span class="m"&gt;0&lt;/span&gt;/&lt;span class="m"&gt;24&lt;/span&gt;(&lt;span class="n"&gt;rw&lt;/span&gt;,&lt;span class="n"&gt;sync&lt;/span&gt;,&lt;span class="n"&gt;no_subtree_check&lt;/span&gt;,&lt;span class="n"&gt;no_root_squash&lt;/span&gt;,&lt;span class="n"&gt;insecure&lt;/span&gt;)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl &lt;span class="nb"&gt;enable&lt;/span&gt; &lt;span class="nt"&gt;--now&lt;/span&gt; rpcbind nfs-server
&lt;span class="nb"&gt;sudo &lt;/span&gt;exportfs &lt;span class="nt"&gt;-arv&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Beklenmedik Engel: Firewall
&lt;/h3&gt;

&lt;p&gt;İlk mount denemesi &lt;code&gt;pve-a&lt;/code&gt;'dan başarısız oldu:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="go"&gt;mount.nfs: Connection refused for 192.168.122.1:/srv/nfs/proxmox-shared on /mnt/test-nfs
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Servisler çalışıyordu, export tanımlıydı, portlar (&lt;code&gt;2049&lt;/code&gt;, &lt;code&gt;111&lt;/code&gt;) dinliyordu; sorun &lt;code&gt;firewalld&lt;/code&gt;'ın aktif olmasıydı:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;firewall-cmd &lt;span class="nt"&gt;--get-active-zones&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;libvirt
  interfaces: virbr-coro virbr0
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;virbr0&lt;/code&gt; (management) ve &lt;code&gt;virbr-coro&lt;/code&gt; (corosync-net) ikisi de &lt;code&gt;libvirt&lt;/code&gt; zone'undaydı, ama bu zone'a NFS servisleri hiç eklenmemişti:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;firewall-cmd &lt;span class="nt"&gt;--permanent&lt;/span&gt; &lt;span class="nt"&gt;--zone&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;libvirt &lt;span class="nt"&gt;--add-service&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;nfs
&lt;span class="nb"&gt;sudo &lt;/span&gt;firewall-cmd &lt;span class="nt"&gt;--permanent&lt;/span&gt; &lt;span class="nt"&gt;--zone&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;libvirt &lt;span class="nt"&gt;--add-service&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;rpc-bind
&lt;span class="nb"&gt;sudo &lt;/span&gt;firewall-cmd &lt;span class="nt"&gt;--permanent&lt;/span&gt; &lt;span class="nt"&gt;--zone&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;libvirt &lt;span class="nt"&gt;--add-service&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;mountd
&lt;span class="nb"&gt;sudo &lt;/span&gt;firewall-cmd &lt;span class="nt"&gt;--reload&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Bu düzeltmeden sonra manuel mount çalıştı, &lt;code&gt;touch&lt;/code&gt; ve &lt;code&gt;ls&lt;/code&gt; başarılı oldu.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F8bfgm5kntz3xmi0k7e8z.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F8bfgm5kntz3xmi0k7e8z.png" alt="nfs-shared Depolamasının Web UI da Görünümü" width="301" height="397"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Proxmox'a Eklemek ve Disk Taşımak
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pvesm add nfs nfs-shared &lt;span class="nt"&gt;--server&lt;/span&gt; 192.168.122.1 &lt;span class="nt"&gt;--export&lt;/span&gt; /srv/nfs/proxmox-shared &lt;span class="nt"&gt;--content&lt;/span&gt; images
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Name              Type     Status     Total (KiB)      Used (KiB) Available (KiB)        %
nfs-shared         nfs     active       486256640        72509440       412091392   14.91%
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;VM 100'ün diskini taşıdım:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;qm move-disk 100 scsi0 nfs-shared
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fr15peaiom5fqhuam3yk4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fr15peaiom5fqhuam3yk4.png" alt="nfs-shared Depolamasına Taşıdığımız Diskin Görünümü" width="800" height="390"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Beklenmedik Bir Detay: Hayalet Disk Referansı
&lt;/h3&gt;

&lt;p&gt;İlk migration denemesinde (&lt;code&gt;pve-b&lt;/code&gt;'den &lt;code&gt;pve-c&lt;/code&gt;'ye) log'da hâlâ "copying local disk images" adımı çıktı, 8GB'lık bir kopyalama yaptı; disk zaten NFS'te olması gerekirken. &lt;code&gt;qm config 100&lt;/code&gt;'e baktığımda sebebi gördüm:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;scsi0: nfs-shared:100/vm-100-disk-0.raw,...
unused0: local-lvm:vm-100-disk-0
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;move-disk&lt;/code&gt; diski gerçekten NFS'e taşımıştı, ama eski local-lvm referansını &lt;code&gt;unused0&lt;/code&gt; olarak arkada bırakmıştı. Migration da bağlı her diski (kullanılan/kullanılmayan farketmeksizin) taşımaya çalıştığı için bu hayalet referansı da kopyalamıştı. &lt;code&gt;lvremove&lt;/code&gt; ile temizlemeye çalışınca üç node'da da "Failed to find logical volume" hatası aldım; migration'ın kendisi log'un sonunda zaten &lt;code&gt;Logical volume "vm-100-disk-0" successfully removed&lt;/code&gt; demişti, yani gerçek disk çoktan silinmişti, sadece config'te unutulmuş bir referans kalmıştı:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;qm &lt;span class="nb"&gt;unlink &lt;/span&gt;100 &lt;span class="nt"&gt;--idlist&lt;/span&gt; unused0
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Temiz Migration: Öncesi/Sonrası
&lt;/h3&gt;

&lt;p&gt;Hayalet referans temizlendikten sonra tekrar denedim (&lt;code&gt;pve-c&lt;/code&gt;'den &lt;code&gt;pve-a&lt;/code&gt;'ya):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;2026-08-14 09:06:34 starting migration of VM 100 to node 'pve-a'
2026-08-14 09:06:34 starting VM 100 on remote node 'pve-a'
2026-08-14 09:06:36 starting online/live migration
2026-08-14 09:06:37 average migration speed: 1.0 GiB/s - downtime 15 ms
2026-08-14 09:06:37 migration completed, transferred 158.5 MiB VM-state
2026-08-14 09:06:39 migration finished successfully (duration 00:00:05)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;"Copying local disk images" adımı &lt;strong&gt;tamamen yok&lt;/strong&gt;; disk hiç dokunulmadı, sadece VM'in bellek durumu (158.5 MiB) taşındı.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Modül 1 (local disk, &lt;code&gt;--with-local-disks&lt;/code&gt;)&lt;/th&gt;
&lt;th&gt;Bu test (NFS shared storage)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Disk kopyalama&lt;/td&gt;
&lt;td&gt;Var, ~8 GB, ~13 saniye&lt;/td&gt;
&lt;td&gt;Yok&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Toplam süre&lt;/td&gt;
&lt;td&gt;~20 saniye&lt;/td&gt;
&lt;td&gt;~5 saniye&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Downtime&lt;/td&gt;
&lt;td&gt;43 ms&lt;/td&gt;
&lt;td&gt;15 ms&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Taşınan veri&lt;/td&gt;
&lt;td&gt;Disk + VM state&lt;/td&gt;
&lt;td&gt;Sadece VM state (158.5 MiB)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Ping testi bu sırada da kesintisizdi; 40'tan fazla paket, hiç kayıp yok, gecikme 0.3-1.3ms aralığında sabit kaldı.&lt;/p&gt;

&lt;p&gt;Bu karşılaştırma, &lt;code&gt;--with-local-disks&lt;/code&gt;'in neden var olduğunu somutlaştırdı: o flag olmadan disk paylaşımlı değilse migration mümkün değil; flag'in kendisi de aslında bir kısayol değil, "diski de taşımak zorundayım çünkü paylaşımlı değil" itirafı. Gerçek shared storage'da bu ihtiyaç tamamen ortadan kalkıyor, migration da doğal olarak hızlanıyor.&lt;/p&gt;




&lt;h2&gt;
  
  
  Genel Değerlendirme
&lt;/h2&gt;

&lt;p&gt;Bu modülde planladığımdan farklı bir sona vardım. Amacım split-brain riskini göstermekti; onun yerine, QDevice'in bu riski nasıl engellediğini gösterdim. Sanırım bu, orijinal planımdan daha iyi bir sonuç.&lt;/p&gt;

&lt;p&gt;En çok üzerinde durduğum üç nokta:&lt;/p&gt;

&lt;p&gt;Birincisi, &lt;code&gt;ffsplit&lt;/code&gt; ve &lt;code&gt;lms&lt;/code&gt; arasındaki oy farkı (1 vs N-1). Bu küçük bir detay gibi görünüyor ama gerçek bir kararı etkiliyor: tek sayılı bir cluster'da QDevice'in matematiği, çift sayılı bir cluster'dakinden temelden farklı çalışıyor.&lt;/p&gt;

&lt;p&gt;İkincisi, &lt;code&gt;pvecm expected&lt;/code&gt;'in "zaten quorate olan bir partition'ı düşüremezsin" kuralı. İlk denemem bu yüzden başarısız oldu, ve bunu QDevice'e yanlış bağladım; doğrusunu bulmak için araştırmam gerekti. Yanlış bir hipotezle başlayıp onu düzeltmek, doğru hipotezle başlamaktan daha çok şey öğretti.&lt;/p&gt;

&lt;p&gt;Üçüncüsü, ikinci (doğru) denemede gördüğüm 1'den 3'e yuvarlanma. Bunun tam mekanizmasını hâlâ %100 kesinlikle açıklayamıyorum; genel corosync davranışı bunu tam karşılamıyor, QDevice'e özgü bir şey olduğunu düşünüyorum ama kaynak koda inmeden kesin konuşamam. Bu belirsizliği olduğu gibi bırakmayı, uydurma bir kesinlik sunmaya tercih ettim.&lt;/p&gt;

&lt;p&gt;Sonuç olarak: quorum kaybını gerçekten tetikledim, pmxcfs'in read-only davranışını iki farklı şekilde (host çökmesi, ağ izolasyonu) doğruladım, QDevice'i kurdum ve onun olmadan imkansız olacak bir senaryoyu ayakta tuttum, split-brain'i kasıtlı olarak tetiklemeye çalışıp başaramadım, ve son olarak Modül 1'deki &lt;code&gt;--with-local-disks&lt;/code&gt; zorunluluğunu shared storage kurarak ortadan kaldırdım. Bu son kısım kendi başına küçük bir hikaye oldu: NFS kurulumu, firewall'ın gerçek engel olduğunu bulmam, ve migration'ın arkada bıraktığı hayalet disk referansını çözmem; hiçbiri planladığım gibi sorunsuz gitmedi, ama her biri gerçek bir öğrenme anıydı.&lt;/p&gt;

&lt;p&gt;Bir sonraki modülde HA Manager'a geçiyorum: watchdog tabanlı fencing, node/resource affinity kuralları, ve Modül 1'de gördüğümüz "VM kendiliğinden açılmadı" sonucunu bu sefer tersine çevirmek.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Bu seri, resmi Proxmox VE dokümantasyonundan (pve.proxmox.com) ve topluluk kaynaklarından (pve-user mailing list, corosync/votequorum man sayfaları) derleniyor. Buradaki gözlemler bir homelab ortamına dayanıyor; production kararları için resmi dokümantasyon ve deneyimli sistem yöneticileri referans alınmalıdır.&lt;/em&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title># Proxmox Cluster Kurmak: Kavramlar, GUI/CLI ve Gerçek Hatalar (Modül 1)</title>
      <dc:creator>Hakan İSMAİL</dc:creator>
      <pubDate>Tue, 11 Aug 2026 06:06:19 +0000</pubDate>
      <link>https://dev.to/hakanbaban53/-proxmox-cluster-kurmak-kavramlar-guicli-ve-gercek-hatalar-modul-1-1f6k</link>
      <guid>https://dev.to/hakanbaban53/-proxmox-cluster-kurmak-kavramlar-guicli-ve-gercek-hatalar-modul-1-1f6k</guid>
      <description>&lt;p&gt;&lt;strong&gt;Seri:&lt;/strong&gt; Proxmox VE Cluster ve Corosync&lt;/p&gt;




&lt;p&gt;Modül 0'da dört sanal makineyi (&lt;code&gt;pve-a&lt;/code&gt;, &lt;code&gt;pve-b&lt;/code&gt;, &lt;code&gt;pve-c&lt;/code&gt;, &lt;code&gt;qdevice-1&lt;/code&gt;) kurdum, ağlarını yapılandırdım ve birbirlerine ulaşabildiklerini doğruladım. Lab artık hazır. Bu modüld asıl kavramlara ve gerçek cluster kurulumuna geçiyorum: &lt;code&gt;pvecm&lt;/code&gt;, Corosync ve pmxcfs nedir, ne işe yarar, ve cluster'ı hem GUI'den hem CLI'dan kurunca neler yaşadım.&lt;/p&gt;

&lt;p&gt;Bu modülde işleri bilerek iki farklı yoldan yaptım: cluster'ı web arayüzünden oluşturdum, bir node'u terminalden, bir node'u web arayüzünden kattım. Amaç sadece "iki yöntem de mümkün" demek değildi; iki yöntemi karıştırınca ortaya çıkan gerçek bir hatayı da görmek istedim, ve gördüm.&lt;/p&gt;




&lt;h2&gt;
  
  
  Neden Cluster?
&lt;/h2&gt;

&lt;p&gt;Tek bir Proxmox node'u zaten kendi başına çalışan bir hipervizör; web arayüzü var, VM/container yönetimi var. Cluster, birden fazla node'u bir araya getirip merkezi bir yönetim deneyimi sunuyor: tek bir web arayüzünden tüm node'ları yönetmek, VM'leri node'lar arası taşımak, ortak firewall ve HA politikaları tanımlamak.&lt;/p&gt;

&lt;p&gt;Mimari olarak dikkat çeken bir nokta var: Proxmox cluster'ı &lt;strong&gt;multi-master&lt;/strong&gt;. Yani tek bir "merkezi yönetim sunucusu" yok; her node, cluster'ın tamamını yönetebilecek yetkiye sahip. Bu, VMware'in vCenter'ı gibi ayrı bir yönetim katmanına ihtiyaç duymuyor; yönetim mantığı doğrudan node'ların kendisine gömülü.&lt;/p&gt;




&lt;h2&gt;
  
  
  Üç Parça: pvecm, Corosync, pmxcfs
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;pvecm&lt;/code&gt;&lt;/strong&gt;, cluster'ı yönetmek için kullandığım komut satırı aracı. Node oluşturma, ekleme, çıkarma, durum sorgulama gibi işlemler buradan geçiyor. Web arayüzünün "Cluster" sekmesi de aslında aynı işlemleri, aynı API üzerinden yapıyor; ikisi farklı arayüz, aynı motor.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Corosync Cluster Engine&lt;/strong&gt;, node'lar arası güvenilir grup iletişimini sağlayan alt katman. Hem &lt;code&gt;pvecm&lt;/code&gt; hem web arayüzü bunun üzerine kurulu. Node sayısında sert bir teknik sınır yok; pratikte ağ ve donanım performansı sınırlıyor, üst düzey donanımla 50'den fazla node'lu production cluster'lar bile rapor edilmiş.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;pmxcfs (Proxmox Cluster File System)&lt;/strong&gt;, &lt;code&gt;/etc/pve&lt;/code&gt; altında mount edilen, FUSE tabanlı bir dosya sistemi. Cluster'daki tüm konfigürasyon dosyaları burada tutuluyor ve Corosync üzerinden tüm node'lara gerçek zamanlı olarak replike ediliyor. En kritik davranışı şu: node quorum'u kaybettiğinde bu dosya sistemi read-only'e geçiyor.&lt;/p&gt;




&lt;h2&gt;
  
  
  Uygulama 1: pmxcfs'i Kümelenmeden Önce Gözlemlemek
&lt;/h2&gt;

&lt;p&gt;Cluster'ı kurmadan önce, &lt;code&gt;pve-a&lt;/code&gt; üzerinde henüz tek başınayken pmxcfs'e baktım.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;systemctl status pve-cluster
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Servis &lt;code&gt;active (running)&lt;/code&gt;, &lt;code&gt;pmxcfs&lt;/code&gt; process'i çalışıyor. Log satırlarında ilginç bir detay vardı:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;pmxcfs[806]: [main] notice: resolved node name 'pve-a' to '192.168.122.11' for default node IP address
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F9eyzb5icckbyx015t38t.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F9eyzb5icckbyx015t38t.png" alt="pmxcfs log satırı - node adının management IP'sine çözümlenmesi" width="786" height="18"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;pmxcfs, node adını çözümlerken &lt;strong&gt;management ağının IP'sini&lt;/strong&gt; (&lt;code&gt;192.168.122.11&lt;/code&gt;) varsayılan olarak almış. Bu gözlem, ileride başıma geleceklerin habercisi oldu; birazdan neden önemli olduğunu göreceğiz.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;ls&lt;/span&gt; &lt;span class="nt"&gt;-la&lt;/span&gt; /etc/pve/nodes/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;/etc/pve/nodes/&lt;/code&gt; dizininde sadece &lt;code&gt;pve-a&lt;/code&gt;'yı gördüm; bu, "öncesi" fotoğrafıydı.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ff0ig0mow8gxf0n4wm6nn.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ff0ig0mow8gxf0n4wm6nn.png" alt="/etc/pve/nodes/ dizini - cluster öncesi, sadece pve-a" width="636" height="63"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Uygulama 2: Cluster'ı Kurmak
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Cluster'ı GUI'den Oluşturmak
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fdizd2e4aqvhxfjl2ldi6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fdizd2e4aqvhxfjl2ldi6.png" alt="Create Cluster ekranı - cluster ismi ve Link seçimi" width="607" height="224"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F0s2z6d8cxw19mkllay4m.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F0s2z6d8cxw19mkllay4m.png" alt="Create Cluster - Link 1 için corosync-net arayüzü (10.10.10.11) seçili" width="602" height="204"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;pve-a&lt;/code&gt;'nın web arayüzünden &lt;code&gt;Datacenter → Cluster → Create Cluster&lt;/code&gt; dedim, isim olarak &lt;code&gt;lab-cluster&lt;/code&gt; verdim, Link 1 için &lt;code&gt;corosync-net&lt;/code&gt; arayüzünü (&lt;code&gt;10.10.10.11&lt;/code&gt;) seçtim. İşlem birkaç saniyede tamamlandı.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fno2gooane4zf0x548hhm.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fno2gooane4zf0x548hhm.png" alt="Datacenter → Cluster - lab-cluster oluşturuldu, tek node (pve-a)" width="799" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Hata: TLS Sertifika Doğrulaması
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;pve-b&lt;/code&gt;'yi katılırken ilk aklıma gelen, doğrudan &lt;code&gt;corosync-net&lt;/code&gt; IP'sini (&lt;code&gt;10.10.10.11&lt;/code&gt;) hedef göstermekti. Mantığım şuydu: bu ağı zaten Corosync trafiği için ayırmıştım, cluster'a katılma işlemi de bir "cluster" işlemiydi, o yüzden bu IP'yi kullanmak bana doğru geldi.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pvecm add 10.10.10.11 &lt;span class="nt"&gt;--link1&lt;/span&gt; 10.10.10.12
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Establishing API connection with host '10.10.10.11'
The authenticity of host '10.10.10.11' can't be established.
X509 SHA256 key fingerprint is FF:59:FA:...
Are you sure you want to continue connecting (yes/no)? yes
500 Can't connect to 10.10.10.11:8006 (hostname verification failed)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Meğerse yanılmışım. &lt;code&gt;pvecm add&lt;/code&gt;'in ilk parametresi, Corosync trafiği değil; &lt;code&gt;pve-a&lt;/code&gt;'nın API'sine (&lt;code&gt;:8006&lt;/code&gt; portu, yani web arayüzünün kendisi) HTTPS üzerinden bağlanıp "beni bu cluster'a ekle" demek. Bu, Uygulama 1'de gördüğüm pmxcfs gözlemiyle doğrudan bağlantılıydı: &lt;code&gt;pve-a&lt;/code&gt;'nın self-signed sertifikası, management IP/hostname için üretilmiş. &lt;code&gt;pve-b&lt;/code&gt;, &lt;code&gt;10.10.10.11&lt;/code&gt; üzerinden bu API'ye bağlanmaya çalışınca sertifika o adresi tanımıyor, hostname doğrulaması çöküyor.&lt;/p&gt;

&lt;p&gt;Yani karıştırdığım şey şuydu: &lt;code&gt;corosync-net&lt;/code&gt;'in var olma amacı (Corosync'in kendi trafiği) ile join işleminin gerçekte ne olduğu (bir API çağrısı) aynı şey değil. &lt;code&gt;--link1&lt;/code&gt; parametresi zaten Corosync trafiğinin hangi arayüzden gideceğini ayrıca belirtiyor; ilk parametrenin de aynı ağdan olması gerekmiyor, çünkü o bambaşka bir iletişim katmanı.&lt;/p&gt;

&lt;p&gt;Doğrusu, join/API bağlantısı için management IP'yi, Corosync trafiği için &lt;code&gt;--link1&lt;/code&gt;'i ayrı ayrı kullanmaktı:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pvecm add 192.168.122.11 &lt;span class="nt"&gt;--link1&lt;/span&gt; 10.10.10.12
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Join request OK, finishing setup locally
stopping pve-cluster service
backup old database to '/var/lib/pve-cluster/backup/config-1786335821.sql.gz'
waiting for quorum...OK
(re)generate node files
generate new node certificate
merge authorized SSH keys
generated new node certificate, restart pveproxy and pvedaemon services
successfully added node 'pve-b' to cluster.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Çalıştı. &lt;code&gt;pve-b&lt;/code&gt; cluster'a katıldı.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;pve-c&lt;/code&gt;'yi GUI'den Katılmak
&lt;/h3&gt;

&lt;p&gt;Bu sefer terminale hiç dokunmadan, tamamen web arayüzünden gitmek istedim. &lt;code&gt;pve-a&lt;/code&gt;'nın arayüzünde &lt;code&gt;Datacenter → Cluster → Join Information&lt;/code&gt;, kopyala butonuna bastım; encode edilmiş bir bilgi bloğu (peer address, fingerprint, cluster network bilgisi hepsi içinde) verdi.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F8a6kgnfhw3ry2h50b56k.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F8a6kgnfhw3ry2h50b56k.png" alt="Join Information ekranı - pve-a, encode edilmiş bilgi bloğu" width="800" height="389"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F8frb6eqdtl3khbi940jg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F8frb6eqdtl3khbi940jg.png" alt="Join Information - kopyala butonu" width="800" height="248"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;pve-c&lt;/code&gt;'nin kendi arayüzüne geçip &lt;code&gt;Join Cluster&lt;/code&gt; dedim, kopyaladığım bilgiyi yapıştırdım, root parolasını girdim. Ekran otomatik olarak Peer Address, Fingerprint alanlarını doldurdu, ve &lt;strong&gt;Cluster Network&lt;/strong&gt; kısmında "Link: 1" yazıp &lt;code&gt;10.10.10.13&lt;/code&gt;'ü önerdi.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fqxpz2qucqfg4xg323ilb.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fqxpz2qucqfg4xg323ilb.png" alt="Cluster Join ekranı - pve-c, Link 1 otomatik önerisi (10.10.10.13)" width="799" height="291"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F3n3kp7ttm6hpr6j5apf7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F3n3kp7ttm6hpr6j5apf7.png" alt="Cluster Join ekranı - Peer Address ve Fingerprint otomatik dolu" width="799" height="297"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;"Join 'lab-cluster'" dedim.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fazvpu0hw09x2egcc0nzt.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fazvpu0hw09x2egcc0nzt.png" alt="Task viewer - Join Cluster, " width="799" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Not:&lt;/strong&gt; Join Information bloğu cluster ismini, node adreslerini (management ve corosync IP'leri) ve sertifika fingerprint'ini kodluyor; root parolası bunun dışında, ayrıca giriliyor. Yani bu string'i tek başına ele geçirmek cluster'a katılmaya yetmiyor. Yine de gerçek bir ortamda bu blok ağ topolojisini açığa çıkarıyor, bu yüzden production sistemlerde bu tür ekran görüntülerini herkese açık paylaşmadan önce IP'leri kırpmak/bulanıklaştırmak makul bir alışkanlık. Burada gösterdiğim IP'ler (&lt;code&gt;192.168.122.x&lt;/code&gt;, &lt;code&gt;10.10.10.x&lt;/code&gt;) private adresler ve sadece kendi laptopumdaki izole lab ağında anlamlı olduğu için olduğu gibi bıraktım.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Task viewer ekranı "stopping pve-cluster service" satırında donmuş gibi görünüyordu, "Download" butonu bile aktif olmamıştı. İlk anda başarısız olduğunu düşündüm. Ama bu, bilinen bir kozmetik davranış: &lt;code&gt;pve-cluster.service&lt;/code&gt; yeniden başlarken &lt;code&gt;pveproxy&lt;/code&gt;/&lt;code&gt;pvedaemon&lt;/code&gt; de kendini yeniden başlatıyor, bu da tarayıcının o anki task log bağlantısını kesiyor. Arka planda işlem gerçekte tamamlanmış oluyor; sadece tarayıcı bunu görmüyor.&lt;/p&gt;

&lt;p&gt;Bunu terminalden doğruladım.&lt;/p&gt;




&lt;h2&gt;
  
  
  Sonucu Doğrulamak
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;pve-a&lt;/code&gt;'da, &lt;code&gt;pve-b&lt;/code&gt; katıldıktan sonra:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Nodes:            2
Quorate:          Yes
Expected votes:   2
Total votes:      2
Quorum:           2
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;pve-c&lt;/code&gt; katıldıktan sonra:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Nodes:            3
Quorate:          Yes
Expected votes:   3
Total votes:      3
Quorum:           2
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;pvecm nodes&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;    Nodeid      Votes Name
         1          1 pve-a (local)
         2          1 pve-b
         3          1 pve-c
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Web arayüzünde de &lt;code&gt;Datacenter → Cluster&lt;/code&gt; altında aynı bilgi: üç node, her biri 1 oy, &lt;code&gt;Link 1&lt;/code&gt; sütununda üçünün de doğru corosync-net IP'sini gösterdiğini gördüm. GUI ve CLI, aynı gerçekliği iki farklı pencereden gösteriyordu; bu benim için iyi bir doğrulama oldu, tek bir kaynağa güvenmek yerine ikisini çapraz kontrol etmiş oldum.&lt;/p&gt;

&lt;h3&gt;
  
  
  pmxcfs'in Canlı Senkronizasyonu
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;pve-a&lt;/code&gt;'da bir dosya oluşturdum:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"cluster calisiyor"&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; /etc/pve/test-sync.txt
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;pve-b&lt;/code&gt; ve &lt;code&gt;pve-c&lt;/code&gt;'de, saniyeler içinde:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cat&lt;/span&gt; /etc/pve/test-sync.txt
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;cluster calisiyor
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;pve-c&lt;/code&gt;'nin &lt;code&gt;pve-cluster.service&lt;/code&gt; loglarına baktığımda senkronizasyonun nasıl gerçekleştiğini de gördüm:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[status] notice: received sync request (epoch 1/1632/00000003)
[dcdb] notice: received all states
[dcdb] notice: leader is 1/1632
[dcdb] notice: synced members: 1/1632, 2/2612
[dcdb] notice: waiting for updates from leader
[status] notice: all data is up to date
[dcdb] notice: update complete - trying to commit (got 47 inode updates)
[dcdb] notice: all data is up to date
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;pve-c&lt;/code&gt;'nin katıldığı anda, &lt;code&gt;pve-a&lt;/code&gt;'nın (leader'ın) tarafında ne olduğunu da görmek istedim:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[status] notice: received sync request (epoch 1/1632/00000003)
[dcdb] notice: received all states
[dcdb] notice: leader is 1/1632
[dcdb] notice: synced members: 1/1632, 2/2612
[dcdb] notice: start sending inode updates
[dcdb] notice: sent all (47) updates
[dcdb] notice: all data is up to date
[status] notice: received all states
[status] notice: all data is up to date
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;leader is 1/1632&lt;/code&gt; satırı özellikle dikkatimi çekti: pmxcfs'in kendi içinde bir "leader" kavramı var, senkronizasyon bu leader üzerinden koordine ediliyor. İki log da aynı sayıyı, 47 update'i, konuşuyor; biri "gönderdim" diyor, diğeri "aldım" diyor. Dağıtık bir sistemde iki bağımsız node'un aynı olayı aynı sayılarla anlatması, bana pmxcfs'in gerçekten tutarlı çalıştığına dair küçük ama tatmin edici bir kanıt oldu.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;/etc/pve/nodes/&lt;/code&gt; Dizininin Son Hali
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;ls&lt;/span&gt; &lt;span class="nt"&gt;-la&lt;/span&gt; /etc/pve/nodes/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Modül 1'in başında &lt;code&gt;pve-a&lt;/code&gt;'da sadece kendi node'unu görmüştüm. Şimdi:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="go"&gt;drwxr-xr-x 2 root www-data 0 Aug  5 17:57 pve-a
drwxr-xr-x 2 root www-data 0 Aug 10 07:23 pve-b
drwxr-xr-x 2 root www-data 0 Aug 10 07:26 pve-c
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Bu dizin listesi, hem &lt;code&gt;pve-a&lt;/code&gt;'da hem &lt;code&gt;pve-b&lt;/code&gt;'de hem &lt;code&gt;pve-c&lt;/code&gt;'de birebir aynı; üçü de aynı gerçekliği paylaşıyor. Bu, "öncesi/sonrası" karşılaştırmasının en net hali: bir dizin, tek bir node'a özgü değil, artık cluster'ın ortak hafızasının bir parçası.&lt;/p&gt;




&lt;h2&gt;
  
  
  Test: Migration ve Node Arızası Simülasyonu
&lt;/h2&gt;

&lt;p&gt;Buraya kadar cluster'ı kurdum, quorate olduğunu doğruladım, pmxcfs'in senkronize çalıştığını gördüm. Ama bir arkadaşım haklı bir eksiği fark etti: cluster'a özgü hiçbir şey (bir VM'i node'lar arası taşımak) hiç denenmemişti. "Cluster kurdum" demek, "kurdum ve gerçekten işe yarıyor" demenin garantisi değil.&lt;/p&gt;

&lt;h3&gt;
  
  
  Küçük Bir VM ile Migration Testi
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;pve-a&lt;/code&gt; üzerinde minimal bir Alpine Linux VM'i (VMID 100) oluşturdum, &lt;code&gt;vmbr0&lt;/code&gt; (management ağı) üzerine bağladım; &lt;code&gt;corosync-net&lt;/code&gt;'e değil, çünkü o ağ sadece Corosync trafiği için izole tutulmuş durumda, guest trafiğini oraya karıştırmak istemedim.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2For0rac4s4u8v6bxlrxve.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2For0rac4s4u8v6bxlrxve.png" alt="Alpine Linux Sanal Makine Detayları" width="759" height="573"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;İlk migration denemem başarısız oldu:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;qm migrate 100 pve-b &lt;span class="nt"&gt;--online&lt;/span&gt; &lt;span class="nt"&gt;--with-local-disks&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;found local disk 'local:iso/alpine-standard-3.24.1-x86_64.iso' (attached)
can't migrate local disk 'local:iso/alpine-standard-3.24.1-x86_64.iso': local cdrom image
ERROR: migration aborted (duration 00:00:01): Problem found while scanning volumes - can't migrate VM - check log
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Kurulumdan kalan ISO hâlâ sanal CD-ROM olarak bağlıydı; bu, ne shared storage'da ne de replike ediliyor, sadece &lt;code&gt;pve-a&lt;/code&gt;'nın diskinde duruyor, migration bunu taşıyamıyor. CD-ROM'u çıkarıp tekrar denedim:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;qm &lt;span class="nb"&gt;set &lt;/span&gt;100 &lt;span class="nt"&gt;--ide2&lt;/span&gt; none
qm migrate 100 pve-b &lt;span class="nt"&gt;--online&lt;/span&gt; &lt;span class="nt"&gt;--with-local-disks&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Bu sefer çalıştı. &lt;code&gt;pve-b&lt;/code&gt;'de doğruladım:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;qm status 100
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;status&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;running&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Cluster genelinde de aynı bilgiyi &lt;code&gt;pve-a&lt;/code&gt;'dan görebiliyordum:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pvesh get /cluster/resources &lt;span class="nt"&gt;--type&lt;/span&gt; vm
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;│ id       │ type │ ... │ name   │
│ qemu/100 │ qemu │ ... │ alpine │
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;VM &lt;code&gt;pve-b&lt;/code&gt; üzerinde, çalışır durumda görünüyordu.&lt;/p&gt;

&lt;h3&gt;
  
  
  Node'u Çökertmek
&lt;/h3&gt;

&lt;p&gt;Asıl test buradaydı. Önce ping'i başlattım (host laptop'umdan):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ping 192.168.122.251
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="go"&gt;64 bytes from 192.168.122.251: icmp_seq=1 ttl=64 time=0.842 ms
64 bytes from 192.168.122.251: icmp_seq=2 ttl=64 time=0.969 ms
&lt;/span&gt;&lt;span class="c"&gt;...
&lt;/span&gt;&lt;span class="go"&gt;64 bytes from 192.168.122.251: icmp_seq=19 ttl=64 time=1.08 ms
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Sonra &lt;code&gt;pve-b&lt;/code&gt;'yi, temiz bir kapanış değil, gerçek bir çökme gibi simüle ettim; fiziksel host'tan (nested VM olduğu için mümkün):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;virsh destroy pve-b
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Domain 'pve-b' destroyed
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;pve-a&lt;/code&gt;'dan cluster durumuna baktım:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pvecm status
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Nodes:            2
Quorate:          Yes
Expected votes:   3
Total votes:      2
Quorum:           2
Membership information
----------------------
    Nodeid      Votes Name
0x00000001          1 10.10.10.11 (local)
0x00000003          1 10.10.10.13
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Tam beklendiği gibi: &lt;code&gt;pve-b&lt;/code&gt; (nodeid 2) membership listesinden düştü, ama kalan iki node (&lt;code&gt;pve-a&lt;/code&gt;, &lt;code&gt;pve-c&lt;/code&gt;) hâlâ çoğunluğu oluşturduğu için &lt;code&gt;Quorate: Yes&lt;/code&gt; kaldı.&lt;/p&gt;

&lt;p&gt;Ping çıktısında ilginç bir detay vardı: &lt;code&gt;pve-b&lt;/code&gt; öldükten hemen sonra paketler önce sessizce kayboldu (ne cevap ne hata, muhtemelen ARP kaydı hâlâ geçerliydi), birkaç düzine paket sonra gateway (&lt;code&gt;192.168.122.1&lt;/code&gt;, libvirt'ün NAT'ı) aktif olarak "Destination Host Unreachable" demeye başladı:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="go"&gt;64 bytes from 192.168.122.251: icmp_seq=19 ttl=64 time=1.08 ms
From 192.168.122.1 icmp_seq=52 Destination Host Unreachable
From 192.168.122.1 icmp_seq=53 Destination Host Unreachable
ping: sendmsg: No route to host
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Yani arıza algılama anlık değil, kademeli: önce sessizlik, sonra açık ret.&lt;/p&gt;

&lt;h3&gt;
  
  
  VM'i Başka Bir Yerde Başlatmayı Denemek
&lt;/h3&gt;

&lt;p&gt;Şimdi asıl soru: VM 100, &lt;code&gt;pve-b&lt;/code&gt; çökmüşken başka bir node'da kendiliğinden açılır mı?&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;qm start 100
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Configuration file 'nodes/pve-a/qemu-server/100.conf' does not exist
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Hayır, açılmadı; ama hatanın kendisi beklediğimden daha ince bir şey söylüyor. Hata "pve-b'ye ulaşamıyorum" demiyor; "&lt;code&gt;pve-a&lt;/code&gt;'nın kendi node dizininde böyle bir config dosyası yok" diyor. Sebep şu: pmxcfs, &lt;code&gt;nodes/pve-b/qemu-server/100.conf&lt;/code&gt; dosyasını cluster genelinde senkronize ediyor, &lt;code&gt;pve-a&lt;/code&gt; bile bu dosyayı görebiliyor (&lt;code&gt;pvesh get /cluster/resources&lt;/code&gt; bunu az önce gösterdi). Ama &lt;code&gt;qm start&lt;/code&gt;, sadece komutu çalıştırdığın node'un &lt;strong&gt;kendi&lt;/strong&gt; dizinindeki config'lere bakıyor. VM 100'ün config'i &lt;code&gt;pve-b&lt;/code&gt;'nin dizininde olduğu için, &lt;code&gt;pve-a&lt;/code&gt; üzerinde &lt;code&gt;qm start 100&lt;/code&gt; demek, "burada böyle bir VM yok" demekle aynı şey.&lt;/p&gt;

&lt;p&gt;Bu ayrım önemli: pmxcfs veriyi her yere kopyalıyor, ama "bu VM'i sahiplenip başka bir node'da başlat" kararını kimse otomatik almıyor. Veri paylaşılıyor, karar paylaşılmıyor. Bunu yapacak mekanizma (HA Manager, fencing, watchdog) henüz devrede değil.&lt;/p&gt;

&lt;h3&gt;
  
  
  Toparlamak ve Doğrulamak
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;pve-b&lt;/code&gt;'yi geri başlattım:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;virsh start pve-b
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Birkaç dakika sonra &lt;code&gt;pve-a&lt;/code&gt;'dan tekrar baktım:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pvecm status
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Nodes:            3
Quorate:          Yes
Expected votes:   3
Total votes:      3
Quorum:           2
Membership information
----------------------
    Nodeid      Votes Name
0x00000001          1 10.10.10.11 (local)
0x00000002          1 10.10.10.12
0x00000003          1 10.10.10.13
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Üç node da geri döndü, cluster kendiliğinden toparlandı; hiçbir manuel müdahale gerekmedi. &lt;code&gt;pve-b&lt;/code&gt; geri geldikten sonra &lt;code&gt;qm start 100&lt;/code&gt;'ü &lt;code&gt;pve-a&lt;/code&gt;'dan tekrar denedim, aynı hatayı aldım; bu da tutarlıydı, çünkü hatanın sebebi "node kapalı" değil "config burada değil" olduğu için, &lt;code&gt;pve-b&lt;/code&gt; geri gelmesi bu durumu değiştirmiyor. VM'i başlatmanın doğru yolu, &lt;code&gt;pve-b&lt;/code&gt;'ye SSH ile bağlanıp oradan &lt;code&gt;qm start 100&lt;/code&gt; demekti; ki VM zaten orada duruyordu, hiç kapanmamıştı bile (sadece host çöktüğü için o da düşmüştü).&lt;/p&gt;




&lt;h2&gt;
  
  
  Genel Değerlendirme
&lt;/h2&gt;

&lt;p&gt;Bu modülde, işleri hem GUI'den hem CLI'dan yapmaya çalışınca gerçek bir hatayla karşılaştım: TLS hostname doğrulaması. Bu, Modül 1'in başında yaptığım pmxcfs gözlemiyle (node adının management IP'sine çözümlenmesi) doğrudan bağlantılıydı; o gözlemi yapmamış olsaydım, hatanın kaynağını bulmak daha uzun sürerdi. Bir kavramı önceden anlamış olmak, karşılaştığın hatayı çok daha hızlı okumanı sağlıyor.&lt;/p&gt;

&lt;p&gt;Task viewer'ın donması ise ayrı bir ders: arayüzün "bir şey oluyormuş gibi görünmemesi", arka planda bir şey olmadığı anlamına gelmiyor. Terminal üzerinden çapraz doğrulama yapmak, GUI'ye kör güvenmemek için iyi bir alışkanlık.&lt;/p&gt;

&lt;p&gt;En değerlisi ise sona sakladığım migration testiydi. Cluster'ı kurmuş olmak, ona güvenmek için yeterli değil; gerçekten bir workload'u taşımadan, bir node'u çökertmeden, "çalışıyor" demek bir iddiadan ibaret kalıyor. Test, iki şeyi net gösterdi: birincisi, live migration gerçekten çalışıyor, VM kesintisiz taşınabiliyor. İkincisi, ve daha önemlisi, cluster kurmak otomatik yüksek erişilebilirlik anlamına gelmiyor. Bir node çöktüğünde, üzerindeki VM kendiliğinden başka bir yerde açılmıyor; pmxcfs veriyi her yere kopyalasa da, "bu VM'i devral" kararını hiçbir mekanizma otomatik almıyor. Bunu yapacak parça (HA Manager, fencing, watchdog) ayrı bir modülün konusu.&lt;/p&gt;

&lt;p&gt;Sonuç olarak: cluster çalışıyor, üç node quorate, pmxcfs gerçek zamanlı senkronize oluyor, migration gerçekten işe yarıyor, ve otomatik failover'ın olmadığını da artık varsayım değil, test ederek biliyorum. VMware serisinde her adımı önceden hazırlanmış bir manuel yönlendiriyordu; burada hem TLS hatasının kaynağını hem de HA'nın sınırlarını kendim bulmam gerekti. Daha yorucu, ama muhtemelen daha kalıcı bir öğrenme biçimi.&lt;/p&gt;

&lt;p&gt;Bir sonraki yazıda Modül 2'ye geçiyorum: quorum'u gerçekten kırıp gözlemleyeceğim, &lt;code&gt;pvecm expected&lt;/code&gt;'in riskini test edeceğim, ve QDevice'i devreye alacağım.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Bu seri, resmi Proxmox VE dokümantasyonundan (pve.proxmox.com) derlenen bir müfredatı takip ediyor. Buradaki gözlemler bir homelab ortamına dayanıyor; production kararları için resmi dokümantasyon ve deneyimli sistem yöneticileri referans alınmalıdır.&lt;/em&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Kendi Laboratuvarını Kurmak: Lab Ortamı Hazırlığı (Modül 0)</title>
      <dc:creator>Hakan İSMAİL</dc:creator>
      <pubDate>Fri, 07 Aug 2026 06:01:43 +0000</pubDate>
      <link>https://dev.to/hakanbaban53/kendi-laboratuvarini-kurmak-lab-ortami-hazirligi-modul-0-1idj</link>
      <guid>https://dev.to/hakanbaban53/kendi-laboratuvarini-kurmak-lab-ortami-hazirligi-modul-0-1idj</guid>
      <description>&lt;p&gt;&lt;strong&gt;Seri:&lt;/strong&gt; Proxmox VE Cluster ve Corosync | Hazırlık&lt;/p&gt;




&lt;p&gt;vSAN serisinde VMware'in hazırladığı bir HOL ortamı üzerinden ilerlemiştim; ekran adımları, önceden kurulmuş cluster'lar, tek yapmam gereken doğru yere tıklamaktı. Bu seri farklı bir yerden başlıyor: Proxmox VE için böyle hazır bir lab yok. Yani cluster'ı, ağı, hatta sanal makineleri bile sıfırdan ben kuruyorum.&lt;/p&gt;

&lt;p&gt;Bunun bir bedeli var: her adım biraz daha uzun sürüyor, hata yapma ihtimalim daha yüksek. Ama bir avantajı da var: bir HOL asla veremeyeceği kadar derin bir öğrenme sağlıyor, çünkü her kararı (kaç node, hangi ağ mimarisi, ne kadar kaynak) kendim veriyorum ve neden öyle verdiğimi de anlamak zorundayım.&lt;/p&gt;

&lt;p&gt;Bu ilk yazı bir "modül" değil, bir hazırlık; asıl Modül 1 (Cluster, Corosync, pmxcfs kavramları) bir sonraki yazıda geliyor. Ama o kavramları anlamlandırmadan önce, üzerinde çalışacağım zemini kurmam gerekiyordu; bu yazı o zemini nasıl hazırladığımı anlatıyor.&lt;/p&gt;




&lt;h2&gt;
  
  
  Ortam Hakkında Bir Not
&lt;/h2&gt;

&lt;p&gt;Bu lab kendi dizüstü bilgisayarımda çalışıyor: CachyOS (Arch tabanlı), 11. nesil Intel Core i7-11800H (8 çekirdek/16 iş parçacığı), 32 GB RAM, NVMe depolama. Production bir ortam değil; nested virtualization ile tek bir fiziksel makinede dört sanal makineyi birbirine "cluster" olarak bağlıyorum. Gerçek sahada birden fazla fiziksel sunucu, ayrı switch'ler, gerçek ağ gecikmeleri olurdu; burada hepsi tek bir kutunun içinde simüle ediliyor.&lt;/p&gt;

&lt;p&gt;Bunu baştan söylüyorum çünkü Corosync'in gerçek gereksinimlerinden biri düşük gecikmeli bir ağ (5 milisaniyenin altı); nested bir ortamda bu neredeyse otomatik olarak sağlanıyor (sanal switch üzerinden iletişim gerçek bir fiziksel ağdan çok daha hızlı), bu yüzden bazı gerçek dünya sorunlarını (ağ gecikmesi, switch arızası) burada birebir yaşayamayacağım. Ama cluster mantığını, quorum'u, fencing'i anlamak için bu ortam fazlasıyla yeterli.&lt;/p&gt;




&lt;h2&gt;
  
  
  Lab Mimarisi: Neden Nested Virtualization, Neden libvirt
&lt;/h2&gt;

&lt;p&gt;Üç ayrı fiziksel sunucum olmadığı için, tek makinede nested virtualization kullanıyorum: fiziksel makinede QEMU/KVM çalışıyor, bunun üzerinde dört sanal makine var, bu sanal makinelerin üçü Proxmox VE (cluster node'ları), biri de QDevice için minimal bir Debian.&lt;/p&gt;

&lt;p&gt;Bunu iki şekilde yapabilirdim: Proxmox VE'yi fiziksel makineye kurup içine nested Proxmox VM'leri koymak (bu, topluluk kaynaklarında sık görülen bir yöntem), ya da doğrudan Linux masaüstümde çalışan libvirt/QEMU'yu kullanmak. İkincisini seçtim, çünkü zaten kurulu ve çalışır durumdaydı; fazladan bir sanallaştırma katmanı eklemek (host'ta Proxmox, onun içinde nested Proxmox'lar) gereksiz karmaşıklık olurdu. Masaüstümü de kullanmaya devam edebiliyorum, bu da pratik bir avantaj.&lt;/p&gt;

&lt;h3&gt;
  
  
  Nested Virtualization Kontrolü
&lt;/h3&gt;

&lt;p&gt;Bunu kurmadan önce doğrulamam gereken bir şey vardı: fiziksel CPU'nun nested virtualization'ı destekleyip desteklemediği. Bu, "VM içindeki VM'in de donanım hızlandırmalı çalışması" anlamına geliyor; olmazsa Proxmox node'larının içine koyacağım test VM'leri (ileride HA testleri için) çok yavaş çalışır.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cat&lt;/span&gt; /sys/module/kvm_intel/parameters/nested
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fklg0ch5rxbu8oglrx7mx.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fklg0ch5rxbu8oglrx7mx.png" alt="Terminal görüntüsü: nested virtualization kontrolü, çıktı Y" width="469" height="49"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Çıktı &lt;code&gt;Y&lt;/code&gt; geldi. Bu, i7-11800H'nin (Tiger Lake mimarisi) nested virtualization'ı sorunsuz desteklediğini doğruladı.&lt;/p&gt;




&lt;h2&gt;
  
  
  Kaynak Planlaması
&lt;/h2&gt;

&lt;p&gt;Donanımı (8 çekirdek/16 iş parçacığı, 32 GB RAM, NVMe üzerinde ~419 GB boş alan) dört VM'e nasıl paylaştıracağıma karar vermem gerekiyordu. Amaç, host masaüstünün (GNOME) rahatça çalışmaya devam etmesi, aynı zamanda cluster node'larının gerçekçi bir şekilde test edilebilmesiydi.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;VM&lt;/th&gt;
&lt;th&gt;vCPU&lt;/th&gt;
&lt;th&gt;RAM&lt;/th&gt;
&lt;th&gt;Disk (qcow2, thin)&lt;/th&gt;
&lt;th&gt;Rol&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;pve-a&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;6 GB&lt;/td&gt;
&lt;td&gt;40 GB&lt;/td&gt;
&lt;td&gt;Cluster node 1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;pve-b&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;6 GB&lt;/td&gt;
&lt;td&gt;40 GB&lt;/td&gt;
&lt;td&gt;Cluster node 2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;pve-c&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;6 GB&lt;/td&gt;
&lt;td&gt;40 GB&lt;/td&gt;
&lt;td&gt;Cluster node 3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;qdevice-1&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;1 GB&lt;/td&gt;
&lt;td&gt;8 GB&lt;/td&gt;
&lt;td&gt;QDevice&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Toplam&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;7&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;19 GB&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;128 GB&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Bu paylaşım, 16 iş parçacığından 7'sini, 32 GB RAM'in 19 GB'ını kullanıyor; host için 9 iş parçacığı ve ~13 GB rahatça kalıyor. Disk thin-provisioned (qcow2) olduğu için 128 GB tahsis etsem bile gerçek kullanım başlangıçta çok daha az.&lt;/p&gt;

&lt;p&gt;Üç cluster node'una eşit kaynak verdim (2 vCPU / 6 GB); QDevice'e ise çok daha az (1 vCPU / 1 GB), çünkü QDevice'in işi ağır değil, sadece bir oy sağlamak.&lt;/p&gt;




&lt;h2&gt;
  
  
  ISO'ları İndirmek ve Doğrulamak
&lt;/h2&gt;

&lt;p&gt;Proxmox VE 9.2 ve QDevice için minimal bir Debian 13 (Trixie) ISO'su indirdim. Burada bir adımı atlamamak önemli: checksum doğrulaması.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"65273beed27b2df543b68b65630ba525cfbad8df2b12035732b2dff87d6664e7  debian-13.6.0-amd64-netinst.iso"&lt;/span&gt; | &lt;span class="nb"&gt;sha256sum&lt;/span&gt; &lt;span class="nt"&gt;-c&lt;/span&gt; -
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"4e88fe416df9b527624a175f24c9aa07c714d3332afb1ee3dbf3879573ef2c6c  proxmox-ve_9.2-1.iso"&lt;/span&gt; | &lt;span class="nb"&gt;sha256sum&lt;/span&gt; &lt;span class="nt"&gt;-c&lt;/span&gt; -
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ft2v5wwmsxf31wf3sfzds.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ft2v5wwmsxf31wf3sfzds.png" alt="Checksum doğrulaması" width="728" height="128"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Bu adımı bir lab ortamında bile atlamamaya çalışıyorum; alışkanlık, üretim ortamında da aynı disiplini otomatik hale getiriyor. Bozuk bir indirme, kurulumun ortasında garip hatalar olarak geri dönüp saatler kaybettirebiliyor; iki saniyelik bir kontrol bunun önüne geçiyor.&lt;/p&gt;




&lt;h2&gt;
  
  
  Ağ Mimarisi: NAT ve İzole Corosync Ağı
&lt;/h2&gt;

&lt;p&gt;Gerçek bir Proxmox cluster kurulumunda Corosync trafiğinin ayrı, adanmış bir ağda olması öneriliyor; VM trafiği veya storage trafiğiyle paylaşılan bir ağda gecikme dalgalanmaları Corosync'i etkileyebiliyor. Bunu nested lab'ımda da simüle etmek istedim, bu yüzden iki ayrı sanal ağ kurdum:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;default&lt;/code&gt; ağı:&lt;/strong&gt; libvirt'ün standart NAT ağı (&lt;code&gt;192.168.122.0/24&lt;/code&gt;). İnternete çıkış (apt update, paket indirme) ve Proxmox web arayüzüne host'tan erişim için kullanılıyor.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;corosync-net&lt;/code&gt; ağı:&lt;/strong&gt; Kendi tanımladığım, izole bir ağ (&lt;code&gt;10.10.10.0/24&lt;/code&gt;). Dışarıya çıkışı yok; sadece bu ağa bağlı VM'ler birbirini görebiliyor. Bunu, gerçek sahadaki "Corosync için adanmış NIC ve switch" pratiğinin bir simülasyonu olarak düşünebilirsin.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight xml"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;network&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;name&amp;gt;&lt;/span&gt;corosync-net&lt;span class="nt"&gt;&amp;lt;/name&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;bridge&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;'virbr-coro'&lt;/span&gt; &lt;span class="na"&gt;stp=&lt;/span&gt;&lt;span class="s"&gt;'on'&lt;/span&gt; &lt;span class="na"&gt;delay=&lt;/span&gt;&lt;span class="s"&gt;'0'&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;ip&lt;/span&gt; &lt;span class="na"&gt;address=&lt;/span&gt;&lt;span class="s"&gt;'10.10.10.1'&lt;/span&gt; &lt;span class="na"&gt;netmask=&lt;/span&gt;&lt;span class="s"&gt;'255.255.255.0'&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;dhcp&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;range&lt;/span&gt; &lt;span class="na"&gt;start=&lt;/span&gt;&lt;span class="s"&gt;'10.10.10.10'&lt;/span&gt; &lt;span class="na"&gt;end=&lt;/span&gt;&lt;span class="s"&gt;'10.10.10.100'&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/dhcp&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/ip&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/network&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Her VM'e iki ağ arayüzü atadım: biri &lt;code&gt;default&lt;/code&gt;'a, biri &lt;code&gt;corosync-net&lt;/code&gt;'e. Proxmox kurulum sihirbazı sırasında sadece birinci arayüzü (default/NAT) yapılandıracağım; ikinci arayüzü (corosync-net) kurulumdan sonra Proxmox web arayüzünden elle ayarlayacağım. Bu ayrım bilinçli: yönetim/internet trafiği ile cluster'ın kendi iç iletişimini daha kurulum aşamasında birbirinden ayırmış oluyorum.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;corosync-net&lt;/code&gt;'i bilinçli olarak XML dosyası yazıp &lt;code&gt;virsh net-define&lt;/code&gt; ile tanımladım; virt-manager'ın "Create Virtual Network" sihirbazı da aynı işi yapardı, ama XML'i elle yazmak beni bridge adı, IP aralığı ve DHCP range gibi alanların her birini tek tek düşünmeye zorladı. Sihirbazda "ileri, ileri, bitir" derken çoğu ayarı görmeden geçebiliyorsun; XML'de her satırı kendin yazdığın için ne yaptığını daha net biliyorsun.&lt;/p&gt;

&lt;p&gt;Burada küçük ama can sıkıcı bir ayrıntıyla karşılaştım: &lt;code&gt;virsh&lt;/code&gt;'i normal kullanıcı olarak çalıştırdığımda, varsayılan olarak &lt;code&gt;qemu:///session&lt;/code&gt;'a bağlanıyor; bu, kullanıcıya özel, izole bir libvirt oturumu ve &lt;code&gt;default&lt;/code&gt; ağı dahil hiçbir sistem-geneli kaynağı görmüyor. Oysa virt-manager'ın oluşturduğu VM'ler ve &lt;code&gt;default&lt;/code&gt; NAT ağı &lt;code&gt;qemu:///system&lt;/code&gt; altında yaşıyor. &lt;code&gt;virsh net-define&lt;/code&gt;'ı &lt;code&gt;sudo&lt;/code&gt; olmadan çalıştırınca ağı yanlış tarafa (session) tanımlamış oldum; sonuç olarak &lt;code&gt;corosync-net&lt;/code&gt;, VM'lerin ağ listesinde hiç görünmedi. Çözüm basitti: komutu &lt;code&gt;sudo virsh net-define ...&lt;/code&gt; ile, yani sistem bağlantısı üzerinden çalıştırmak. Aynı ayrım &lt;code&gt;pool-define-as&lt;/code&gt; ve diğer &lt;code&gt;virsh&lt;/code&gt; komutları için de geçerli; hepsini &lt;code&gt;sudo&lt;/code&gt; ile ya da &lt;code&gt;-c qemu:///system&lt;/code&gt; ile çalıştırmak gerekiyor, aksi halde sessizce yanlış (görünmez) bir yere yazıyorsunuz.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fxwst5e7xns6djjlmt9nf.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fxwst5e7xns6djjlmt9nf.png" alt="virsh net-list çıktısı - default ve corosync-net ağları" width="526" height="117"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Storage Pool ve VM'ler: Geri Kalanı Arayüzden
&lt;/h2&gt;

&lt;p&gt;Ağı XML ile tanımladıktan sonra, storage pool'u ve dört VM'i virt-manager'ın grafik arayüzünden oluşturdum. "Create a new virtual machine" sihirbazında sırasıyla: ISO dosyasını seçtim, bellek/vCPU değerlerini yukarıdaki tabloya göre girdim, disk boyutunu ayarladım (qcow2, thin-provisioned), ve ağ sekmesinde iki arayüzü de (&lt;code&gt;default&lt;/code&gt; ve &lt;code&gt;corosync-net&lt;/code&gt;) ekledim. CPU modeli için "Copy host CPU configuration" seçeneğini işaretledim; bu, host-passthrough ile aynı işi görüyor, fiziksel CPU'nun VMX özelliğini VM'e taşıyor ve nested virtualization zincirinin ikinci halkasını tamamlıyor.&lt;/p&gt;

&lt;p&gt;Aynı sihirbazı &lt;code&gt;pve-a&lt;/code&gt;, &lt;code&gt;pve-b&lt;/code&gt;, &lt;code&gt;pve-c&lt;/code&gt; için üç kez, &lt;code&gt;qdevice-1&lt;/code&gt; için çok daha hafif kaynaklarla bir kez daha çalıştırdım.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fetnk3gzgnvriesxwqi25.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fetnk3gzgnvriesxwqi25.png" alt="virt-manager - dört VM'in listesi, kurulum bekliyor durumunda" width="755" height="391"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F0s8num7u6u8myb1pw40a.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F0s8num7u6u8myb1pw40a.png" alt="VM oluşturma sihirbazı - CPU sekmesi, Copy host CPU configuration seçili" width="800" height="767"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Kurulumu Tamamlamak: Proxmox VE ve Debian
&lt;/h2&gt;

&lt;p&gt;VM'leri oluşturup ISO dosyalarını bağladıktan sonra kurulumları doğrudan &lt;strong&gt;virt-manager&lt;/strong&gt; konsolundan tamamladım. İlk aşamada her sanal makineye yalnızca &lt;strong&gt;Management (NAT)&lt;/strong&gt; ağı bağlıydı. Böylece Proxmox VE ve Debian kurulumları herhangi bir ek ağ yapılandırmasına ihtiyaç duymadan tamamlanabildi.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;pve-a&lt;/code&gt;, &lt;code&gt;pve-b&lt;/code&gt; ve &lt;code&gt;pve-c&lt;/code&gt; için Proxmox VE kurulumu standart sihirbaz üzerinden ilerledi. Hedef disk seçimi (tek bir VirtIO disk), ülke ve saat dilimi, root parolası ve son olarak &lt;strong&gt;Management Network Configuration&lt;/strong&gt; ekranında ilk ağ arayüzüne yönetim IP adreslerini atadım.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;qdevice-1&lt;/code&gt; için ise masaüstü ortamı kurmadan, yalnızca &lt;strong&gt;SSH server&lt;/strong&gt; ve &lt;strong&gt;standard system utilities&lt;/strong&gt; paketlerini seçerek minimal bir Debian 13 kurulumu yaptım.&lt;/p&gt;

&lt;p&gt;Kurulum tamamlandıktan sonra artık virt-manager konsoluna ihtiyaç kalmadı. Bundan sonraki tüm yapılandırmayı kendi terminalim üzerinden &lt;strong&gt;SSH&lt;/strong&gt; ile yaptım. Bunun iki önemli avantajı vardı:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Komutları doğrudan kopyala-yapıştır ile çalıştırabilmek,&lt;/li&gt;
&lt;li&gt;Yapılan değişiklikleri daha rahat takip edip gerektiğinde tekrar edebilmek.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Proxmox VE'de root kullanıcısıyla SSH erişimi varsayılan olarak açık geldiği için ek bir ayar yapmam gerekmedi. Debian tarafında ise güvenlik nedeniyle root ile SSH oturumu varsayılan olarak kapalıydı. Bu nedenle &lt;code&gt;/etc/ssh/sshd_config&lt;/code&gt; dosyasında aşağıdaki satırı düzenledim:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;PermitRootLogin yes
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fp99xribhku7ys71ya6i3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fp99xribhku7ys71ya6i3.png" alt=" " width="799" height="435"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Ardından SSH servisini yeniden başlatarak root kullanıcısıyla uzaktan bağlantıyı etkinleştirdim.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;systemctl restart sshd.service
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;İlk kurulum tamamlandıktan sonra ikinci ağ arayüzünü (&lt;strong&gt;corosync-net&lt;/strong&gt;) yapılandırdım. Proxmox node'larında bunu &lt;code&gt;/etc/network/interfaces&lt;/code&gt; dosyası üzerinden yaptım; Debian tarafında da aynı yöntemle Corosync ağı için statik IP adresini tanımladım.&lt;/p&gt;

&lt;p&gt;Son durumda lab ortamının ağ planı şu şekilde oluştu:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Makine&lt;/th&gt;
&lt;th&gt;Management (NAT)&lt;/th&gt;
&lt;th&gt;Corosync&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;pve-a&lt;/td&gt;
&lt;td&gt;192.168.122.11&lt;/td&gt;
&lt;td&gt;10.10.10.11&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;pve-b&lt;/td&gt;
&lt;td&gt;192.168.122.12&lt;/td&gt;
&lt;td&gt;10.10.10.12&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;pve-c&lt;/td&gt;
&lt;td&gt;192.168.122.13&lt;/td&gt;
&lt;td&gt;10.10.10.13&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;qdevice-1&lt;/td&gt;
&lt;td&gt;192.168.122.20&lt;/td&gt;
&lt;td&gt;10.10.10.20&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Kurulum sırasında hostnameleri de son hâlleriyle belirledim. Bu lab'da &lt;strong&gt;&lt;code&gt;.home.arpa&lt;/code&gt;&lt;/strong&gt; alan adını kullanıyorum:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;pve-a.home.arpa
pve-b.home.arpa
pve-c.home.arpa
qdevice-1.home.arpa
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Bunun iki önemli sebebi var. Birincisi, &lt;strong&gt;&lt;code&gt;.home.arpa&lt;/code&gt;&lt;/strong&gt; RFC 8375 ile yalnızca ev ve yerel ağlar için ayrılmış özel bir alan adıdır. Gerçek internette hiçbir zaman çözümlenmez; dolayısıyla ileride gerçek bir alan adıyla çakışma riski bulunmaz. İkincisi ise sıkça kullanılan &lt;strong&gt;&lt;code&gt;.local&lt;/code&gt;&lt;/strong&gt; uzantısının mDNS (Multicast DNS) tarafından rezerve edilmiş olmasıdır. Linux sistemlerde Avahi, macOS'ta Bonjour ve diğer mDNS uygulamaları &lt;code&gt;.local&lt;/code&gt; alanını kullandığından, özellikle cluster ortamlarında isim çözümleme problemlerine yol açabilir. Bu nedenle Proxmox'un da önerdiği yaklaşımlardan biri olan &lt;strong&gt;&lt;code&gt;.home.arpa&lt;/code&gt;&lt;/strong&gt; daha doğru ve geleceğe dönük bir tercih oluyor.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;📌 &lt;strong&gt;Not:&lt;/strong&gt; Bu aşamadan sonra dört makine de birbirine Management ağı üzerinden SSH ile erişebilir, Corosync ağı ise tamamen hazır durumda bekliyor. Artık cluster oluşturma aşamasına geçebiliriz.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Bağlantıyı Doğrulamak
&lt;/h3&gt;

&lt;p&gt;Dört node'un birbirini gerçekten görüp görmediğini, &lt;code&gt;pve-a&lt;/code&gt;'dan her iki ağ üzerinden ping atarak test ettim:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fpyg895fywj055z09n329.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fpyg895fywj055z09n329.png" alt="NAT ağı üzerinden ping" width="658" height="571"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fqg1s584y13lskp2fcedc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fqg1s584y13lskp2fcedc.png" alt="Corosync ağı üzerinden ping" width="658" height="571"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Sıfır paket kaybı, gecikmeler milisaniyenin çok altında (Corosync'in gerektirdiği 5ms sınırının çok altında, beklendiği gibi; nested bir ortamda ağ gecikmesi neredeyse ölçülemeyecek kadar düşük). Aynı testi &lt;code&gt;pve-b&lt;/code&gt; ve &lt;code&gt;pve-c&lt;/code&gt;'den de tekrarladım, sonuçlar aynı; hepsi birbirini her iki ağdan da görüyor.&lt;/p&gt;

&lt;p&gt;Bu noktada lab hazır: dört makine kurulu, isimlendirilmiş, iki ayrı ağdan birbirine ulaşabiliyor. Bir sonraki yazıda artık kuruluma değil, doğrudan kavramlara geçebiliyorum.&lt;/p&gt;

&lt;p&gt;Küçük bir not: &lt;code&gt;qdevice-1&lt;/code&gt; üzerine &lt;code&gt;corosync-qnetd&lt;/code&gt; paketini de bu aşamada kurup servisi etkinleştirdim; ileride QDevice'i devreye alacağım modülde hazır beklesin diye. Asıl QDevice kurulumu ve testleri (&lt;code&gt;pvecm qdevice setup&lt;/code&gt;, 2-node senaryosu, quorum matematiği) kendi modülünde ayrıca işlenecek; burada sadece "ortam hazır" demek istedim.&lt;/p&gt;




&lt;h2&gt;
  
  
  Genel Değerlendirme
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fa5m0bw5qb24iau5pvmt1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fa5m0bw5qb24iau5pvmt1.png" alt="Genel Topoloji" width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Bu modülde henüz tek bir Proxmox komutu çalıştırmadım; her şey "cluster'ı kuracağım ortamı hazırlamak" üzerineydi. Ama bu hazırlık aşaması, VMware serisindeki gibi hazır bir HOL kullanırken hiç düşünmek zorunda kalmadığım kararları öne çıkardı.&lt;/p&gt;

&lt;p&gt;En çok üzerinde durduğum nokta ağ mimarisiydi. VMware HOL'da Corosync'e denk bir kavram yoktu, ama vSAN serisinin Modül 4'ünde (Stretched Cluster) gördüğüm "witness trafiğini ayrı tutma" mantığıyla burada kurduğum NAT/corosync-net ayrımı aslında aynı prensibi paylaşıyor: kritik, düşük gecikmeli bir iletişim kanalını, genel amaçlı trafikten izole tutmak. Farklı ürünler, aynı temel disiplin.&lt;/p&gt;

&lt;p&gt;İkinci nokta, checksum doğrulamasını bir lab ortamında bile atlamamaktı. Küçük bir şey ama bunun bir HOL'da hiç düşünmem gereken bir adım olduğunu fark ettim; VMware zaten doğrulanmış bir ortam sunuyordu. Kendi lab'ını kurunca, bu tür "sıradan" disiplinlerin aslında ne kadar bilinçli bir seçim olduğunu görüyorsun.&lt;/p&gt;

&lt;p&gt;Üçüncü nokta, ağı XML ile tanımlarken fark ettiğim şey. Storage pool ve VM'leri virt-manager sihirbazıyla oluşturmak hızlı ve rahattı, ama tam olarak neyi neden yaptığımı hatırlamıyorum diyebilirim; sihirbaz benim adıma çoğu kararı verdi. Ağı XML ile yazarken ise her alanı (bridge adı, IP aralığı, DHCP range) kendim belirlemek zorunda kaldım; bu yüzden şu an o ağın nasıl çalıştığını çok daha net açıklayabiliyorum. Bu, aslında GUI'nin kötü olduğu anlamına gelmiyor, sadece "hızlı yapmak" ile "anlayarak yapmak" arasında küçük bir ödünleşim olduğunu gösteriyor.&lt;/p&gt;

&lt;p&gt;Bir sonraki yazıda Modül 1'e geçiyorum: lab artık tamamen hazır ve doğrulanmış durumda, sırada Cluster, Corosync ve pmxcfs kavramları, ve cluster'ı kurmadan hemen önce pmxcfs'in tek-node haldeki davranışını gözlemlemek var.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Bu seri, resmi Proxmox VE dokümantasyonundan (pve.proxmox.com) derlenen bir müfredatı takip ediyor; hazır bir lab ortamı olmadığı için her adımı kendim kuruyor ve test ediyorum. Buradaki gözlemler bir homelab ortamına dayanıyor; production kararları için resmi dokümantasyon ve deneyimli sistem yöneticileri referans alınmalıdır.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>proxmox</category>
      <category>corosync</category>
    </item>
    <item>
      <title>vSAN Data Protection: Snapshot, Protection Group ve Immutability (Modül 7)</title>
      <dc:creator>Hakan İSMAİL</dc:creator>
      <pubDate>Sun, 26 Jul 2026 14:08:18 +0000</pubDate>
      <link>https://dev.to/hakanbaban53/vsan-data-protection-snapshot-protection-group-ve-immutability-modul-7-190a</link>
      <guid>https://dev.to/hakanbaban53/vsan-data-protection-snapshot-protection-group-ve-immutability-modul-7-190a</guid>
      <description>&lt;p&gt;Altı haftadır SPBM'den File Services'e kadar vSAN'ın farklı katmanlarını gezdim. Modül 7, serinin son modülü ve konusu net: Data Protection. Bu modülde snapshot almayı, VM'leri "protection group" adı verilen politikalarla korumayı, silinmiş bir VM'i geri getirmeyi ve ransomware senaryolarına karşı değiştirilemez (immutable) koruma gruplarını görüyoruz.&lt;/p&gt;

&lt;p&gt;Bu modül önceki altısına göre daha "hikaye anlatan" bir yapıya sahip. Sadece bir özelliği açıp kapatmıyoruz; bir VM oluşturup koruyoruz, siliyoruz, geri getiriyoruz, klonluyoruz. Bu akış, konuyu soyut bir özellik listesinden çıkarıp gerçek bir operasyonel senaryoya dönüştürüyor.&lt;/p&gt;




&lt;h2&gt;
  
  
  vSAN Data Protection Nedir?
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F8q4gyj9dejq0ll9osdyh.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F8q4gyj9dejq0ll9osdyh.png" alt="vSAN Data Protection" width="800" height="511"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;vSAN Data Protection (DP), vSAN 8.0 Update 3'te tanıtılan bir özellik. Amaç, VM'leri operasyonel hatalardan veya ransomware saldırılarından hızlıca kurtarabilmek; bunu vSAN cluster üzerinde yerel olarak saklanan native snapshot'larla yapıyor.&lt;/p&gt;

&lt;p&gt;Mimari olarak birkaç önemli nokta var:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Policy tabanlı "protection group" kavramıyla çalışıyor; hangi VM'lerin korunacağını, snapshot sıklığını ve saklama (retention) süresini bu gruplar üzerinden yönetiyorsunuz.&lt;/li&gt;
&lt;li&gt;Yanlışlıkla silinen VM'leri kurtarmak veya operasyonel çeviklik için VM'leri hızlıca klonlamak için kullanılabiliyor.&lt;/li&gt;
&lt;li&gt;VMware Live Cyber Recovery çözümüyle entegre olarak ransomware senaryolarından kurtarmayı da destekliyor (bu ayrı bir lisans gerektiriyor).&lt;/li&gt;
&lt;li&gt;Sadece vSAN ESA (Express Storage Architecture) ile çalışan HCI cluster'larda destekleniyor.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Mimari tarihçesi de ilginç: vSAN 8.0u3'te bu servis ayrı indirilebilir bir "vSAN Snapmanager Appliance" olarak geliyordu. vSAN 9.0 ile birlikte vSAN Data Protection, vSphere Replication ve VMware Live Recovery tek bir appliance'da birleşti. HOL'da bu appliance zaten kurulu ve vCenter'a kayıtlı; biz doğrudan vSphere Client üzerinden Data Protection'ı kullanıyoruz.&lt;/p&gt;

&lt;p&gt;Bir not daha: vSAN 9'da protection group'lar, vCenter'lar arası vSAN-to-vSAN replikasyon içeren VMware Live Recovery ile entegre olabiliyor. Bu modül sadece yerel snapshot'ları kapsıyor; replikasyonun aksiyonda görülmesi için ayrı bir lab (HOL-2634-03-VCF-L) öneriliyor.&lt;/p&gt;




&lt;h2&gt;
  
  
  vSAN ESA Snapshot'ları: Temel Mekanik
&lt;/h2&gt;

&lt;p&gt;ESA, VM'in durumunu ve verisini snapshot alındığı andaki haliyle koruyan entegre, yüksek performanslı bir snapshot mekanizması sunuyor. Birkaç teknik detay:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Snapshot alındığında VM'in o anki çalışan durumu yakalanıyor; snapshot'lar "quiesced" (uygulama seviyesinde tutarlılık için duraklatılmış) değil.&lt;/li&gt;
&lt;li&gt;Snapshot'lar bireysel VM'ler üzerinde çalışıyor; her VM ayrı bir snapshot gerektiriyor.&lt;/li&gt;
&lt;li&gt;Her vSAN snapshot'ı, VM'in namespace nesnesinin ve virtual disk nesnelerinin durumunu içeriyor.&lt;/li&gt;
&lt;li&gt;Protection group'lardaki VM'lerin snapshot'ları zamanlanmış aralıklarla alınıyor ve yerel olarak vSAN datastore'da saklanıyor.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Bu, geleneksel vSphere snapshot mekanizmasından farklı bir zihniyetle çalışıyor; snapshot almak burada manuel bir "şimdi al" işlemi değil, bir politikanın parçası olarak zamanlanmış bir süreç.&lt;/p&gt;




&lt;h2&gt;
  
  
  Data Protection Arayüzüne Giriş
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;cluster-esa-01a &amp;gt; Configure &amp;gt; vSAN &amp;gt; Data Protection&lt;/code&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Genel Bakış (Overview)
&lt;/h3&gt;

&lt;p&gt;Overview bölümünde, cluster'daki 7 VM'den 4'ünün korunduğu görülüyor. Grafik bu korumanın türünü (yerel, replikasyon veya korumasız) gösteriyor.&lt;/p&gt;

&lt;p&gt;"vSAN Snapshot Space Usage" bölümünde snapshot'ların kullandığı kapasitenin dökümü var. Burada dikkat çeken bir uyarı kutusu var: datastore kullanımı %70'i aştığında zamanlanmış snapshot'lar alınmıyor.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ffeux7au184zz69vha2vg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ffeux7au184zz69vha2vg.png" alt="Data Protection Overview - korunan VM sayısı ve Snapshot Space Usage" width="800" height="386"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Bu %70 eşiği bana Modül 1'deki Reserved Capacity konseptini hatırlattı; orada da benzer bir "belirli bir doluluk oranından sonra sistem kendini korumaya alır" mantığı vardı. Burada aynı mantık, snapshot alma sürecine uygulanmış.&lt;/p&gt;

&lt;h3&gt;
  
  
  Protection Groups
&lt;/h3&gt;

&lt;p&gt;HOL ortamında iki protection group önceden tanımlı:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Core PG:&lt;/strong&gt; Sadece yerel snapshot alıyor, bir VM'i aktif olarak koruyor.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Remote Acct PG:&lt;/strong&gt; Site B'ye vSAN replikasyonu yapıyor, üç VM'i koruyor.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Her ikisi de "Active" durumda, yani zamanlanmış snapshot'lar konfigüre edildiği gibi alınıyor. Core PG'nin iki yerel snapshot'ı var; en son snapshot belirli bir tarihte alınmış.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F1d4nlpfxp7fmmge33h4v.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F1d4nlpfxp7fmmge33h4v.png" alt="Protection Groups listesi - Core PG ve Remote Acct PG detayları" width="800" height="486"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Existing VMs, Removed VMs, Incoming VMs
&lt;/h3&gt;

&lt;p&gt;VMs sekmesi, cluster'daki VM'leri üç kategoride gruplandırıyor:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Existing VMs:&lt;/strong&gt; Şu anda vSAN'da aktif olarak bulunan VM'ler.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Removed VMs:&lt;/strong&gt; Silinmiş ama hâlâ mevcut bir snapshot tarafından korunan VM'ler.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Incoming VMs:&lt;/strong&gt; Bu cluster'a replike edilmekte olan VM'ler.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Her VM için protection group'u, yerel koruma durumu, replikasyon durumu ve (varsa) hangi peer cluster'a replike edildiği gösteriliyor.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F0up6j8j1z71zk388i9e0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F0up6j8j1z71zk388i9e0.png" alt="VMs sekmesi - Existing/Removed/Incoming VM kategorileri" width="800" height="486"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Removed VMs sekmesinde &lt;code&gt;core-c&lt;/code&gt; adlı bir VM görülüyor; bu VM silinmiş ama snapshot'ı hâlâ mevcut, yani geri getirilebilir durumda.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F7dqtbcglntuutb90x0wn.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F7dqtbcglntuutb90x0wn.png" alt="Removed VMs - core-c VM'inin görünümü" width="800" height="486"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Replication Pairs
&lt;/h3&gt;

&lt;p&gt;REPLICATION sekmesinde vSAN replikasyon sunucu çiftleri görülüyor. Site A cluster'ı (&lt;code&gt;cluster-esa-01a&lt;/code&gt;), Site B cluster'ına (&lt;code&gt;vsan-client-cluster-01b&lt;/code&gt;) eşleştirilmiş ve Remote Acct PG protection group'undaki üç VM'i replike ediyor. Bu özelliğin VMware Live Recovery lisansı gerektirdiği belirtiliyor.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fy0m91xc52h1vzvba58hg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fy0m91xc52h1vzvba58hg.png" alt="Replication Pairs - Site A'dan Site B'ye replikasyon" width="800" height="486"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Bu ekran, Modül 5'te gördüğümüz Storage Cluster/Compute Cluster ayrımının farklı bir versiyonunu hatırlattı bana; orada da farklı cluster'lar birbirine bir hizmet sağlıyordu, burada ise koruma amaçlı bir replikasyon ilişkisi var.&lt;/p&gt;




&lt;h2&gt;
  
  
  Yeni Bir Protection Group Oluşturmak
&lt;/h2&gt;

&lt;p&gt;Modülün pratik kısmı burada başlıyor. Amacımız, "sales-" ön ekiyle başlayan satış uygulaması VM'lerini koruyan bir protection group oluşturmak.&lt;/p&gt;

&lt;h3&gt;
  
  
  Genel Ayarlar
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;Protection Groups &amp;gt; Create Protection Group&lt;/code&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;İsim: &lt;code&gt;Sales Apps PG&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Protection type: üç seçenek var:

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Local protection and replication:&lt;/strong&gt; Yerel snapshot alıp başka bir vSAN cluster'a da replike ediyor (VMware Live Recovery lisansı gerekiyor).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Local protection:&lt;/strong&gt; Sadece yerel snapshot alıyor.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Replication:&lt;/strong&gt; Sadece başka bir cluster'a replike ediyor (VMware Live Recovery gerekiyor).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Bu HOL'da &lt;strong&gt;Local protection&lt;/strong&gt; seçiliyor.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Immutability mode kutusu şimdilik işaretsiz bırakılıyor (bu konuya modülün sonunda dönülüyor).&lt;/li&gt;
&lt;li&gt;VM seçim yöntemi olarak Dynamic VM name patterns seçiliyor.&lt;/li&gt;
&lt;li&gt;NEXT&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fkkwy6lstcbprgshglfmx.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fkkwy6lstcbprgshglfmx.png" alt="Create Protection Group - General sayfası" width="800" height="604"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  VM İsim Deseni Eklemek
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;sales*&lt;/code&gt; deseni giriliyor (tüm satış uygulaması VM'leri &lt;code&gt;sales-xxxx-y&lt;/code&gt; adlandırma kuralını kullanıyor). Add'e tıklandığında, eşleşen &lt;code&gt;sales-app-01&lt;/code&gt;, &lt;code&gt;sales-db-01&lt;/code&gt; ve &lt;code&gt;sales-web-01&lt;/code&gt; VM'leri listede görünüyor.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fhdv6d9rba5ltsyl92asu.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fhdv6d9rba5ltsyl92asu.png" alt="VM name pattern ekranı - sales* deseni ve eşleşen VM'ler" width="800" height="604"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Bu dinamik isimlendirme yaklaşımı bence modülün en pratik fikri. Sabit bir VM listesi tutmak yerine bir isim deseni tanımlamak, gelecekte oluşturulacak yeni VM'lerin de otomatik olarak korunmasını sağlıyor; bunu birazdan test edeceğiz.&lt;/p&gt;

&lt;h3&gt;
  
  
  Snapshot Zamanlaması
&lt;/h3&gt;

&lt;p&gt;Burada önemli bir teknik sınır var: vSAN ESA snapshot'ları, nesne başına en fazla 200 kopyaya kadar ölçekleniyor. Snapshot sıklığı ve saklama süresi kombinasyonu bu sınırı aşarsa, protection group oluşturulmadan önce düzenlenmesi gerekiyor.&lt;/p&gt;

&lt;p&gt;Bu HOL'da:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Snapshot sıklığı: her 8 saatte bir&lt;/li&gt;
&lt;li&gt;Saklama süresi: 2 ay&lt;/li&gt;
&lt;li&gt;NEXT&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Bir protection group için birden fazla snapshot zamanlaması tanımlamak da mümkün, ama bu lab'da tek bir zamanlama kullanılıyor.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fcfb2k9xklpb33fk09mqk.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fcfb2k9xklpb33fk09mqk.png" alt="Snapshot schedule ekranı - 8 saat sıklık, 2 ay saklama" width="800" height="604"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;200 kopya sınırını akılda tutarak hızlıca bir hesap yaptım: 8 saatte bir snapshot, günde 3 kopya demek. 2 aylık saklama süresinde bu yaklaşık 180 kopyaya denk geliyor, sınırın altında ama yakınında. Bu tür bir hesabı protection group tasarlarken önceden yapmak, ileride "limit aşıldı" hatasıyla karşılaşmamak için gerekli.&lt;/p&gt;

&lt;h3&gt;
  
  
  Review ve Oluşturma
&lt;/h3&gt;

&lt;p&gt;Review ekranında dikkat çeken bir not var: standart vSphere Client "snapshot" arayüzünün aksine, vSAN Data Protection snapshot'ları hemen oluşturmuyor, bunun yerine zamanlıyor. Ama istenirse manuel bir snapshot da alınabileceği hatırlatılıyor. CREATE ile protection group oluşturuluyor.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fhgdb245mcadu2j5hq2pr.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fhgdb245mcadu2j5hq2pr.png" alt="Review sayfası - protection group özeti" width="800" height="604"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Manuel Snapshot Almak
&lt;/h2&gt;

&lt;p&gt;Protection group oluşturulduğunda henüz hiçbir snapshot yok; bu yüzden bir uyarı üçgeni ile işaretleniyor. 8 saat beklemek yerine manuel snapshot alınabiliyor.&lt;/p&gt;

&lt;p&gt;Sales Apps PG'nin üç nokta menüsünden "Take local snapshot" seçiliyor.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fl3uidc9auu2ggtfgzyk7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fl3uidc9auu2ggtfgzyk7.png" alt="Protection Groups listesi - uyarı üçgeni ve Take local snapshot seçeneği" width="799" height="203"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Snapshot ismi varsayılan olarak protection group adı, oluşturma yöntemi ve zaman damgasını içeren açıklayıcı bir isim alıyor. Saklama süresi olarak "1 gün" seçiliyor, TAKE SNAPSHOT tıklanıyor.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ftzklu8e9zchem84fal1t.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ftzklu8e9zchem84fal1t.png" alt="Take Snapshot ekranı - isim ve retention seçimi" width="547" height="395"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Recent Tasks panelinden işlem takip ediliyor; tamamlandığında uyarı üçgeni kayboluyor ve üç Sales VM'i için snapshot'lar görünüyor.&lt;/p&gt;




&lt;h2&gt;
  
  
  Dinamik İsimlendirmeyi Test Etmek: Yeni Bir VM Oluşturmak
&lt;/h2&gt;

&lt;p&gt;Bu bölüm, dinamik isim deseninin gerçekten çalıştığını kanıtlıyor. &lt;code&gt;sales-&lt;/code&gt; ön ekiyle yeni bir VM oluşturursak, protection group'a manuel müdahale etmeden otomatik olarak dahil olması bekleniyor.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;cluster-esa-01a&lt;/code&gt; üzerine sağ tık → New Virtual Machine → Create a new virtual machine. Sihirbaz adımları:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;İsim: &lt;code&gt;sales-lab&lt;/code&gt;, Sales klasörü seçili&lt;/li&gt;
&lt;li&gt;Compute resource: &lt;code&gt;cluster-esa-01a&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Storage: &lt;code&gt;vsan-esa-01a_Datastore&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Compatibility: varsayılan (ESX 9.0 ve üzeri)&lt;/li&gt;
&lt;li&gt;Guest OS: Linux, VMware Photon OS (64-bit)&lt;/li&gt;
&lt;li&gt;Hardware: varsayılan ayarlar, FINISH&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fftt2tkn2goi70gy6mg3f.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fftt2tkn2goi70gy6mg3f.png" alt="New Virtual Machine wizard - sales-lab VM'i oluşturma" width="800" height="572"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;VM oluşturulduktan sonra vCenter inventory'de kayıtlı olduğu doğrulanıyor.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fk6shhcnwgskzlotod45x.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fk6shhcnwgskzlotod45x.png" alt="cluster-esa-01a VM listesi - sales-lab VM'i" width="376" height="599"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Data Protection'a dönülüp Sales Apps PG için tekrar manuel snapshot alınıyor (yeni VM'in zamanlanmış aralığı beklemesine gerek kalmadan test etmek için). İşlem tamamlandığında dört VM'in korunduğu görülüyor: orijinal üç sales VM'i ve yeni oluşturulan &lt;code&gt;sales-lab&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Burada altı çizilen önemli nokta şu: yeni VM eklendiğinde protection group'un yeniden yapılandırılmasına gerek kalmadı, çünkü dinamik isimlendirme seçeneği kullanılmıştı. Bu, production ortamında sürekli yeni VM oluşturulan bir ortamda (örneğin bir CI/CD pipeline veya self-service VM provisioning sürecinde) manuel takip yükünü ortadan kaldıran bir tasarım.&lt;/p&gt;




&lt;h2&gt;
  
  
  VM'leri Geri Yüklemek
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Mevcut Bir VM'i Önceki Bir Ana Geri Döndürmek
&lt;/h3&gt;

&lt;p&gt;Bu senaryoda &lt;code&gt;core-a&lt;/code&gt; VM'i, mevcut bir snapshot noktasına geri döndürülüyor. Önce &lt;code&gt;core-a&lt;/code&gt;'nın açık (powered on) olduğu doğrulanıyor.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;VMs &amp;gt; core-a seçili &amp;gt; Restore VM&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Data Protection burada bir uyarı veriyor: VM kapatılacak ve geri yükleme öncesinde, ileride "ileri sarma" (mevcut duruma dönme) seçeneği olabilmesi için yeni bir snapshot otomatik olarak alınacak. Mevcut snapshot'lardan biri seçilip RESTORE'a tıklanıyor.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;📌 &lt;strong&gt;[Resim: Restore VM ekranı - core-a için snapshot seçimi ve uyarı]&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fyo0pbxwyqhtevzkvjyft.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fyo0pbxwyqhtevzkvjyft.png" alt=" " width="800" height="536"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;İşlem tamamlandığında &lt;code&gt;core-a&lt;/code&gt;'nın kapalı (powered off) olduğu görülüyor, tıpkı uyarıldığı gibi. Snapshot sütununda snapshot sayısının 2'den 3'e çıktığı da fark ediliyor; bu, restore işleminin kendisinin de bir snapshot bıraktığını gösteriyor.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fhsx4utznvka4x924nzy4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fhsx4utznvka4x924nzy4.png" alt="Restored VM durumu - powered off ve artan snapshot sayısı" width="800" height="139"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Bu davranış bana mantıklı geldi: bir restore işlemi, geri dönülemez bir işlem değil. Restore öncesi durumun da bir snapshot olarak saklanması, "yanlışlıkla yanlış snapshot'a döndüm" senaryosunda ikinci bir güvenlik ağı sağlıyor.&lt;/p&gt;

&lt;h3&gt;
  
  
  Silinmiş Bir VM'i Geri Getirmek
&lt;/h3&gt;

&lt;p&gt;Bu, modülün en dramatik anı: tamamen silinmiş bir VM'in snapshot'tan yeniden oluşturulması.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;VMs &amp;gt; Removed VMs &amp;gt; core-c seçili &amp;gt; Restore VM&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Sihirbaz adımları:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Bir snapshot seçiliyor, NEXT&lt;/li&gt;
&lt;li&gt;İsim ve klasör: varsayılan olarak orijinal isim &lt;code&gt;core-c&lt;/code&gt; korunuyor, &lt;code&gt;dc-a&lt;/code&gt; kök klasöründe kalıyor, NEXT&lt;/li&gt;
&lt;li&gt;Compute resource: varsayılan &lt;code&gt;cluster-esa-01a&lt;/code&gt;, NEXT&lt;/li&gt;
&lt;li&gt;RESTORE&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fgcw659mr27nwzsy2d6fx.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fgcw659mr27nwzsy2d6fx.png" alt=" " width="800" height="364"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;İşlem tamamlandığında &lt;code&gt;core-c&lt;/code&gt;, vCenter inventory'sinde tekrar görünüyor, açılmaya hazır durumda. VM'in adı "core" ile başladığı için, cluster'da kaldığı sürece otomatik olarak zaten var olan Core PG protection group'u tarafından korunmaya devam ediyor.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F7xo3tfmowm0y99nmz8l1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F7xo3tfmowm0y99nmz8l1.png" alt="vCenter inventory - geri getirilen core-c VM'i" width="384" height="607"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Bu son detay dikkatimi çekti: dinamik isimlendirme kullanan bir protection group, sadece yeni oluşturulan VM'leri değil, geri getirilen VM'leri de otomatik olarak kapsıyor. İsim deseni eşleştiği sürece, VM'in "geçmişi" (silinmiş olması) önemli değil.&lt;/p&gt;




&lt;h2&gt;
  
  
  VM Klonlamak
&lt;/h2&gt;

&lt;p&gt;vSAN Data Protection, protection group'a atanmış herhangi bir VM'den hızlıca klon oluşturma imkanı da sunuyor. Bu klonlar ESA snapshot'larına dayanıyor ve linked-clone mimarisi kullanıyor; hızlı oluşturma ve yüksek performans sağlıyor, ama bunlar kalıcı VM'ler değil, araştırma veya VM içindeki belirli verileri kurtarma amaçlı geçici kopyalar olarak düşünülmeli.&lt;/p&gt;

&lt;p&gt;Önemli bir ayrım: Data Protection'ın ürettiği klonlar, vCenter'ın geleneksel "clone" işleminden farklı ve bu klonlar vSAN Data Protection tarafından korunmaya &lt;strong&gt;aday değil&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Klonlama Adımları
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;VMs &amp;gt; Existing VMs &amp;gt; core-a seçili &amp;gt; Clone VM&lt;/code&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Bir snapshot seçiliyor, NEXT&lt;/li&gt;
&lt;li&gt;İsim: varsayılan &lt;code&gt;core-a-clone&lt;/code&gt;, &lt;code&gt;dc-a&lt;/code&gt; kök klasörü, NEXT&lt;/li&gt;
&lt;li&gt;Compute resource: varsayılan &lt;code&gt;cluster-esa-01a&lt;/code&gt;, NEXT&lt;/li&gt;
&lt;li&gt;CLONE&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fcbl9tlppgbtxiarou0hu.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fcbl9tlppgbtxiarou0hu.png" alt="Clone VM sihirbazı - snapshot ve hedef seçimi" width="799" height="365"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Klon tamamlandığında &lt;code&gt;core-a-clone&lt;/code&gt; vCenter inventory'de görünüyor. VMs panelinde bu klonun durumu "Not protected" olarak işaretleniyor.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fyz5nhhmey2i5y38r9x5i.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fyz5nhhmey2i5y38r9x5i.png" alt="VMs listesi - core-a-clone'un Not protected durumu" width="800" height="433"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Klonların Neden Korunmadığını Doğrulamak
&lt;/h3&gt;

&lt;p&gt;Bunu somut olarak görmek için Core PG protection group'u Edit ile açılıyor, "Individual VM selection" seçiliyor. Bu ekranda vSAN Data Protection açıkça uyarıyor: linked-clone VM'ler protection group'larda desteklenmiyor. &lt;code&gt;core-a-clone&lt;/code&gt;, aday VM listesinden zaten filtrelenmiş durumda.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Foj1hlnt5m1lne3iq0fhq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Foj1hlnt5m1lne3iq0fhq.png" alt="Edit Protection Group - core-a-clone'un aday listesinden filtrelenmesi" width="799" height="598"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Bu kısıtlama mantıklı: bir linked-clone, zaten bir snapshot'a bağımlı bir yapı. Onu tekrar bir protection group'a dahil edip snapshot almaya çalışmak, muhtemelen mimari olarak dairesel bir bağımlılık yaratırdı. Data Protection bu senaryoyu en baştan engelliyor.&lt;/p&gt;




&lt;h2&gt;
  
  
  Immutable Protection Groups: Ransomware'e Karşı Bir Kilit
&lt;/h2&gt;

&lt;p&gt;Modülün son ve bence en önemli konsepti burada: değiştirilemez (immutable) protection group'lar.&lt;/p&gt;

&lt;p&gt;Bir protection group immutable olarak oluşturulduğunda, oluşturulduktan sonra değiştirilemiyor veya iptal edilemiyor. Korunan VM kriterleri (dinamik isimlendirme, bireysel VM seçimi veya ikisinin kombinasyonu), snapshot zamanlaması ve saklama süresi ilk konfigürasyondan sonra sabitleniyor. Protection group da silinemiyor.&lt;/p&gt;

&lt;p&gt;Bu tasarımın amacı açık: kötü niyetli aktörlerin (bad actors) koruma planlarına müdahale etmesini veya onları silmesini engellemek. Bu, ransomware saldırısı senaryosunda özellikle anlamlı; bir saldırgan sisteme erişim sağlasa bile, snapshot'ları ve koruma politikasını silip kurtarma imkanını ortadan kaldıramıyor.&lt;/p&gt;

&lt;h3&gt;
  
  
  Immutable Protection Group Oluşturmak
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;Protection Groups &amp;gt; Create Protection Group&lt;/code&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;İsim: &lt;code&gt;Immutable Core Apps&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Protection type: Local protection&lt;/li&gt;
&lt;li&gt;Immutability mode kutusu işaretleniyor; bu grup oluşturulduktan sonra düzenlenemeyeceğine dair bir uyarı beliriyor&lt;/li&gt;
&lt;li&gt;VM seçimi: Dynamic VM name patterns&lt;/li&gt;
&lt;li&gt;NEXT&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fi1ritgw5qukqiom89yb7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fi1ritgw5qukqiom89yb7.png" alt="Create Protection Group - Immutability mode etkinleştirme ve uyarı" width="799" height="598"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;VM isim deseni olarak &lt;code&gt;core*&lt;/code&gt; giriliyor. Bu desenle üç VM eşleşiyor: &lt;code&gt;core-a&lt;/code&gt;, &lt;code&gt;core-a-clone&lt;/code&gt; ve &lt;code&gt;core-c&lt;/code&gt;.&lt;br&gt;
Immutable Core Apps&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fiujboefye8xy27fonl4r.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fiujboefye8xy27fonl4r.png" alt="VM name pattern - core* deseni ve eşleşen VM'ler" width="799" height="598"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Not: Manuel burada ilginç bir detay veriyor; &lt;code&gt;core-a-clone&lt;/code&gt; isim deseni ile eşleşse de (çünkü "core" ile başlıyor), daha önce gördüğümüz gibi linked-clone VM'ler zaten protection group'lardan otomatik filtreleniyor. Yani isim eşleşmesi, filtrelemenin önüne geçmiyor.&lt;/p&gt;

&lt;p&gt;Snapshot zamanlaması olarak her 1 günde bir snapshot, 3 aylık saklama süresi belirleniyor. NEXT, sonra CREATE.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fch90slbhbdti0u63f4w6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fch90slbhbdti0u63f4w6.png" alt="Snapshot schedule - günlük snapshot, 3 aylık saklama" width="799" height="598"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Immutability'nin Etkisini Doğrulamak
&lt;/h3&gt;

&lt;p&gt;Yeni oluşturulan protection group'un üç nokta menüsüne bakıldığında, Edit, Pause ve Delete seçeneklerinin gri renkte (devre dışı) olduğu görülüyor. Bu yetenekler immutable protection group'lar için izin verilmiyor.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F8mp3bez4fhcsxhygtzqp.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F8mp3bez4fhcsxhygtzqp.png" alt="Protection Groups listesi - Immutable Core Apps için devre dışı Edit/Pause/Delete" width="800" height="497"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Dinamik isimlendirme kullanıldığı için, "core" ile başlayan yeni VM'ler vSAN datastore'lara eklendiğinde otomatik olarak korunacak ve snapshot'ları, VM'ler daha sonra silinse bile 3 ay boyunca saklanacak.&lt;/p&gt;




&lt;h2&gt;
  
  
  Genel Değerlendirme
&lt;/h2&gt;

&lt;p&gt;Modül 7, serinin kapanışı için iyi bir seçim olmuş; çünkü burada gördüğümüz her şey, önceki altı modülde öğrendiğimiz kavramların üzerine inşa ediliyor. Protection group'lar SPBM'in mantığını (politika tanımla, sistem uygula) hatırlatıyor. Replication pairs, Modül 5'teki cluster-arası ilişkileri andırıyor. %70 doluluk eşiği, Modül 1'deki Reserved Capacity mantığıyla aynı prensibi paylaşıyor.&lt;/p&gt;

&lt;p&gt;Benim için en dikkat çekici üç nokta şunlardı:&lt;/p&gt;

&lt;p&gt;Birincisi, dinamik isim deseninin gücü. Bir VM isim kuralı tanımlamak, gelecekteki tüm uyumlu VM'lerin otomatik korunmasını sağlıyor; bu, "her yeni VM için manuel yapılandırma" yükünü ortadan kaldıran zarif bir tasarım. Aynı zamanda bunun disiplinli bir isimlendirme kuralı gerektirdiğini de görmek gerekiyor; "sales-" ile başlamayan bir satış VM'i sessizce korumasız kalabilir.&lt;/p&gt;

&lt;p&gt;İkincisi, restore işleminin kendisinin bir snapshot bırakması. Bu, "geri dönülemez işlem" korkusunu azaltan küçük ama önemli bir güvenlik katmanı.&lt;/p&gt;

&lt;p&gt;Üçüncüsü, Immutable Protection Groups. Bu özellik, teknik bir yetenekten çok bir tehdit modeline cevap veriyor: eğer bir saldırgan (ya da yanlışlıkla yetkili bir kullanıcı) sisteme erişim kazanırsa, koruma planının kendisi saldırı yüzeyi olmamalı. Bu, "backup'ınız varsa güvendesiniz" varsayımının yeterli olmadığı, backup'ın kendisinin de korunması gerektiği fikrinin somut bir uygulaması.&lt;/p&gt;




&lt;h2&gt;
  
  
  Seri Üzerine Kapanış Notu
&lt;/h2&gt;

&lt;p&gt;Yedi modül boyunca vSAN'ı SPBM'den başlayıp izleme, şifreleme, stretched cluster, storage cluster ayrımı, file services ve şimdi data protection'a kadar bir yolculuk olarak takip ettim. HOL formatının en büyük avantajı, hiçbir şeyi bozma korkusu olmadan bu kadar geniş bir yüzeyi tek bir ortamda gezebilmekti.&lt;/p&gt;

&lt;p&gt;Ama başta da söylediğim gibi, bunun sınırlarını da net tutmak istiyorum: gerçek bir production ortamında bu kararların her biri, burada göremediğimiz baskılarla (bütçe, mevcut donanım, ekip deneyimi, değişim yönetimi süreçleri) birlikte alınıyor. Bu seri, o kararları alacak kişi olmaya değil, o kararların neye dayandığını anlayacak bir zemine sahip olmaya yardımcı olmayı amaçladı.&lt;/p&gt;

&lt;p&gt;Serinin geri kalanını okuyanlara teşekkürler. Bir sonraki öğrenme serisinde görüşmek üzere.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Bu seri VMware HOL ortamı (HOL-2634-01-VCF-L) üzerinden yürütülmektedir. Buradaki gözlemler lab bağlamında değerlendirilmeli, production ortamı kararları için mutlaka resmi VMware dokümantasyonu ve deneyimli mühendisler referans alınmalıdır.&lt;/em&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>vSAN File Services: Datastore Üzerinde Dosya Paylaşımı (Modül 6)</title>
      <dc:creator>Hakan İSMAİL</dc:creator>
      <pubDate>Sun, 19 Jul 2026 12:58:34 +0000</pubDate>
      <link>https://dev.to/hakanbaban53/vsan-file-services-datastore-uzerinde-dosya-paylasimi-modul-6-2m70</link>
      <guid>https://dev.to/hakanbaban53/vsan-file-services-datastore-uzerinde-dosya-paylasimi-modul-6-2m70</guid>
      <description>&lt;p&gt;Beş haftadır vSAN'ın blok depolama tarafını (VMDK'lar, storage policy'ler, cluster mimarileri) işledim. Modül 6 farklı bir katmana giriyor: File Services. Bu modülde vSAN datastore üzerinde NFS ve SMB paylaşımları oluşturmayı, bunları izlemeyi ve gerçek bir client'tan mount edip dosya yazmayı görüyoruz.&lt;/p&gt;

&lt;p&gt;Bu konu ilk bakışta "neden vSAN bir NAS gibi davransın ki" sorusunu akla getirebiliyor. Ama mantığını anlayınca aslında oldukça pratik bir kullanım alanı ortaya çıkıyor: zaten var olan vSAN altyapısını, ayrı bir dosya sunucusu kurmadan, dosya paylaşımı ihtiyaçları için de kullanabilmek.&lt;/p&gt;




&lt;h2&gt;
  
  
  vSAN File Services Nedir?
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F3pmnqae3cpyr3kr6t39u.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F3pmnqae3cpyr3kr6t39u.png" alt="Dağıtılmış depolama mimarisi diyagramı" width="800" height="699"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;vSAN File Services, vSAN datastore üzerinde dosya paylaşımları (file share) oluşturmayı sağlıyor; bu paylaşımlara client workstation'lar veya VM'ler erişebiliyor. Desteklenen protokoller: SMB, NFSv3 ve NFSv4.1.&lt;/p&gt;

&lt;p&gt;Mimarinin altında vSAN Distributed File System (vDFS) yatıyor. Bu, vSAN nesnelerini birleştirerek ölçeklenebilir bir dosya sistemi sağlıyor. File share'ler, mevcut Storage Policy Based Management mekanizmasına entegre; yani her paylaşıma, VMDK'lara atadığımız gibi bir storage policy atanabiliyor.&lt;/p&gt;

&lt;p&gt;Teknik olarak dikkat çeken bir nokta: File Service etkinleştirildiğinde vSAN, cluster için tek bir vDFS dağıtık dosya sistemi oluşturuyor ve bunu her host üzerinde container'lar halinde çalıştırıyor. Bu container'lar hypervisor ile sıkı entegre, dosya servislerini sağlamanın birincil aracı olarak çalışıyorlar.&lt;/p&gt;

&lt;h3&gt;
  
  
  IP Havuzu Mantığı
&lt;/h3&gt;

&lt;p&gt;File Service etkinleştirilirken statik bir IP adres havuzu tanımlanması gerekiyor. Bu havuzdaki adreslerden biri "primary IP" olarak atanıyor; SMB ve NFSv4.1 referral mekanizması sayesinde, tüm paylaşımlara bu tek IP üzerinden erişilebiliyor.&lt;/p&gt;

&lt;p&gt;Her IP adresi için ayrı bir file server başlatılıyor, ama paylaşımlar bu sunucular arasında dengeli dağıtılıyor. İdeal performans için IP adres sayısının, vSAN cluster'ındaki host sayısına eşit olması öneriliyor. Bu IP'lerin DNS'te forward ve reverse lookup kayıtlarının olması da gerekiyor.&lt;/p&gt;

&lt;p&gt;Bu detayı okurken şunu düşündüm: bu, tipik bir load-balanced servis mimarisi. Tek bir giriş noktası (primary IP) sunarken arkada birden fazla worker'a (file server) dağıtım yapması, kullanıcı deneyimini basitleştirirken ölçeklenebilirliği koruyor.&lt;/p&gt;

&lt;h3&gt;
  
  
  Bir Kısıtlama: Stretched Cluster Desteklenmiyor
&lt;/h3&gt;

&lt;p&gt;Manuel'de net bir uyarı var: File Services şu anda vSAN Stretched Cluster üzerinde desteklenmiyor, sadece normal (standart) bir vSAN cluster üzerinde etkinleştirilebiliyor. Bu, Modül 4'te öğrendiğimiz stretched cluster mimarisiyle File Services'i aynı cluster'da birleştiremeyeceğimiz anlamına geliyor; bu iki özelliği aynı anda isteyen bir tasarım için ayrı cluster'lar planlamak gerekecek.&lt;/p&gt;




&lt;h2&gt;
  
  
  Ağ Gereksinimleri
&lt;/h2&gt;

&lt;p&gt;File Services'i etkinleştirmeden önce birkaç ağ gereksinimi karşılanmalı:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Dosya paylaşımlarına tek erişim noktası olacak statik IP adresleri; en iyi performans için host sayısı kadar.&lt;/li&gt;
&lt;li&gt;Bu IP'lerin DNS'te forward ve reverse lookup zone'larında kayıtlı olması.&lt;/li&gt;
&lt;li&gt;Tüm statik IP'lerin aynı subnet'te olması.&lt;/li&gt;
&lt;li&gt;DVS (Distributed Virtual Switch) sürüm 6.6.0 veya üzeri; File Service için ayrı bir dedicated port group oluşturulması.&lt;/li&gt;
&lt;li&gt;Promiscuous Mode ve Forged Transmits'in, File Services etkinleştirme süreci sırasında otomatik olarak açılması. NSX tabanlı ağlar kullanılıyorsa bu ayarların NSX admin konsolundan da yapılması gerekiyor.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;HOL'da File Services zaten önceden etkinleştirilmiş durumda; biz bu adımları uygulamıyoruz, ama gerçek bir kurulumda networking hazırlığının en az storage cluster networking'i kadar dikkat gerektirdiğini not etmek istedim (Modül 5'teki front-end/back-end ayrımına benzer bir dikkat seviyesi burada da geçerli).&lt;/p&gt;




&lt;h2&gt;
  
  
  File Services'in Etkin Olduğunu Doğrulamak
&lt;/h2&gt;

&lt;p&gt;Site B vCenter'a giriş yapılıyor (&lt;code&gt;vc-mgmt-b&lt;/code&gt;). Doğrulama adımları:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;dc-b &amp;gt; vsan-storage-cluster-01b &amp;gt; Configure &amp;gt; vSAN &amp;gt; Services&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Aşağı kaydırılınca File Service bölümünün "Enabled" durumda olduğu görülüyor.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Flnvgivqsi83bozwe1p54.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Flnvgivqsi83bozwe1p54.png" alt="vSAN Services - File Service bölümü, Enabled durumu" width="800" height="388"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Bu bölümde file service'in ağ detayları da görünüyor. Sol panelde &lt;code&gt;vsan-storage-cluster-01b&lt;/code&gt; altında vSAN File Service node'larının oluşturulduğu görülüyor; her vSAN node için bir tane. Her File Service VM'i (FSVM) en fazla 50 paylaşım destekliyor, cluster başına toplam paylaşım limiti 500 (bunun içinde en fazla 100 tanesi SMB paylaşımı olabiliyor).&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fi4lcua4f82mylz9lmwmy.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fi4lcua4f82mylz9lmwmy.png" alt="File Service Nodes listesi - her host için bir FSVM" width="344" height="191"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Bu limitleri görünce aklıma şu geldi: 500 paylaşım/cluster gibi bir üst sınır, küçük-orta ölçekli dosya paylaşımı ihtiyaçları için gayet yeterli, ama büyük bir dosya sunucusu konsolidasyonu planlıyorsanız bu sınırı erkenden hesaba katmak gerekiyor.&lt;/p&gt;




&lt;h2&gt;
  
  
  File Server Health Check
&lt;/h2&gt;

&lt;p&gt;File Service'in sağlığını kontrol etmek için Skyline Health'e dönüyoruz, artık tanıdık bir akış:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;Monitor &amp;gt; vSAN &amp;gt; Skyline Health &amp;gt; Health findings &amp;gt; ALL &amp;gt; Category filtresi &amp;gt; File Service&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ff1zsbh8yo0l3sq6tp8xh.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ff1zsbh8yo0l3sq6tp8xh.png" alt="Skyline Health - File Service kategorisi filtrelenmiş görünüm" width="800" height="471"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;"File Server Health" bulgusunun üç nokta menüsünden "View Current Result" seçiliyor. Bu ekran, File Servers Service'e katkı veren host'ları, her file server node'unda çalışan servisleri ve atanmış IP adreslerini detaylı olarak gösteriyor.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fdnc41ih5cvoame24e8gn.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fdnc41ih5cvoame24e8gn.png" alt="File Server Health - host bazlı servis ve IP detayları" width="800" height="471"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Bu adım, Modül 3'teki (şifreleme) health check akışıyla neredeyse birebir aynı desende ilerliyor: kategori filtrele, bulguyu seç, View Current Result ile detaya in. vSAN'ın health check mimarisinin tutarlılığı, farklı özellikler için bile aynı zihinsel modeli kullanmanıza izin veriyor.&lt;/p&gt;




&lt;h2&gt;
  
  
  NFS Paylaşımı Oluşturmak
&lt;/h2&gt;

&lt;p&gt;Paylaşım isimlendirmesi için birkaç kural var, not almaya değer:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;ASCII olmayan karakterler içeren kullanıcı adları paylaşım verisine erişim için kullanılabiliyor.&lt;/li&gt;
&lt;li&gt;Paylaşım isimleri sadece İngilizce karakterler içerebiliyor.&lt;/li&gt;
&lt;li&gt;Salt NFSv4 tipi paylaşımlarda dosya ve dizin isimleri herhangi bir UTF-8 uyumlu karakter içerebiliyor.&lt;/li&gt;
&lt;li&gt;Salt NFSv3 ve NFSv3+NFSv4 paylaşımlarında dosya ve dizin isimleri sadece ASCII uyumlu olabiliyor.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Bu kısıtlama listesi ilk okuyuşta teknik bir detay gibi görünüyor, ama gerçek bir ortamda özellikle Türkçe karakterler (ç, ş, ğ, ı, ö, ü) içeren dosya/dizin isimleriyle çalışırken, protokol seçiminin (salt NFSv4 mü, yoksa NFSv3 uyumlu mu) doğrudan bir etkisi olacağını gösteriyor.&lt;/p&gt;

&lt;h3&gt;
  
  
  Oluşturma Adımları
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;vsan-storage-cluster-01b &amp;gt; Configure &amp;gt; vSAN &amp;gt; File Shares &amp;gt; ADD&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;General sayfası:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;İsim: &lt;code&gt;VMSharesNFS&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Protokol: NFS, hem NFS 4.1 hem NFS 3 versiyonları seçili&lt;/li&gt;
&lt;li&gt;Storage Policy: &lt;code&gt;vsan-storage-cluster-01b - Optimal Datastore Default Policy - RAID5&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Share warning threshold 5 GB, share hard quota 10 GB olarak etkinleştiriliyor&lt;/li&gt;
&lt;li&gt;NEXT&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fq6d0u21zru1noa5ih53g.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fq6d0u21zru1noa5ih53g.png" alt="Create a File Share - General sayfası, isim ve protokol seçimi" width="799" height="388"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Net access control sayfası:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;"Allow access from any IP" seçiliyor&lt;/li&gt;
&lt;li&gt;NEXT&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F0j10ptkmtcjorrc8f9zt.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F0j10ptkmtcjorrc8f9zt.png" alt="Net access control sayfası - IP erişim ayarı" width="799" height="388"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Review sayfası:&lt;/strong&gt; Girilen bilgiler gözden geçirilip FINISH ile paylaşım oluşturuluyor.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fg6tul9atvx54308zje49.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fg6tul9atvx54308zje49.png" alt="Review sayfası - paylaşım özeti" width="799" height="388"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Burada dikkatimi çeken şey, storage policy'nin ve quota ayarlarının (warning threshold, hard quota) aynı wizard içinde birlikte tanımlanması. Bu, bir dosya paylaşımının sadece "nerede depolanacağını" değil, aynı zamanda "ne kadar büyüyebileceğini" de aynı yerde yönetmenizi sağlıyor.&lt;/p&gt;

&lt;h3&gt;
  
  
  Oluşturulan Paylaşımı Görüntülemek
&lt;/h3&gt;

&lt;p&gt;Paylaşım listesinde &lt;code&gt;VMSharesNFS&lt;/code&gt;, atanmış storage policy, kullanım/kota ve gerçek kullanım bilgileriyle görünüyor. "Show or Hide Columns" ile Hard Quota ve Warning Threshold sütunları da eklenebiliyor.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fasd4k3n31kpls5wrthsf.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fasd4k3n31kpls5wrthsf.png" alt="File Shares listesi - VMSharesNFS ve kota bilgileri" width="799" height="388"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Paylaşımı Başka Sistemlere Mount Etmek
&lt;/h2&gt;

&lt;p&gt;Bu bölüm, HOL'un daha "elle dokunulan" kısımlarından biri; gerçekten bir Linux terminalinden mount komutu çalıştırıp dosya yazıyoruz.&lt;/p&gt;

&lt;h3&gt;
  
  
  Bağlantı Yolunu Kopyalamak
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;VMShareNFS&lt;/code&gt; seçilip "COPY PATH" dropdown'ından NFS 3 veya NFS 4.1 seçilebiliyor. NFS 4.1 seçildiğinde örnek bağlantı dizesi şöyle görünüyor:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;NFSv3: &lt;code&gt;vsan-fs-06a.vcf.sddc.lab:/VMSharesNFS&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;NFSv4.1: &lt;code&gt;vsan-fs-01a.vcf.sddc.lab:/vsanfs/VMSharesNFS&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Not: NFSv4.1 referral mekanizmasıyla mount etmek için, mount path'inde kök paylaşımı (&lt;code&gt;/vsanfs&lt;/code&gt;) dahil edilmesi gerekiyor.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F6labvyw95jn5s4ecby5s.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F6labvyw95jn5s4ecby5s.png" alt="Copy Path menüsü - NFS 3 ve NFS 4.1 seçenekleri" width="311" height="215"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Terminal Üzerinden Mount Etmek
&lt;/h3&gt;

&lt;p&gt;Terminal açılıp şu komut çalıştırılıyor:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;mount vsan-fs-07b.site-b.vcf.lab:/VMSharesNFS /mnt/newfs
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Şifre istendiğinde &lt;code&gt;VMware123!VMware123!&lt;/code&gt; giriliyor. Mount'un başarılı olduğu şu komutla doğrulanıyor:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;mount | &lt;span class="nb"&gt;grep&lt;/span&gt; /mnt/newfs
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Manuel'de bir not var: NFS 4.1 aynı zamanda varsayılan mount versiyonu; eğer protokol belirtilmezse, client sunucuyla en yüksek uyumlu protokolü otomatik müzakere ediyor, vSAN 9 Native File Services için bu NFS v4.1.&lt;/p&gt;

&lt;h3&gt;
  
  
  Dosya Yazıp Okumak
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; /mnt/newfs
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"NFS 4 Share"&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; newfs.txt
&lt;span class="nb"&gt;cat &lt;/span&gt;newfs.txt
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Bu üç komutla paylaşıma bir dosya yazılıyor ve tekrar okunarak doğrulanıyor.&lt;/p&gt;

&lt;p&gt;Bu basit test, aslında modülün en somut kanıtı: vSAN üzerinde oluşturduğumuz bir "storage policy'ye bağlı nesne", gerçek bir Linux client'tan standart NFS protokolüyle erişilebilir, yazılabilir bir dosya sistemi olarak çalışıyor. Bunun arkasında vDFS, container'lar, IP havuzu gibi karmaşık bir mimari olsa da, client tarafında deneyim sıradan bir NFS mount'undan farksız.&lt;/p&gt;




&lt;h2&gt;
  
  
  vSAN Nesne Görünümü ve Placement Details
&lt;/h2&gt;

&lt;p&gt;Paylaşımın vSAN'ın kendi nesne yapısına nasıl entegre olduğunu görmek için:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;vsan-storage-cluster-01b &amp;gt; Monitor &amp;gt; vSAN &amp;gt; Virtual Objects&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;VMSharesNFS&lt;/code&gt; seçilip "VIEW PLACEMENT DETAILS" tıklanıyor.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ffebegklotu7540poeab2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ffebegklotu7540poeab2.png" alt="Virtual Objects - VMSharesNFS seçili görünüm" width="800" height="388"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Bu ekran, dosya paylaşımının bileşenlerinin hangi host'larda ve hangi fiziksel storage cihazlarında yerleştiğini gösteriyor.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ffounfll5lpxvltp6zxpu.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ffounfll5lpxvltp6zxpu.png" alt="Placement Details - VMSharesNFS bileşen dağılımı" width="800" height="486"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Bu, Modül 1'de bir VM'in VMDK'sı için gördüğümüz Placement Details ekranıyla aynı arayüz, aynı mantık. Bir dosya paylaşımının da tıpkı bir sanal disk gibi vSAN nesnesi olarak ele alınması ve aynı görselleştirme aracıyla incelenebilmesi, vSAN'ın "her şey bir nesne" felsefesinin tutarlılığını gösteriyor.&lt;/p&gt;




&lt;h2&gt;
  
  
  File Service Health'i Tekrar Kontrol Etmek
&lt;/h2&gt;

&lt;p&gt;Yeni paylaşım oluşturulduktan sonra Skyline Health'e dönülüp RETEST yapılıyor (health check zaten periyodik çalışıyor, ama yeni bir servis eklendiği için manuel tetiklemek öneriliyor).&lt;/p&gt;

&lt;p&gt;Filtre yine File Service kategorisine ayarlanıyor. Bu sefer "Share Health" bulgusunun üç nokta menüsünden "View Current Result" seçiliyor.&lt;/p&gt;

&lt;p&gt;Sonuç, oluşturduğumuz paylaşımın sağlıklı olduğunu gösteriyor.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fd9tjliqnxidngs7eoyz0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fd9tjliqnxidngs7eoyz0.png" alt="Share Health sonucu - Healthy durumu" width="798" height="228"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Performans ve Kapasite İzleme
&lt;/h2&gt;

&lt;p&gt;File Services için de, önceki modüllerde gördüğümüz izleme mantığı geçerli.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Performans:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;vsan-storage-cluster-01b &amp;gt; Monitor &amp;gt; vSAN &amp;gt; Performance &amp;gt; FILE SHARE &amp;gt; VMSharesNFS&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Burada file service için toplanan çeşitli metrikler görülüyor.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F89rx7tt0p9rutfmibu8o.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F89rx7tt0p9rutfmibu8o.png" alt="Performance - FILE SHARE sekmesi, VMSharesNFS metrikleri" width="800" height="387"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Kapasite:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;Monitor &amp;gt; vSAN &amp;gt; Capacity&lt;/code&gt;, aşağı kaydırılıp "Usage breakdown" bölümünde "User Data" genişletilerek File Shares kapasite kullanımı görülüyor.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fdix0scg7ltyfygw41lfd.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fdix0scg7ltyfygw41lfd.png" alt="Capacity - Usage breakdown, File Shares kalemi" width="800" height="387"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Bu iki ekran, Modül 2'de öğrendiğimiz izleme çerçevesinin (Skyline Health, Kapasite, Performans) File Services için de birebir geçerli olduğunu gösteriyor. Yeni bir özellik öğrenirken sıfırdan bir izleme mantığı öğrenmek yerine, var olan çerçeveyi yeni bir nesne tipine uygulamak yeterli oluyor.&lt;/p&gt;




&lt;h2&gt;
  
  
  Genel Değerlendirme
&lt;/h2&gt;

&lt;p&gt;Bu modül, vSAN'ın "sadece blok depolama" olmadığını gösteren iyi bir örnekti. File Services, temelde aynı vSAN altyapısını (aynı disk grupları, aynı SPBM mekanizması, aynı health check çerçevesi) kullanarak farklı bir erişim modeli (dosya paylaşımı) sunuyor.&lt;/p&gt;

&lt;p&gt;Benim için en dikkat çekici üç nokta şunlardı:&lt;/p&gt;

&lt;p&gt;Birincisi, IP havuzu ve primary IP mekanizmasının load-balancing mantığıyla çalışması. Host sayısı kadar IP tanımlayıp bunları file server'lara dağıtmak, basit ama etkili bir ölçeklenebilirlik yaklaşımı.&lt;/p&gt;

&lt;p&gt;İkincisi, paylaşım isimlendirme kurallarındaki ASCII/UTF-8 ayrımı. Küçük bir detay gibi görünüyor ama gerçek bir ortamda, özellikle Türkçe gibi ASCII-dışı karakterler kullanan dil ortamlarında, protokol seçiminin doğrudan pratik bir etkisi oluyor.&lt;/p&gt;

&lt;p&gt;Üçüncüsü, tüm bu modül boyunca "yeni bir şey öğreniyormuşum" hissinden çok, "tanıdık araçları yeni bir nesne tipine uyguluyormuşum" hissi baskındı. Placement Details, Skyline Health akışı, Performance ve Capacity sekmeleri; hepsi önceki modüllerden tanıdık. Bu tutarlılık, vSAN'ın farklı özelliklerini öğrenirken kümülatif bir öğrenme eğrisi sağlıyor: her yeni modül, sıfırdan başlamak yerine önceki modüllerin üzerine inşa ediyor.&lt;/p&gt;

&lt;p&gt;Bir sonraki hafta &lt;strong&gt;son&lt;/strong&gt; modül olan Modül 7'ye geçiyorum: Data Protection.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Bu seri VMware HOL ortamı (HOL-2634-01-VCF-L) üzerinden yürütülmektedir. Buradaki gözlemler lab bağlamında değerlendirilmeli, production ortamı kararları için mutlaka resmi VMware dokümantasyonu ve deneyimli mühendisler referans alınmalıdır.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>vmware</category>
    </item>
    <item>
      <title>vSAN Storage Cluster: Compute'u Storage'dan Ayırmak (Modül 5)</title>
      <dc:creator>Hakan İSMAİL</dc:creator>
      <pubDate>Sun, 12 Jul 2026 10:51:18 +0000</pubDate>
      <link>https://dev.to/hakanbaban53/vsan-storage-cluster-computeu-storagedan-ayirmak-modul-5-12pi</link>
      <guid>https://dev.to/hakanbaban53/vsan-storage-cluster-computeu-storagedan-ayirmak-modul-5-12pi</guid>
      <description>&lt;p&gt;Dört haftadır Site A üzerinde çalışıyordum: SPBM, izleme, şifreleme, stretched cluster. Modül 5 ile birlikte ilk kez Site B'ye geçiyorum ve konu da farklı bir yöne kırılıyor: vSAN Storage Cluster.&lt;/p&gt;

&lt;p&gt;Bu modül, önceki dördünden kavramsal olarak ayrı bir yerde duruyor. Şimdiye kadar gördüğümüz her şey HCI (Hyper-Converged Infrastructure) mantığıyla çalışıyordu; yani her host hem compute hem storage sağlıyordu. Storage Cluster ise bu ikisini birbirinden ayırıyor. Bunun neden var olduğunu ve HOL'da nasıl göründüğünü aktarayım.&lt;/p&gt;




&lt;h2&gt;
  
  
  vSAN Storage Cluster Nedir?
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fgtq7fwzdt4g6858wu4e1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fgtq7fwzdt4g6858wu4e1.png" alt="vSAN Storage Cluster Overview" width="800" height="517"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;vSAN Storage Cluster, eski adıyla vSAN Max, vSphere cluster'ları için dağıtık, scale-out bir depolama sistemi. vSAN ESA tarafından güç alıyor, yani ESA'nın sunduğu tüm yeteneklere sahip, ama sadece depolama sağlayan bir cluster olarak çalışıyor.&lt;/p&gt;

&lt;p&gt;Buradaki kritik ayrım şu: Normal vSAN'da (HCI modelinde) bir host hem VM'leri çalıştırır hem de kendi diskini vSAN datastore'a katkı verir. Storage Cluster modelinde ise bazı cluster'lar sadece depolama sağlıyor (compute çalıştırmıyor), bazı cluster'lar ise sadece compute sağlayıp bu depolamayı uzaktan tüketiyor.&lt;/p&gt;

&lt;p&gt;Bu, disaggregation (ayrıştırma) dediğimiz bir mimari yaklaşım. Compute ve storage kaynaklarını ayrı ayrı ölçeklendirebiliyorsunuz; storage ihtiyacınız artınca sadece storage cluster'ı büyütüyorsunuz, compute cluster'a dokunmadan.&lt;/p&gt;

&lt;p&gt;Cross-cluster iletişim için vSAN'ın kendi native protokolü ve data path'i kullanılıyor. Bu, yönetim deneyimini koruyor ve dağıtık bir depolama sistemi için mümkün olan en yüksek performans ve esnekliği sağlıyor iddiasında.&lt;/p&gt;




&lt;h2&gt;
  
  
  HOL Ortamındaki İki Cluster
&lt;/h2&gt;

&lt;p&gt;Site B'de iki cluster önceden hazır geliyor:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;vsan-storage-cluster-01b&lt;/code&gt;&lt;/strong&gt;: Depolama sağlayan cluster.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;vsan-client-cluster-01b&lt;/code&gt;&lt;/strong&gt;: Bu depolamayı tüketen compute cluster.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Bu ayrımı doğrulamak için ilk yapılan şey, her iki cluster'ın Configure sekmesinden &lt;code&gt;vSAN &amp;gt; Services&lt;/code&gt; altındaki "Cluster type" alanına bakmak.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;vsan-storage-cluster-01b&lt;/code&gt; için Cluster type "vSAN Storage Cluster" olarak görünüyor; bu cluster diğer compute cluster'lara depolama sağlamaya adanmış.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F77pjedwn6s9523oj1c67.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F77pjedwn6s9523oj1c67.png" alt="vsan-storage-cluster-01b - Services ekranı, Cluster type: vSAN Storage Cluster" width="800" height="386"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;vsan-client-cluster-01b&lt;/code&gt; için ise Cluster type "vSAN Compute Cluster" olarak görünüyor; bu cluster diğer vSAN storage cluster'ların depolamasını tüketmeye adanmış.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F8lrt89xm35to3srku29d.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F8lrt89xm35to3srku29d.png" alt="vsan-client-cluster-01b - Services ekranı, Cluster type: vSAN Compute Cluster" width="800" height="386"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Bu iki etiketin ayrı ayrı görünmesi bana önemli geldi. Sistem, bir cluster'ın rolünü GUI seviyesinde açıkça belirtiyor; "bu cluster ne için var" sorusuna dolaşmadan cevap veriyor.&lt;/p&gt;




&lt;h2&gt;
  
  
  Mount Edilmiş Datastore'u Görmek
&lt;/h2&gt;

&lt;p&gt;Compute cluster'ın, storage cluster'daki datastore'u gerçekten kullandığını doğrulamak için:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;vsan-client-cluster-01b &amp;gt; Configure &amp;gt; vSAN &amp;gt; Datastore Management&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Burada &lt;code&gt;vsan_SC_Datastore&lt;/code&gt; adlı datastore'un, &lt;code&gt;vsan-storage-cluster-01b&lt;/code&gt; cluster'ında bulunduğu ve compute cluster tarafından mount edildiği görülüyor.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ff326xmydoxr4hd05lj4p.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ff326xmydoxr4hd05lj4p.png" alt="Datastore Management - vsan_SC_Datastore mount durumu" width="800" height="386"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Bu ekran, HCI modelindeki "VM burada, disk de burada" basitliğinden farklı bir gerçekliği gösteriyor: VM'in compute'u bir cluster'da, verinin fiziksel olarak bulunduğu yer başka bir cluster'da.&lt;/p&gt;




&lt;h2&gt;
  
  
  Ağ Trafiği Ayrımı: Front-End ve Back-End
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fo17msu85wsnnc8wqvfqw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fo17msu85wsnnc8wqvfqw.png" alt="Ağ Trafiği Ayrımı" width="800" height="487"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Bu modülün bence en önemli teknik detayı burada. VCF 9.0 ile vSAN Storage Cluster'lara yeni bir yapılandırma seçeneği geldi: depolama performansını artıran, ağ trafiği izolasyonunu ve güvenliği iyileştiren bir ayrım.&lt;/p&gt;

&lt;p&gt;İki tür trafik tanımlanıyor:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Guest VM I/O (front-end trafik):&lt;/strong&gt; Guest VM'e giden/gelen, vSAN datastore'a erişen trafik.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;vSAN I/O (back-end trafik):&lt;/strong&gt; vSAN datastore'daki node'lar arasında akan trafik; yani vSAN'ın kendi iç senkronizasyon ve replikasyon trafiği.&lt;/p&gt;

&lt;p&gt;VCF 9.0 için vSAN, bu iki trafiği ayrı VMkernel portları üzerinden ayırma yeteneği getiriyor. Bu ayrım, Modül 2'de gördüğümüz cluster seviyesindeki front-end/back-end trafik ayrımıyla kavramsal olarak aynı fikri paylaşıyor, ama burada fiziksel port seviyesinde uygulanıyor.&lt;/p&gt;

&lt;h3&gt;
  
  
  Storage Cluster Node'unun VMkernel Arayüzleri
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;esx-05b.site-b.vcf.lab&lt;/code&gt; üzerinde iki vSAN'a özgü VMkernel portu inceleniyor:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;vmk2:&lt;/strong&gt; vSAN servisi için etkin. Storage Cluster bağlamında bu port, storage cluster node'ları arasındaki vSAN I/O'dan (back-end trafik) sorumlu.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fmuu64gnb22vbrhp3i1vo.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fmuu64gnb22vbrhp3i1vo.png" alt="esx-05b VMkernel Adapters - vmk2, vSAN servisi etkin" width="800" height="386"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;vmk3:&lt;/strong&gt; vSAN Storage Cluster Client servisi için etkin. Bu port, storage cluster node'larının, client cluster'daki vSAN VMkernel portlarıyla iletişim kurup Guest VM I/O'yu (front-end trafik) taşımasından sorumlu.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fwm112nyvhn1etmjlctvt.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fwm112nyvhn1etmjlctvt.png" alt="esx-05b VMkernel Adapters - vmk3, vSAN Storage Cluster Client servisi etkin" width="800" height="386"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Compute Cluster Node'unun VMkernel Arayüzü
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;esx-09b.site-b.vcf.lab&lt;/code&gt; üzerinde ise tek bir vSAN'a özgü VMkernel portu var:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;vmk2:&lt;/strong&gt; vSAN servisi için etkin. Compute Cluster bağlamında bu port, storage cluster node'larındaki vSAN Storage Cluster Client portlarıyla iletişim kurup Guest VM I/O'yu (front-end trafik) taşıyor.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F3ghzrqolkrcqk09bklhv.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F3ghzrqolkrcqk09bklhv.png" alt="esx-09b VMkernel Adapters - vmk2, vSAN servisi etkin" width="800" height="386"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Burada dikkatimi çeken şey, storage cluster node'unda iki ayrı port varken (biri back-end, biri front-end için), compute cluster node'unda sadece bir port olması. Mantıklı: compute cluster kendi verisini tutmuyor, sadece storage cluster'a Guest VM I/O gönderiyor; kendi içinde bir back-end senkronizasyon trafiğine ihtiyacı yok.&lt;/p&gt;

&lt;p&gt;Bu ayrım, gerçek bir ortamda ağ tasarımı yaparken önemli bir referans noktası. Storage cluster tarafında iki ayrı VMkernel portu (ve muhtemelen iki ayrı fiziksel NIC veya VLAN) planlamak, front-end ve back-end trafiğinin birbirini etkilememesi için gerekli.&lt;/p&gt;




&lt;h2&gt;
  
  
  Compute Cluster'a VM Deploy Etmek
&lt;/h2&gt;

&lt;p&gt;Bu bölümde &lt;code&gt;core-b&lt;/code&gt; VM'i klonlanarak &lt;code&gt;vsan-client-cluster-01b&lt;/code&gt; compute cluster'ına deploy ediliyor. Manuel'de vurgulanan önemli nokta şu: bu süreç, normal bir vSAN HCI cluster'ına VM deploy etmekle aynı. Tek fark, compute resource olarak compute cluster'ı, datastore olarak da storage cluster'daki vSAN datastore'unu seçmeniz.&lt;/p&gt;

&lt;h3&gt;
  
  
  Adımlar
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;code&gt;core-b&lt;/code&gt; üzerine sağ tık → Clone → Clone to Virtual Machine&lt;/li&gt;
&lt;li&gt;İsim: &lt;code&gt;clone-vm-b&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Compute resource: &lt;code&gt;vsan-client-cluster-01b&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;VM Storage Policy: &lt;code&gt;cluster-esa-01b - Optimal Datastore Default Policy - RAID1&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Datastore: &lt;code&gt;vsan_SC_Datastore&lt;/code&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fb8a9ou1zv0s2i7i5mio0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fb8a9ou1zv0s2i7i5mio0.png" alt="Clone wizard - compute resource ve storage policy seçimi" width="800" height="568"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Bu akış, Modül 1'de &lt;code&gt;core-a&lt;/code&gt; VM'ini klonlarken gördüğümüz sürecin neredeyse birebir aynısı. Aradaki fark sadece hangi cluster'ın compute, hangi datastore'un hedef olarak seçildiği; SPBM mekanizması, wizard akışı, hepsi tanıdık.&lt;/p&gt;

&lt;h3&gt;
  
  
  Sonucu Doğrulamak
&lt;/h3&gt;

&lt;p&gt;Klon tamamlandıktan sonra &lt;code&gt;clone-vm-b &amp;gt; Summary &amp;gt; Related Objects&lt;/code&gt; bölümünde şunlar görülüyor:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;VM, &lt;code&gt;vsan-client-cluster-01b&lt;/code&gt; compute cluster'ında bulunuyor.&lt;/li&gt;
&lt;li&gt;VM'in verisi ise &lt;code&gt;vsan_SC_Datastore&lt;/code&gt; datastore'unda duruyor.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fb825mp0e1ehkjpc7yaza.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fb825mp0e1ehkjpc7yaza.png" alt="clone-vm-b Related Objects - compute cluster ve datastore ilişkisi" width="799" height="385"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Bu iki bilginin ayrı ayrı, ayrı nesneler olarak görünmesi, disaggregated mimarinin özünü gösteriyor: VM'in "nerede çalıştığı" ile verisinin "nerede durduğu" artık aynı host'a bağlı değil.&lt;/p&gt;




&lt;h2&gt;
  
  
  Genel Değerlendirme
&lt;/h2&gt;

&lt;p&gt;Bu modül kısa ama kavramsal olarak önceki dördünden farklı bir zihniyet gerektiriyor. HCI modelinde "compute ve storage aynı host'ta" varsayımı o kadar yerleşik ki, bunu ayırmanın ne gibi bir esneklik getirdiğini görmek için ayrı bir cluster çiftini incelemek gerekiyordu.&lt;/p&gt;

&lt;p&gt;Benim için en dikkat çekici iki nokta şunlardı:&lt;/p&gt;

&lt;p&gt;Birincisi, front-end/back-end trafik ayrımının VMkernel port seviyesinde somutlaşması. Modül 2'de bu ayrımı sadece bir monitoring sekmesi (Backend vs VM sekmeleri) olarak görmüştüm; burada aynı ayrımın fiziksel ağ tasarımına nasıl yansıdığını görmek, kavramı daha somut hale getirdi. Storage cluster node'unda iki ayrı port, compute cluster node'unda tek port olması, hangi tarafın hangi trafiği taşıdığını networking seviyesinde de ayırt edilebilir kılıyor.&lt;/p&gt;

&lt;p&gt;İkincisi, VM deploy etme sürecinin HCI'dakiyle neredeyse aynı olması. Bu bana şunu gösterdi: vSAN Storage Cluster, kullanıcı deneyimi açısından büyük bir öğrenme eğrisi getirmiyor; asıl fark mimari seviyede, admin'in cluster'ları nasıl tasarladığında. Bir VM deploy eden birisi için "bu storage cluster'dan mı geliyor, yoksa HCI'dan mı" ayrımı büyük ölçüde görünmez kalıyor, ki bu da tasarımın amaçladığı şey.&lt;/p&gt;

&lt;p&gt;Gerçek sahada bu mimariyi ne zaman tercih edeceğim sorusunu düşününce, akla gelen ilk senaryo şu: storage ve compute ihtiyaçlarının farklı oranlarda büyüdüğü ortamlar. Compute-yoğun ama storage-hafif workload'lar için (ya da tam tersi) ayrı ayrı ölçeklendirme yapabilmek, her host'a hem compute hem storage eklemek zorunda kalmaktan daha esnek bir yaklaşım olabilir. Ama bunun getirdiği ek ağ tasarımı karmaşıklığını (front-end/back-end ayrımı, ek VMkernel portları) da hesaba katmak gerekiyor.&lt;/p&gt;

&lt;p&gt;Bir sonraki hafta Modül 6'ya geçiyorum.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Bu seri VMware HOL ortamı (HOL-2634-01-VCF-L) üzerinden yürütülmektedir. Buradaki gözlemler lab bağlamında değerlendirilmeli, production ortamı kararları için mutlaka resmi VMware dokümantasyonu ve deneyimli mühendisler referans alınmalıdır.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>vmware</category>
    </item>
    <item>
      <title>vSAN Stretched Cluster: Site Koruması ve Local Affinity (Modül 4)</title>
      <dc:creator>Hakan İSMAİL</dc:creator>
      <pubDate>Sun, 05 Jul 2026 07:51:38 +0000</pubDate>
      <link>https://dev.to/hakanbaban53/vsan-stretched-cluster-site-korumasi-ve-local-affinity-modul-4-14aa</link>
      <guid>https://dev.to/hakanbaban53/vsan-stretched-cluster-site-korumasi-ve-local-affinity-modul-4-14aa</guid>
      <description>&lt;p&gt;Üç haftadır SPBM, izleme ve şifreleme konularını işledim. Bu hafta Modül 4'e geçiyorum: vSAN Stretched Cluster. Önceki modüllere göre bu konu kavramsal olarak biraz daha zorlayıcı geldi; tek bir cluster'ı iki fiziksel siteye yaymak, hem ağ mimarisi hem de failure senaryoları açısından yeni bir düşünme biçimi gerektiriyor.&lt;/p&gt;

&lt;p&gt;Şunu baştan belirtmek isterim: HOL ortamı bunu tam olarak simüle edemiyor, manuel de bunu açıkça söylüyor. İki site arası gerçek bir 10GbE bağlantısı ya da crossover kablo burada yok. Ama stretched cluster'ı hazırlama adımları ve witness trafiğini ayırma mantığı, gerçek bir direct-connect cluster'da yapılanla aynı.&lt;/p&gt;




&lt;h2&gt;
  
  
  Stretched Cluster Nedir, Neden Var?
&lt;/h2&gt;

&lt;p&gt;Normal bir vSAN cluster'ı tek bir lokasyonda çalışır. Stretched cluster ise aynı cluster'ı iki fiziksel siteye yayıyor: veri her iki sitede de bir kopya halinde tutuluyor. Amaç, bir sitenin tamamen kaybedilmesi durumunda bile VM'lerin diğer sitede çalışmaya devam etmesi.&lt;/p&gt;

&lt;p&gt;Bunu mümkün kılan üçüncü bir bileşen var: Witness Host. Bu, veri taşımayan, sadece quorum (çoğunluk kararı) sağlayan özel bir sanal cihaz. 1+1+1 mimarisi şöyle işliyor: Site 1'de en az bir host, Site 2'de en az bir host, ve ayrı bir yerde bir witness host.&lt;/p&gt;

&lt;h3&gt;
  
  
  2-Node Direct Connect Senaryosu
&lt;/h3&gt;

&lt;p&gt;vSAN 6.5'ten itibaren 2-node konfigürasyonlarda doğrudan crossover kablo kullanımı destekleniyor. Bu özellikle ROBO (remote office/branch office) senaryolarında değerli: her lokasyona 10GbE switch altyapısı kurmak maliyetli ve karmaşık olabiliyor. İki host'u doğrudan birbirine bağlamak bu maliyeti ortadan kaldırıyor, aynı zamanda karmaşıklığı azaltıp güvenilirliği artırıyor.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F7776t9054gq2eg0pwezr.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F7776t9054gq2eg0pwezr.png" alt="Node Direct Connect vSAN Cluster" width="800" height="1202"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Preferred Site Kavramı
&lt;/h2&gt;

&lt;p&gt;Stretched cluster'da "preferred site" (tercih edilen site) diye bir kavram var. Bu, vSAN'a "iletişim koptuğunda hangi tarafın ayakta kalmasını istiyorum" demenin yolu. Denilebilir ki preferred site, en güvenilir olması beklenen taraf.&lt;/p&gt;

&lt;p&gt;Mantık şöyle işliyor: Site 1 ile Site 2 arasındaki bağlantı koparsa ama her iki site de witness host'a erişebiliyorsa, preferred site çalışmaya devam ediyor ve bileşenleri aktif kalıyor. Preferred olmayan site'daki storage ise "down" olarak işaretleniyor, bileşenler "absent" durumuna geçiyor.&lt;/p&gt;

&lt;p&gt;Bu, klasik bir split-brain önleme mekanizması. Witness, kimin "doğru" taraf olduğuna karar veren hakem rolünü oynuyor.&lt;/p&gt;




&lt;h2&gt;
  
  
  Read Locality: Okuma Trafiğini Yerel Tutmak
&lt;/h2&gt;

&lt;p&gt;Bu kısım benim için modülün en pratik bilgisi oldu. Normal vSAN'da okuma istekleri, verinin tüm replika kopyaları arasında round-robin şeklinde dağıtılıyor. Stretched cluster'da ise bu davranış değişiyor.&lt;/p&gt;

&lt;p&gt;Read locality algoritması, okumaların yüzde yüzünü compute'un bulunduğu site'daki yerel veri kopyasından yapıyor. Mantığı açık: VM'in compute kaynağı Site 1'deyse, okuma isteklerini Site 2'ye göndermek gereksiz bir ağ gecikmesi (latency) yaratır. Bu yeni algoritma, okuma işlemlerindeki gecikmeyi azaltmak için tasarlanmış.&lt;/p&gt;

&lt;p&gt;Manuel'de ilginç bir eşik veriyor: Eğer siteler arası gecikme 5ms'nin altındaysa ve yeterli bant genişliği varsa, read locality kapatılabiliyor. Ama bunu kapatmak, okuma trafiğinin yarısının uzak siteye gitmesi anlamına geliyor; bu da ağ bant genişliği planlaması için ciddi bir fark yaratıyor. Manuel ayrıca bunun yalnızca VMware Global Support Services rehberliğinde ve sadece son derece düşük gecikme olan ortamlarda yapılması gerektiğini özellikle vurguluyor. Yani bu varsayılan davranışı kapatmak bir "ileri seviye ayar" değil, neredeyse bir istisna durumu.&lt;/p&gt;

&lt;p&gt;Bununla ilgili gizli bir advanced parameter de var: &lt;code&gt;VSAN.DOMOwnerForceWarmCache&lt;/code&gt;. Bu, vSphere Web Client'ta görünmüyor, sadece CLI üzerinden erişilebiliyor. Bunun gizli tutulması bana mantıklı geldi; yanlışlıkla değiştirildiğinde etkisi geniş olabilecek bir ayar.&lt;/p&gt;




&lt;h2&gt;
  
  
  Witness Host: Cluster'ın Dışında Kalan Üye
&lt;/h2&gt;

&lt;p&gt;Burada altı önemle çizilen bir kural var: Stretched cluster yapılandırılırken sadece data host'lar cluster objesinin içinde olmalı. Witness host, cluster dışında kalmalı ve hiçbir aşamada cluster'a eklenmemeli.&lt;/p&gt;

&lt;p&gt;HOL ortamında witness host önceden deploy edilmiş durumda: &lt;code&gt;esx-11a.site-a.vcf.lab&lt;/code&gt;. Inventory görünümünde bu host'un sunucu ikonunda küçük bir işaret var; bunun normal bir ESX host değil, vSAN 2-Node ve Stretched Cluster mimarilerini desteklemek için kullanılan özel bir sanal cihaz olduğunu gösteriyor.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fmecon6wvar938nrisoyc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fmecon6wvar938nrisoyc.png" alt="Inventory görünümü - esx-11a witness host" width="800" height="409"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Witness Networking: İki Ayrı Arayüz
&lt;/h3&gt;

&lt;p&gt;Witness appliance'ın iki ağ adaptörü var, iki ayrı standart switch'e bağlı:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Management VMkernel (vmk0):&lt;/strong&gt; vCenter ile iletişim için, appliance yönetimi amacıyla.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;secondaryPG (vmk1):&lt;/strong&gt; vSAN ağıyla iletişim için.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Bu ayrım önerilen konfigürasyon. Bu iki arayüz farklı ya da aynı ağlara bağlanabilir, yeter ki ilgili servislere erişimleri olsun. Management arayüzü vSAN trafiğini de taşıyacak şekilde tag'lenebilir, ama bu durumda vmk0'ın hem vCenter'a hem vSAN ağına erişimi olması gerekiyor.&lt;/p&gt;

&lt;p&gt;Manuel'de nested ortamlar için ilginç bir not var: VMware'in bu HOL için kullandığı platform gibi birçok nested ESX ortamında, promiscuous mode'u etkinleştirme önerisi var. Sebebi şu: sanal switch, tanımadığı nested vmnic'ler için paketleri düşürebiliyor; promiscuous mode bunu önlüyor. HOL'da bu zaten yapılandırılmış durumda, ama gerçek bir nested ortamda bu ayarı unutursanız witness trafiği sessizce kaybolabilir; bunu hatırlamak gerekiyor.&lt;/p&gt;

&lt;p&gt;Witness üzerinde &lt;code&gt;secondaryPg&lt;/code&gt; adında önceden tanımlanmış bir portgroup var, vSAN trafiği için kullanılan VMkernel port burada görünüyor. vSAN ağında DHCP sunucusu yoksa (ki genelde yok), VMkernel adaptörünün geçerli bir IP adresi olmayacaktır; bu durumda manuel IP ataması gerekiyor.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fi7tmx33i0xyc7uhhuk7t.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fi7tmx33i0xyc7uhhuk7t.png" alt="ESX host VMkernel Adapters - vmk0 üzerinde vSAN servisi etkin görünümü" width="800" height="409"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Static Route Gerekliliği
&lt;/h3&gt;

&lt;p&gt;Stretched cluster yapılandırılmadan önceki son adım, her sitedeki host'lar ile witness host arasında bağlantının sağlandığından emin olmak. Bu bağlantıyı yapılandırmadan önce doğrulamak önemli.&lt;/p&gt;

&lt;p&gt;vSAN ağı, veri siteleri arasında stretched bir L2 broadcast domain olarak öneriliyor, ama witness appliance'ın vSAN ağına ulaşmak için L3 (routing) gerekiyor. Bu yüzden veri host'ları ile witness arasında static route'lar tanımlanması gerekiyor; ama farklı sitelerdeki veri host'larının birbiriyle iletişimi için bu gerekmiyor, çünkü onlar zaten aynı L2 domain'de.&lt;/p&gt;

&lt;p&gt;Bir static route eklemek için kullanılan esxcli komutu manuel'de örnek olarak veriliyor; route bilgisini görüntülemek için ayrı komutlar da mevcut (network komşularını listeleyen ve gateway bilgisini gösteren komutlar). Bu adımın her host için tekrarlanması gerektiği özellikle vurgulanıyor.&lt;/p&gt;

&lt;p&gt;Bu kısmı okurken şunu düşündüm: GUI üzerinden yapılan çoğu adımın aksine, bu networking hazırlığı CLI bilgisi gerektiriyor. HOL'da bu adım atlanmış, zaten hazır geliyor, ama gerçek bir kurulumda muhtemelen en çok zaman alacak ve en çok hata yapılacak adım burası olurdu.&lt;/p&gt;




&lt;h2&gt;
  
  
  Mevcut Cluster'ı Stretched Cluster'a Dönüştürmek
&lt;/h2&gt;

&lt;p&gt;HOL'da var olan 4-node cluster'ı (esx-05a, 06a, 07a, 08a) stretched cluster'a çeviriyoruz. İki host daha (esx-09a, esx-10a) cluster'a ekleniyor, toplam 6 node oluyor.&lt;/p&gt;

&lt;h3&gt;
  
  
  Host'ları Cluster'a Eklemek
&lt;/h3&gt;

&lt;p&gt;Önce her iki host'ta da (&lt;code&gt;esx-09a&lt;/code&gt; ve &lt;code&gt;esx-10a&lt;/code&gt;) vSAN VMkernel adaptörünün doğru yapılandırıldığı, &lt;code&gt;Configure &amp;gt; VMkernel Adapters&lt;/code&gt; üzerinden kontrol ediliyor.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F0oa3pfdlyd9kl42u3wqp.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F0oa3pfdlyd9kl42u3wqp.png" alt="ESX host VMkernel Adapters - vmk0 üzerinde vSAN servisi etkin görünümü" width="800" height="409"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Ardından host'lar sürükle-bırak ile cluster'a ekleniyor. Açılan onay penceresi varsayılan ayarlarla geçiliyor. Host cluster'a eklendikten sonra, eğer maintenance mode'daysa sağ tık ile Exit Maintenance Mode uygulanıyor. Bu işlem birkaç dakika sürebiliyor, Recent Tasks üzerinden takip edilebiliyor.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F9utydu5dc502oesr0107.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F9utydu5dc502oesr0107.png" alt="esx-09a ve esx-10a host'larının cluster-esa-01a'ya sürüklenmesi" width="386" height="602"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Fault Domain Yapılandırması
&lt;/h3&gt;

&lt;p&gt;Asıl dönüşüm burada başlıyor:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;cluster-esa-01a &amp;gt; Configure &amp;gt; vSAN &amp;gt; Fault Domains &amp;gt; CONFIGURE STRETCHED CLUSTER&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Açılan ekranda host'lar iki domain'e ayrılıyor. Varsayılan olarak hepsi "preferred" tarafında görünüyor; &lt;code&gt;esx-08a&lt;/code&gt;, &lt;code&gt;esx-09a&lt;/code&gt; ve &lt;code&gt;esx-10a&lt;/code&gt; seçilip &lt;code&gt;&amp;gt;&amp;gt;&lt;/code&gt; ile secondary domain'e taşınıyor.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fhocbwtt4ihzkwehsw76r.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fhocbwtt4ihzkwehsw76r.png" alt="Fault Domains yapılandırma - host'ların preferred/secondary olarak ayrılması" width="799" height="388"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Sonraki adımda witness host seçiliyor: &lt;code&gt;esx-11a&lt;/code&gt;. vSAN burada otomatik bir uyumluluk kontrolü çalıştırıyor; witness'ın bu cluster ile kullanılabilir olup olmadığını doğruluyor.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fkody7rbb28pgu9npfmeo.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fkody7rbb28pgu9npfmeo.png" alt="Witness host seçim ekranı ve uyumluluk kontrolü" width="799" height="388"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Review ekranında vSAN, oluşturacağı cluster konfigürasyonunun özetini gösteriyor; burada, dönüştürme işlemi tamamlanmadan önce düzeltme yapma fırsatı da veriliyor. FINISH ile cluster oluşturuluyor.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F4ux55dojzrwkcth9hv2x.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F4ux55dojzrwkcth9hv2x.png" alt="Stretched cluster yapılandırma özeti - Review ekranı" width="799" height="388"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;İşlem sırasında Recent Tasks panelinden ilerleme izlenebiliyor; tüm görevler "Completed" olana kadar beklemek gerekiyor.&lt;/p&gt;

&lt;h3&gt;
  
  
  Sonucu Doğrulamak
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;cluster-esa-01a &amp;gt; Configure &amp;gt; vSAN &amp;gt; Fault Domains&lt;/code&gt; ekranına dönüldüğünde:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Failures To Tolerate (FTT) değeri 1 olarak görünüyor. Bu, cluster'ın herhangi bir site'ın (ya da witness host'un) kaybını tolere edip VM'leri çalışır tutabileceği anlamına geliyor.&lt;/li&gt;
&lt;li&gt;İki fault domain ve bunlara ait host'lar listede görünüyor.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F5bsdsa7kl7ovoa1tgmnu.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F5bsdsa7kl7ovoa1tgmnu.png" alt="Fault Domains özet ekranı - FTT=1 ve iki domain" width="799" height="388"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Manuel'de önemli bir mimari notu var: Site Mirroring ile FTT=1 kombinasyonu, stretched cluster'lar için önerilen standart mimari. 6 node ve üzeri büyük stretched cluster'larda, site içi ek koruma katmanı da isteğe bağlı olarak yapılandırılabiliyor; bu seçimler tipik vSAN politikalarıyla (RAID-1 mirroring, RAID-5 ve RAID-6 erasure coding) uyumlu. Yani site-level koruma ile site-içi koruma birbirinden ayrı, üst üste konumlandırılabilen iki katman.&lt;/p&gt;




&lt;h2&gt;
  
  
  Nested Ortam Uyarıları
&lt;/h2&gt;

&lt;p&gt;HOL, nested bir vSphere ortamında çalıştığı için vCenter, vSAN cluster'ının sağlığı hakkında birkaç uyarı gösteriyor. Manuel açıkça şunu söylüyor: bu lab kapsamında bu uyarıları görmezden gelmek veya susturmak sorun değil, ama gerçek workload barındıran herhangi bir "canlı" vSAN cluster'ında bu tür uyarıları Skyline Health servisi üzerinden detaylıca araştırmak gerekiyor.&lt;/p&gt;

&lt;p&gt;Bu küçük ama önemli bir uyarı; HOL'da görülen "her şey kırmızı/sarı" görünümünün gerçek ortamda aynı ciddiyetle ele alınmaması gerektiğini hatırlatıyor, ama aynı zamanda gerçek ortamda bu uyarıların asla göz ardı edilmemesi gerektiğini de.&lt;/p&gt;




&lt;h2&gt;
  
  
  Skyline Health: Stretched Cluster'a Özel Kontroller
&lt;/h2&gt;

&lt;p&gt;Cluster oluşturulduktan sonra Skyline Health'te yeni bulgular ortaya çıkıyor. RETEST'e basıldığında "vSAN optimal datastore default policy configuration" başlıklı bir uyarı görülüyor; üç nokta menüsünden TROUBLESHOOT seçilince detaylar açılıyor.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fzm2fqm97ltg7s4gniorq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fzm2fqm97ltg7s4gniorq.png" alt="Skyline Health - optimal datastore default policy uyarısı ve Troubleshoot görünümü" width="800" height="385"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Datastore Default Policy'yi Güncellemek
&lt;/h3&gt;

&lt;p&gt;Cluster yapısı değiştiği için (standart cluster'dan, her sitede üç host olan bir stretched cluster'a geçiş), Skyline Health iki değişiklik öneriyor:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Standart cluster'dan stretched cluster'a (site mirroring ile) geçiş.&lt;/li&gt;
&lt;li&gt;Her site içinde RAID-5'ten RAID-1'e geçiş.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;"UPDATE Cluster DS Policy" butonuna basılıyor.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fy1mwm6r1yklm8a5d9v93.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fy1mwm6r1yklm8a5d9v93.png" alt="Update datastore default policy onay penceresi" width="799" height="345"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Açılan onay penceresinde OK tıklanıyor. Default policy değiştirildiği için, orijinal policy'i kullanan VM'lerin yeni policy'e geçmesi için ayrıca reapply işlemi gerekiyor. Bu ortamdaki VM'ler varsayılan ESA RAID-5 policy'sini kullandığından, policy'yi manuel olarak yeni Optimal Storage Policy'ye değiştirmek gerekiyor.&lt;/p&gt;

&lt;h3&gt;
  
  
  Mevcut VM'lere Yeni Policy'i Uygulamak
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;Policies and Profiles&lt;/code&gt; menüsüne gidilip yeni oluşan &lt;code&gt;cluster-esa-01a - Optimal Datastore Default Policy - stretched RAID1&lt;/code&gt; policy'si seçiliyor, REAPPLY'a tıklanıyor. Bir uyarı, bu işlemin zaman alabileceğini ve birkaç VM'i etkileyeceğini bildiriyor; OK ile onaylanıyor.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fcc3vmiw5xoa26a913au2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fcc3vmiw5xoa26a913au2.png" alt="Policies and Profiles - REAPPLY işlemi ve uyarı penceresi" width="799" height="386"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Skyline Health'e dönülüp tekrar RETEST yapıldığında, policy uyarısının kaybolduğu görülüyor. Manuel'de bir not daha var: bazen bu uyarı bir kez daha görünebiliyor, RETEST ile geçiyor.&lt;/p&gt;

&lt;p&gt;Stretched cluster'a özel diğer health check'leri görmek için filtre üzerinden "Stretched cluster" kategorisi seçilebiliyor.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fp3d6gqv77e2jpnjlywuh.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fp3d6gqv77e2jpnjlywuh.png" alt="Skyline Health - Stretched cluster kategorisi filtrelenmiş görünüm" width="799" height="386"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;vSAN health check, vSAN kurulumlarının performans ve sağlık testlerine derinlemesine inmek için değerli bir araç; vSAN ortamını izlemek için gidilecek ilk yer olmalı. Güncel durumu görmek için health check'i düzenli olarak yeniden çalıştırmak iyi bir pratik.&lt;/p&gt;




&lt;h2&gt;
  
  
  vSAN Site Affinity: Her VM'in Çok Site Koruması İstemediği Durumlar
&lt;/h2&gt;

&lt;p&gt;Modülün ikinci yarısı farklı bir soruna eğiliyor. Bir veri merkezinde, uygulama seviyesinde zaten dahili yüksek erişilebilirlik veya yedeklilik sağlayan pek çok workload var. Ama tipik production workload'ları çoğunlukla daha iyi veri yedekliliği için çok-site koruması gerektiriyor. Peki, kopyaların farklı sitelerde tutulmasını gerektirmeyen workload'lar için ne yapılabilir?&lt;/p&gt;

&lt;p&gt;Bu soruya cevap: &lt;strong&gt;Local Affinity&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Local Affinity Mantığı
&lt;/h3&gt;

&lt;p&gt;Local Affinity, bir policy aracılığıyla veriyi tek bir site'da tutmayı sağlıyor. Bunun teknik karşılığı Primary Failures To Tolerate (PFTT) değerinin 0 olarak ayarlanması. PFTT=0 olduğunda nesneler ikincil siteye replike edilmiyor, bu da siteler arası gereken bant genişliğini azaltıyor. Ayrıca affinity kuralları kullanılarak VM/VMDK atamaları belirli host'lara da sabitlenebiliyor.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fv5xlvy0r403x9kl8p314.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fv5xlvy0r403x9kl8p314.png" alt="Local Affinity" width="800" height="621"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Manuel, test senaryosu olarak şu kombinasyonu öneriyor: PFTT=0, Secondary Failures To Tolerate (SFTT)=2, Failure Tolerance Method (FTM)=RAID-5. Bu kombinasyonla tüm I/O'nun yerel olarak yapılması, hiçbirinin ikincil siteye gitmemesi bekleniyor. Yani site koruması olmadan, host/disk seviyesinde koruma sorunsuzca elde edilmiş oluyor.&lt;/p&gt;

&lt;p&gt;Birkaç kısıtlama da var:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Affinity, sadece Stretched Cluster etkinleştirilmiş cluster'larda kullanılabiliyor.&lt;/li&gt;
&lt;li&gt;DRS/HA kuralları, data locality ile uyumlu olmalı.&lt;/li&gt;
&lt;li&gt;OSA'da Hybrid konfigürasyonlarda RAID-0 ve RAID-1 destekleniyor, All-Flash'te RAID-0, RAID-1, RAID-5 ve RAID-6 destekleniyor.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Bu son madde aklımda kaldı: Local Affinity kullanılırken DRS/HA kurallarının manuel olarak hizalanması gerekiyor. Bu, "policy ayarladım, iş bitti" diyemeyeceğiniz, cluster'ın diğer otomasyon katmanlarıyla da koordinasyon gerektiren bir özellik.&lt;/p&gt;

&lt;h3&gt;
  
  
  Single Site Storage Policy Oluşturmak
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;Policies and Profiles &amp;gt; VM Storage Policies &amp;gt; CREATE&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;İsim: &lt;code&gt;Single Site Storage Policy&lt;/code&gt;. "Enable rules for vSAN storage" seçiliyor.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fdub9xfw7mzqowm39ji3r.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fdub9xfw7mzqowm39ji3r.png" alt="VM Storage Policy oluşturma - isim ve vSAN storage kuralları etkinleştirme" width="800" height="566"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Availability sekmesinde:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Site disaster tolerance: &lt;strong&gt;None - keep data on Preferred (stretched cluster)&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Failures to tolerate: &lt;strong&gt;1 failure - RAID-1 (Mirroring)&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fsg9cz2aub5cxmguozz0a.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fsg9cz2aub5cxmguozz0a.png" alt="Availability sekmesi - Site disaster tolerance ve FTT seçimleri" width="800" height="566"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Datastore uyumluluğu doğrulanıyor (&lt;code&gt;vsan-esa-01a_Datastore&lt;/code&gt; Compatible görünmeli), FINISH ile policy tamamlanıyor.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fhc0r34paxkwi8ivpkviw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fhc0r34paxkwi8ivpkviw.png" alt="VM Storage Policies listesi - Single Site Storage Policy ve kuralları" width="800" height="387"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Local Affinity Policy ile VM Oluşturmak
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;core-a&lt;/code&gt; VM'i klonlanarak &lt;code&gt;Local Affinity VM&lt;/code&gt; adıyla yeni bir VM oluşturuluyor. Clone wizard'ında:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Datacenter: &lt;code&gt;dc-a&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Cluster: &lt;code&gt;cluster-esa-01a&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Storage Policy: &lt;code&gt;Single Site Storage Policy&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Datastore: &lt;code&gt;vsan-esa-01a_Datastore&lt;/code&gt; (compatible olarak görünüyor)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ffy5bf900ttdai3ooxq25.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ffy5bf900ttdai3ooxq25.png" alt="Clone wizard - Single Site Storage Policy seçimi" width="800" height="569"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Klon tamamlandığında VM Summary'den policy'nin atandığı ve "Compliant" olduğu doğrulanıyor.&lt;/p&gt;

&lt;h3&gt;
  
  
  Yerleşimi Doğrulamak: Preferred Fault Domain
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;cluster-esa-01a &amp;gt; Configure &amp;gt; vSAN &amp;gt; Fault Domains&lt;/code&gt; ekranından preferred fault domain'in hangi host'ları içerdiği görülüyor. HOL'daki örnekte &lt;code&gt;esx-05a&lt;/code&gt;, &lt;code&gt;esx-06a&lt;/code&gt; ve &lt;code&gt;esx-07a&lt;/code&gt; preferred domain'de.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fibmwch6a830pfcjfd7ow.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fibmwch6a830pfcjfd7ow.png" alt="Fault Domains - Preferred domain ve içerdiği host'lar" width="800" height="385"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;Local Affinity VM &amp;gt; Monitor &amp;gt; vSAN &amp;gt; Physical disk placement&lt;/code&gt; ekranından, bileşenlerin gerçekten preferred fault domain üzerinde konumlandığı doğrulanıyor.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fc50haunisxy0la7rvfny.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fc50haunisxy0la7rvfny.png" alt="Physical disk placement - bileşenlerin Preferred domain'de görünmesi" width="800" height="385"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Bu doğrulama adımı önemli, çünkü policy'nin "doğru göründüğünü" varsaymak yerine bileşenlerin gerçekte nerede oturduğunu kontrol etmek, "compliant" etiketinin arkasındaki gerçekliği teyit ediyor.&lt;/p&gt;

&lt;h3&gt;
  
  
  Policy'i Değiştirip Site Geçişini Görmek
&lt;/h3&gt;

&lt;p&gt;Modülün son kısmında, &lt;code&gt;Single Site Storage Policy&lt;/code&gt; düzenlenerek Site disaster tolerance ayarı &lt;strong&gt;"None - keep data on Secondary"&lt;/strong&gt; olarak değiştiriliyor. Bu, verinin artık preferred yerine secondary site'da tutulmasını söylüyor.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ffq5c8a4d13opt1xnrmgf.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ffq5c8a4d13opt1xnrmgf.png" alt="Policy düzenleme - Site disaster tolerance Secondary olarak değiştirme" width="800" height="570"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Policy zaten bir VM tarafından kullanıldığı için, "Reapply to VMs" seçeneği "Now" olarak ayarlanıp YES ile onaylanıyor.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fyralqx9dzl1ye9vo3tnp.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fyralqx9dzl1ye9vo3tnp.png" alt="Reapply to VMs - Now seçeneği ve onay" width="800" height="570"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Son doğrulama adımında &lt;code&gt;Local Affinity VM &amp;gt; Monitor &amp;gt; vSAN &amp;gt; Physical disk placement&lt;/code&gt; tekrar kontrol ediliyor; bu sefer bileşenlerin Secondary Fault Domain'e taşındığı görülüyor.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fs0u7874h3kji2uk47x3p.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fs0u7874h3kji2uk47x3p.png" alt="Physical disk placement - bileşenlerin Secondary domain'e taşınmış hali" width="800" height="385"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Bu son adım, Local Affinity'nin sadece statik bir yerleşim olmadığını, policy değiştiğinde verinin gerçekten fiziksel olarak başka bir site'a taşındığını gösteriyor. vMotion gibi VM'in compute'unun taşınması değil, doğrudan storage nesnelerinin yeniden yerleştirilmesi (re-placement) söz konusu.&lt;/p&gt;




&lt;h2&gt;
  
  
  Genel Değerlendirme
&lt;/h2&gt;

&lt;p&gt;Bu modül, önceki üçünden farklı bir karaktere sahip. SPBM, izleme ve şifreleme tek bir site içinde çalışan kavramlardı. Stretched cluster ise coğrafi/fiziksel bir boyut ekliyor; ağ topolojisi, gecikme süreleri ve "hangi taraf hayatta kalmalı" gibi sorular devreye giriyor.&lt;/p&gt;

&lt;p&gt;Benim için en çok düşündüren üç nokta şunlardı:&lt;/p&gt;

&lt;p&gt;Birincisi, witness host'un cluster'ın &lt;strong&gt;dışında&lt;/strong&gt; tutulması gerekliliği. İlk bakışta tuhaf geliyor; quorum sağlayan bir bileşenin neden cluster üyesi olmadığını sorgulamak doğal. Ama mantığı şu: witness veri taşımıyor, sadece karar verici. Cluster üyesi olsaydı, kendisi de bir failure noktası haline gelebilirdi.&lt;/p&gt;

&lt;p&gt;İkincisi, read locality'nin varsayılan davranış olması ve kapatılmasının neredeyse istisnai bir durum olarak tanımlanması. Bu, "ne zaman varsayılanı değiştirmemeliyim" sorusuna iyi bir örnek; bazen en iyi karar, ayarı olduğu gibi bırakmak.&lt;/p&gt;

&lt;p&gt;Üçüncüsü, Local Affinity'nin son demosu; policy değiştiğinde verinin fiziksel olarak taşındığını göstermesi. Bu, SPBM'in sadece "uyumlu/uyumsuz" etiketlemekle kalmadığını, gerçek veri hareketini tetiklediğini somut olarak gösteriyor. Modül 1'de gördüğümüz Placement Details ekranının burada da işe yaraması, serinin kendi içinde nasıl bağlandığını da hissettirdi.&lt;/p&gt;

&lt;p&gt;HOL'un nested ortam kısıtlamaları burada daha belirgin hissettiriyor kendini; gerçek bir stretched cluster kurulumunda WAN gecikmesi, bant genişliği sınırlamaları ve gerçek bir site kaybı senaryosu test etmek, bu modülün kapsamının çok ötesinde bir konu. Ama temel kavramları, doğru terminolojiyle ve doğru sırayla görmüş olmak, gerçek bir tasarım dokümanını okurken işe yarayacak bir zemin oluşturuyor.&lt;/p&gt;

&lt;p&gt;Bir sonraki hafta Modül 5'e geçiyorum.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Bu seri VMware HOL ortamı (HOL-2634-01-VCF-L) üzerinden yürütülmektedir. Buradaki gözlemler lab bağlamında değerlendirilmeli, production ortamı kararları için mutlaka resmi VMware dokümantasyonu ve deneyimli mühendisler referans alınmalıdır.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>vmware</category>
      <category>vsan</category>
    </item>
    <item>
      <title>vSAN Şifreleme ve Güvenlik: HOL Notları (Modül 3)</title>
      <dc:creator>Hakan İSMAİL</dc:creator>
      <pubDate>Sun, 28 Jun 2026 08:59:25 +0000</pubDate>
      <link>https://dev.to/hakanbaban53/vsan-sifreleme-ve-guvenlik-hol-notlari-modul-3-53hk</link>
      <guid>https://dev.to/hakanbaban53/vsan-sifreleme-ve-guvenlik-hol-notlari-modul-3-53hk</guid>
      <description>&lt;p&gt;İki haftadır SPBM ve izleme konularını işledim. Bu hafta Modül 3'e geçiyorum: vSAN şifreleme ve güvenlik. Modül kısa ama içerik yoğun. Şifreleme konuları genelde "evet, şifreleyelim" deyip geçilen yerler değil; anahtar yönetimi, reboot davranışı ve performans etkisi gibi detaylar production'da gerçekten fark ediyor.&lt;/p&gt;

&lt;p&gt;Bu yazıda iki ana konu var: data-in-transit (aktarım sırasında) şifreleme ve data-at-rest (durağan veri) şifreleme. İkisi birbirinden bağımsız, ayrı ayrı açılıp kapatılabiliyor.&lt;/p&gt;




&lt;h2&gt;
  
  
  İki Şifreleme Türü, İki Farklı Amaç
&lt;/h2&gt;

&lt;p&gt;vSAN iki tür şifreleme sunuyor:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Data-in-transit encryption:&lt;/strong&gt; Host'lar arasında akan tüm vSAN verisi ve metadata trafiğini şifreliyor.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Data-at-rest encryption:&lt;/strong&gt; Veriyi, deduplikasyon gibi diğer işlemler tamamlandıktan sonra şifreliyor. Bir disk cluster'dan fiziksel olarak çıkarılsa bile üzerindeki veri korunmuş oluyor.&lt;/p&gt;

&lt;p&gt;Bu ayrımı net tutmak önemli: birini açmak diğerini otomatik açmıyor. Tehdit modeline göre ikisi farklı senaryoları kapatıyor. Data-in-transit, ağ üzerinde dinleme (sniffing) riskine karşı; data-at-rest, fiziksel disk hırsızlığına veya yanlış imha edilen donanıma karşı.&lt;/p&gt;




&lt;h2&gt;
  
  
  Data-In-Transit Encryption: Detaylar
&lt;/h2&gt;

&lt;p&gt;Bu özelliğin birkaç teknik özelliği var, not almaya değer:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;AES-256 bit şifreleme kullanılıyor.&lt;/li&gt;
&lt;li&gt;Data-at-rest şifrelemesiyle ilişkisi yok; ikisi bağımsız açılıp kapatılabiliyor.&lt;/li&gt;
&lt;li&gt;Forward secrecy uygulanıyor (yani bir anahtar ele geçirilse bile geçmiş trafiği deşifre etmek için kullanılamıyor).&lt;/li&gt;
&lt;li&gt;Data host'ları ile witness host'ları arasındaki trafik de şifreleniyor.&lt;/li&gt;
&lt;li&gt;File service trafiği (VDFS proxy ile VDFS server arası) de kapsam içinde.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;En dikkat çeken kısım şu: şifreleme için bir Key Management Server'a ihtiyaç yok. Host'lar bir bağlantı kurduklarında dinamik olarak simetrik bir anahtar üretiyor ve bu anahtarla aralarındaki trafiği şifreliyorlar. Bir host cluster'a katıldığında doğrulanıyor, cluster'dan çıkarıldığında ise sertifikası kaldırılıyor.&lt;/p&gt;

&lt;p&gt;Bu, data-at-rest şifrelemesine kıyasla operasyonel olarak çok daha hafif bir özellik. Tek bir toggle, anahtar yönetimi derdi yok. Bu yüzden "neden açmayalım ki" sorusuna cevap vermek daha kolay.&lt;/p&gt;

&lt;h3&gt;
  
  
  Etkinleştirme Adımları
&lt;/h3&gt;

&lt;p&gt;vSphere Client üzerinden:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;code&gt;cluster-esa-01a&lt;/code&gt; seçiliyor&lt;/li&gt;
&lt;li&gt;Configure&lt;/li&gt;
&lt;li&gt;vSAN &amp;gt; Services&lt;/li&gt;
&lt;li&gt;Data Services bölümü genişletilip EDIT'e tıklanıyor&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Flbmyblgvecgviavtxpcl.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Flbmyblgvecgviavtxpcl.png" alt="vSAN Services - Data Services bölümü, Edit ekranı" width="800" height="409"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Açılan ekranda Data-In-Transit Encryption toggle'ı açılıyor ve APPLY'a basılıyor. Bir de "rekey interval" var; varsayılan 1 gün, ihtiyaca göre özelleştirilebiliyor. Bu rekey periyodu, anahtarların ne sıklıkla yenileneceğini belirliyor.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fahd52i9skcd7unn8gkz6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fahd52i9skcd7unn8gkz6.png" alt="Data-In-Transit Encryption toggle ve rekey interval ayarı" width="800" height="409"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Data-At-Rest Encryption: Anahtar Hiyerarşisi
&lt;/h2&gt;

&lt;p&gt;Burası modülün biraz daha karmaşık kısmı, ama mantığını anladığınızda aslında oldukça temiz bir tasarım.&lt;/p&gt;

&lt;p&gt;Üç seviyeli bir anahtar hiyerarşisi var:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;KEK (Key Encryption Key):&lt;/strong&gt; vCenter, KMS'ten AES-256 bir KEK talep ediyor. Ama vCenter bu anahtarın kendisini saklamıyor, sadece ID'sini tutuyor.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;DEK (Data Encryption Key):&lt;/strong&gt; ESX host, diski AES-256 XTS modunda şifrelerken DEK kullanıyor. OSA'da her disk için ayrı, rastgele üretilmiş bir DEK var. ESA'da ise cluster'daki tüm diskler aynı DEK'i kullanıyor.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Host Key:&lt;/strong&gt; Core dump'ları şifrelemek için kullanılıyor, veri için değil. Aynı cluster'daki tüm host'lar aynı host key'i paylaşıyor. Support bundle toplarken core dump'lar rastgele bir anahtarla yeniden şifreleniyor; bu anahtara bir şifre de atayabiliyorsunuz.&lt;/p&gt;

&lt;p&gt;Burada OSA-ESA farkı dikkatimi çekti. OSA'da disk başına ayrı DEK varken ESA'da tüm cluster için tek bir DEK kullanılması, anahtar yönetimini basitleştiriyor ama "tek anahtar = tek başarısızlık noktası" sorusunu da aklımıza getiriyor. Tabii bu DEK zaten KEK ile şifrelenmiş halde diskte duruyor, host KEK'i almadan DEK'i kullanamıyor; yani anahtarın kendisi tek başına bir şey ifade etmiyor.&lt;/p&gt;

&lt;h3&gt;
  
  
  Reboot Davranışı: Dikkat Edilmesi Gereken Bir Nokta
&lt;/h3&gt;

&lt;p&gt;Şunu production açısından önemli buluyorum: Host reboot olduğunda, disk grup'ları KEK'i alana kadar mount edilmiyor. Bu işlem birkaç dakika veya daha uzun sürebiliyor. Yani bir host restart sonrası "neden disk grupları hemen görünmüyor" diye panik yapmadan önce, bu sürecin normal olduğunu bilmek gerekiyor. Durumu &lt;code&gt;vSAN health service &amp;gt; Physical disks &amp;gt; Software state health&lt;/code&gt; üzerinden takip edebiliyorsunuz.&lt;/p&gt;

&lt;p&gt;Bu, KMS'in erişilebilirliğinin de ne kadar kritik olduğunu gösteriyor. KMS'e erişilemiyorsa host KEK'i alamaz, disk grupları mount olmaz. KMS'in yüksek erişilebilirlikli olması bu yüzden boş bir öneri değil.&lt;/p&gt;




&lt;h2&gt;
  
  
  DISA STIG ve FIPS 140-2
&lt;/h2&gt;

&lt;p&gt;vSAN, vSAN 6.7'den itibaren FIPS 140-2 doğrulamalı ilk yazılım tabanlı çözüm olma iddiasında. vSAN doğrudan hypervisor'a entegre olduğu için vSphere'in kullandığı kernel modülünü kullanıyor ve bu modül FIPS 140-2 doğrulamasına sahip.&lt;/p&gt;

&lt;p&gt;Bu, ABD federal hükümeti gibi belirli regülasyon gereksinimleri olan kurumlar için önemli bir kutu işaretleme maddesi. Aynı zamanda DISA onaylı bir STIG'e (Security Technical Implementation Guide) sahip olan ilk HCI çözümü olarak konumlandırılıyor.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fwp0099mxrfk7b7mhce8p.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fwp0099mxrfk7b7mhce8p.png" alt="FIPS 140-2 Doğrulaması" width="800" height="596"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Türkiye'deki bir okuyucu için bu spesifik sertifikasyonlar doğrudan bir gereksinim olmayabilir, ama "bu seviyede bir doğrulamadan geçmiş" bilgisi, ürünün güvenlik mimarisinin ne kadar olgun olduğu konusunda bir gösterge.&lt;/p&gt;




&lt;h2&gt;
  
  
  Key Management Server: Native Key Provider Kurulumu
&lt;/h2&gt;

&lt;p&gt;vSAN encryption, harici bir Key Management Server, vCenter Server ve ESXi host'ları arasında çalışıyor. vCenter, KMS'ten anahtar talep ediyor; KMS anahtarları üretip saklıyor, vCenter ise sadece anahtar ID'lerinin listesini tutuyor.&lt;/p&gt;

&lt;p&gt;HOL'da harici bir KMS kurmak yerine vSAN'ın "Native Key Provider" özelliğini kullanıyoruz. Bu, vCenter'a gömülü bir key provider; ayrı bir KMS sunucusu kurmaya gerek kalmıyor.&lt;/p&gt;

&lt;h3&gt;
  
  
  Kurulum Adımları
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;code&gt;vc-mgmt-a.site-a.vcf.lab&lt;/code&gt; vCenter'ı seçiliyor&lt;/li&gt;
&lt;li&gt;Configure&lt;/li&gt;
&lt;li&gt;Security &amp;gt; Key Providers&lt;/li&gt;
&lt;li&gt;ADD&lt;/li&gt;
&lt;li&gt;Add Native Key Provider&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fqlsot7ldbv7fnin40dxn.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fqlsot7ldbv7fnin40dxn.png" alt="vCenter Configure - Security - Key Providers menüsü" width="799" height="408"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Sonra şu bilgiler giriliyor:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;İsim: &lt;code&gt;vSAN-Native-KP&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;"Use key provider only with TPM..." kutusu işaretsiz bırakılıyor (nested bir lab ortamı olduğu için TPM mevcut değil)&lt;/li&gt;
&lt;li&gt;ADD KEY PROVIDER&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F6h69smowcd88n6xckp8r.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F6h69smowcd88n6xckp8r.png" alt="Add Native Key Provider - isim ve TPM ayarı ekranı" width="628" height="414"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Key Provider eklendiğinde Type "Native", Status ise "Not backed up" olarak görünüyor.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fhmrt8pxtymixhoyc4q0f.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fhmrt8pxtymixhoyc4q0f.png" alt="Key Provider listesi - Native, Not backed up durumu" width="800" height="408"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Yedekleme: Atlanmaması Gereken Adım
&lt;/h3&gt;

&lt;p&gt;Burada gerçekten önemli bir nokta var. Key Provider eklendikten sonra BACK-UP butonuna basıp "BACK UP KEY PROVIDER" seçeneği seçiliyor.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fzxedye2sae7baf92rolr.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fzxedye2sae7baf92rolr.png" alt="Key Provider yedekleme ekranı" width="799" height="251"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Yedekleme tamamlandığında status "Active" oluyor.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F2kes29mpu7sqg7i38ywv.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F2kes29mpu7sqg7i38ywv.png" alt="Key Provider durumu - Active" width="800" height="428"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Bu adımın HOL'da bir formalite gibi görünmesi mümkün ama gerçek ortamda kritik: Native Key Provider'ın yedeği yoksa ve vCenter kaybedilirse, şifrelenmiş veriye erişim de kaybedilebilir. "Not backed up" durumundaki bir key provider, encryption'ı aktif etmeden önce mutlaka yedeklenmesi gereken bir uyarı sinyali.&lt;/p&gt;




&lt;h2&gt;
  
  
  vSAN Encryption'ı Etkinleştirmek
&lt;/h2&gt;

&lt;p&gt;vSAN Encryption, vSAN 6.6'dan beri mevcut ve ilk native HCI şifreleme çözümü olarak tanıtılıyor. Birkaç tıkla tüm vSAN datastore için açılıp kapatılabiliyor; ekstra bir adım gerekmiyor.&lt;/p&gt;

&lt;p&gt;Hypervisor seviyesinde çalıştığı için VM'den bağımsız (VM Encryption gibi VM'e özgü değil). Donanımdan bağımsız olduğu için de Self-Encrypting Drive (SED) gibi özel ve daha maliyetli donanımlara ihtiyaç yok.&lt;/p&gt;

&lt;p&gt;HOL'da data-at-rest encryption zaten önceden etkinleştirilmiş durumda. Bu bölümde yapılan, "shallow rekey" denilen bir işlem; bu, encryption'ı ilk kez açmakla aynı adımları takip ediyor.&lt;/p&gt;

&lt;h3&gt;
  
  
  Adımlar
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;code&gt;cluster-esa-01a&lt;/code&gt; seçiliyor&lt;/li&gt;
&lt;li&gt;Configure&lt;/li&gt;
&lt;li&gt;vSAN &amp;gt; Services&lt;/li&gt;
&lt;li&gt;Data Services altında EDIT&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Foyzjiaole09es7lahpzi.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Foyzjiaole09es7lahpzi.png" alt="vSAN Services - Data Services Edit ekranı" width="765" height="599"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Açılan ekranda:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Data-at-rest Encryption zaten açık görünüyor&lt;/li&gt;
&lt;li&gt;Key Provider, &lt;code&gt;nk1&lt;/code&gt;'den &lt;code&gt;vSAN-Native-KP&lt;/code&gt;'ye değiştiriliyor (her seçenek için bilgi (i) butonuna tıklanarak detay görülebiliyor)&lt;/li&gt;
&lt;li&gt;APPLY&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F5qvnrvp8mplaovxjoim6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F5qvnrvp8mplaovxjoim6.png" alt="Key Provider değişimi - nk1'den vSAN-Native-KP'ye" width="765" height="599"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;İşlem tamamlandığında Data Services genişletilip Key Provider'ın &lt;code&gt;vSAN-Native-KP&lt;/code&gt; olarak ayarlandığı doğrulanıyor. Bu noktadan sonra vSAN datastore'a eklenen tüm veri şifreleniyor. Bir anahtar süresi dolarsa veya ele geçirilirse yeni anahtar üretme seçeneği de burada.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fj53n1mkz80koadaou4i3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fj53n1mkz80koadaou4i3.png" alt="Data Services - Key Provider doğrulama" width="614" height="355"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Burada dikkatimi çeken şey, bu işlemin "shallow rekey" olarak tanımlanması. Yani mevcut şifrelenmiş veri tamamen yeniden şifrelenmiyor (bu "deep rekey" olurdu, çok daha pahalı bir operasyon); sadece anahtar değişiyor. Production'da deep rekey'in I/O üzerindeki etkisini ayrıca araştırmak gerekir, ama bu HOL bunun ayrımını yapmamıza yardımcı oluyor.&lt;/p&gt;




&lt;h2&gt;
  
  
  vSAN Encryption Health Check
&lt;/h2&gt;

&lt;p&gt;vSAN, encryption'ın etkin ve sağlıklı olduğunu doğrulamak için health check'lere sahip. Bunlara erişim:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;code&gt;cluster-esa-01a&lt;/code&gt; seçili, Monitor&lt;/li&gt;
&lt;li&gt;vSAN &amp;gt; Skyline Health&lt;/li&gt;
&lt;li&gt;Health findings altında ALL seçiliyor&lt;/li&gt;
&lt;li&gt;Category sütunundaki filtre ikonuna tıklanıyor&lt;/li&gt;
&lt;li&gt;"Data-at-rest encryption" işaretleniyor&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fhld1alzuxxe9cro8zrr5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fhld1alzuxxe9cro8zrr5.png" alt="Skyline Health - Data-at-rest encryption kategorisi filtrelenmiş" width="800" height="408"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Bu kategoride iki health check var.&lt;/p&gt;

&lt;h3&gt;
  
  
  Kontrol 1: KMS Bağlantısı
&lt;/h3&gt;

&lt;p&gt;"vCenter and all hosts are connected to Key Management Servers" bulgusunun yanındaki üç noktalı menüden "View Current Result" seçiliyor.&lt;/p&gt;

&lt;p&gt;Bu kontrol, ESX Key Provider durumunu, bağlantı durumunu ve anahtar durumunu (key state) listeliyor.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fr9nezgf3sypnhmn3v9pd.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fr9nezgf3sypnhmn3v9pd.png" alt="ESX Key Provider durumu, Connection Status ve Key State" width="800" height="408"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Kontrol 2: AES-NI
&lt;/h3&gt;

&lt;p&gt;Aynı kategori altında "CPU AES-NI is enabled on hosts" bulgusunun üç noktalı menüsünden "View Current Result" seçiliyor.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fxo1p6pupcmussjvgjfnj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fxo1p6pupcmussjvgjfnj.png" alt="CPU AES-NI kontrolü sonucu" width="800" height="408"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Bu kontrol, cluster'daki ESX host'ların CPU AES-NI özelliğine sahip olup olmadığını doğruluyor. AES-NI, Intel ve AMD işlemcilerde AES şifreleme/deşifreleme işlemlerini hızlandırmak için tasarlanmış bir donanım uzantısı.&lt;/p&gt;

&lt;p&gt;Bu kontrolün burada olması mantıklı: AES-NI olmadan şifreleme yazılımsal olarak yapılır ve bu CPU üzerinde belirgin bir yük oluşturur. Modern sunucu işlemcilerinin büyük çoğunluğunda AES-NI zaten var, ama eski donanımla çalışan ortamlarda bu kontrolün kırmızı çıkması, "şifrelemeyi açtık ama performans neden düştü" sorusunun cevabı olabilir.&lt;/p&gt;




&lt;h2&gt;
  
  
  Genel Değerlendirme
&lt;/h2&gt;

&lt;p&gt;Bu modül, önceki ikisine göre daha "arka plan" bir konuyu işliyor; şifreleme açıldıktan sonra günlük operasyonda görünür bir şey değişmiyor, ama yanlış yapılandırıldığında ya da KMS erişilemez olduğunda etkisi çok görünür hale geliyor.&lt;/p&gt;

&lt;p&gt;Benim için en dikkat çekici üç nokta şunlardı:&lt;/p&gt;

&lt;p&gt;Birincisi, data-in-transit encryption'ın KMS gerektirmemesi ve tamamen dinamik anahtarlarla çalışması. Bu, "açmamak için bahane bulmak zor" bir özellik; operasyonel yük neredeyse sıfır.&lt;/p&gt;

&lt;p&gt;İkincisi, host reboot sırasında disk gruplarının KEK'i bekleyerek mount olması. Bu, KMS'in yüksek erişilebilirlik gereksinimini soyut bir "best practice" maddesinden çıkarıp somut bir bağımlılığa dönüştürüyor. KMS düşerse, sadece yeni anahtar talepleri değil, reboot sonrası disk mount süreçleri de etkileniyor.&lt;/p&gt;

&lt;p&gt;Üçüncüsü, Native Key Provider'ın "Not backed up" uyarısı. HOL'da bu adım hızlıca geçiliyor ama gerçek bir ortamda bu, encryption'ı açmadan önce check-list'in en üstünde olması gereken bir madde gibi duruyor.&lt;/p&gt;

&lt;p&gt;vSAN'ın şifreleme tarafı, "aç ve unut" gibi pazarlanıyor ve büyük ölçüde de öyle. Ama anahtar yönetimi her zaman böyle; basit görünen arayüzün ardında, bir şeyler ters gittiğinde önemli hale gelen bir bağımlılık zinciri var.&lt;/p&gt;

&lt;p&gt;Bir sonraki hafta Modül 4'e geçiyorum.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Bu seri VMware HOL ortamı (HOL-2634-01-VCF-L) üzerinden yürütülmektedir. Buradaki gözlemler lab bağlamında değerlendirilmeli, production ortamı kararları için mutlaka resmi VMware dokümantasyonu ve deneyimli mühendisler referans alınmalıdır.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>vmware</category>
      <category>vsan</category>
    </item>
    <item>
      <title>vSAN İzleme: Sağlık, Kapasite ve Performans: HOL Notları (Modül 2)</title>
      <dc:creator>Hakan İSMAİL</dc:creator>
      <pubDate>Sun, 21 Jun 2026 07:20:16 +0000</pubDate>
      <link>https://dev.to/hakanbaban53/vsan-izleme-saglik-kapasite-ve-performans-hol-notlari-modul-2-5fc3</link>
      <guid>https://dev.to/hakanbaban53/vsan-izleme-saglik-kapasite-ve-performans-hol-notlari-modul-2-5fc3</guid>
      <description>&lt;p&gt;Geçen hafta SPBM'i, policy yönetimini ve cluster'ı büyütüp küçültmeyi incelemiştim. Bu hafta Modül 2 ile devam ediyorum. Konu: vSAN ortamının sağlığını izlemek, kapasiteyi takip etmek ve performans verilerini okumak.&lt;/p&gt;

&lt;p&gt;Bu modül biraz farklı bir yerden başlıyor. Bir şey kurup yapılandırmak yerine, kurulu ortamı "gözetlemeyi" öğreniyoruz. Kulağa pasif geliyor ama değil; hangi ekrana ne zaman bakacağını bilmek, bir sorun çıktığında saatleri kurtarabilir.&lt;/p&gt;




&lt;h2&gt;
  
  
  vSAN Health Check: Neden Önemli?
&lt;/h2&gt;

&lt;p&gt;vSAN 6.0'dan bu yana sistemde yerleşik bir sağlık kontrol mekanizması var. Yüzden fazla hazır kontrol içeriyor. Ağ bağlantısı, donanım uyumluluğu, disk durumu, VM nesneleri, konfigürasyon tutarsızlıkları gibi başlıkları kapsıyor.&lt;/p&gt;

&lt;p&gt;Yeni bir cluster kurduktan sonra yapılacak ilk şeylerden biri bu kontrolü çalıştırmak. Bir ağ sorununu erkenden yakalamak ile haftalar sonra performans şikayetleri gelince fark etmek arasındaki farkı bu araç belirleyebilir.&lt;/p&gt;




&lt;h2&gt;
  
  
  Skyline Health Üzerinden Kontrol
&lt;/h2&gt;

&lt;p&gt;vSphere Client'ta şu yola gidiyoruz:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;cluster-esa-01a &amp;gt; Monitor &amp;gt; vSAN &amp;gt; Skyline Health&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Açılan ekranda üç şey görüyorsunuz:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Cluster Health Score (sayısal bir puan)&lt;/li&gt;
&lt;li&gt;Health Score Trend (zaman serisi)&lt;/li&gt;
&lt;li&gt;Health Findings (aktif sorunlar)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Trend görünümünde "VIEW DETAILS" diyince geçmişe de bakabiliyorsunuz; sorunun ne zaman başladığını görmek için işe yarıyor.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhdiafa04f1hvp8xneyjj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhdiafa04f1hvp8xneyjj.png" alt="Skyline Health genel görünümü: Cluster Health Score ve trend grafiği" width="799" height="407"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Kontrolleri kategoriye göre filtrelemek de mümkün. "Category" filtresinden "Network" seçince sadece ağ katmanıyla ilgili testler listeleniyor. Her testin yanındaki &lt;code&gt;&amp;gt;&amp;gt;&lt;/code&gt; ikonuna tıklayınca sağ panelde o kontrolün ne anlama geldiği ve nasıl düzeltileceği açıklıyor. KB makalesi bağlantısı da genellikle orada.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnvf5uj1ynrd01v7sx0uo.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnvf5uj1ynrd01v7sx0uo.png" alt="Skyline Health: Network kategorisi filtrelenmiş görünüm" width="799" height="407"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Kasıtlı Arıza: Sistemi Test Etmek
&lt;/h2&gt;

&lt;p&gt;HOL'un bu kısımda yaptığı ilginç: bir host'u kasıtlı olarak disconnect edip health check'in bunu nasıl yakaladığını gösteriyor.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;esx-05a.site-a.vcf.lab&lt;/code&gt; üzerine sağ tık, Connection &amp;gt; Disconnect diyoruz. Ardından Skyline Health'e dönüp RETEST'e basıyoruz.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fx8tzmjkm5r0wz5nule0c.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fx8tzmjkm5r0wz5nule0c.png" alt="Skyline Health: Host disconnect sonrası UNHEALTHY uyarısı" width="799" height="407"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Birkaç saniye içinde "UNHEALTHY" bölümünde &lt;code&gt;esx-05a&lt;/code&gt;'nın vCenter'dan koptuğuna dair uyarı çıkıyor. TROUBLESHOOT'a basınca hangi host'un sorunlu olduğu, durumu ve KB bağlantısı görünüyor.&lt;/p&gt;

&lt;p&gt;Sonra aynı host'u yeniden connect edip RETEST yapıyoruz. Uyarı kayboluyor, health score normale dönüyor.&lt;/p&gt;

&lt;p&gt;Bu adımın değeri şu: Sistemin gerçekten alarm üretip üretmediğini, doğru kaynağı gösterip göstermediğini ve çözüm önerisi sunup sunmadığını ellerin kirletmeden görmek.&lt;/p&gt;




&lt;h2&gt;
  
  
  Kapasite İzleme
&lt;/h2&gt;

&lt;p&gt;Kapasite takibi için birkaç farklı giriş noktası var. En doğrudan olanı datastore görünümü.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;Datastores Icon &amp;gt; dc-a &amp;gt; vsan-esa-01a_Datastore &amp;gt; Summary &amp;gt; VIEW CAPACITY&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Açılan ekranda iki önemli bölüm var:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Capacity Overview:&lt;/strong&gt; Toplam kapasite, kullanılan alan ve boş alan. Standart bir disk kullanım göstergesi.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What-if Analysis:&lt;/strong&gt; Burası daha ilginç. Seçtiğiniz bir storage policy bazında "etkin boş alan" hesaplıyor. Thin provisioning açısından datastore'un oversubscribed olup olmadığını da gösteriyor. Yani gerçek fiziksel alan ile politika gereği ayrılması gereken alan arasındaki farkı görünür kılıyor.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fj7wnj1j6pl6q3hyeyy0i.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fj7wnj1j6pl6q3hyeyy0i.png" alt="Kapasite genel görünümü ve What-if Analysis ekranı" width="799" height="407"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Kullanım Detayı (Usage Breakdown)
&lt;/h3&gt;

&lt;p&gt;"EXPAND ALL" diyince vSAN datastore üzerindeki nesne tiplerinin dökümü geliyor:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;VMDK'lar (sanal diskler)&lt;/li&gt;
&lt;li&gt;VM Home namespace'leri&lt;/li&gt;
&lt;li&gt;Swap nesneleri&lt;/li&gt;
&lt;li&gt;Performans servisi veritabanı&lt;/li&gt;
&lt;li&gt;Dosya sistemi ve checksum overhead&lt;/li&gt;
&lt;li&gt;Diğerleri (template, ISO gibi kategorize edilmemiş nesneler)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Yüzdeler anlık kullanıma göre değişiyor. Ortam henüz az doluysa overhead kalemleri orantısız büyük görünebiliyor; bu normal.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmmnh8zudjaz2izx9jiq6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmmnh8zudjaz2izx9jiq6.png" alt="Usage Breakdown: vSAN datastore nesne tipi dağılımı" width="799" height="407"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Performans İzleme
&lt;/h2&gt;

&lt;p&gt;vSAN'ın yerleşik performans servisi vSAN 9 ile cluster seviyesinde otomatik olarak aktif geliyor. Bu servis her host üzerinde çalışıyor, veri topluyor ve sonuçları vSAN datastore üzerinde ayrı bir nesne olarak saklıyor.&lt;/p&gt;

&lt;p&gt;Birkaç detay kayda değer:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Metrikler 90 gün saklanıyor.&lt;/li&gt;
&lt;li&gt;5 dakikalık aralıklarla kaydediliyor.&lt;/li&gt;
&lt;li&gt;Performans veritabanı vCenter'dan bağımsız bir vSAN nesnesi. vCenter erişilemez olsa bile veriler orada duruyor, ama görüntüleyemezsiniz.&lt;/li&gt;
&lt;li&gt;Veritabanına da bir storage policy atanmış; bu nedenle "Configure &amp;gt; vSAN &amp;gt; Services &amp;gt; Performance Service" altında Stats DB'nin Compliant olduğunu görebilirsiniz.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwp2hechfzfkgalqv5lx4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwp2hechfzfkgalqv5lx4.png" alt="Performance Service: Stats DB durumu, Healthy ve Compliant" width="800" height="408"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Üç Seviyede Performans Görünümü
&lt;/h3&gt;

&lt;p&gt;Performans verilerini üç farklı seviyede inceleyebiliyorsunuz:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Cluster Seviyesi&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;cluster-esa-01a &amp;gt; Monitor &amp;gt; vSAN &amp;gt; Performance&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Burada VM, Backend, File Share ve IOInsight sekmelerini göreceksiniz. Önemli bir ayrım var:&lt;/p&gt;

&lt;p&gt;"Front-end" trafik: VM'lerin doğrudan oluşturduğu okuma/yazma trafiği.&lt;br&gt;
"Back-end" trafik: Replika ve senkronizasyon trafiği; vSAN VMkernel arayüzü üzerinden akıyor. Bu iki trafiği ayrı izlemek, bir yavaşlamanın VM'den mi yoksa vSAN'ın arka plan operasyonlarından mı kaynaklandığını anlamak için gerekli.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Feeqe7szfjiggy531mhpu.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Feeqe7szfjiggy531mhpu.png" alt="Cluster performans görünümü: IOPS, Throughput, Latency grafikleri" width="800" height="408"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Host Seviyesi&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;esx-05a.site-a.vcf.lab &amp;gt; Monitor &amp;gt; vSAN &amp;gt; Performance&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Cluster görünümüne kıyasla daha fazla sekme var: VM, Backend, Disks, Physical Adapters, Host Network ve I/O Insight. Bir performans sorununun hangi katmandan geldiğini daraltmak için bu seviye daha kullanışlı.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsa17rrybp3fg21z512vr.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsa17rrybp3fg21z512vr.png" alt="Host seviyesi performans görünümü" width="800" height="408"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;VM Seviyesi&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;acct-app-01 &amp;gt; Monitor &amp;gt; vSAN &amp;gt; Performance&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Sanal disk bazında IOPS, throughput ve latency. Belirli bir VM'den şikayet geldiğinde buradan başlamak doğru.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbjoqxz8trx9rqdsoblb9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbjoqxz8trx9rqdsoblb9.png" alt="VM seviyesi performans görünümü" width="800" height="408"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  VCF Operations ile Çok Cluster İzleme
&lt;/h2&gt;

&lt;p&gt;Şimdiye kadar gördüklerimiz vCenter içindeydi ve tek cluster'a bakıyordu. Birden fazla cluster'ı, birden fazla workload domain'i izlemek gerektiğinde VCF Operations devreye giriyor.&lt;/p&gt;

&lt;p&gt;HOL'da yeni bir sekmede VCF Operations'a giriş yapıyoruz:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;Infrastructure Operations &amp;gt; Storage Operations&lt;/code&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Storage Operations: Ne Görünüyor?
&lt;/h3&gt;

&lt;p&gt;Ekran üç katmanda bilgi sunuyor:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Üst kısım:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Storage Alert Trends: Tüm storage instance'larında kaç uyarı var.&lt;/li&gt;
&lt;li&gt;Usage and Distribution: vSAN ve vSAN dışı storage'ları kapsayan toplam/boş kapasite.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fauqkg2zq9jq4i65ic39k.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fauqkg2zq9jq4i65ic39k.png" alt="VCF Operations: Storage Operations üst panel" width="799" height="224"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Orta kısım:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;vSAN Cluster Health Score: Tüm cluster'ların Skyline health skoru bir arada.&lt;/li&gt;
&lt;li&gt;vSAN Cluster Types: HOL ortamında ne var ne yok görünüyor: 1 ESA cluster, 2 OSA cluster, 1 Storage Cluster, 1 Compute Cluster. Bu dağılım modül bazlı hangi konuların ayrı cluster türleri gerektirdiğini göstermesi açısından da ilginç.&lt;/li&gt;
&lt;li&gt;vSAN Cluster Performance: Tüm cluster'ların IOPS, throughput ve latency değerleri; tek ekranda.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F444xx9xydrytd118s5aq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F444xx9xydrytd118s5aq.png" alt="VCF Operations: Cluster Health ve Cluster Types görünümü" width="799" height="243"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Alt kısım:&lt;/strong&gt; Cluster bazında daha granüler metrikler.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9v5v8qoteflnu7fd50iq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9v5v8qoteflnu7fd50iq.png" alt="vSAN Clusters" width="799" height="224"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Hazır Dashboard'lar
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;Dashboards &amp;amp; Reports&lt;/code&gt; menüsüne geçip arama kutusuna "vsan" yazınca hazır dashboard listesi çıkıyor. "vSAN ESA Performance" dashboard'unu açıp bir cluster seçince IOPS, latency ve throughput verilerini görselleştirilmiş halde görüyorsunuz.&lt;/p&gt;

&lt;p&gt;Bu dashboard'ların önemli bir özelliği var: VCF Operations içinde tek bir cam yüzeyi sunuyorlar. vCenter'da cluster cluster dolaşmak yerine buradan konsolidasyon yapılabiliyor.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdnkvp5uq8hn1kpbb0nsf.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdnkvp5uq8hn1kpbb0nsf.png" alt="VCF Operations: vSAN ESA Performance dashboard" width="799" height="408"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Genel Değerlendirme
&lt;/h2&gt;

&lt;p&gt;Bu modül bir öncekinden farklı bir kas grubu çalıştırıyor. Kurulum ve yapılandırma değil, okudum anlama.&lt;/p&gt;

&lt;p&gt;Bir şey dikkat çekti: vSAN'ın izleme araçları birbiriyle iç içe geçmiş ama her biri farklı bir soruya cevap veriyor. Skyline Health "sorun var mı" sorusu için. Kapasite ekranı "ne kadar yerim kaldı ve bu yeter mi" için. Performans servisi "sistem iyi çalışıyor mu, darboğaz nerede" için. VCF Operations ise bu üçünü birden tek pencerede görmek ve birden fazla cluster'ı karşılaştırmak için.&lt;/p&gt;

&lt;p&gt;Gerçek ortamda bu ayrımı bilmeden izleme yapmak, doğru araçla yanlış soruyu sormak anlamına gelebilir. Mesela kapasite doluyken performans grafiklerine bakmak, asıl problemi kaçırmanıza neden olabilir.&lt;/p&gt;

&lt;p&gt;Bir diğer gözlem: Performans veritabanının vCenter'dan bağımsız bir vSAN nesnesi olarak depolanması teorik olarak temiz bir tasarım. Ama bu nesne erişilemez hale gelirse performans geçmişine de ulaşamazsınız. Production'da bu nesnenin politikasını ve sağlığını ayrıca takip etmek gerekiyor; HOL'da bunu görüp not aldım.&lt;/p&gt;

&lt;p&gt;Bir sonraki hafta Modül 3'e geçiyorum: vSAN şifreleme ve güvenlik.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Bu seri VMware HOL ortamı (HOL-2634-01-VCF-L) üzerinden yürütülmektedir. Buradaki gözlemler lab bağlamında değerlendirilmeli, production ortamı kararları için mutlaka resmi VMware dokümantasyonu ve deneyimli mühendisler referans alınmalıdır.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>vmware</category>
      <category>vsan</category>
    </item>
    <item>
      <title>VMware vSAN ile Başlarken: Depolama Politikası, Kullanılabilirlik ve HOL Notları (Modül 1)</title>
      <dc:creator>Hakan İSMAİL</dc:creator>
      <pubDate>Sat, 13 Jun 2026 17:36:05 +0000</pubDate>
      <link>https://dev.to/hakanbaban53/vmware-vsan-ile-baslarken-depolama-politikasi-kullanilabilirlik-ve-hol-notlari-modul-1-2mbi</link>
      <guid>https://dev.to/hakanbaban53/vmware-vsan-ile-baslarken-depolama-politikasi-kullanilabilirlik-ve-hol-notlari-modul-1-2mbi</guid>
      <description>&lt;p&gt;Birkaç haftadır "VMware vSAN - Getting Started and Advanced Topics" başlıklı HOL (Hands-on Lab) üzerinde çalışıyorum. Bu yazı, o serinin ilk modülünden çıkardığım notların ve gözlemlerin bir dökümü. Baştan söyleyeyim: burada anlatılanlar gerçek bir üretim ortamından değil, tamamen HOL ortamından geliyor. Kendi adıma bu ayrımı net tutmak önemliydi çünkü sahadaki dinamikler ile simüle bir ortam arasında her zaman fark var. Ama bu fark, HOL'u değersiz kılmıyor; tam tersine, kavramları karşılıklı test edip yanılma maliyeti sıfır olarak görmek için iyi bir zemin.&lt;/p&gt;

&lt;p&gt;Şimdi Modül 1'de neyle karşılaştığımı aktarayım.&lt;/p&gt;




&lt;h2&gt;
  
  
  Ortam Hakkında Kısa Bir Not
&lt;/h2&gt;

&lt;p&gt;Lab iki siteden oluşuyor: Site A ve Site B. İlk dört modül tamamen Site A üzerinde ilerliyor. Yönetim cluster'larına dokunulmaksızın sadece workload cluster'larında çalışıyoruz. Bu ayrım, özellikle VCF (VMware Cloud Foundation) bağlamında düşününce mantıklı: yönetim katmanına gereksiz yandan temas, gerçek ortamlarda da kaçınılan bir şey.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frocw518jeeva6xodgoft.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frocw518jeeva6xodgoft.png" alt="Lab topoloji diyagramı: Site A ve Site B genel görünümü" width="800" height="435"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  vSAN Nedir, Neden Var?
&lt;/h2&gt;

&lt;p&gt;vSAN 2014'te hayatımıza girdi. Temel fikir şu: birden fazla ESXi host'unun yerel disklerini bir araya getirip tek, merkezi olarak yönetilen bir depolama havuzu oluşturmak. Ayrı bir storage donanımına gerek kalmıyor, en azından teoride.&lt;/p&gt;

&lt;p&gt;Bunun anlamı şu: vSAN doğrudan vSphere hypervisor'ına gömülü. Yani bir storage OS yönetmiyorsunuz, ayrı bir SAN fabric kurmuyor değilsiniz. Compute ve storage, vSphere Client üzerinden tek elden yönetiliyor. TCO açısından geleneksel storage'a kıyasla yüzde elliye varan maliyet düşüşü iddiası var. Bunu elbette ortam büyüklüğüne, lisans yapısına ve mevcut altyapıya göre ayrı değerlendirmek gerek, ama kavramsal olarak mantığı oturuyor.&lt;/p&gt;

&lt;p&gt;Data resilience tarafında erasure coding (silme kodlaması) kullanılıyor. RAID-5 ve RAID-6 burada saf disk mirroring'e göre daha verimli kapasite kullanımı sağlıyor.&lt;/p&gt;




&lt;h2&gt;
  
  
  vSAN 9'da Neler Değişti?
&lt;/h2&gt;

&lt;p&gt;Bu HOL, vSAN 9 üzerine kurulu. vSAN 9'da öne çıkan başlıklara bakmak istedim çünkü önceki sürümlerle karşılaştırma yapmadan nelerin "yeni" olduğunu anlamak zor.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fss2ut6weww3ah0mmp9nf.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fss2ut6weww3ah0mmp9nf.png" alt="vSAN OSA ve vSAN ESA" width="800" height="304"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Gerçek hayatta şunu sormak gerekir: mevcut donanımınız ESA'yı destekliyor mu? ESA'nın VMware HCL gereksinimleri daha kısıtlayıcı. Bu, HOL'da görmediğiniz ama sahaya geçince sizi ilk duraksatan şeylerden biri olabilir.&lt;/p&gt;

&lt;h3&gt;
  
  
  VMware Live Recovery ile DR
&lt;/h3&gt;

&lt;p&gt;vSAN cluster'ları artık VMware Live Recovery entegrasyonuyla korunabiliyor. RPO 1 dakikaya kadar inebiliyormuş. Bu özellik Modül 7'de işleniyor, burada sadece genel bir bilgi olarak geçiyor.&lt;/p&gt;

&lt;h3&gt;
  
  
  File Services ve Kubernetes
&lt;/h3&gt;

&lt;p&gt;vSAN artık Kubernetes pod'ları için file-based persistent volume destekliyor. Aynı zamanda cluster başına 500 adet file share'e kadar çıkılabiliyor (vSAN 9 ile gelen bir iyileştirme). Bu konu Modül 6'da detaylandırılıyor.&lt;/p&gt;

&lt;h3&gt;
  
  
  Dying Disk Handling (DDH)
&lt;/h3&gt;

&lt;p&gt;ESA'da disk latency değerlerini izleyip önceden belirlenen eşik aşılırsa otomatik müdahale edebiliyor. Cache drive arızalarını da proaktif olarak yakalıyor. Bu tür şeyler production ortamında görünmez çalışmasını beklediğiniz mekanizmalar; genelde var olduğunu ancak bir sorun çıktığında fark ediyorsunuz.&lt;/p&gt;

&lt;h3&gt;
  
  
  Global Deduplication (Sınırlı Yayın)
&lt;/h3&gt;

&lt;p&gt;OSA'da deduplikasyon alanı disk grubuyla sınırlıydı. ESA ile bu kapsam tüm cluster'a genişliyor; tekrar eden bloklar cluster genelinde tek depolama ihtiyacına düşüyor. Veri azaltma oranları teorik olarak daha iyi. VCF 9.0 P01 ile TQR programı kapsamında geliyor.&lt;/p&gt;




&lt;h2&gt;
  
  
  Storage Policy Based Management (SPBM)
&lt;/h2&gt;

&lt;p&gt;Bu modülün asıl konusu SPBM. Burada anlatmak istediğim şeyin "politika" kısmına takılmamak lazım; bu bir kurumsal yazılım sloganı değil, gerçekten işe yarayan bir mekanizma.&lt;/p&gt;

&lt;p&gt;Temel mantık şu: VM'e "şu datastore'a yerleştir" demiyorsunuz. Onun yerine bir politika tanımlıyorsunuz, "bu VM en az 1 arıza tolere edebilmeli, RAID-5 ile" gibi. vSAN bu politikaya uyan yerleşimi kendisi buluyor. VM o politikaya uymakta zorlanırsa bunu da raporluyor: "Compliant" ya da "Non-compliant."&lt;/p&gt;

&lt;p&gt;Bu yaklaşım, özellikle büyük ortamlarda her VM için ayrı ayrı storage konfigürasyonu yapmak yerine politika bazlı bir standart getiriyor. Dezavantajı şu olabilir: politika sayısı artınca bunları kim/ne zaman güncelleyecek, eski politikalara kim sahip çıkacak sorularına önceden cevap vermek gerekiyor.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fs1mdddnnqk8ohen3mcab.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fs1mdddnnqk8ohen3mcab.png" alt="Policies and Profiles menüsü" width="800" height="406"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Default Policy ve Optimal Datastore Default Policy
&lt;/h3&gt;

&lt;p&gt;vSAN'ın bir "default storage policy"si var. Bu, herhangi bir politika atanmadan oluşturulan VM'lere otomatik atanıyor. Bunu silemiyorsunuz, ama kopyalayıp üzerine kendi politikanızı kurabiliyorsunuz.&lt;/p&gt;

&lt;p&gt;vSAN 8.0 U1 ile gelen "Auto-Policy Management" özelliği ise bunu bir adım öteye taşıyor. Cluster'daki host sayısına ve konfigürasyonuna bakarak size özel bir "cluster-esa-01a - Optimal Datastore Default Policy - RAID5" gibi bir politika oluşturuyor. Bu otomatik politika RAID seviyesini cluster büyüklüğüne göre belirliyor. HOL'da bu özellik zaten etkin hale getirilmiş.&lt;/p&gt;




&lt;h2&gt;
  
  
  İlk Uygulama: VM Deploy Etmek
&lt;/h2&gt;

&lt;p&gt;Bu bölümde mevcut bir VM'i (core-a) vSAN datastore'a klonluyoruz. Adımlar gayet açık:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;vSphere Client'tan VM'e sağ tık → Clone → Clone to Virtual Machine&lt;/li&gt;
&lt;li&gt;İsim: &lt;code&gt;clone-vm-a&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Cluster: &lt;code&gt;cluster-esa-01a&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Datastore: &lt;code&gt;vsan-esa-01a_Datastore&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Storage Policy: &lt;code&gt;cluster-esa-01a - Optimal Datastore Default Policy - RAID 5&lt;/code&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F143qi6sblbc886fcm2y4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F143qi6sblbc886fcm2y4.png" alt="VM klonlama wizard: Yapılan Ayarlar" width="800" height="406"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Klon işlemi tamamlanınca VM Summary ekranından politikanın atanmış ve "Compliant" olduğunu doğrulamak mümkün.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frnx2ffh6anxw6je8dign.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frnx2ffh6anxw6je8dign.png" alt="VM Summary: Storage Policies bölümü, Compliant durumu" width="800" height="408"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  VM vSAN Üzerinde Nasıl Depolanıyor?
&lt;/h2&gt;

&lt;p&gt;Bu kısım bence modülün en ilginç parçası. vSAN ESA'nın log-structured file system mimarisine bakınca şunu görüyorsunuz:&lt;/p&gt;

&lt;p&gt;Yazma işlemi iki aşamada gerçekleşiyor:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Performance Leg (RAID-1):&lt;/strong&gt; Gelen yazma önce RAID-1 olarak iki host arasında mirroring ile saklanıyor. Hızlı write acknowledgement için. Veri henüz kalıcı konumuna geçmedi.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Capacity Leg (RAID-5 veya RAID-6):&lt;/strong&gt; Küçük yazmaların yeterince birikmesiyle vSAN bunları full-stripe write olarak RAID-5/6 formatında kalıcı kapasiteye indiriyor (destage). Bu, IO amplifikasyonunu azaltmak için tasarlanmış.&lt;/p&gt;

&lt;p&gt;HOL'da bunu "Monitor &amp;gt; vSAN &amp;gt; Virtual Objects" üzerinden görebiliyorsunuz. VM'in hard diskini seçip "View Placement Details"e tıklayınca bileşenlerin hangi host üzerinde bulunduğunu görüyorsunuz.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fx8z4zjk2xcmah1i3tqg0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fx8z4zjk2xcmah1i3tqg0.png" alt="VM Placement Details: Performance Leg (RAID-1) ve Capacity Leg (RAID-5) bileşen dağılımı" width="800" height="339"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Bu dağılımı görmek, "storage siyah bir kutu" algısını kırıyor. Veriyi görünür kılıyor.&lt;/p&gt;




&lt;h2&gt;
  
  
  Cluster'ı Büyütmek: Scale Out
&lt;/h2&gt;

&lt;p&gt;RAID-5 ve RAID-6 için host sayısı gereksinimleri önemli:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Mimari&lt;/th&gt;
&lt;th&gt;RAID-5 Minimum&lt;/th&gt;
&lt;th&gt;RAID-6 Minimum&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;OSA&lt;/td&gt;
&lt;td&gt;4 host&lt;/td&gt;
&lt;td&gt;6 host&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ESA&lt;/td&gt;
&lt;td&gt;3 host (2+1 şeması, 1.5x kapasite)&lt;/td&gt;
&lt;td&gt;6 host&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;ESA'da 6 veya daha fazla host varsa RAID-5 şeması 4+1'e geçiyor ve kapasite verimliliği artıyor (1.25x). Bu geçiş host sayısı değiştikten 24 saat sonra otomatik.&lt;/p&gt;

&lt;h3&gt;
  
  
  Yeni Host Eklemek
&lt;/h3&gt;

&lt;p&gt;HOL'da cluster başlangıçta 4 host ile geliyor. İki ek host (&lt;code&gt;esx-09a&lt;/code&gt; ve &lt;code&gt;esx-10a&lt;/code&gt;) dışarıda bekliyor. Bu host'ları sürükle-bırak ile cluster'a ekliyorsunuz.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkz5fhctnujxdnmz8jq9h.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkz5fhctnujxdnmz8jq9h.png" alt="vSphere Client: Host'u cluster'a sürükle-bırak ile ekleme" width="800" height="339"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;ESA'da artık "disk group" kavramı yok. Onun yerine "disk pool" var; host üzerindeki tüm uyumlu sürücüler havuza dahil oluyor. "vSAN Managed Disk Claim" etkinse eklenen host'un uyumlu sürücüleri otomatik olarak algılanıp vSAN datastore'a dahil ediliyor. HOL'da bu özellik etkin.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8afwy26ruc59zuruj2n9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8afwy26ruc59zuruj2n9.png" alt="vSAN &gt; Disk Management: eklenen host'un sürücüleri" width="800" height="339"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Skyline Health ve Otomatik Policy Önerisi
&lt;/h3&gt;

&lt;p&gt;İki host eklendikten sonra Skyline Health'i açtığımızda bir uyarı görüyoruz: cluster 6 host'a çıktığı için Auto Policy Management yeni bir politika öneriyor.&lt;/p&gt;

&lt;p&gt;"TROUBLESHOOT" dediğinizde mevcut politika (RAID-5) ile önerilen politika (RAID-6) yan yana görünüyor. Mantıklı: 6 host ile RAID-6 hem mümkün hem daha resilient.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5m2hg8y610icftevido8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5m2hg8y610icftevido8.png" alt="Skyline Health: Policy değişikliği uyarısı" width="800" height="557"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;"UPDATE CLUSTER DS POLICY" diyebilirsiniz; bu noktadan sonra oluşturulan VM'ler RAID-6 politikası alıyor. Mevcut VM'leri de Policies and Profiles &amp;gt; REAPPLY ile güncelleyebiliyorsunuz. HOL'da bu adım zaman kazanmak için atlanıyor.&lt;/p&gt;




&lt;h2&gt;
  
  
  İleri Düzey Policy: Compression'ı Kapatmak
&lt;/h2&gt;

&lt;p&gt;ESA'da sıkıştırma (compression) artık storage policy seviyesinde yönetiliyor. Varsayılan olarak açık, çünkü replica trafiği de compressed olarak taşınıyor. Ama bazı durumlarda kapatmak gerekebilir: kendi sıkıştırmasını yapan uygulamalar (veritabanları gibi) için ekstra sıkıştırma hem CPU israfı hem de veri azaltma oranlarını yanıltabilir.&lt;/p&gt;

&lt;p&gt;Bu bölümde şunu yapıyoruz:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Mevcut &lt;code&gt;vSAN ESA Default Policy - RAID5&lt;/code&gt; politikasını klonla.&lt;/li&gt;
&lt;li&gt;Yeni politikaya isim ver: &lt;code&gt;vSAN ESA No Compression - RAID 5&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Storage rules &amp;gt; Storage tier: "No space efficiency" seç (sıkıştırma bu şekilde devre dışı kalıyor)&lt;/li&gt;
&lt;li&gt;Uyumluluk kontrolü: &lt;code&gt;vsan-esa-01a_Datastore&lt;/code&gt; compatible göründüğünü doğrula&lt;/li&gt;
&lt;li&gt;Finish&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwsezbet1kij034vjfspx.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwsezbet1kij034vjfspx.png" alt="Storage Policy: Storage Rules sekmesi, No space efficiency" width="800" height="339"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Ardından mevcut &lt;code&gt;clone-vm-a&lt;/code&gt; VM'ine bu yeni politikayı atıyoruz: VM &amp;gt; Configure &amp;gt; Policies &amp;gt; EDIT VM STORAGE POLICIES. Dropdown'dan yeni politikayı seçince bir süre sonra VM "Compliant" statüsüne geçiyor.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fljux111ueudue06jpg0r.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fljux111ueudue06jpg0r.png" alt="VM politika değiştirme ekranı: yeni policy ataması" width="800" height="339"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Reserved Capacity
&lt;/h2&gt;

&lt;p&gt;vSAN'ın tüm kapasitesi varsayılan olarak workload'lara açık. Ama cluster'da bir rebuild veya rebalancing operasyonu başladığında o an doluysa ne olacak? İşte "Reserved Capacity" tam buna yönelik.&lt;/p&gt;

&lt;p&gt;İki tür rezervasyon var:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Operations Reserve:&lt;/strong&gt; Cluster içi operasyonlar (policy reconfig, vb.) için ayrılan alan.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Host Rebuild Reserve:&lt;/strong&gt; Bir host arızalandığında veri yeniden inşası için ayrılan alan. Bu rezervasyon, cluster'daki en büyük host'un kapasitesine göre belirleniyor. Minimum 4 host gereksinimi var.&lt;/p&gt;

&lt;p&gt;HOL'da bu özelliği etkinleştirme ekranını görüyoruz: uyarı eşikleri %70, hata eşikleri %90 olarak ayarlanmış. Sonra iptal ediliyor çünkü iç içe geçmiş (nested) lab ortamında gerçek anlamda reserve etmek için yeterli kapasite yok.&lt;/p&gt;

&lt;p&gt;Bu noktada şunu düşünmeden geçemedim: gerçek ortamlarda bu rezervasyonu kurmak ne zaman anlam taşıyor? Disk kapasitesi kısıtlıysa reserve etmek kısa vadede sizi zorlar. Ama o buffer olmadan bir host çöktüğünde rebuild yetersiz kapasiteye çarpar, bu daha büyük bir risk. Denge kurmak gerekiyor.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fw2kzkmad32xg7c3myzmw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fw2kzkmad32xg7c3myzmw.png" alt="Reservations and Alerts: Operations Reserve ve Host Rebuild Reserve toggle'ları" width="800" height="339"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Bir kısıtlama notu:&lt;/strong&gt; Stretched cluster, fault domain kullanılan cluster'lar, ROBO cluster ve 4'ten az host içeren cluster'larda bu özellik desteklenmiyor.&lt;/p&gt;




&lt;h2&gt;
  
  
  Scale In: Node Çıkarmak
&lt;/h2&gt;

&lt;p&gt;Scale out kadar konuşulmayan ama production'da bir o kadar önemli olan şey: cluster'ı küçültmek. vSAN cluster'ı minimum 3 host ile çalışır. Host çıkarmadan önce şunlara bakmak gerekiyor:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Kalan compute ve storage kapasitesi yeterli mi?&lt;/li&gt;
&lt;li&gt;Mevcut VM storage policy'leri compliant kalmaya devam edecek mi?&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Data Migration Pre-Check
&lt;/h3&gt;

&lt;p&gt;Bu araç, "şu host'u çıkarsam ne etkilenir?" sorusunun cevabını veriyor. HOL'da &lt;code&gt;esx-10a&lt;/code&gt; seçilip "Full data migration" tercih edildiğinde hiçbir nesnenin etkilenmeyeceği görülüyor. Ardından direkt "ENTER MAINTENANCE MODE" adımına geçilebiliyor.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9auzrtezecdzqefg88np.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9auzrtezecdzqefg88np.png" alt="Data Migration Pre-Check: etkilenen nesne yok görünümü" width="800" height="339"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Maintenance Mode ve Host Kaldırma
&lt;/h3&gt;

&lt;p&gt;Maintenance mode'a alınan host sonra drag &amp;amp; drop ile cluster dışına (datacenter seviyesine) taşınıyor. Aynı adımlar &lt;code&gt;esx-09a&lt;/code&gt; için de tekrarlanıyor. Cluster böylece 4'e iniyor.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7osc79nobqp5b5arai8t.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7osc79nobqp5b5arai8t.png" alt="Maintenance mode ve çıkarılan hostlar" width="384" height="813"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Genel Değerlendirme
&lt;/h2&gt;

&lt;p&gt;HOL formatı bu konu için iyi çalışıyor. Her adım ekran yönlendirmesiyle geldiği için "nerede tıklamalıyım" sancısı yaşamıyorsunuz; odağınız tamamen mantığı anlamaya kayıyor. Ama şunu da söylemeliyim: HOL sizi hiçbir şeyin bozulmadığı, kapasitesinin üstünde çalışmayan bir ortamda karşılıyor. Gerçek sahada bu adımların her birinin yanına "peki bunu değişken bir ortamda nasıl yapacaksın, işler ters giderse ne olur" soruları ekleniyor.&lt;/p&gt;

&lt;p&gt;Modülün beni en çok düşündüren kısmı RAID şeması geçişleri ve bunların kapasite verimliliğine yansımaları oldu. ESA'nın adaptif RAID-5'i (3-5 host için 1.5x, 6+ host için 1.25x) storage planlaması açısından gerçekten önemli bir ayrıntı. Host ekledikten 24 saat sonra otomatik geçiş yapması şık, ama o 24 saatte neler olabileceğini de takip etmek gerekir.&lt;/p&gt;

&lt;p&gt;Bir sonraki haftada Modül 2'ye; sağlık izleme, kapasite takibi ve performans raporlaması konularına geçeceğim.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Bu seri VMware HOL ortamı (HOL-2634-01-VCF-L) üzerinden yürütülmektedir. Buradaki gözlemler lab bağlamında değerlendirilmeli, production ortamı kararları için mutlaka resmi VMware dokümantasyonu ve deneyimli mühendisler referans alınmalıdır.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>vmware</category>
      <category>vsan</category>
    </item>
    <item>
      <title>Local LLM Ops: Building an Observable, GPU-Accelerated AI Cloud at Home with Docker &amp; Grafana</title>
      <dc:creator>Hakan İSMAİL</dc:creator>
      <pubDate>Fri, 13 Feb 2026 19:50:35 +0000</pubDate>
      <link>https://dev.to/hakanbaban53/local-llm-ops-building-an-observable-gpu-accelerated-ai-cloud-at-home-with-docker-grafana-4hbi</link>
      <guid>https://dev.to/hakanbaban53/local-llm-ops-building-an-observable-gpu-accelerated-ai-cloud-at-home-with-docker-grafana-4hbi</guid>
      <description>&lt;h3&gt;
  
  
  Why I Built My Own Local AI Stack: Prioritizing Privacy &amp;amp; ROI
&lt;/h3&gt;

&lt;p&gt;Integrating AI into a development workflow usually starts with a compromise: you either send your proprietary code to a third-party API (risking &lt;strong&gt;Data Privacy&lt;/strong&gt; and &lt;strong&gt;Compliance&lt;/strong&gt;) or you watch your "pay-per-token" bill spiral out of control (&lt;strong&gt;Operational Overhead&lt;/strong&gt;).&lt;/p&gt;

&lt;p&gt;As a &lt;strong&gt;Systems Administrator&lt;/strong&gt;, I prefer a third option: &lt;strong&gt;Data Sovereignty.&lt;/strong&gt; I wanted a private, secure, and fully observable AI environment, eliminating data leak risks (&lt;strong&gt;GDPR/KVKK compliance&lt;/strong&gt;) while achieving significant &lt;strong&gt;Long-term ROI&lt;/strong&gt; by running on my own hardware (Arch Linux + NVIDIA RTX 3050 Ti).&lt;/p&gt;

&lt;p&gt;The real challenge wasn't just downloading an LLM; it was engineering a &lt;strong&gt;Scalable AI Infrastructure&lt;/strong&gt; that runs efficiently on consumer hardware. I'm documenting how I orchestrated this &lt;strong&gt;microservices-based stack&lt;/strong&gt; with &lt;strong&gt;Docker Compose&lt;/strong&gt;, optimized &lt;strong&gt;Resource Management&lt;/strong&gt; for limited VRAM, and established &lt;strong&gt;Full-Stack Observability&lt;/strong&gt; with &lt;strong&gt;Grafana and Prometheus&lt;/strong&gt;.&lt;/p&gt;




&lt;h3&gt;
  
  
  Scalable Microservices Architecture
&lt;/h3&gt;

&lt;p&gt;I went with a modular, containerized approach to ensure internal &lt;strong&gt;Scalability&lt;/strong&gt; and keep the host system clean:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Inference Management:&lt;/strong&gt; &lt;code&gt;Ollama&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Secure Hardware Integration:&lt;/strong&gt; &lt;code&gt;NVIDIA Container Toolkit&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;User Experience (UX):&lt;/strong&gt; &lt;code&gt;OpenWebUI&lt;/code&gt; (for a polished RAG-capable interface).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The Observability Layer:&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;NVIDIA DCGM Exporter&lt;/code&gt; for real-time hardware telemetry.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Prometheus&lt;/code&gt; &amp;amp; &lt;code&gt;Grafana&lt;/code&gt; for &lt;strong&gt;SLA monitoring&lt;/strong&gt; and data retention.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;h3&gt;
  
  
  Infrastructure &amp;amp; GPU Passthrough
&lt;/h3&gt;

&lt;p&gt;Before deploying the containers, we must ensure the host operating system (Arch Linux in my case) allows Docker to access the GPU hardware. This is not enabled by default.&lt;/p&gt;

&lt;h4&gt;
  
  
  1.1 The Prerequisites: NVIDIA Container Toolkit
&lt;/h4&gt;

&lt;p&gt;The bridge between Docker containers and the physical GPU is the &lt;strong&gt;NVIDIA Container Toolkit&lt;/strong&gt;. Without this, the containers would only see the CPU, resulting in painfully slow inference speeds (0.5 tokens/sec).&lt;/p&gt;

&lt;p&gt;Since I am running Arch Linux, the setup was straightforward:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Install the toolkit&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;pacman &lt;span class="nt"&gt;-S&lt;/span&gt; nvidia-container-toolkit

&lt;span class="c"&gt;# Configure the Docker daemon to use the NVIDIA runtime&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;nvidia-ctk runtime configure &lt;span class="nt"&gt;--runtime&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;docker

&lt;span class="c"&gt;# Restart Docker to apply changes&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl restart docker
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To verify the passthrough is working, I ran a quick ephemeral container. If &lt;code&gt;nvidia-smi&lt;/code&gt; prints the GPU stats inside Docker, we are green.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker run &lt;span class="nt"&gt;--rm&lt;/span&gt; &lt;span class="nt"&gt;--gpus&lt;/span&gt; all nvidia/cuda:12.4.1-runtime-ubuntu22.04 nvidia-smi
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsrrkjcd161yeworup8ri.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsrrkjcd161yeworup8ri.png" alt="GPU Passthrough Verification (NVIDIA 590.48.01 / CUDA 13.1 on Arch Linux)" width="800" height="639"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Container Orchestration
&lt;/h3&gt;

&lt;p&gt;I believe in "defining once, running everywhere." Instead of running disparate &lt;code&gt;docker run&lt;/code&gt; commands, I defined the entire stack in a single &lt;code&gt;docker-compose.yml&lt;/code&gt; file.&lt;/p&gt;

&lt;p&gt;This file handles network isolation (creating a private ai-net), volume persistence (so our chat history isn't lost on reboot), and most importantly, &lt;strong&gt;GPU resource reservation&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Here is the complete configuration:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;services&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="c1"&gt;# 🧠 1. AI ENGINE: Ollama&lt;/span&gt;
  &lt;span class="c1"&gt;# This is the backend that runs the LLM inference.&lt;/span&gt;
  &lt;span class="na"&gt;ollama&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ollama/ollama:latest&lt;/span&gt;
    &lt;span class="na"&gt;container_name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ollama&lt;/span&gt;
    &lt;span class="na"&gt;ports&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;11434:11434"&lt;/span&gt;
    &lt;span class="na"&gt;volumes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;ollama_storage:/root/.ollama&lt;/span&gt;
    &lt;span class="c1"&gt;# Critical: This section reserves the NVIDIA GPU for this container&lt;/span&gt;
    &lt;span class="na"&gt;deploy&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;resources&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;reservations&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;devices&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
            &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;driver&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;nvidia&lt;/span&gt;
              &lt;span class="na"&gt;count&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;
              &lt;span class="na"&gt;capabilities&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;gpu&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
    &lt;span class="na"&gt;restart&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;unless-stopped&lt;/span&gt;
    &lt;span class="na"&gt;networks&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;ai-net&lt;/span&gt;

  &lt;span class="c1"&gt;# 💻 2. INTERFACE: OpenWebUI&lt;/span&gt;
  &lt;span class="c1"&gt;# A user-friendly frontend that connects to Ollama.&lt;/span&gt;
  &lt;span class="na"&gt;open-webui&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ghcr.io/open-webui/open-webui:main&lt;/span&gt;
    &lt;span class="na"&gt;container_name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;open-webui&lt;/span&gt;
    &lt;span class="na"&gt;ports&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;3000:8080"&lt;/span&gt;
    &lt;span class="na"&gt;environment&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;OLLAMA_BASE_URL=http://ollama:11434&lt;/span&gt;
    &lt;span class="na"&gt;volumes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;openwebui_storage:/app/backend/data&lt;/span&gt;
    &lt;span class="na"&gt;depends_on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;ollama&lt;/span&gt;
    &lt;span class="na"&gt;restart&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;unless-stopped&lt;/span&gt;
    &lt;span class="na"&gt;networks&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;ai-net&lt;/span&gt;

  &lt;span class="c1"&gt;# 🕵️ 3. METRICS EXPORTER: NVIDIA DCGM&lt;/span&gt;
  &lt;span class="c1"&gt;# This container scrapes GPU metrics (Temp, Power, Utilization).&lt;/span&gt;
  &lt;span class="na"&gt;dcgm-exporter&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;nvidia/dcgm-exporter:latest&lt;/span&gt;
    &lt;span class="na"&gt;container_name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;dcgm-exporter&lt;/span&gt;
    &lt;span class="na"&gt;deploy&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;resources&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;reservations&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;devices&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
            &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;driver&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;nvidia&lt;/span&gt;
              &lt;span class="na"&gt;count&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;
              &lt;span class="na"&gt;capabilities&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;gpu&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
    &lt;span class="na"&gt;environment&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;DCGM_EXPORTER_NO_HOSTNAME=1&lt;/span&gt;
    &lt;span class="na"&gt;ports&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;9400:9400"&lt;/span&gt;
    &lt;span class="na"&gt;restart&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;unless-stopped&lt;/span&gt;
    &lt;span class="na"&gt;networks&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;ai-net&lt;/span&gt;

  &lt;span class="c1"&gt;# 🗄️ 4. TIME-SERIES DB: Prometheus&lt;/span&gt;
  &lt;span class="c1"&gt;# Collects the metrics exposed by dcgm-exporter.&lt;/span&gt;
  &lt;span class="na"&gt;prometheus&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;prom/prometheus:latest&lt;/span&gt;
    &lt;span class="na"&gt;container_name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;prometheus&lt;/span&gt;
    &lt;span class="na"&gt;ports&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;9090:9090"&lt;/span&gt;
    &lt;span class="na"&gt;volumes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;./prometheus.yml:/etc/prometheus/prometheus.yml&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;prometheus_data:/prometheus&lt;/span&gt;
    &lt;span class="na"&gt;command&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;--config.file=/etc/prometheus/prometheus.yml"&lt;/span&gt;
    &lt;span class="na"&gt;restart&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;unless-stopped&lt;/span&gt;
    &lt;span class="na"&gt;networks&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;ai-net&lt;/span&gt;

  &lt;span class="c1"&gt;# 📊 5. VISUALIZATION: Grafana&lt;/span&gt;
  &lt;span class="c1"&gt;# Displays the metrics in a dashboard.&lt;/span&gt;
  &lt;span class="na"&gt;grafana&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;grafana/grafana:latest&lt;/span&gt;
    &lt;span class="na"&gt;container_name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;grafana&lt;/span&gt;
    &lt;span class="na"&gt;ports&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;3001:3000"&lt;/span&gt;
    &lt;span class="na"&gt;volumes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;grafana_storage:/var/lib/grafana&lt;/span&gt;
    &lt;span class="na"&gt;restart&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;unless-stopped&lt;/span&gt;
    &lt;span class="na"&gt;networks&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;ai-net&lt;/span&gt;

&lt;span class="na"&gt;volumes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;ollama_storage&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;openwebui_storage&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;prometheus_data&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;grafana_storage&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;

&lt;span class="na"&gt;networks&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;ai-net&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;driver&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;bridge&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Prometheus Scraper Configuration
&lt;/h4&gt;

&lt;p&gt;Prometheus needs to know exactly where to pull metrics from. I configured a 5-second &lt;code&gt;scrape_interval&lt;/code&gt;. While 15s-30s is more common for production, a 5s interval is better for a local lab where we want to track immediate power spikes during token generation.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;global&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;scrape_interval&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;5s&lt;/span&gt; &lt;span class="c1"&gt;# Scrape often for real-time visibility&lt;/span&gt;

&lt;span class="na"&gt;scrape_configs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;job_name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;gpu-metrics"&lt;/span&gt;
    &lt;span class="na"&gt;static_configs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;targets&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;dcgm-exporter:9400"&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;With the configuration files in place, a single command boots the entire cloud infrastructure:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker compose up &lt;span class="nt"&gt;-d&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdyux3ha2qpeek4tncp2k.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdyux3ha2qpeek4tncp2k.png" alt="Stack Deployment (Ollama, DCGM Exporter, Prometheus, Grafana, OpenWebUI)" width="800" height="435"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Resource Management: Optimizing for 4GB VRAM
&lt;/h3&gt;

&lt;p&gt;The infrastructure setup is the foundation, but &lt;strong&gt;Cost-Sensitive Resource Allocation&lt;/strong&gt;, selecting a model that runs effectively on limited hardware, is where the real value lies. I optimized this build for an &lt;strong&gt;NVIDIA RTX 3050 Ti with 4GB of VRAM&lt;/strong&gt;.&lt;/p&gt;

&lt;h4&gt;
  
  
  The VRAM Constraint
&lt;/h4&gt;

&lt;p&gt;Popular models like DeepSeek R1 or Llama 3 (8B) usually require 5GB to 6GB of VRAM just to load. Offloading these models to system RAM via PCIe on a 4GB card results in unusable generation speeds, often dropping to 1-2 tokens per second.&lt;/p&gt;

&lt;p&gt;I needed a model that fits entirely within the 4GB ceiling while remaining capable for coding tasks.&lt;/p&gt;

&lt;h4&gt;
  
  
  Choosing the right model: Qwen 2.5 Coder (3B)
&lt;/h4&gt;

&lt;p&gt;I used &lt;strong&gt;Hugging Face&lt;/strong&gt; to cross-reference benchmarks and VRAM requirements for various 1B, 3B, and 7B models. After evaluating the trade-offs between parameter count and inference speed, I settled on &lt;strong&gt;Qwen 2.5 Coder (3B Instruct)&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Since it only occupies roughly &lt;strong&gt;2.2 GB of VRAM&lt;/strong&gt;, it leaves enough headroom for the context window without triggering a bottleneck. It's significantly faster than larger models that would force the system to swap to system RAM.&lt;/p&gt;

&lt;p&gt;I specifically used the &lt;strong&gt;Instruct&lt;/strong&gt; version; it's much better at actual code logic than the base model.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frj6xcwm5mwioykt0kdej.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frj6xcwm5mwioykt0kdej.png" alt="Qwen Model Card" width="800" height="435"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You can pull it with:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker &lt;span class="nb"&gt;exec&lt;/span&gt; &lt;span class="nt"&gt;-it&lt;/span&gt; ollama ollama run qwen2.5-coder:3b
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Verifying Telemetry
&lt;/h3&gt;

&lt;p&gt;Once the containers are up, query the DCGM exporter directly to ensure the GPU is communicating correctly with Docker:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl http://localhost:9400/metrics
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fp6xwjnxnxa31wbqeo05f.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fp6xwjnxnxa31wbqeo05f.png" alt="Raw DCGM Metrics Exposer (Port 9400)" width="800" height="435"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You'll see keys like &lt;code&gt;DCGM_FI_DEV_GPU_TEMP&lt;/code&gt; and &lt;code&gt;DCGM_FI_DEV_POWER_USAGE&lt;/code&gt;. Now we need to visualize these in Grafana.&lt;/p&gt;




&lt;h3&gt;
  
  
  Dashboard Configuration
&lt;/h3&gt;

&lt;p&gt;Since Grafana and Prometheus are on the same Docker network (&lt;code&gt;ai-net&lt;/code&gt;), they communicate via container names.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; Log in to Grafana (&lt;code&gt;http://localhost:3001&lt;/code&gt;, default &lt;code&gt;admin&lt;/code&gt;/&lt;code&gt;admin&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt; Add &lt;strong&gt;Prometheus&lt;/strong&gt; as a data source and use the URL: &lt;code&gt;http://prometheus:9090&lt;/code&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbcoequasudm252ymofzv.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbcoequasudm252ymofzv.png" alt="Grafana Data Source Connection" width="800" height="435"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; Import Dashboard ID &lt;strong&gt;12239&lt;/strong&gt; (NVIDIA DCGM Exporter).&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffowxbzl9bcmxfys8dvi1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffowxbzl9bcmxfys8dvi1.png" alt="NVIDIA Dashboard Import" width="800" height="435"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The result is a comprehensive command center for your local AI hardware.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkc4hncwchp5xt8ljxdw7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkc4hncwchp5xt8ljxdw7.png" alt="Active GPU Dashboard (Idle State: ~54.1°C / 10.8 W)" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  Real-World Business Value &amp;amp; Metrics
&lt;/h3&gt;

&lt;p&gt;I tested the stack with a typical DevOps automation request:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"Write a bash script that detects zombie processes and logs the action."&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h4&gt;
  
  
  Full-Stack Observability Analysis
&lt;/h4&gt;

&lt;p&gt;Checking the Grafana dashboard during inference gives the ultimate validation of the setup, proving &lt;strong&gt;System Reliability&lt;/strong&gt;:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsf45d3zh91rqg6ikx1dj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsf45d3zh91rqg6ikx1dj.png" alt="Final Hardware Analysis (Peak Inference: 64°C / 20.0 W / 2.8 GB VRAM)" width="800" height="436"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;VRAM Efficiency&lt;/strong&gt;: Usage peaked at &lt;strong&gt;2.8 GB&lt;/strong&gt;. This confirms that the 3B model is the sweet spot: fluent generation with &lt;strong&gt;Zero Licensing Overhead&lt;/strong&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Scalability Benchmarks&lt;/strong&gt;: &lt;strong&gt;~438 prompt tokens/s&lt;/strong&gt; and &lt;strong&gt;~10 generation tokens/s&lt;/strong&gt;. Proving that high-performance AI is possible without cloud dependency.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fuwvbt0z0er6uupjrv7ue.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fuwvbt0z0er6uupjrv7ue.png" alt="Scalability Benchmarks" width="218" height="292"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Operational Sustainability&lt;/strong&gt;: The GPU pulled a steady &lt;strong&gt;20W&lt;/strong&gt; and stayed at &lt;strong&gt;64°C&lt;/strong&gt;. This is a &lt;strong&gt;Low-Cost/High-Performance&lt;/strong&gt; local solution.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Summary: Driving Innovation Internally
&lt;/h3&gt;

&lt;p&gt;Building a local AI stack isn't just a technical exercise; it's a strategic move for &lt;strong&gt;Business Continuity&lt;/strong&gt; and &lt;strong&gt;Data Security&lt;/strong&gt;. By combining Docker, NVIDIA's toolkit, and a comprehensive observability layer, I've created a dev environment that's both secure and cost-efficient, proving that significant &lt;strong&gt;AI ROI&lt;/strong&gt; can be achieved on existing on-premise hardware.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>beginners</category>
      <category>tutorial</category>
      <category>devops</category>
    </item>
  </channel>
</rss>
