DFS Namespace ile Dağıtık Dosya Sistemi Kurulumu

Kurumsal ortamlarda dosya paylaşımı derken aklınıza ilk ne geliyor? Büyük ihtimalle “hangi sunucuda?” sorusu geliyor. Pazartesi sabahı kullanıcıdan gelen “geçen hafta kaydettiğim dosyayı bulamıyorum” şikayetiyle güne başlamak istemiyorsanız, DFS Namespace tam size göre. Yıllardır Windows ortamlarında bu yapıyı kurup yöneten biri olarak söylüyorum: DFS olmadan kurumsal dosya yönetimi yapmak, GPS olmadan şehirler arası yol gitmek gibi bir şey.

DFS Namespace Nedir, Ne İşe Yarar?

DFS (Distributed File System), birden fazla sunucuda dağılmış dosya paylaşımlarını tek bir mantıksal namespace altında toplar. Kullanıcı \domain.localBelgeler adresine gittiğinde, arka planda hangi sunucunun devreye girdiğini bilmesine gerek kalmaz. Siz sunucu değiştirseniz, yeniden adlandırsanız, hatta bakıma alsanız bile kullanıcı yolunun değişmediğini görür.

İki temel bileşenden oluşur:

  • DFS Namespace (DFS-N): Mantıksal klasör yapısını ve yönlendirmeyi yönetir. Kullanıcının gördüğü “sanal” dizin ağacı buradadır.
  • DFS Replication (DFS-R): Birden fazla sunucu arasında dosyaların senkronize tutulmasını sağlar. SYSVOL replikasyonu da zaten DFS-R üzerine kuruludur.

Pek çok yapıda bu ikisi birlikte çalışır ama ayrı ayrı da kullanılabilir. Namespace olmadan replikasyon yapabilirsiniz (örneğin sadece yedek amaçlı), replikasyon olmadan da namespace kurabilirsiniz (tek sunucu, birden fazla paylaşım yolu). Biz bu yazıda her ikisini de ele alacağız.

Ortam Hazırlığı

Anlatacağım senaryo gerçek bir kurumsal yapıyı yansıtıyor. Elimde şunlar var:

  • DC01.domain.local – Primary domain controller, aynı zamanda DFS namespace sunucusu
  • FS01.domain.local – Birincil dosya sunucusu
  • FS02.domain.local – İkincil dosya sunucusu (replikasyon hedefi)

Önce her iki dosya sunucusunda da DFS rolünü yükleyelim. PowerShell üzerinden yapacağım, Server Manager’la da yapılabilir ama tekrarlanabilir ve betiklenebilir olması açısından PowerShell tercih ediyorum.

# Her iki dosya sunucusunda çalıştırın
Install-WindowsFeature -Name FS-DFS-Namespace, FS-DFS-Replication -IncludeManagementTools -Restart

# Kurulumu doğrula
Get-WindowsFeature -Name FS-DFS-*

DFS yönetim araçlarını (RSAT) yönetim iş istasyonunuza kurmak için:

# Yönetim iş istasyonunda (Windows 10/11 veya diğer sunucularda)
Add-WindowsCapability -Online -Name Rsat.FileServices.Tools~~~~0.0.1.0

# Veya Windows Server üzerinde:
Install-WindowsFeature -Name RSAT-DFS-Mgmt-Con

Kurulum tamamlandıktan sonra dfsmgmt.msc ile DFS Management konsolunu açabilirsiniz. Ben hem konsolu hem PowerShell’i kullanacağım, çünkü bazı işlemleri GUI ile yapmak daha hızlı, bazılarını ise betiklemek zorundasınız.

Domain-Based Namespace Oluşturma

DFS Namespace’in iki türü var: standalone ve domain-based. Standalone namespace tek sunucuya bağlıdır, sunucu çökerse namespace de gider. Domain-based namespace ise Active Directory’ye entegre çalışır ve birden fazla namespace sunucusu ekleyerek yüksek erişilebilirlik sağlayabilirsiniz. Üretim ortamında her zaman domain-based tercih edin.

# DC01 üzerinde yeni bir domain-based namespace oluştur
New-DfsnRoot -Path "\domain.localDosyalar" `
             -TargetPath "\FS01Dosyalar" `
             -Type DomainV2 `
             -Description "Kurumsal Dosya Namespace"

# Namespace durumunu kontrol et
Get-DfsnRoot -Path "\domain.localDosyalar"

Burada DomainV2 kullandığımıza dikkat edin. DomainV1 eski Windows 2000/2003 ortamlarıyla uyumluluk için vardı. Tüm sunucularınız 2008 ve üzeriyse DomainV2 kullanın, çünkü erişim tabanlı numaralandırma (Access-Based Enumeration) ve ölçeklendirme açısından çok daha iyi.

Namespace’in fiziksel karşılığı olan paylaşımı FS01’de oluşturalım:

# FS01 üzerinde çalıştırın
New-Item -Path "D:DFSDosyalar" -ItemType Directory -Force

# SMB paylaşımı oluştur
New-SmbShare -Name "Dosyalar" `
             -Path "D:DFSDosyalar" `
             -FullAccess "Domain Admins" `
             -ChangeAccess "Domain Users" `
             -FolderEnumerationMode AccessBased

# Paylaşımı doğrula
Get-SmbShare -Name "Dosyalar"

Namespace’e Klasör ve Hedef Ekleme

Namespace oluşturduk ama içi boş. Şimdi mantıksal klasörler ekleyip bunları fiziksel paylaşımlara yönlendireceğiz.

# Namespace altına "Muhasebe" klasörü ekle
New-DfsnFolder -Path "\domain.localDosyalarMuhasebe" `
               -TargetPath "\FS01Muhasebe" `
               -Description "Muhasebe Departmanı Dosyaları"

# Birden fazla hedef eklemek için (replikasyon sonrası)
New-DfsnFolderTarget -Path "\domain.localDosyalarMuhasebe" `
                     -TargetPath "\FS02Muhasebe" `
                     -ReferralPriorityClass GlobalHigh

# Tüm klasörleri listele
Get-DfsnFolder -Path "\domain.localDosyalar*"

FS01 ve FS02 üzerinde fiziksel klasörleri de oluşturun:

# Her iki sunucuda da çalıştırın
$departmanlar = @("Muhasebe", "Insan_Kaynaklari", "IT", "Yonetim", "Genel")

foreach ($dept in $departmanlar) {
    New-Item -Path "D:DFS$dept" -ItemType Directory -Force
    
    New-SmbShare -Name $dept `
                 -Path "D:DFS$dept" `
                 -FullAccess "Domain Admins" `
                 -ChangeAccess "Domain Users" `
                 -FolderEnumerationMode AccessBased
    
    # DFS Namespace'e klasör olarak ekle (FS01 üzerindeyseniz)
    New-DfsnFolder -Path "\domain.localDosyalar$dept" `
                   -TargetPath "\FS01$dept" `
                   -Description "$dept Departmanı"
}

DFS Replication Yapılandırması

Namespace hazır, şimdi FS01 ile FS02 arasında replikasyon kuralım. Bu adım önemli: replikasyon olmadan FS02’yi hedef olarak eklemenin bir anlamı yok, kullanıcılar farklı sunucularda farklı dosyalar görür.

Önce replikasyon grubunu oluşturalım:

# Yeni replikasyon grubu oluştur
New-DfsReplicationGroup -GroupName "DFS-Dosyalar-RG" `
                        -Description "Dosyalar namespace replikasyon grubu"

# Üyeleri ekle
Add-DfsrMember -GroupName "DFS-Dosyalar-RG" -ComputerName "FS01"
Add-DfsrMember -GroupName "DFS-Dosyalar-RG" -ComputerName "FS02"

# Replicated folder ekle - Muhasebe örneği
New-DfsReplicatedFolder -GroupName "DFS-Dosyalar-RG" `
                        -FolderName "Muhasebe" `
                        -Description "Muhasebe replikasyonu"

# FS01 için yerel yolu ayarla (birincil üye)
Set-DfsrMembership -GroupName "DFS-Dosyalar-RG" `
                   -FolderName "Muhasebe" `
                   -ComputerName "FS01" `
                   -ContentPath "D:DFSMuhasebe" `
                   -PrimaryMember $true `
                   -Force

# FS02 için yerel yolu ayarla (ikincil üye)
Set-DfsrMembership -GroupName "DFS-Dosyalar-RG" `
                   -FolderName "Muhasebe" `
                   -ComputerName "FS02" `
                   -ContentPath "D:DFSMuhasebe" `
                   -PrimaryMember $false `
                   -Force

Replikasyon bağlantısını oluşturun:

# Çift yönlü replikasyon bağlantısı
Add-DfsrConnection -GroupName "DFS-Dosyalar-RG" `
                   -SourceComputerName "FS01" `
                   -DestinationComputerName "FS02"

# Replikasyon durumunu izle
Get-DfsrState -ComputerName "FS01" -Verbose

İlk replikasyon başladığında DFS Replication event logunu takip edin. Event ID 4104 başarılı replikasyonu, Event ID 4012 ise uzun süredir replikasyon yapılamadığını gösterir. 4012 görürseniz paniklemeden önce sunucular arası bağlantıyı ve firewall kurallarını kontrol edin.

Namespace Sunucu Yedekliliği

Domain-based namespace kullanıyorsanız ikinci bir namespace sunucusu ekleyerek yüksek erişilebilirlik sağlayabilirsiniz. Birinci sunucu çökerse istemciler ikincisinden namespace bilgisini alır.

# FS02'yi de namespace sunucusu yap
New-DfsnRootTarget -Path "\domain.localDosyalar" `
                   -TargetPath "\FS02Dosyalar"

# Tüm namespace sunucularını listele
Get-DfsnRootTarget -Path "\domain.localDosyalar"

FS02 üzerinde de Dosyalar adında bir paylaşım oluşturmayı unutmayın, aksi halde namespace sunucusu eklenirken hata alırsınız.

Erişim Tabanlı Numaralandırma (ABE)

Namespace üzerinde ABE’yi etkinleştirmek, kullanıcıların yalnızca erişebildikleri klasörleri görmesini sağlar. Muhasebe kullanıcısı namespace’e bağlandığında IT klasörünü görmez bile.

# Namespace üzerinde ABE'yi etkinleştir
Set-DfsnRoot -Path "\domain.localDosyalar" `
             -EnableAccessBasedEnumeration $true

# Belirli bir klasör için de ayarlanabilir
Set-DfsnFolder -Path "\domain.localDosyalarYonetim" `
               -EnableTargetFailback $true

# Durumu doğrula
Get-DfsnRoot -Path "\domain.localDosyalar" | Select EnableAccessBasedEnumeration

Burada dikkat edilmesi gereken bir nokta var: ABE namespace düzeyinde çalışır ama asıl yetkilendirme hala NTFS ve Share izinleri üzerinden yapılır. ABE sadece görsel filtreleme sağlar, güvenlik değil. NTFS izinleriniz doğru yapılandırılmamışsa ABE sizi kurtarmaz.

Referral ve Önbellek Ayarları

DFS istemciler, namespace bilgisini önbelleğe alır (referral cache). Varsayılan TTL değerleri çoğu ortam için uygundur ama geniş WAN ortamlarında veya sık değişen yapılarda bu değerleri ayarlamak gerekebilir.

# Namespace referral TTL ayarı (saniye cinsinden, varsayılan 300)
Set-DfsnRoot -Path "\domain.localDosyalar" `
             -TimeToLiveSec 600 `
             -State Online

# Klasör bazında TTL ayarı
Set-DfsnFolder -Path "\domain.localDosyalarMuhasebe" `
               -TimeToLiveSec 1800

# Target failback ayarı - birincil hedef tekrar çevrimiçi olunca geri dön
Set-DfsnFolderTarget -Path "\domain.localDosyalarMuhasebe" `
                     -TargetPath "\FS01Muhasebe" `
                     -ReferralPriorityClass GlobalHigh `
                     -State Online

WAN ortamlarında site ayarı kritik önem taşır. İstanbul ofisindeki kullanıcı, İzmir’deki sunucuya yönlendirilmemeli. Bunun için AD Sites and Services’te site bağlantılarınızın doğru yapılandırılmış olması gerekir. DFS, istemcinin site bilgisini kullanarak en yakın hedefi seçer.

Replikasyonu İzleme ve Sorun Giderme

Üretim ortamında kurulum kadar önemli olan şey, düzenli izleme yapmaktır.

# Replikasyon durumu özeti
Get-DfsrBacklog -GroupName "DFS-Dosyalar-RG" `
                -FolderName "Muhasebe" `
                -SourceComputerName "FS01" `
                -DestinationComputerName "FS02" `
                -Verbose

# Tüm replikasyon gruplarını listele
Get-DfsReplicationGroup | Format-Table GroupName, State, Description

# Üyelik bilgilerini kontrol et
Get-DfsrMembership -GroupName "DFS-Dosyalar-RG" | 
    Select ComputerName, FolderName, ContentPath, PrimaryMember, State

# DFS servis durumunu her iki sunucuda kontrol et
Invoke-Command -ComputerName "FS01","FS02" -ScriptBlock {
    Get-Service -Name DFSR | Select Name, Status, StartType
    Get-Service -Name Dfs | Select Name, Status, StartType
}

Karşılaştığım en yaygın sorunları şöyle sıralayabilirim:

  • Staging alanı dolduğunda replikasyon durur: Varsayılan staging alanı 4 GB’dir. Büyük dosya ortamlarında bu yetersiz kalabilir. Set-DfsrMembership ile staging quota’yı artırın.
  • Firewall bloklaması: DFS-N için TCP/UDP 445 ve 135, DFS-R için TCP 5722 açık olmalı. Domain ortamında RPC portlarını da ihmal etmeyin.
  • Split-brain durumu: Her iki sunucuda da aynı dosya aynı anda değiştirilmişse çakışma oluşur. DFS-R çakışan dosyaları DfsrPrivateConflictAndDeleted klasörüne taşır, log’lardan takip edebilirsiniz.
  • Zaman senkronizasyonu: DFS-R, sunucular arasındaki saat farkına duyarlıdır. W32tm ayarlarınızın doğru olduğundan emin olun.

Namespace Sağlık Kontrolü Betiği

Günlük otomatik sağlık kontrolü için kullandığım basit bir betik:

# DFS-HealthCheck.ps1
param(
    [string]$NamespacePath = "\domain.localDosyalar",
    [string[]]$FileServers = @("FS01", "FS02"),
    [string]$LogPath = "C:LogsDFS-Health.log"
)

$timestamp = Get-Date -Format "yyyy-MM-dd HH:mm:ss"
$report = @()

# Namespace erişilebilirlik kontrolü
try {
    $roots = Get-DfsnRootTarget -Path $NamespacePath -ErrorAction Stop
    foreach ($root in $roots) {
        $status = if ($root.State -eq "Online") { "OK" } else { "UYARI" }
        $report += "$timestamp | Namespace Target | $($root.TargetPath) | $status"
    }
} catch {
    $report += "$timestamp | HATA | Namespace sorgulanamadı: $_"
}

# Servis kontrolü
foreach ($server in $FileServers) {
    $services = Invoke-Command -ComputerName $server -ScriptBlock {
        Get-Service -Name "DFSR","Dfs" | Select Name, Status
    } -ErrorAction SilentlyContinue

    if ($services) {
        foreach ($svc in $services) {
            $status = if ($svc.Status -eq "Running") { "OK" } else { "KRITIK" }
            $report += "$timestamp | Servis | $server$($svc.Name) | $status"
        }
    } else {
        $report += "$timestamp | HATA | $server'a ulaşılamadı"
    }
}

# Replikasyon backlog kontrolü
$replicationGroups = Get-DfsReplicationGroup -ErrorAction SilentlyContinue
foreach ($group in $replicationGroups) {
    $folders = Get-DfsReplicatedFolder -GroupName $group.GroupName
    foreach ($folder in $folders) {
        try {
            $backlog = (Get-DfsrBacklog -GroupName $group.GroupName `
                        -FolderName $folder.FolderName `
                        -SourceComputerName $FileServers[0] `
                        -DestinationComputerName $FileServers[1] `
                        -ErrorAction Stop).BacklogCount
            $status = if ($backlog -lt 100) { "OK ($backlog)" } else { "UYARI ($backlog dosya bekliyor)" }
            $report += "$timestamp | Backlog | $($group.GroupName)$($folder.FolderName) | $status"
        } catch {
            $report += "$timestamp | Backlog | $($group.GroupName)$($folder.FolderName) | Sorgulanamadı"
        }
    }
}

# Rapora yaz
$report | Add-Content -Path $LogPath
$report | Write-Output

Bu betiği Task Scheduler’a ekleyip her sabah çalıştırın, çıktısını bir e-posta ile kendinize gönderin. Sabah toplantısından önce bir bakışta sisteminizin durumunu görmek büyük konfor sağlar.

Göç Senaryosu: Eski Paylaşım Yollarından DFS’e Geçiş

Pek çok kurumda DFS’e geçiş süreci “varolan her şey çalışıyor, neden değiştirelim” direnciyle karşılaşır. Bu dirence karşı en güçlü argüman, geçiş sırasında kullanıcıların hiçbir şeyi fark etmemesidir. Şu adımları izleyin:

Önce namespace’i kurun ve tüm yeni erişim yollarını hazırlayın. Replikasyonun sağlıklı çalıştığını doğrulayın. Sonra kullanıcı login script veya Group Policy ile drive mapping’leri eski yoldan (\FS01Muhasebe) yeni namespace yoluna (\domain.localDosyalarMuhasebe) güncelleyin. Kullanıcılar oturumu kapatıp açtığında eski yol artık çalışmayabilir ama yeni yol dosyalarını gösterir. Geçiş tamamlanana kadar eski paylaşımları canlı tutun.

DFS migration araçları arasında dfsutil.exe hala işe yarıyor, özellikle toplu namespace işlemleri için:

# Mevcut namespace konfigürasyonunu dışa aktar
dfsutil root export \domain.localDosyalar C:BackupDFS-Export.xml

# Başka bir ortama aktar
dfsutil root import merge C:BackupDFS-Export.xml \domain2.localDosyalar

Sonuç

DFS Namespace kurulumu, ilk bakışta karmaşık görünen ama bir kez doğru yapıldığında yıllarca sorunsuz çalışan bir altyapı katmanıdır. Burada anlattıklarımı özetleyecek olursam: domain-based namespace her zaman standalone’dan üstündür, replikasyon olmadan yedeklilik olmaz, ABE güvenlik değil görünürlük kontrolüdür ve izleme olmadan yapılan her kurulum bir süre sonra başınıza dert açar.

Pratikte en çok fark yaratan kararlar şunlar oldu benim için: her departmanın kendi replikasyon grubunda olması (sorun yaşandığında izolasyon sağlar), staging alanını başından büyük ayarlamak (4 GB varsayılan yetersiz kalır) ve DFS servislerini izleyen otomatik kontrol betiklerini baştan kurmak.

Bir de şunu ekleyeyim: DFS’i kurduktan sonra felaket kurtarma senaryolarınızı gözden geçirin. DFS, dosyalarınızı dağıtır ama yedeklemez. robocopy veya yedekleme çözümünüz hala fiziksel yolları yedeklemeli. Namespace üzerinden yedekleme yapıyorsanız, namespace sunucusu çöktüğünde yedekleme işleminin de durduğunu görürsünüz. Fiziksel yolları hedefleyin, her zaman.

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir