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.
Merhaba dökümandaki yönergelerinizi uyguladım. Subscriber üzerinden view ile mevcut replication işlem durumlarına baktığımda alert pencesi cıkıyor ve agent üzerinde job tanımlanması gerekiyor diyor.
Bu durumda işlemler gerçekleşmiyor.
Merhaba,
Makalelerin hepsi test ortamlarında test edildikten sonra yazılmıştır.
Sizin kullandığınız sql server sürümü nedir?
ilk tahminim kurulum aşamasında sql server agent service account’u belirttiyseniz bu hesabın gerekli yetkileri olmadığı için sorun yaşamış olabilirsiniz.
Kesin çözüm üretebilmemiz için hangi aşamada hangi hatayı aldıysanız ekran görüntüleriyle paylaşabilir misiniz? teknik destek kısmından hata ile ilgili detaylı bilgi verebilirsiniz.