Sepetiniz

SQL Server Failover Cluster, Database Mirroring, Always ON,Replication ve Log Shipping Farkları

Bu makaleyi SQL Server’ın HA(High Availability/Yüksek Erişilebilirlik) ve DR(Disaster Recovery/Felaket Kurtarma) için kullanılan teknolojiler arasında seçim yapmanızı kolaylaştırmak açısından yazmak istedim. Kısaca karşılaştırma yapacağımız teknolojileri aşağıda listeledim.

 

  • SQL Server Failover Cluster
  • Database Mirroring
  • Always ON
  • Replication
  • Log Shipping

 

 

SQL Server Failover Cluster:

  • HA için kullanılabilir.
  • Failover Cluster’a dahil olacak sunucuların aynı windows cluster’da olması gerekir.
  • Otomatik failover vardır. Sunucu üzerindeki SQL Servisi durursa failover işlemi otomatik olarak gerçekleşebilir.
  • Disk yedekliliği yoktur. Çünkü veritabanı dosyaları iki sunucunun da görebileceği bir shared disk kullanır.
  • Instance seviyesinde yapılabilir.(Bir veritabanını diğer sunucuya failover edemezsiniz. O instance’daki bütün veritabanları failover olacaktır. Bu yüzden bir DBA için çok pratik olduğu söylenemez)
  • Secondary sunucudan read ya da write yapılamaz.
  • Always ON,Replication ve Log Shipping ile birlikte çalışabilir.

 

Database Mirroring:

  • HA ya da DR çözümü olarak uygulayabilirsiniz. Senkron yaparsanız HA, asenkron yaparsanız DR çözümü olabilir.
  • Veritabanı bazında yapılır. Çok fazla veritabanınız varsa Instance üzerindeki tüm veritabanları üzerinde tek tek yapmanız gerekir. Ama veritabanı bazında failover yapıldığı için daha esnektir.
  • Disk yedekliliği vardır.
  • Witness Server koyarsanız ve senkron olarak set ederseniz otomatik failover gerçekleştirilebilir.
  • Secondary veritabanından read ya da write yapılamaz. Sadece secondary sunucunun snapshot’ını alarak okuma yapabilirsiniz.(“Database Snapshot Nedir ve Nasıl Alınır?” isimli makalemi okumak isteyebilirsiniz)
  • Microsoft’un sonraki sürümlerinde geçerli olmayacak bir teknolojidir. Bu teknolojinin yerine Always ON kullanılabilir.
  • Otomatik page repair var. DBA’lerin korkulu rüyası olan veritabanının suspect mode’a düşmesini engellemek için güzel bir özellik.

 

Always ON:

  • HA ya da DR çözümü olarak uygulayabilirsiniz. Senkron yaparsanız HA, asenkron yaparsanız DR çözümü olabilir.
  • Birden fazla veritabanını bir grup yaparak availability group oluşturabilirsiniz. Database Mirroring’e göre hem daha esnek hemde yönetmesi daha kolaydır. Örneğin bir uygulamanın 7 veritabanı var. Bu 7 veritabanını tek bir availability group’a alabilirsiniz. Kısaca istediğiniz gibi yönetebiliyorsunuz. Database Mirroring’in geliştirişmiş versiyonudur diyebiliriz.
  • Disk yedekliliği vardır.
  • Senkron olarak set ederseniz otomatik failover vardır. Witness server’a ihtiyaç duymaz.
  • Secondary sunucudan Read yapılabilir.
  • Otomatik page repair var. DBA’lerin korkulu rüyası olan veritabanının suspect mode’a düşmesini engellemek için güzel bir özellik.

 

Replication:

  • Replication’ın bir çok teknolojisi var ve herbiri değişik özellikler sunuyor. Bu yüzden Replication’da şu özellik var şu özellik yok demek doğru olmaz. Detaylar için makalenin sonunda vereceğim linklerdeki makaleleri okumanız gerekir. Genellikle HA için kullanılmaz. Ben şu ana kadar hep raporlama amaçlı kullandım.

 

Log Shipping:

  • DR çözümüdür.
  • Veritabanı bazında yapılabilir.
  • Secondary veritabanından Read yapılabilir.
  • Otomatik failover yoktur.

 

Benim favorim Always ON. Management’ı çok kolay. İstediğiniz kadar veritabanını bir Availability Group’a alabiliyorsunuz. Aynı sistemi hem HA hem DR için kullanabiliyorsunuz. Disk yedekliliği var. Secondary’den read yapılabiliyor. Microsoft’tan bir arkadaşımdan duyduğum kadarıyla hem read hem write yapabilmek için çalışmalar yapılıyormuş. Gün içinde bile kimse hissetmeden availability group’larınızı diğer sunucuya failover yapabiliyorsunuz.

 

Veritabanlarını gruplayabildiğiniz için bazı availability group’larınızı 1.sunucudan, bazılarını ise 2.sunucudan çalıştırarak 2 sunucununda kaynaklarından maksimum faydayı elde edebiliyorsunuz.

 

Bahsettiğim tüm bu teknolojilerin detaylarına aşağıdaki makalelerden erişebilirsiniz. Ayrıca aradığınız şeye ulaşmak için sitemizin arama kısmınıda kullanabilirsiniz.

 

Database Mirroring Nedir ve Nasıl Yapılır? Mirroring Hataları ve Çözümleri..“,

SQL Server Always ON AG(Availability Group) Oluşturmak“,

SQL Server Failover Cluster Kurulumu“,

SQL Server Replication Nedir?“,

Transactional Replication Kurulumu“,

Peer to Peer Transactional Replication Kurulumu“,

Snapshot Replication Kurulumu“,

Merge Replication Kurulumu“,

SQL Server Log Shipping Kurulumu

SQL Server Log Shipping Kurulumu

Log Shipping gerekli konfigurasyonlar yapıldıktan sonra veritabanının Transaction Log Backup’ını alarak başka bir sunucuya aktaran ve aktardığımız sunucuda read yapabilmeye olanak sağlayan basit bir teknolojidir. Her adım için arka planda bir job tanımlar.

 

  • Transaction Log Backup’ı alan bir job(primary instance’da oluşur),
  • Alınan log backup’ı secondary sunucuya kopyalayan bir job(secondary instance’da oluşur),
  • Secondary sunucuda kopyalanan backup’ı restore eden bir job(secondary instance’da oluşur),
  • Herhangi bir job’ta sorun ya da gecikme olduğunda alert üreten bir job(monitor server instance’da oluşur. Yazının devamında monitor server instance’a değineceğim.)

 

Yukardaki jobların her birinin bir schedule’ı var. Yani 5 dakikada bir çalışsın,15 dakikada bir çalışsın gibi. Bu süreye bağlı olarak secondary veritabanının ne kadar geriden geleceğini bulabilirsiniz.

 

Veritabanı seviyesinde yapılır. Veritabanının Recovery Model’inin Full olması gerekir.

 

HA(High Availability) seçeneklerinden biri olarak karşımıza çıksa da primary ve secondary sunucu arasında her zaman bir süre farkı olacak. Otomatik fail over modu’da olmadığı için HA için kullanmak çok da mantıklı değil. Ama raporlama amaçlı veritabanı bazında Log Shipping yapabilirsiniz.

 

2 test sunucusu üzerinde bir örnek yaparak konuyu netleştirelim.

 

1.sunucu üzerinde AdventureWorks2014 isimli veritabanını log shipping yöntemi ile 2.sunucu üzerindeki bir instance’a aktaralım.

 

1.sunucu üzerindeki AdventureWorks2014 veritabanına sağ tıklayarak properties diyoruz. Aşağıdaki gibi Transaction Log Shipping sekmesine gelerek Enable this as a primary database in a log shipping configuration’ı tıklıyoruz.

 

 

Ardından Backup Settings’e tıklayarak 1.sunucudan backup alacak job’ın ne kadar sürede bir çalışacağını belirliyoruz. Backup Settings’e tıkladığınızda karşınıza aşağıdaki gibi bir ekran gelecek.

 

Ya network path ile başlayan kısma bir share ismi vermelisiniz ya da if the backup ile başlayan kısma lokal bir path vermelisiniz. Paylaşım verirseniz paylaşım üzerinde, lokal path verirseniz lokal path üzerinde primary instance’ın SQL Server servis hesabının ve SQL Server Agent servis read ve write, Secondary instance’ın SQL Server Agent hesabının read yetkisinin olması gerekiyor. Secondary instance’a da yetki vermemiz gerektiğinden ben paylaşım üzerinden gidiyorum.

 

Delete files older than kısmından kaç saat sonra eski backup’ların silineceğini,

 

Alert if no backup occurs within kısmından da backup alınmamışsa kaç saat sonra alert üreteğini ayarlayabilirsiniz.

 

 

Backup job’ın altından Schedule’a tıklayarak aşağıdaki gibi 15 dakikada bir backup alacak şekilde set ediyoruz. Siz isterseniz bu süreyi uzatabilir ya da kısaltabilirsiniz.

 

 

Backup için schedule’ı ayarladıktan sonra aşağıdaki ekrandan Secondary databases kısmından Add diyoruz.

 

 

Karşımıza gelen ekranda Connect diyerek Secondary veritabanının nereye kopyalanacağını seçiyoruz.  Veritabanı kısmındanda gerekli seçimi aşağıdaki gibi yapıyoruz.

Initilalize Secondary Database sekmesinde;

Do you want the Management Studio to restore… ile başlayan kısımda,

Yes, generate a full backup… ile başlayan kısmı seçersek 1.sunucudan backup alıp ikinci sunucuya restore eder.

Yes, restore an existing backup… ile başlayan kısmı seçersek backup alma işlemini yapmaz ama mevcut backup’ımızı alıp secondary’ye restore eder.

No, the secondary database is initilalize kısmını seçerseniz backup’ı manual olarak secondary sunucuya norecovery mode’da restore etmeniz gerekir.

Biz aşağıdaki gibi ilk seçeneği seçerek Copy Files Sekmesine geçiyoruz.

Copy Files sekmesinde,

 

Destination folder for… ile başlayan kısma secondary sunucudaki lokal bir path’i yazmalısınız. Daha önce oluşturmuş olduğumuz paylaşıma alınan backup dosyaları burada belirttimiz path’e kopyalanacak. Bu path üzerinde sql server servis hesabının ve sql server agent servis hesabının read ve write yetkisinin olması gerekiyor.

 

Delete copied files after yazan kısımda ben 72 saat olacak şekilde bırakıyorum. Kopyalan backup’ların 72 saat sonra silineceği anlamına geliyor.

 

 

Daha sonra aşağıdaki Copy Job kısmının sağ tarafındaki schedule’a tıklayarak aşağıdaki gibi kopyalama işleminin 15 dakikada bir yapılacağını söylüyorum. Siz bu süreyi uzatıp kısaltabilirsiniz.

 

 

Ok’e tıkladıktan sonra bir sonraki sekme olan Restore Transaction Log sekmesine geçiyoruz.

 

No recovery mode’u seçersek 1.sunucudan aldığı backup’ı 2.sunucuya restore ederken norecovery mode’da restore eder. Yani 2.sunucudan okuma işlemi yapılamaz.

 

Standby mode’u seçersek 2.sunucudan okuma yapılabilir. Bu mode’u seçersek hemen altında bir seçenek daha çıkar.

 

Disconnect users in the database when restoring backups: bu seçeneği seçersek 2.sunucuya restore yapılmadan önce veritabanına bağlı bir kullanıcı varsa o kullanıcının bağlantısını koparır ve restore’u gerçekleştirir. Biz aşağıdaki gibi bu seçeneği seçiyoruz.

 

 

Yukardaki resmin alt tarafında görünen Restore Job kısmının sağ tarafındaki Schedule’a tıklayarak aşağıdaki gibi kopyalanmış backup’ların secondary sunucuya restore edilmesi için gerekli job’ı schedule ediyoruz. Ben 15 dakikada bir restore yapacak şekilde ayarladım. Siz isterseniz bu süreyide uzatıp kısaltabilirsiniz.

 

 

Bu işlemde bittikten sonra secondary database settings’teki ayarlar bitmiş oluyor ve ok’e tıklıyoruz.

 

Ok’e tıkladıktan sonra Database Properties’e geri dönüyoruz ve aşağıdaki gibi Use a monitor server instance’a tıklıyoruz ve ardından settings diyoruz. Aslında Monitor server’ın ayarlarını yapmadan ne işe yaracağından bahsedeyim. Eğer Log Shipping de bir sıkıntı varsa, yani backup job’ı, copy job’ı ya da restore job’ında bir problem varsa problem olduğu ile ilgili alert üretir.

 

 

Settings’e tıkladıktan sonra aşağıdaki gibi bir ekran gelecek. Monitor Server instance’ın yanındaki connect’e tıklayarak Log Shipping ‘de bir sorun olup olmadığını izleyecek instance’ı yani monitor server’ı seçiyoruz. Bu iki instance’ınız dışında başka bir instance’ınız varsa o instance’ı seçmenizde fayda var. Çünkü, 1. instance’ımızı monitor server yaptığımızı düşünelim. 1.instance kapansa ve backup  ya da  copy job’ı çalışmasa alert te üretilemeyecek. Çünkü monitor server olarak ta 1.instance’ı seçtik. Bu yüzden 3.bir instance seçmenizi tavsiye ederim.

Monitor server instance üzerinde Backup, copy ve restore job’ını monitor edecek bir kullanıcı girmemiz gerekiyor.

By impersonating the proxy… ile başlayan kısmı seçersek monitor server instance’ın SQL Server Agent servis hesabını seçmiş oluruz.

Use the following SQL Server Login diyerek SQL Login ve şifre girişi de yapabilirsiniz. Biz ilk seçeneği seçerek monitor server instance’ın sql server agent servisinin bu işi yapmasını tercih ettik.

Monitor işlemini yapacak kullanıcının primary ve secondary instance üzerinde sysadmin yetkisinin olması gerekiyor. Ben yukarda belirttiğim gibi By impersonating the proxy… ile başlayan kısmı seçtiğim için Monitor Server Instance’ın SQL Server Agent servis hesabını, Primary ve Secondary instance üzerinde sysadmin yaptım.

Bütün işlemleri tamamlayıp ok’e tıkladığımızda aşağıdaki gibi bir ekran gelmesi gerekir.

 

 

1.sunucudaki backup job’ını manual olarak çalıştırıyorum. Bu job tamamlandıktan sonra 2.sunucudaki copy job’ını manual olarak çalıştırıyorum. Bu job’da bittikten sonra 2.sunucudaki restore job’ını çalışıtırıyorum. Konfigurasyon doğru yapıldıysa bu 3 job’ta çalışacaktır. Bu şekilde konfigurasyonu doğru yaptığımı test etmiş oluyorum.

 

Log Shipping’in mevcut durumunu görmek için 2.instance üzerine sağ tıklayarak aşaıdaki gibi Connect->Reports->Standart Reports-> Transaction Log Shipping Status diyebilirsiniz.

 

Merge Replication Kurulumu

Merge Replication birden fazla sunucu üzerinden aynı  tablo üzerinde update yapmak isteyen uygulamalar için geliştirilmiş bir teknolojidir. Yani Publisher ve Subscriber’lar replike edilmiş datayı update edebilirler. Peer To Peer Transactional Replication da aynı işi yapıyor dediğinizi duyar gibiyim. Peer To Peer Transactional Replication, Transacational Replication’ın altyapısını kullanıyor. Bu yüzden conflictleri yönetmek daha zor. Merge Replication bu amaçla geliştirildiği için; Microsoft’un ifadesiyle karmaşık bir conflict dedection ve resolution gerektiren bir uygulamanız varsa Peer To Peer Transactional Replication yerine Merge Replication kullanın.

Örneğin bir telekom şirketinin tüm Türkiye de bayileri var ve bu bayilerin yaptığı tüm işlemler tek bir veritabanında toplanmak istiyor. Bu telekom şirketi için Merge Replication kurup her bayiyi bir üye yapabiliriz. Her bayinin kendi lokalindeki veritabanında yaptığı değişikliklerin diğerlerine de yansıması sağlanmış olacaktır.

Bir örnek üzerinden giderek konuyu daha net anlamaya çalışalım. 2 sunucu üzerinde Merge Replication kurulumu yapacağız. Merge Replication, Snapshot Agent ve Merge Agent ile çalışır. Diğer Replication tiplerinde kullandığımız Distribution Agent’ı kullanmayacağız.

Diğer replication tiplerinin detaylarını öğrenmek için sitemizin arama kısmına replication yazabilirsiniz.

İlk olarak publisher ve bütün subscriber’larda AdventureWorks2014 veritabanında aşağıdaki script yardımıyla replike edeceğimiz tabloyu oluşturalım.

USE [AdventureWorks2014]
GO
CREATE TABLE [dbo].[MergeReplication](
[ID] [int] IDENTITY(1,1) NOT NULL,
[Ad] [varchar](200) NULL,
 CONSTRAINT [PK_MergeReplication] PRIMARY KEY CLUSTERED
(
[ID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO

Bir sonraki adımda Publication’ı oluşturacağız. 1.Sunucu  üzerindeki instance’a giderek aşağıdaki gibi Local Publications’a sağ tıklayarak New Publication diyoruz.

Gelen ekranda aşağıdaki gibi publication’ı oluşturduğumuz sunucunun Distributor olarak davranacağını söylüyor. Sizde daha önce distributor veritabanı varsa bu ekran gelmeyecektir. Distributor’u publication’ı oluşturduğumuz sunucuda kurmak istediğimiz için aşağıdaki gibi seçim yaparak ilerliyoruz.

 

 

Bir sonraki ekranda aşağıdaki gibi ilk snapshot’ı diğer sunucudaki aboneye ya da abonelere aktarmak için kullanılacak paylaşım bilgisini giriyoruz.

 

 

Gelen ekranda aşağıdaki gibi replike edeceğimiz veritabanını seçiyoruz.

 

 

Gelen ekranda aşağıdaki gibi Merge Publication’ı seçerek Next diyoruz.

 

 

Bir sonraki ekranda aşağıdaki gibi üye tiplerini belirliyoruz. Biz kuracağımız publication’a bağlı olacak tüm üyelerin SQL Server 2008 ve sonrası olacağını belirttik. Aslında iki instance’ımız olacak ve ikiside SQL Server 2014.

 

 

Bir sonraki ekranda Replike edeceğim article’ların arasından başlangıçta oluşturduğum tabloyu seçerek next diyorum.

 

 

Bir sonraki ekranda aşağıdaki gibi publish edeceğimiz tabloya uniqueidentifier veri tipine sahip bir kolon ekleyeceğini, bu kolon üzerinde unique index oluşturacağını ve kolonun ROWGUIDCOL(kolona otomatik olarak yeni bir guid değeri verilmesi ) özelliğinde olacağını söylüyor.

 

 

Bir sonraki ekranda bize tablonun tamamını değil de belli bir filtreye göre filtrelenmiş halini aktarmak istersek bu kolaylığı sağlayan ekran geliyor. Aşağıdaki ekrandan Add diyerek istediğimiz filtreyi ekleyip tablonun belli bir kısmını replike edebiliriz. Biz şu anda herhangi bir filtreleme yapmadan next diyerek ilerliyoruz.

 

 

Bir sonraki ekranda verilerin snapshot’ının şimdi mi yoksa daha sonra mı alınacağını soruyor.  Diğer replication tiplerinden farklı olarak Schedule the Snapshot Agent to run at the following times kısmı da seçili geldi. Buradaki tik’i kaldırıyoruz. Aşağıdaki gibi Create a snapshot immediately and keep the snapshot available to initialize subscription’ı seçerek, snapshot’ın şimdi alınmasını istediğimizi söylüyor ve next diyerek ilerlemeye devam ediyoruz.

Bir sonraki ekranda aşağıdaki gibi Snapshot Agent’ın çalışacağı kullanıcı bilgisini soruyor. Security Settings’e tıklıyoruz.

 

 

Snapshot Agent için set edeceğiniz kullanıcının minimum hakları:

  • Distribution veritabanında db_owner olmalı.
  • Publication yapılacak veritabanında db_owner olmalı.
  • Snapshot paylaşımında write hakkı olmalı.

 

Microsoft bu  hesap için Windows Account set etmemizi öneriyor.

Benim kendi test ortamımda iki sql server instance’ı ve iki sql server agent instance’ı da aynı windows sql server servis hesabını kullanıyor ve gerekli yetkileri var. Snapshot paylaşımı üzerinde de bu kullanıcıyı daha önce yetkilendirdim. Bu yüzden aşağıdaki gibi set ederek ilerliyorum.

Bir sonraki ekranda aşağıdaki gibi Create the publication seçili iken next  diyerek ilerliyoruz.

Gelen ekranda Publication’a bir isim veriyoruz ve finish diyerek publication kurulumunu tamamlıyoruz.

 

 

Kurulum tamamlandıktan sonra aşağıdaki şekilde publication’ın sağlıklı bir şekilde çalıştığını test edebilirsiniz.

 

 

View Snapshot Agent Status dediğinizde aşağıdaki gibi bir ekran gelmeli.

 

 

Publication kurulumu bittikten sonra subscriber kuracağımız sunucuya gidiyoruz.

 

Aşağıdaki gibi Local Subscriptions’a sağ tıklayarak New Subscriptions diyoruz.

 

 

Gelen ekranda aşağıdaki gibi Publisher kısmından Publisher’ı tanımladığımız instance’ı seçiyoruz ve oluşturduğumuz MergePublication’ı seçerek next diyoruz.

 

 

Bir sonraki ekranda Merge Agent’ın çalışacağı sunucuyu soruyor. Yani push subscriptions mı olacak yoksa pull subscriptions mı olacak? Bu konuda daha detaylı bilgi için “SQL Server Replication Nedir?” isimli makalemi okuyabilirsiniz. Diğer replication tipleri için sitemizin arama kısmına Replication yazarak bilgi edinebilirsiniz.

 

 

Bir sonraki ekranda aşağıdaki gibi replike edeceğimiz tabloları hangi instance’taki hangi veritabanına replike edeceğimizi soruyor. Add Subscriber diyerek 2.sunucumuzdaki instance’ımızı seçiyoruz. Veritabanı olarak ta 2.sunucudaki instance’daki AdventureWorks2014’ü seçiyoruz.

 

 

Bir sonraki ekranda MergeAgent ‘ın kullanacağı kullanıcıyı set edeceğiz. Agent for Subscriber’ın altında Subscriber’ı oluşturacağınız instance’ın adının yazması lazım. Sağ taraftaki …. Ya tıklıyoruz.

 

 

Ben SQL Server Agent hesabını kullanacağım için aşağıdaki gibi set ettim.

 

 

Merge Agent için set edeceğiniz kullanıcının minimum hakları:

 

  • Distribution veritabanında db_owner olmalı.
  • Pull Subscription kullanılacaksa, subscription(hangi veritabanına replike edeceksek o veritabanı) veritabanında db_owner olmalı.
  • Publication veritabanında public yetkisi olmalı.
  • Snapshot paylaşımında read hakkı olmalı.
  • Publication Access List(PAL)’ın bir üyesi olmalı.

 

Set edeceğiniz kullanıcıyı PAL’a üye yapmak için Publisher’ın olduğu instance’ta publication’a gelip sağ tıklayarak properties diyoruz.

 

 

Açılan ekranda aşağıdaki gibi Publication Access List’e giderek listelenen kullanıcılar arasında kendi kullanıcımızın olup olmadığına bakıyoruz.

 

 

Eğer yoksa Add diyerek ekliyoruz. Eğer kullanıcımız Add dediğimizde çıkmazsa aşağıdaki gibi bir uyarı verecektir.

 

 

Uyarıda, kullanıcının burada listelenmesi için Publisher ve Distributor instance’ında tanımlı olmasına ve replike edeceğimiz AdventureWorks2014 veritabanına erişiminin olması gerektiğini söylüyor. Eğer kullanıcınız burada yoksa publisher ve distributor’un olduğu instance üzerinde kullanıcınızı tanımlayıp AdventureWorks2014 üzerinde de yetkilendirmeniz gerekir.

 

Subscription kurulumumuza geri dönersek Merge Agent Security için yukarda anlattığımız gibi işlemlerimizi tamamlayıp next diyerek ilerliyoruz.

 

Bir sonraki ekranda senkronizasyonun nasıl olacağını soruyor.

 

Run continuousluy seçersek sürekli olarak senkronize olur ve gerçek zamanlıya yakın bir kopyamız olur.

Run on demand only seçersek sadece tetiklediğimizde çalışır.

Define schedule seçersek belirli zaman aralıklarıyla düzenli olarak çalışmasını sağlarız.

 

 

Biz sürekli replike etmesini istediğimiz için Run continuously’yi seçiyoruz.

 

Bir sonraki ekranda, subscriber’a(asıl veritabanını replike edeceğimi veritabanı. Bizim örneğimizde ReplikeTest isminde oluşturduk.) hemen verileri aktarmak için Immediately’yi seçerek next diyoruz.

 

 

Bir sonraki ekranda Subscription Type’ı ve Priority for Conclict Resolution’ı ayarlayacağız. Merge Replication kullanıyorsanız conflictlerin nasıl çözüleceğini belirlemek için başlangıçta yapılaması gereken bir ayar. Subscription’ı oluşturduktan sonra Subscription Type’ı değiştiremiyorsunuz. Bu yüzden ne işe yaradığını anlayıp ihtiyaca göre konfigure etmeniz gerekir.

 

İki adet Subscription Type var.

 

Server

Farklı Subscriber’ların farklı önceliği olmasını istiyorsanız Server seçebilirsiniz. Örneğin ben 2.sunucu için Subscription Type’ı aşağıdaki gibi Server seçmişim ve Priority for Conflict Resolution(conflict oluştuğundaki öncelik yüzdesi) olarak ta 75.00 set ettim. Üçüncü bir sunucuya başka bir subscriber oluşturduğumuzu varsayalım ve subscription type olarak yine server seçelim. Priority for Conflict Resolution’ı da 60.00 set edelim. İkinci sunucudaki subscriber ve üçüncü sunucudaki subscriber bir conflict yaşadığında ikinci sunucunun önceliği daha yüksek olduğu için ikinci sunucudaki subscriber’ın yaptığı işlem geçerli olacak.

 

Veriyi diğer subscriber’lara yeniden yayınlayabilir.

Client

Conflict dedection(subscriber’lar arasında aynı veriyi update etmeye çalışma sonucu çakışma) bu subscribtion type’da da var fakat Server subscription type’ında ki gibi subscriber’lara öncelik veremiyorsunuz. Default olarak priority 0.00 olarak geliyor.

 

Bütün subscriber’ların aynı önceliğe sahip olmasını istiyorsanız ve publish’in yapıldığı 1.instance’ın conflict durumunda her zaman kazandığı bir senaryo istiyorsanız set edebilirsiniz. Bir çok senaryoda Client kullanılabilir.

 

 

Subscription type’larının yukarda anlattığım detaylarından yola çıkarak Client kullanmayı tercih edebilirsiniz. Bizde kurulumumuzda Client Subscription type’ı kullanarak devam edelim.

 

 

Bir sonraki ekranda aşağıdaki gibi Create the subscription(s) seçili haldeyken next diyoruz ve Finish diyerek işlemi tamamlıyoruz.

 

 

 

Snapshot Replication Kurulumu

Snapshot teknolojisi diğer replication tiplerinde ilk senkronizasyon esnasında kullanılır. Aşağıda replication türleri ile ilgili diğer makalelerimi bulabilirsiniz.

Transactional Replication Kurulumu“,

Peer to Peer Transactional Replication Kurulumu“,

Merge Replication Kurulumu

 

Snapshot Replication ile verinin o anki kopyası diğer node’a aktarılır ve herhangi bir değişiklik daha sonra 2.sunucuya/instance’a replike edilmez. Senkronizasyon yeniden çalıştığında tekrar tüm veri aktarılır. Her seferinde bu şekilde döngü devam eder. Küçük tablolar’ın düzenli olarak başka bir instance’a aktarılması gereken durumlarda kullanmak mantıklı olacaktır.

Adım adım snapshot replication’ı gerçekleştirelim.

Eğer 1.sunucuda distributor’u yapılandırmadıysanız aşağıda anlatacağımız şekilde bu işlemi gerçekleştirebilirsiniz. Eğer distributor’u daha önce yapılandırdıysanız aşağıdaki kısmı atlayıp publication tanımladığımız kısma geçebilirsiniz.

İlk olarak AdventureWorks2014 veritabanında aşağıdaki script yardımıyla replike edeceğimiz tabloyu oluşturalım.

USE [AdventureWorks2014]
GO
CREATE TABLE [dbo].[SnapshotReplication](
[ID] [int] IDENTITY(1,1) NOT FOR REPLICATION NOT NULL,
[Ad] [varchar](200) NULL,
 CONSTRAINT [PK_SnapshotReplication] PRIMARY KEY CLUSTERED
(
[ID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

Daha sonra aşağıdaki gibi Configure Distribution diyoruz.

Gelen ekranda Do not show this page again’i tıklayarak next diyoruz.

 

Bir sonraki ekranda aşağıdaki gibi seçim yaparak Distributor’ü kurulum yaptığımız sunucuda oluşturuyoruz. Arka planda distribution veritabanıda oluşacak. Next diyerek ilerliyoruz.

 

 

Bir sonraki ekranda snapshot dosyalarının tutulacağı bir paylaşım istiyor. “Paylaşım Tanımlamak ve Tanımladığımız Paylaşımı SQL Server’ın olduğu sunucuya Map Etmek” isimli makalemde nasıl paylaşım oluşturacağımızı anlattım. Paylaşıma iki instance’ın kullandığı sql server agent servis hesabını ve kurulum yaptığınız kullanıcıyı eklemeniz gerekir. SQL Server Agent servis hesapları windows account olmalıdır. Lokal bir kullanıcı olursa paylaşımı göremez.

 

Ben aşağıdaki gibi Sunucu1 üzerinde Replication isimli bir klasör oluşturup gerekli yetkileri verdim ve Snapshot folder olarak paylaşım adresini yazdım. Next diyerek ilerliyoruz.

 

 

Bir sonraki ekranda aşağıdaki gibi distribution veritabanının data ve log dosyalarının hangi path’lerde tutulacağı bilgilerini girip next diyerek ilerliyoruz.

 

 

Bir sonraki ekranda bu distribution veritabanının hangi Publisher’ın kullanacağını belirliyoruz. Biz Publisher ve distributor’ın aynı instance üzerinde kuracağımız için aynı instance’ı seçili bırakıp next diyerek ilerliyoruz.

 

 

Bir sonraki ekranda aşağıdaki gibi Configure Distribution seçili iken next ve Finish diyerek distributor yapılandırmasını tamamlıyoruz.

 

 

Kurulum tamamlandıktan sonra aşağıdaki gibi sistem veritabanlarının içinde distribution veritabanını görmeniz gerekir.

 

 

Distributor yapılandırmamız bittikten sonra 1.instace’da aşağıdaki gibi Local Publications’a sağ tıklayarak New Publication diyoruz.

 

 

Gelen ekranda aşağıdaki gibi replike edeceğimiz veritabanını seçiyoruz.

 

 

Gelen ekranda aşağıdaki gibi Snapshot publication’ı seçerek Next diyoruz.

 

 

Bir sonraki ekranda Replike edeceğim article’ların arasından başlangıçta oluşturduğum tabloyu seçerek next diyorum.

 

 

Bir sonraki ekranda bize tablonun tamamını değil de belli bir filtreye göre filtrelenmiş halini aktarmak istersek bu kolaylığı sağlayan ekran geliyor. Aşağıdaki ekrandan Add diyerek istediğimiz filtreyi ekleyip tablonun belli bir kısmını replike edebiliriz. Biz şu anda herhangi bir filtreleme yapmadan next diyerek ilerliyoruz.

 

 

Bir sonraki ekranda verilerin snapshot’ının şimdi mi yoksa daha sonra mı alınacağını soruyor. Aşağıdaki gibi Create a snapshot immediately and keep the snapshot available to initialize subscription’ı seçerek, snapshot’ın şimdi alınmasını istediğimizi söylüyor ve next diyerek ilerlemeye devam ediyoruz.

 

 

Bir sonraki ekranda aşağıdaki gibi Snapshot Agent’ın çalışacağı kullanıcı bilgisini soruyor. Security Settings’e tıklıyoruz.

 

 

Snapshot Agent için set edeceğiniz kullanıcının minimum hakları:

  • Distribution veritabanında db_owner olmalı.
  • Publication yapılacak veritabanında db_owner olmalı.
  • Snapshot paylaşımında write hakkı olmalı.

Microsoft bu  hesap için Windows Account set etmemizi öneriyor.

Benim kendi test ortamımda iki sql server instance’ı ve iki sql server agent instance’ı da aynı windows sql server servis hesabını kullanıyor ve gerekli yetkileri var. Snapshot paylaşımı üzerinde de bu kullanıcıyı daha önce yetkilendirdim. Bu yüzden aşağıdaki gibi set ederek ilerliyorum.

Bir sonraki ekranda aşağıdaki gibi Create the publication seçili iken next  diyerek ilerliyoruz.

Gelen ekranda Publication’a bir isim veriyoruz ve finish diyerek publication kurulumunu tamamlıyoruz.

 

 

Publication’ı tanımladıktan sonra 1.instance üzerinde aşağıdaki gibi New Subscriptions diyoruz.

 

 

Gelen ekranda aşağıdaki gibi biraz önce tanımladığımız SnapshotPublication’ı seçip next diyoruz.

 

 

Bir sonraki ekranda subcriptions’a verilerin nasıl geleceğini soruyor. Yani veriler Distributor’den subcscriber’lara mı aktarılacak yoksa subscriberlar distributor’dan mı veriyi alacaklar. Bu yöntemler Push ya da Pull Subscription olarak geçiyor. “SQL Server Replication Nedir?” isimli makalemi okuduysanız oradaki örnekten devam edersek  Stok takip personeli gazeteleri abonelere kendimi dağıtacak yoksa aboneler gazete deposuna gelip gazateyi kendimi alacak sorusudur diyebiliriz.

Microsoft aşağıdaki ekranda görüldüğü gibi yönetimin kolay olması için stok takip personelinin biraz yorulmasını tercih edebilirsiniz diyor. Bizde yönetimin kolay olması için push subscriptions’ı seçerek Distrubution agent Location’ı Distributor’un bulunduğu instance’ta çalışacak şekilde set ediyoruz ve next diyerek ilerliyoruz.

Bir sonraki ekranda Subscriber olarak 1.instance gelecektir.

 

 

Biz 2.sunucunun subscriber olmasını istediğimiz için Add Subscriber diyerek 2.instance’ı ekleyerek aşağıdaki gibi seçimimizi yapıyoruz.

 

 

Bir sonraki ekranda Distribution Agent’ın hangi kullanıcı ile çalışacağını soruyor. Aşağıdaki resimde gördüğünüz ….’ya tıklıyoruz.

 

 

Distribution Agent için set edeceğiniz kullanıcının minimum hakları:

 

  • Distribution veritabanında db_owner olmalı.
  • Pull Subscription kullanılacaksa subscription(hangi veritabanına replike edeceksek o veritabanı) veritabanında db_owner olmalı.
  • Snapshot paylaşımında read hakkı olmalı.
  • Publication Access List(PAL)’ın bir üyesi olmalı.

 

Set edeceğiniz kullanıcıyı PAL’a üye yapmak için Publisher’ın olduğu instance’ta publication’a gelip sağ tıklayarak properties diyoruz.

 

Açılan ekranda aşağıdaki gibi Publication Access List’e giderek listelenen kullanıcılar arasında kendi kullanıcımızın olup olmadığına bakıyoruz.

 

 

Eğer yoksa Add diyerek ekliyoruz. Eğer kullanıcımız Add dediğimizde çıkmazsa aşağıdaki gibi bir uyarı verecektir.

 

 

Uyarıda, kullanıcının burada listelenmesi için Publisher ve Distributor instance’ında tanımlı olmasına ve replike edeceğimiz AdventureWorks2014 veritabanına erişiminin olması gerektiğini söylüyor. Eğer kullanıcınız burada yoksa publisher ve distributor’un olduğu instance üzerinde kullanıcınızı tanımlayıp AdventureWorks2014 üzerinde de yetkilendirmeniz gerekir.

 

Distribution Agent Security’ye geri dönersek, ben Run under the SQL Server Agent service account’u ve By impersonating the process account’u seçerek ilerliyorum. Tabi SQL Server Agent Servis hesabıma gerekli yetkileri verdim.

 

 

Bir sonraki ekranda senkronizasyonun nasıl olacağını soruyor.

 

Run continuousluy seçersek sürekli olarak senkronize olur ve gerçek zamanlıya yakın bir kopyamız olur.

Run on demand only seçersek sadece tetiklediğimizde çalışır.

Define schedule seçersek belirli zaman aralıklarıyla düzenli olarak çalışmasını sağlarız.

 

 

Biz günde 1 defa replike etmesini istediğimiz için Define schedule diyerek günde 1 defa çalışacak şekilde aşağıdaki gibi ayarlıyoruz.

 

 

Bir sonraki ekranda, subscriber’a(asıl veritabanını replike edeceğimiz veritabanı,yani 2.instance’daki AdventureWorks2014) hemen verileri aktarmak için Immediately’yi seçerek next diyoruz.

 

 

Bir sonraki ekranda aşağıdaki gibi Create the subscription(s) seçili haldeyken next diyoruz ve Finish diyerek işlemi tamamlıyoruz.

 

 

Next ve finish diyerek işlemi tamamlıyoruz. Artık günde 1 kere çalışan job’ımız 1.Instance’daki AdventureWorks2014 veirtabanındaki SnapshotReplication tablosunu 2.Instance’daki AdventureWorks2014 veritabanına aktaracak. Makalenin başında da bahsettiğimiz gibi gün içinde oluşan fark dataları değil tüm tabloyu aktaracak. Herhangi bir zaman da manual olarak snapshot’ın çalışmasını istiyorsanız SSMS üzerinden aşağıdaki gibi SnapshotPublication’a sağ tıklayarak Reinitialize All Subscriptions diyebilirsiniz.

 

 

Açılan ekranda aşağıdaki seçimleri yaparak Mark For Reinitialization diyoruz. Bir süre sonra işlem tamamlanacaktır ve verilerin 2.instance üzerine yansıdığınız görebileceğiz.

 

 

Peer to Peer Transactional Replication Kurulumu

Transactional Replication’ın teknolojisini kullanır. Fark olarak her subscriber aynı zamanda publisher’dır. “Transactional Replication Kurulumu” isimli makalemi okuyabilirsiniz. Bir örnek ile kurulumunu yaparak mantığını anlamaya çalışalım.

Transactional Replication kurulumu ile çok benzer bir kurulum yapacağız. Kurulumdaki en önemli farklardan biri her subscriber’da distributor olması gerektiğidir. “Transactional Replication Kurulumu” isimli makalemde 1.sunucuda Distributor’u yapılandırmıştık. Örneği aynı instance üzerinde yapacağım için 1.sunucuda aynı işlemi tekrar yapmama gerek yok. 2. sunucuda distributor’u aşağıdaki şekilde yapılandıralım. Eğer 1.sunucuda distributor’u yapılandırmadıysanız aşağıda anlatacağımız şekilde her iki sunucuda da bu işlemi gerçekleştirebilirsiniz.

İlk olarak AdventureWorks2014 veritabanında aşağıdaki script yardımıyla replike edeceğimiz tabloyu oluşturalım.

USE [AdventureWorks2014]
GO
CREATE TABLE [dbo].[PeerToPeer](
[ID] [int] IDENTITY(1,1) NOT NULL,
[Ad] [varchar](200) NULL,
 CONSTRAINT [PK_PeerToPeer] PRIMARY KEY CLUSTERED
(
[ID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO

Aşağıdaki gibi Configure Distribution diyoruz.

 

Gelen ekranda Do not show this page again’i tıklayarak next diyoruz.

 

Bir sonraki ekranda aşağıdaki gibi seçim yaparak Distributor’ü kurulum yaptığımız sunucuda oluşturuyoruz. Arka planda distribution veritabanıda oluşacak. Next diyerek ilerliyoruz.

 

 

Bir sonraki ekranda snapshot dosyalarının tutulacağı bir paylaşım istiyor. “Paylaşım Tanımlamak ve Tanımladığımız Paylaşımı SQL Server’ın olduğu sunucuya Map Etmek” isimli makalemde nasıl paylaşım oluşturacağımızı anlattım. Paylaşıma iki instance’ın kullandığı sql server agent servis hesabını ve kurulum yaptığınız kullanıcıyı eklemeniz gerekir. SQL Server Agent servis hesapları windows account olmalıdır. Lokal bir kullanıcı olursa paylaşımı göremez.

 

Ben aşağıdaki gibi Sunucu1 üzerinde Replication isimli bir klasör oluşturup gerekli yetkileri verdim ve Snapshot folder olarak paylaşım adresini yazdım. Next diyerek ilerliyoruz.

 

 

Bir sonraki ekranda aşağıdaki gibi distribution veritabanının data ve log dosyalarının hangi path’lerde tutulacağı bilgilerini girip next diyerek ilerliyoruz.

 

 

Bir sonraki ekranda bu distribution veritabanının hangi Publisher’ın kullanacağını belirliyoruz. Biz Publisher ve distributor’ın aynı instance üzerinde kuracağımız için aynı instance’ı seçili bırakıp next diyerek ilerliyoruz.

 

 

Bir sonraki ekranda aşağıdaki gibi Configure Distribution seçili iken next ve Finish diyerek distributor yapılandırmasını tamamlıyoruz.

 

 

Kurulum tamamlandıktan sonra aşağıdaki gibi sistem veritabanlarının içinde distribution veritabanını görmeniz gerekir.

 

 

Distributor yapılandırmamız bittikten sonra 1.instace’a geçerek aşağıdaki gibi Local Publications’a sağ tıklayarak New Publication diyoruz.

 

 

Gelen ekranda aşağıdaki gibi replike edeceğimiz veritabanını seçiyoruz.

 

 

Gelen ekranda aşağıdaki gibi Peer-to-Peer Publication’ı seçerek Next diyoruz.

 

 

Bir sonraki ekranda Replike edeceğim article’ların arasından başlangıçta oluşturduğum tabloyu seçerek next diyorum.

 

 

Bir sonraki ekranda aşağıdaki gibi Create the publication seçili iken next  diyerek ilerliyoruz.

Bir sonraki ekranda aşağıdaki gibi Log Reader Agent’ın hangi servis hesabı ile çalışacağını set edeceğiz.

Security Settings’e tıklayoruz.

 

Benim kendi test ortamımda iki sql server servis’i,iki sql agent servisi de aynı windows hesabını kullanıyor ve gerekli yetkileri var. Snapshot paylaşımı üzerinde de bu kullanıcıyı daha önce yetkilendirdim. Bu yüzden aşağıdaki gibi set ederek ilerliyorum.

 

 

Log Reader Agent için set edeceğiniz kullanıcının minimum hakları:(Benim test kurulumumda sql server servis hesabı ve sql server agent servis hesabı için kullandığım kullanıcıya aşağıdaki hakları verdim.)

 

  • Distribution veritabanında db_owner olmalı.
  • Publication yapılacak veritabanında db_owner olmalı.

 

Microsoft bu hesap için Windows Account set etmemizi öneriyor.

 

 

Gelen ekranda Publication’a PeerToPeerPublication ismini veriyoruz ve finish diyerek publication kurulumunu tamamlıyoruz.

 

Transactional Replication’dan farklı olarak Snapshot Agent’ı yapılandırmadık ve filtreleme yapmadık. Filtreleme Peer To Peer Transactional Replication’da desteklenmiyor. 1.sunucudan 2.sunucuya olan aktarımıda backup restore yöntemi ile yapıyoruz. Restore sonrasında replike etmeyeceğiniz tabloları 2.sunucudan silmelisiniz.

 

Publication kurulumu yaptık. Daha sonra restore işlemini gerçekleştirdik.

 

Bazen subscriber’daki veritabanını silip replication’ı yeniden yapılandırmak isteyebilirsiniz. Böyle bir durumda aşağıdaki gibi hata alırsınız.

 

Cannot drop the database X because it is being used for replication.

 

1.sunucudan yeni backup alıp overwrite ederek restore ederseniz sorun çözülecektir.

 

Şimdi aşağıdaki gibi oluşan publication’a sağ tıklayarak Configure Peer-To-Peer Topology… seçeneğini seçiyoruz.

 

 

Açılan ekranda aşağıdaki gibi 1.instance’ı seçiyoruz.

 

 

Gelen ekranda aşağıdaki gibi Add Node diyoruz.

 

 

Açılan ekranda aşağıdaki seçimleri yapıyoruz. Biz Push Subcriptions’ı seçtik. Pull ve Push Subscriptions ile ilgili detayı “Transactional Replication Kurulumu” isimli makalemizde bulabilirsiniz. Next diyerek ilerliyoruz.

 

 

Bir sonraki ekranda 2.instance’daki Log Reader Agent’ın kullanıcı hesaplarını soruyor. 2.instance normalde subscriber ama Peer-To-Peer Replication’da her subscriber aynı zamanda publisher olduğu için bu bilgileri doldurmamızı istiyor. Buraya gireceğimiz kullanıcı hesabı için makalenin başında anlattığımız Log Reader Agent için set edeceğiniz kullanıcının minimum haklarını vermelisiniz.  Aşağıdaki ekranda sağ taraftaki …. Ya tıklayarak ilgili kullanıcı seçimimizi yapıyoruz.

Biz iki instance üzerinde de aynı windows account’u kullanıyoruz ve bu account’a belirttiğimiz yetkileri daha önce verdik. Bu yüzden aşağıdaki gibi  bir seçim yapıyoruz.

Ok’e tıkladıktan sonra aşağıdaki gibi bir ekran gelecektir. Use the first peer’s security settings for all others peers’i seçerek bütün replike olacak node’lar için aynı güvenlik ayarını kullanabilirsiniz.

 

 

Bir sonraki ekranda her iki instance üzerindeki subscription’lar için gerekli güvenlik ayarlarını yapmamız gerekiyor. Yukarda anlattığım şekilde sağ taraftaki …. Üzerine tıklayarak Run under the SQL Server agent service account..’u seçerek devam ediyoruz.

 

 

Gerekli seçimleri yaptıktan sonra aşağıdaki gibi bir ekran gelmeli.

 

 

Bir sonraki ekranda I restored a backup of the original publication database… ile başlayan kısmı seçiyoum ve 1.instance’dan 2.instance’a veritabanını backup restore yöntemiyle aktarırken aldığım backup’ın path’ini gösteriyorum.

 

 

Kurulumumuz bu şekilde tamamlanmış oluyor. 1.Sunucudaki tabloya bir kayıt eklediğinizde 2. sunucuda görebileceksiniz. 2.sunucuda bu kaydı update ettiğinizde ise değişikliklerin 1.sunucudaki tabloya yansıdığını fark edeceksiniz. Aynı anda 1.sunucu ve 2.sunucu aynı satırı update etmeye çalışırsa conflict olacaktır. Oluşan conflictleri aşağıdaki şekilde görebilirsiniz.

 

 

Conflict oluşmaması için two-phase commit kullanabilirsiniz ama performans olarak oldukça yavaş çalışacaktır.

Conflictleri çözmek için birkaç yol vardır. Conflict oluştuğunda distribution agent duracaktır.

Backup kullanarak conflict olan node’a veri yeniden yüklenir. Verinin tutarlı bir yapıya geçmesini sağlar.

Ya da Distrubition Agent’ın yeniden enable edilerek değişiklikleri uygulaması  sağlanmaya çalışılabilir.

Conflictlerin tespit edilmesi ve düzeltilmesi ile ilgili merge replication daha başarılıdır. “Merge Replication Kurulumu” isimli makalemi okumak isteyebilirsiniz.