Sürekli Kullanılabilirlik etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster
Sürekli Kullanılabilirlik etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster

13 Eylül 2018 Perşembe

Eyvah! Storage'ın yazılımında "bug" çıktı!

Yönettiğim ortamların birinde disk altyapısı (storage) kaynaklı ciddi bir sorun oluştu. Şöyle bir senaryo düşünün ki, X veri merkezinde barındırdığımız canlı veritabanı ve uygulama sunucularımıza ait dosyaların ve yedeklerimizin bulunduğu disk altyapısı Y firmasının ürünü olan Storage'taki bir yazılım sorunu (bug) nedeniyle komple bozuluyor (corruption). Ne canlı ortam verilerine, ne de yedeklerine ulaşılamıyor. Tam bir kriz!

Bir süre sonra veri merkezi 1 gün öncesine ait veritabanı yedeklerine ulaşabildiğini söyledi, fakat bu bizim için 1 günlük veri kaybı demekti. Bu kritik bir sistem olduğu için tabii ki Transaction Log yedekleri alıyorduk ve bu yedek dosyaları da sistemi tamamen kaybetmeden 1 saat öncesine kadar geri getirilebildi. Bu noktada veri kaybı 1 saatti. Yine neyse ki bu ortamın BT yöneticisi felaket senaryolarının bilincindeydi ve bu konuda yatırım yapılmasını sağlamıştı, bu sayede başka bir veri merkezinde bulunan yedeklerimizi kullanarak yalnızca 1 dakikalık veri kaybı ile bu kriz atlatılmış oldu.

Not: Müşteri felaket önleme seçenekleri konusunda bilgilendirilmişti. Maliyet-fayda hesabına göre 1 dakikalık veri kaybı müşteri için kabul edilebilirdi.

Sadece son 2 senede 4 kere buna benzer durum için yedekliliğin önemine dair yazılar yazmışım (yazı1yazı2yazı3yazı4), en azından bir çırpıda bulabildiklerim bunlar. Disk altyapıları kısmen veya tamamen yazılım (firmware) veya donanım hatası nedeniyle bozulabilir. Ayrıca verileriniz disk veya sistem yöneticileri tarafından yanlışlıkla silinebilir veya bir saldırı neticesinde bozulabilir. Sistemleriniz çeşitli nedenlerle kullanılamaz, ulaşılamaz duruma gelebilir. Bu gibi olasılıklar sizin başınıza gelmeyecek sanmayın, çok yanılırsınız. Türkiye'nin veya dünyanın en büyük kurumlarının bile başlarına geliyor bu durumlar. Şahsen yönettiğim ortamlarda ister istemez, şartlar ve imkanlar dahilindeki her türlü önleme rağmen bahsettiğim çeşitli nedenlerle senede ortalama 2 kere yaşıyorum benzer senaryoları. Şimdiye kadar bunu tatmadıysanız bile, üzgünüm ama emin olun eninde sonunda tadacaksınız. En iyisi, o güne şimdiden hazırlıklı olmak!

Size tavsiyem şirketiniz içerisindeki ilgili partilerle bir toplantı yapın ve şu soruların cevaplarını arayın: 

"Ne kadar sürelik veri kaybına tahammülümüz var? 1 gün? 1 saat? 1 dakika? Birkaç saniye?"

"Sistemimizin en fazla ne kadar süre kapalı kalmasını tolere edebiliriz?" 

Tabii ki iki soruya da ilk etapta "Sıfır!" yanıtının gelmesi şaşırtıcı olmayacak, fakat bunun maliyet-fayda hesabının yapılması gerekiyor. Çünkü kullandığınız SQL Server Edition'ına göre farklı lisans ücretleri ödüyorsunuz ve yine Edition'lara göre farklı sürekli kullanılabilirlik ve felaket önleme seçenekleri mevcut. İhtiyacınıza en uygun çözümü örneğin SQL Server'ın Standard Edition'ıyla da üretebilirsiniz, böylece lisans maliyetlerinizi hele ki dövizin bu seviyelerde olduğu bu zamanlarda ciddi oranda düşürebilirsiniz. Ayrıca şunu da belirtmek gerekir ki bütçe musluklarını açsanız bile çeşitli nedenlerle tamamen kesintisiz bir ortam kuramazsınız, fakat kesintinin olabildiğince kısa sürmesini ve doğru yönetilmesini sağlayabilirsiniz.

Veri kayıpsız, az kesintili günler dilerim.

Ekrem Önsoy
Microsoft SQL Server Danışmanı
www.ekremonsoy.com

16 Nisan 2018 Pazartesi

"Always On" olacak diye umulan Availability Groups

Geçen hafta çok ilginç bir Always On Availability Groups (AG) sorunu ile karşılaştım, bunu yazmazsam olmazdı.

Önce ortam hakkında özet bilgi vereyim. Bu ortamda SQL Server 2014 + Service Pack 2 kurulu ve 2 Replica'dan oluşan bir Always On AG yapısı var; geçen senenin sonlarına doğru kurmuştuk. Müşteri, 2. Replica'yı sürekli kullanılabilirlik için değil, sadece raporlama için istemişti, bu nedenle Always On AG temel amacından birazcık saparak sürekli kullanılabilirlik için kullanılmıyor.

Sorun yaşandığı anda ben de başka bir şeyle meşguldüm, kesintiye dair telefon geldi ve ilk müdahaleyi telefonda yaptık. Fakat temel şeyler sonuç vermeyince kısa bir süre sonra sisteme ben bağlandım ve kontrollere başladım.

Canlı sunucuya bağlandığımda SQL Server Database Engine servisi çalışıyordu, fakat Always On AG Resource Group Offline durumdaydı. Cluster Resource'u bir türlü Online duruma gelmiyordu ve çok ilginç bir şekilde SQL Server Error Log'ta, Windows System Event Log'larında ve Cluster Log'larında aradığım ayrıntıları bulamadım. Bir taraftan da kesinti devam ediyordu, tüm Login'ler veritabanlarına erişemediğine dair hata alıyordu. En temel genel Microsoft sorun çözücü yöntem olarak sunucuyu yeniden başlattım. Çok ilginç bir şekilde sorunu bu hamle de çözmemişti (tabii ki takılıyorum)...

SQL Server Database Engine'e bağlanıp veritabanlarını kontrol edeyim dedim...




ve yukarıdaki ekranla karşılaşınca açıkçası çok şaşırdım, çünkü yazımın girişinde belirttiğim gibi bu ortamda Always On AG vardı ve bu da tek Primary Replica olabilecek makineydi, nasıl veritabanları "Restoring" durumda olabilirdi ki? Secondary Replica'daki veritabanları da "Not synchronizing" durumdaydı.

Henüz bunun şaşkınlığını atlatamadan bir de ne göreyim:



Yukarıdaki ekran görüntüsü Primary Replica'ya ait. Always On AG yapılandırmam yok olmuş!

Bunun nasıl olabileceği konusunda en ufak bir fikrim yok. Yani ne, nasıl tetiklenir de Always On AG yapısını bu şekilde siler hiç bilemedim. Secondary Replica'yı kontrol etmek geldi aklıma, bağlandım baktım, orada duruyor yapılandırma. Bulguları birleştirince Always On AG Cluster Resource'unun da neden bir türlü Online olmadığı anlaşıldı.

Sahadaki servis kesintisi sorununu gidermek için "RESTORE DATABASE" komutuyla hemen veritabanlarını Online duruma getirdim* ve servislerin ayağa kalktığını teyit ettim. Artık sahada kesinti yoktu. Bundan sonraki aşama Always On AG'yi ayağa kaldırmaktı. 

* Dikkatinizi çekerim veritabanları Restoring durumdaydı, öyle veya böyle bu duruma gelmişti, veritabanlarına ulaşmaya çalışan Login'ler de bu nedenle hata alıyordu ve Database Engine servisinin açılışında da herhangi bir sorun yoktu, bu nedenle basit bir RESTORE DATABASE ile veritabanlarını açabilir ve sahadaki kesintiyi engelleyebilirdim, temel öncelik her zaman kesintiyi güvenli bir şekilde sona erdirmektir.

Primary Replica'daki Database Engine servisinin Always On AG için Enabled durumunda olup olmadığını teyit ederek başladım işe. Daha sonra veritabanları açıldıktan sonra Primary Replica'da herhangi bir Transaction Log dosyası yedeği alınmış mı diye kontrol ettim. Eğer alınan bir yedek varsa bu yedekler Secondary Replica ile senkronizasyonun sağlanabilmesi için Secondary Replica'daki veritabanlarına da uygulanmalıydı. Komple yeniden kuruluma gerek yoktu, çünkü Secondary Replica'daki veritabanları duruyordu, sadece iki Replica'daki veritabanları arasında herhangi bir Log Sequence Number (LSN) boşluğu olmadığından emin olmak yeterliydi, eğer boşluk varsa da bu eksikler Transaction Log yedekleri Secondary Replica'da Restore edilerek giderilebilirdi.

İki Replica'daki veritabanlarının arasında LSN boşluğu olmadığından da emin olduktan sonra Always On AG'yi ilgili veritabanlarıyla tekrar oluşturdum ve tüm eksiklikler giderilmiş oldu. Artık sistem kesinti olmadan önceki gibi çalışıyordu.

Tabii bu noktadan sonra sorunun nedenini araştırmak gerekiyordu. Ne olmuştu da kesinti oluşmuştu?

Always On AG, diğer birçok Microsoft teknolojisi gibi kurulumu nispeten kolaydır, bu nedenle birçok şirkette şık arayüzler kullanılarak "ileri, ileri" denilerek kurulur; fakat birçok senaryoda ya doğru tasarlanmaz, ya doğru yönetilmez, ya da sistem işlerliği doğru takip edilmez. Bazen de bizim senaryomuzda olduğu gibi ne yaparsanız yapın, birileri bir şekilde bir şeyleri bozabilir. Bizim senaryomuzda birisi bir sorgu çalıştırmış ve sunucu bu aşırı garip sorgu nedeniyle birkaç dakika cevap veremez duruma gelmiş. Bu nedenle Cluster, SQL Server'dan cevap alamamış ve "lease" yenilenememiş ve Cluster tarafından bu sunucu sağlıksız sayılıp servis kapatılmış. (Ödev: Böyle senaryolar için de bu garip sorguları çalıştırabilecek Login'ler tespit edilip Resource Governor'ın kullanımı düşünülmelidir, bu sayede bu potansiyel tehlikeli kullanıcıların işlemci kaynağını azami kullanım miktarı sınırlanabilir, bu aşamada müşteri ile bunu görüşüyoruz.)

Yeri gelmişken tekrar vurgulamak istedim. Always On AG, Log Shipping, Replication, Database Mirroring veya Failover Clustered Instance'larınızı sadece kurup kendi hallerine bırakmayın. Yakından izleyin. Aktarımlar geride kaldığında, yapının parçalarından birinde kesinti olduğunda, uygulamalar Virtual Network Name / Listener gibi sunucu agnostik elemanlar yerine doğrudan üye sunuculara bağlandığında haberiniz olsun istersiniz. Daha sürdürülebilir, daha sağlıklı ve daha kesintisiz ortamlar için bunlar sadece en temel kontrollerden birkaçıdır.

Yazıyı yazarken eşim de o anda bir fotoğraf çekmiş, bu yazıyı sevgili Tuncel Kurtiz'in Zeytinbağı'ndayken yazmıştım, nur içinde yatsın.



Ekrem Önsoy
Microsoft SQL Server Danışmanı
www.ekremonsoy.com


27 Kasım 2017 Pazartesi

Hata: Servis hesabının Always On Availability Groups kurulumuna etkisi

Geçen gün bir müşterimde Always On Availability Groups kurulumu yaparken önceden karşılaşmadığım bir sorun ile karşılaştım. Müsait olunca konu hakkında bir blog yazısı yazarım diye o anda ekran görüntüsünü almıştım. Soruna dair ilgili ekran görüntüsünü aşağıda paylaşıyorum.

Kurulum yaparken karşılaştığım sorun

Bilgi mesajı şöyle diyordu:
"The Endpoints tab lists at least one endpoint that uses only Windows Authentication. However, the server instance might be running under a nondomain account. To use the listed endpoint, change the corresponding SQL Server service account to a domain account. To continue using the nondomain account, after the endpoint to use a certificate."

SQL Server bir nedenden dolayı Replica'lardan birinin Domain hesabıyla çalışmadığını düşünüyordu. Fakat "SQL Server Service Account" sütununda da görülebileceği üzere iki hesap da Domain hesabı. Kuruluma bu şekilde devam ettiğimde kurulum bir türlü tamamlanmıyordu. Bir hata da vermiyordu veya verinceye kadar bekleyememiştim, ama bir yerlerde sıkıntı olduğu artık çok netti.

Kurulumu sadece arayüzle değil, T-SQL ile denediğimde de aynı sonuç ile karşılaşıyordum. Yukarıdaki bilgi mesajı gelmiyordu, ama kurulum da tamamlanmıyordu.

Endpoint'leri de kontrol etmiştim, herhangi bir anormallik yoktu.

Yukarıdaki ekran görüntüsündeki gibi farklılıkları oldum olası hiç sevmem. Yani örneğin Replica'lardan birinin servis hesabı "servis_hesap_adi@domain_adi" biçimindeyken diğerininkinin "domain_adi\servis_hesap_adi" olması benim için rahatsız edici bir durum. O anda tabii ki sorunun nedeninin bu olduğundan %100 emin olmasam da, %90'lık çok güçlü bir tahminle sorunun bu olacağını düşünmüştüm. 

Sonra test etmek için bir SQL Server kurulu sunucuda SQL Server Configuration Manager kullanarak 2. Replikanın servis hesabınının biçimini de canlı sunucudaki gibi "servis_hesap_adi@domain_adi" olarak değiştirmek istedim ve bunun yapılamadığını gördüm. Yani istesem de SQL Server Configuration Manager ile bir servis hesabını bu yazım biçimiyle atayamıyordum. O anda anladım ki birisi bu hesap değişikliğini SQL Server Configuration Manager yerine Services.msc ile yapmıştı, ki bu hiç iyi bir pratik değildir. Tüm SQL Server servis hesabı değişikliği işlemlerini SQL Server Configuration Manager aracıyla yapmalısınız. Çünkü bu sırada sadece servis hesabı değiştirilmez, aynı zamanda bu hesaba arkaplanda gerekli bazı yetkiler ve rol üyelikleri uygulanır. Eğer bu işi Services.msc ile yaparsanız sadece servis hesabı değişmiş olur. Ayrıca bu örnekte de görülebileceği üzere SQL Server servis hesabı değişikliğini "domain_adi\servis_hesap_adi" yerine "servis_hesap_adi@domain_adi" biçimiyle yapmış olabilirsiniz, ki bu örnekten de görülebileceği gibi bu biçimi kullanmak ilginç sorunlara neden olabiliyor.

Not: Bu noktada bir belirsizliğe dikkat çekmek istiyorum. Bu yazıya konu olan sorun SQL Server servis hesabının SQL Server Configuration Manager yerine Services.msc'den değiştirilmesinden de kaynaklanıyor olabilir, servis hesabının "domain_adi\servis_hesap_adi" biçimi yerine "servis_hesap_adi@domain_adi" biçimiyle belirlenmiş olmasından da kaynaklanıyor olabilir. Örneğin SQL Server servis hesabını Services.msc'den değiştirip, bu işlemi yaparken de "domain_adi\servis_hesap_adi" biçimini kullansaydım da sorun çözülebilirdi belki? Bu, ayrı bir test gerektiriyor. Ortam canlı olduğu için o anda bunun testini yapamadım. Eğer başka bir ortamda bunu test edebilirsem bu yazıyı güncelleyeceğim.

Servis hesabı değişimi (normal şartlar altında) kısa da olsa kesinti gerektiren bir değişiklik. İlgili yöneticilerle planlı bir kesinti için anlaştık ve zamanı geldiğinde canlı sunucudaki SQL Server Database Engine servis hesabını SQL Server Configuration Manager kullanarak ve "domain_adi\servis_hesap_adi" biçiminde değiştirdim. Bu değişiklikten sonra Always On Availability Groups kurulumunu tekrar denedim ve yukarıda paylaştığım ekran görüntüsündeki hata ile karşılaşmadım.

Yukarıdaki bilgi mesajıyla karşılaşmadığım gibi kuruluma devam ettikten sonra da kurulumun başarıyla tamamlandığını gördüm. Yani bu değişiklikle sorunum çözüldü. Olur da bir gün başka bir arkadaşım karşılaşırsa diye paylaşmak istedim.

Ekrem Önsoy
Microsoft SQL Server Danışmanı


18 Ekim 2007 Perşembe

Replication (Sürekli Kullanılabilirlik - 3)

SQL Server Replication

Merhaba arkadaşlar,

Bu makalemde, SQL Server Replication teknolojisinin kavramsal olarak yapısını irdeleyeceğiz. Ayrıca, Replication yöntemlerinden de bahsedeceğim.

Sürekli Kullanılabilirlik (High Availability) konusunda şimdiye kadar SQL Server Failover Clustering ve Database Mirroring’ ten bahsetmiştim. Bunların avantaj ve dezavantajlarından, özelliklerinden ve hangi durumlarda kullanılabileceğinden kısaca bahsetmiştim. Replication konusu ile, Sürekli Kullanılabilirlik yazı dizimin üçüncü bölümünü tamamlamış olacağım. Dördüncü bölüm ise Log Shipping konusunda olacak ve böylelikle Sürekli Kullanılabilirlik konusunu tamamlamış olacağız. En sonunda, bu teknolojilerin birlikte nasıl kullanılabileceklerinden ve genel olarak duruma göre birbirlerine karşı üstünlüklerinden ve dezavantajlarından bahsedeceğim. Ayrıca, Log Shipping konusunun sonunda değişik senarolar da kurgulayacağım. Böylece, hangi teknolojinin nerede kullanılabileceği daha anlaşılır bir hale gelecek umarım.

Makalemde yer yer terimlerin Türkçe ve İngilizcelerini karışık şekilde kullanacağım. Böylece bu terimlerin daha iyi öğrenilebileceği kanısındayım. İki dildeki terimlere aşina olmanızı uygun görmemin nedeni, yazılımların ingilizce olması ve bunların anlaşılabilmesinin de türkçe olarak daha kolay olabilmesi. Umarım işe yarar.


KONU BAŞLIKLARI:

- Replication ve Elemanları
- Publisher, Distributor ve Subscriber
- Replication Teknolojisinde Kullanılan Agent’ lar
- Replication Yöntemleri



REPLICATION YÖNTEMLERİ ve ELEMANLARI

Replication’ ın temel olarak üç yöntemi var, bunlar:

- Snapshot Replication
- Transactional Replication
- Merge Replication’ dır.


Her yöntem, ayrı ayrı seçenekler sunar. İhtiyacımıza göre hangisini kullanabileceğimizi öğrenmek için bu konularda, kendi başlıklarında söz edeceğim.

Fakat daha önce, Replication yapısını oluşturan öğelerden bahsetmek istiyorum. Replication yapısını genel olarak “Yayımevinin yayınladığı makalelere üye olan ve bu yayınları dağıtıcı sayesinde alan aboneler” şeklinde düşünebilirsiniz.

Publisher (Yayıncı) : Yayınlanacak olan makaleleri (Article), yayın (Publication) şeklinde yayınlanmak üzere üzerinde barındırır.

Distributor (Dağıtıcı) : “Publisher” daki “Article” ları, “Subscriber” lara ulaştırır.

Subscriber(Abone) : “Publisher” ın yayınladığı “Article” lara abone olarak, “Distributor” vasıtasıyla yayınları alır.

Publication (Yayın) : Bunu bir gazete gibi varsayın, “Article” lar da bu gazetenin makaleleri.

Article (Makale) : Table, Stored Procedure, View gibi nesneleri makalelere örnek olarak verebiliriz. Yukarıdaki örnekte de söylediğim gibi, Publication’ lar, makalelerden oluşur. Bir tane bile makaleniz olsa, bu, Publication şeklinde Publisher tarafından yayınlanır.

Burada anlattıklarımı, bir de görsel olarak aşağıdaki Şekil-1’ de anlatmanın daha yararlı olacağını düşünüyorum.

Şekil-1

Yukarıdaki Şekil-1’ de gördüğünüz gibi, “Publication_1” isimli bir yayınımız var ve bu yayın 4 makaleden (Article) oluşuyor. Bu Yayını (Publication) ise, Yayıncı (Publisher) yayımlıyor. Dağıtıcı (Distributor), yayını yayıncıdan alıp, ya iterek (Push) ya da abonelerin kendisinden yayını çekerek (Pull) yayınlama işlemini gerçekleştiriyor.

Bu arada, biliyorum bazen çok sıkıcı olabiliyorum. Aynı terimleri defalarca yazıyorum, ama maksadım bu terimlerin kafanızda daha belirgin şekilde yer etmesidir.


REPLICATION TEKNOLOJISINDE KULLANILAN AGENT’ lar

Yukarıda bahsetmiş olduğum yayınlama, itme, çekme gibi işler, Agent’ lar vasıtasıyla yapılıyor. Replication yapısında beş adet Agent bulunmaktadır. Her Agent aslında SQL Server’ dan bağımsız olarak uygulama şeklinde çalışırlar. Yani her Agent aslında bir uygulama (exe) dosyasıdır. Biraz da bu Agent’ lardan başlıklar halinde bahsedelim. O zaman inanıyorum ki işlevleri ve yapıları daha iyi anlaşılacaktır.

Snapshot Agent (snapshot.exe) : Snapshot Agent, Replication’ ın tüm yöntemlerinde kullanılan bir Agent’ tır. Tabloların ve diğer nesnelerin Şema (Schema) ve veri dosyalarını hazırlar. Snapshot dosyalarını depolar ve Dağıtım (Distribution) veritabanına, eşleşmeler (senkronizasyon) hakkındaki bilgileri kaydeder. Snapshot Agent, Dağıtıcı (Distributor) ‘nın üstünde çalışır. Yani Dağıtıcı görevi hangi SQL Server sunucusundaysa, Snapshot Agent da orada çalışır.

Log Reader Agent (logread.exe) : Log Reader Agent, sadece Transactional Replication yönteminde kulanılır. Yayıncının (Publisher) yayınladığı veritabanının Transaction Log’ unda bulunan ve Replication işlemi için işaretlenen kayıtları, Dağıtıcı (Distributor) görevini yapan SQL Server’ daki Dağıtım (Distribution) veritabanına taşır. Transactional Replication kullanılarak yayınlanan her veritabanının, Dağıtıcı’ da çalışan ve Yayıncı’ ya bağlanıp verileri alan Log Reader Agent’ ı vardır.

Distribution Agent (distrib.exe): Distribution Agent, Snapshot Replication ve Transactional Replication ile birlikte kullanılır. Başlangıç bilgilerini Abone’ ye (Subscriber) uygular; ayrıca Dağıtım (Distribution) veritabanında bulunan işlemleri de abonelere aktarır. Eğer Replication veri aktarma şekli olarak çekme (Pull) şekli kullanılırsa, Distribution Agent, Abone’ lik yapan SQL Server sunucusunda çalışır; Eğer itme (Push) kullanılırsa, o zaman da Dağıtıcı görevini üstlenen SQL Server’ da çalışır.

Merge Agent (replmerg.exe): Merge Agent, sadece Merge Replication yönteminde kullanılan bir Agent’ tır. Distribution Agent’ ın Snapshot Replication ve Transactional Replication’ da yaptığı görevi yapar. Başlangıç bilgilerini Abone’ ye uygular ve Dağıtım veritabanında bulunan işlemleri de abonelere aktarır. Her Merge Replication abonesinin, Yayıncıya ve Aboneye bağlayıp verileri güncelleyen kendi Merge Agent’ ları vardır. Gene Distribution Agent’ ta olduğu gibi veri aktarma yolu olarak Çekme yöntemi kullanılırsa Merge Agent Abone’ de çalışır, eğer İtme yöntemi kullanılırsa da Dağıtıcı’ da çalışır. Merge Agent, varsayılan olarak, değişiklikleri Abone’ den Yayıncıya gönderir ve Yayıncı’ daki veritabanında yapılan değişiklikleri de Abone’ nin veritabanına yansıtır.

Queue Reader Agent (qrdrsvc.exe): Queued Updating seçeneği ile birlikte Transactional Replication’ da kullanılır. Bu Agent, Dağıtıcı’ da çalışır ve Abone’ de yapılan değişiklikleri Yayıncıya aktarır. Distribution Agent ve Merge Agent’ ın aksine, sadece bir Queue Reader Agent örneği vardır.


PUBLISHER, DISTRIBUTOR ve SUBSCRIBER

SQL Server Replication teknolojisini SQL Server’ ın tüm sürümlerinde kullanabilirsiniz. Fakat kullandığınız sürüme göre, bazı kısıtlamalar vardır. Genel olarak aşağıdaki tabloda bu kısıtlamaları bulabilirsiniz.




SQL Server sürümleri arasındaki farkları daha ayrıntılı görmek için şu adresi ziyaret edebilirsiniz:
http://www.microsoft.com/sql/prodinfo/features/compare-features.mspx

Duruma göre, Replication kurulumlarında Publisher ve Distributor bir SQL Server sunucusu üzerinde konuşlandırılabilir. Bu, sisteminizdeki yük miktarına bağlı olarak değişir. Eğer sisteminizdeki yük fazla değilse ve SQL Server sunucunuz hem Publisher hem de Distributor görevlerinin yükünü kaldırabilecekse, o zaman Replication topolojinizi bu yönde şekillendirebilirsiniz. Yani Yayını, Yayıncı yayınlar ve dağıtır. Yalnız bu, Dağıtıcı’ nın aradan kalktığı anlamına gelmemektedir. Sadece Yayıncı ve Dağıtıcı’ nın aynı SQL Server üzerinde konuşlandırılacağı anlamına gelir. Sistem, gene aynı şekilde işler. Bu şekilde, merkezde bir SQL Server sunucusu kullanmış olursunuz. Bu da hem donanım, hem de lisans tasarrufu sağlar. Fakat yükün fazla olduğu ortamlarda, Publisher ve Distributor görevlerini ayrı ayrı SQL Server sunucularında gerçekleştirmek kaçınılmazdır.

Bu arada, veri aktarma yöntemi olarak İtme (Push) ve Çekme (Pull) yöntemlerine de bu noktada tekrar değinmek istiyorum. Neden ve neye göre İtme ve Çekme yöntemlerini kullanırız? Nedeni şu, Eğer dağıtım işiyle ilgili Agent’ ın (Yukarıda da bahsettik: Distribution veya Merge Agent) yükünü Distributor’ a yüklemek istiyorsak, Push kullanıyorduk; yani veri Distributor vasıtasıyla Publisher’ dan alınıyor ve Subscriber’ lara doğru itilmek suretiyle gönderiliyoruz. Eğer Distributor görevini ifa eden SQL Server’ daki bu yükü azaltmak istersek, o zaman Pull yöntemini kullanarak bahsini ettiğimiz Ditribution ve Merge Agent’ ın Subcriber’ lar üzerinde çalışmasını sağlıyoruz. Böylece yük sadece bir noktada toplanmamış oluyor, yükü abonelere dağıtıyoruz. Fakat Distributor bu görevi rahatlıkla ifa ediyor ise ve kısa ve orta vadede de geniş çaplı bir büyüme beklenmiyorsa, o zaman bu Agent’ lar Distributor üzerinde çalıştırılabilir; böylece Distribution ve Merge Agent’ larının yükleri güçsüz Abone cihazlarına yüklenmemiş olur.


REPLICATION YÖNTEMLERİ

Bu başlık altında, hangi Replication yönteminin ne işe yaradığını, ne amaçla kullanılabileceğini ve belli başlı özelliklerini anlatacağım.


Snapshot Replication:
Snapshot Replication yönteminde, kaynaktaki veriler olduğu gibi hedefe aktarılır. Kaynak veritabanında yapılan değişiklikler takip edilmez. Yani Snapshot Replication’ da, yapılan değişikliklere göre bir aktarma söz konusu değildir. Snapshot Replication, aşağıdaki durumlar söz konusu olduğunda kullanılmalıdır:

- Veri, nadir olarak değişiyorsa;

- Replication ile aktarılan verilerin güncelliğinin, Publisher’ daki verilere
nazaran eski olması kabul edilebiliyorsa;

- Replication için küçük miktardaki veriler kullanılıyorsa;

- Eğer kısa bir süre içerisinde, çok fazla veri değişikliği
gerçekleştiriliyorsa.

Bu Replication yönteminin kullanılabileceği bir örnek vermek istiyorum. Meselâ bir ürün listeniz var. Ürünleriniz senede bir veya iki kez güncelleniyor ve güncellendiklerinde de ürün listesinin %70’ i veya daha fazlası değişiyor. İşte bu durumda, Snapshot Replication kullanılabilir. Çünkü sürekli bir şekilde veri değişikliği yapılmıyor, ayrıca veri değişikliği yapıldığında da veriler büyük miktarda değişiyor.

Bir örnek daha verelim, meselâ küçük boyutlarda bir tablomuz var. Bu tablomuzun her gece saat 12’ de güncellenmesi gerekiyor. Tablo boyutu küçük olduğundan dolayı ve güncellemenin sürekli veya tam zamanlı değil de, geceden geceye yapılması gerektiğinden dolayı Snapshot Replication bu durum için idealdir.

Eğer veri boyutu büyük olsaydı veya güncellemelerin sürekli takip edilmesi gerekseydi, o zaman Snapshot Replication senaryolarımız için uygun olmayacak ve diğer Replication yöntemlerini düşünecektik.


Transactional Replication:
Transactional Replication, Şema ve verilerin tamamının abonelere gönderilmesiyle başlar. Daha sonra, Publisher’ daki veritabanında yapılacak olan değişiklikler nerdeyse gerçek zamanlı olarak abonelere aktarılır. Publisher’ daki veritabanında yapılan değişiklikler, aynen değişiklik sırasına göre Abone’ lerde de uygulanır. Böylece, veri tutarlılığı garanti edilmiş olur. Transactional Replication, daha ziyade sunucular arası kullanılan bir Replication yöntemidir.

Transactional Replication’ ın kullanımı, aşağıdaki durumlarda uygun olacaktır:

- Eğer Publisher’ da gerçekleşen değişikliklerin, gerçekleşir gerçekleşmez
Subscriber’ lara iletilmesini istiyorsanız;

- Eğer toptan değil de, her veri değişikliğinin tek tek Abone’ de uygulanmasını
istiyorsanız (Örn: Publication’ daki bir tabloda bulunan bir veri, Abonelere
ulaştırılmadan önce 5 kere değişmişse, her değişiklik sırasıyla Abone’ de de
uygulanır. Yani sadece 5nci değişiklik yapılmaz.);

- Eğer Publisher’ da çok sık olarak Insert, Update ve Delete işlemleri
uygulanıyorsa;

- Eğer Publisher veya Subscriber, SQL Server değil de Oracle gibi başka bir
uygulama ise.

Transactional Replication varsayılan olarak tek taraflı çalıştığı için, yani Publisher’ dan Subscriber’ a gönderilen veriler sadece Publisher’ da günellenebildiği için ve Subscriber’ daki veritabanında yapılacak değişikliklerin Publisher’ daki veritabanına bir etki yapmayacağı için Subscriber’ daki verilere Salt Okunur olarak davranılmalıdır. Aksi takdirde, Publisher’ daki verilerle Subscriber’ daki veriler birbirlerini tutmayacaktır.

Transactional Replication’ da, Subscriber’ ların da veri güncellemesi yapabileceği bir biçim vardır. Updatable Subscriptions for Transactional Replication yöntemi kullanılarak, Abone’ lerin de güncelleme yapması ve bu güncellemelerin Publisher’ a da yansıtılması sağlanabilir. Fakat bu yöntem daha ziyade arada sırada değişiklik yapılan Abone’ lerde kullanılmalıdır.

Bir de, SQL Server 2005 ile birlikte gelen yeni bir yöntem olan Peer to Peer Replication yöntemi mevcuttur. Bu yöntem ise her noktadaki bilgilerin aynı olması ve her noktanın hem Publisher hem de Subscriber gibi davranmasını istediğinizde kullanılabilir. Aynı satır, her seferinde sadece bir nokta tarafından değiştirilebilir.


Merge Replication:
Merge Replication da, Transactional Replication gibi tipik olarak Yayın nesnelerinin Şema ve verilerin Abone’ lere gönderilmesiyle başlar. Devamında Publisher’ da ve Subscriber’ da yapılacak Şema ve veri değişiklikleri, Trigger’ lar vasıtasıyla takip edilir. Abone, Yayıncı ile yapacağı veri eşleştirmesini, ağa bağlandıktan sonra yapar; son eşleştirmeden bu yana kendinde (yani Abone’ de) ve Yayıncı’ da yapılan tüm değişiklikler iki tarafa da işlenir ve eşleştirme yapılmış olur. Merge Replication, daha ziyade Sunucu ve İstemci’ ler arası kullanılan bir Replication yöntemidir.

Aşağıdaki koşullar gerçekleştiğinde, Merge Replication’ ı kullanmak avantajlıdır:

- Bir çok Abone’ nin aynı veriyi değişik zamanlarda güncellemesi ve
değişiklikleri Yayıncıya ve diğer Abonelere yapması gerektiğinde;

- Abone’ lerin veriyi alması, veri üstünde çevrimdışıyken değişiklik yapması ve
daha sonra Yayıncı ile diğer Abonelere eşletirme yapması gerektiğinde;

- Her abonenin, verinin farklı bir bölümüne ihtiyaç duyduğu zaman;

- Transactional Replication’ ın aksine, Abone’ de 5 değişiklik yapıldığında,
Yayıncı’ ya sadece beşinci değişikliğin ardından çıkan sonuç gönderilir. Yani
değişiklikleri sayı ile gösterirsek, bir tablonun 4. satırında 5 defa
değişiklik yapıldı diyelim, Transactional Replication’ da, Yayıncı’ ya
bu beş değişiklik de tek tek gönderilirdi; ama Merge Replication’ da, Abone’
de 1., 2., 3., 4. değişiklik yapılır; ama Yayıncı’ ya, kaydın sadece 5.
değişiklik yapılmış hali gönderilir.

Merge Replication yöntemi, değişik noktalara değişik zamanlardayken ve çevrimdışıyken değişiklik yapma şansı verdiği için, aynı veri iki noktada ve aynı zamanda değiştirilmiş olabilir. İki nokta da eşleştirme yapmaya kalktığı zaman, çatışma (Conflict) yaşanacaktır. Bunun da Merge Replication’ da farklı çözümleri bulunmaktadır. Bu makaledeki konumuz çatışmaları kapsamıyor, başka bir makalede değinirim bu konuya da.

Merge Replication’ ı, el terminallerinin, dizüstü bilgisayarların vs. kullanıldığı ortamlarda kullanabiliriz. Meselâ büyük bir firmanın pazarlamacılarının sabah şirketten çıktığını, gündüz el terminalleriyle bakkallardan ve restaurantlardan sipariş aldığını ve akşam da şirkete gelip, el terminallerindeki verileri veritabanına aktardıklarını düşünebiliriz...


Selamlar!
Ekrem Önsoy