MSSQL Server’da Snapshot Replication Kurulumu

Microsoft SQL Server’da Snapshot Replication (Anlık Görüntü Çoğaltma), verilerin ve veritabanı nesnelerinin belirli bir andaki durumunun tam bir kopyasının oluşturulup “Subscriber” (Abone) sunuculara aktarılması yöntemidir.

Diğer replikasyon türlerinden (Transactional veya Merge) en büyük farkı, verideki değişiklikleri satır satır takip etmek yerine, her seferinde belirlenen veri setinin tamamını (schema ve data) bir paket halinde karşıya göndermesidir.

Bu süreç genellikle şu üç ajan üzerinden yürütülür:

  1. Snapshot Agent: Yayınlanacak verilerin şemasını ve verisini hazırlar, dosyaları (bcp, sql) “Snapshot Folder” içine yazar.
  2. Log Reader Agent: Snapshot replikasyonda aktif görev almaz (bu ajan Transactional için kritiktir).
  3. Distribution Agent: Hazırlanan bu dosyaları klasörden alarak abone sunucuya uygular.

Avantajları

  • Kurulumu ve yönetimi en kolay replikasyon türüdür. Karmaşık çakışma çözümleriyle veya uniqueidentifier gibi zorunlu kolonlarla uğraşmazsınız.
  • Veri değişikliklerini (Insert/Update/Delete) anlık olarak izlemediği için “Publisher” (Yayıncı) sunucu üzerinde sürekli bir CPU/IO yükü oluşturmaz. Sadece snapshot alındığı sırada kaynak tüketir.
  • Abone tarafındaki veri her zaman yayıncıdaki belirli bir andaki durumun birebir kopyasıdır.
  • Fiyat listeleri, posta kodları veya nadiren güncellenen referans tabloları için en verimli yöntemdir.

Dezavantajları

  • Veri seti çok büyükse (örneğin terabaytlık tablolar), her seferinde tüm veriyi paketleyip göndermek ağ trafiğini ve disk IO’sunu ciddi şekilde yorar.
  • Veriler sadece snapshot alındığı an güncellenir. Eğer günde bir kez çalışıyorsa, abonelerdeki veri gün boyunca eski kalabilir. Gerçek zamanlı veri ihtiyacı için uygun değildir.
  • Dağıtım klasöründe (Snapshot Folder) verilerin geçici kopyaları tutulduğu için bu alanda geniş bir disk alanına ihtiyaç duyulur.
  • Büyük veri setleri aboneye uygulanırken, işlem bitene kadar hedef tablolar genellikle kilitlenir veya okuma performansını etkiler.

Ne Zaman Kullanılmalı

  • Veri miktarı nispeten küçükse.
  • Veriler nadiren değişiyorsa (günlük veya haftalık güncellemeler yetiyorsa).
  • Abonelerin ana sunucu ile anlık senkronize olması gerekmiyorsa.
  • Transactional Replikasyon için başlangıç verisi (initialization) oluşturulurken.

n kurulumun makalesinde yapmış olduğumuz distributor yapısını mevcut olan ikinci sunucumuza da ekliyoruz. İlgili makaleden ilk sunucu için Distribution yapısı olduğu için ikinci sunucu için bu işlemi yapmıyoruz.

Bilgi olması açısından ssql server kurulumunda database engine role’ünün yanına replication role’ünün eklenmesi gerekmektedir. Bu özellik seçilmezse replication servisleri yüklenmez ve sihirbazlar çalışmaz.

En az iki farklı SQL Server Instance gereklidir.

  • Publisher (Yayıncı): Verinin asıl sahibi.
  • Subscriber (Abone): Verinin kopyalanacağı yer.
  • Not: İsterseniz “Distributor” (Dağıtıcı) rolünü üçüncü bir sunucuya verebilirsiniz, ancak genellikle Publisher ve Distributor aynı sunucuda yapılandırılır.

Not: Instance isimlerinin farklı olması bir engel değildir. Hatta karışıklığı önlemek için farklı olması önerilir. Ancak sunucuların birbirini Host Name (veya SQL Instance Name) üzerinden çözümleyebilmesi şarttır.

Genellikle büyük ölçekli ve yoğun trafikli sistemlerde tek başına bir çözümden ziyade, diğer replikasyon modellerini başlatmak için bir “ilk kurulum” aracı olarak tercih edilir.

DB1 veritabanında aşağıdaki script yardımıyla replike edeceğimiz tabloyu oluşturalım.

USE [DB1]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[SnapshotReplicationTable](
	[id] [int] IDENTITY(1,1) NOT NULL,
	[ad] [nchar](10) NULL,
	[soyad] [nchar](10) NULL,
 CONSTRAINT [PK_SnapshotReplicationTable] PRIMARY KEY CLUSTERED 
(
	[id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]
GO

İlk olarak birinci sunucu üzerinde Distributor yapılandırılması yapılmaktadır. Bir sunucu üzerinde sadece bir tane yapmak yeterlidir.

Replication mekanizmasının “postacısı” olan Distribution veritabanını oluşturma adımıdır. SSMS üzerinde “Replication” klasörüne sağ tıklayıp “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.

Gelen ekranda sql server agent servisinin otomatik başlaması için Yes diyiyoruz.

Dağıtımın yapılacağı bir klasör yolu (Network Share) belirtilir. Değişiklikleri takip eden logların ve ilk kurulumdaki veri setinin (snapshot) tutulacağı bir depo oluşturmak için. Replication sistemi veriyi nereye yazacağını ve nereden dağıtacağını bilemez, sistem çalışmaz.

Oluşturulan paylaşım klasörüne sql server engine ve agent servis hesaplarına full kontrol yetkisi verilmesi gerekmektedir.

S1 sunucusu üzerinde ReplicationFolder klasörü oluşturduktan sonra Snapshot folder kısmına oluşturulan paylaşım klasörü yazılır.

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. Hiçbir değişim yapmadan default şeklinde bırakıyorum.

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.

Seçili olan Configure Distribution yapısını gördükten sonra Next diyoruz. İkinci seçeneği işaretlerseniz yapılan işlemin scriptini alabilirsiniz.

Finish diyerek yapılan işlemler tamamlanır.

Kurulum işlemleri gerçekleştikten sonra sistem veritabanları içerisinde distrubution veritabanının görülmesi gerekmektedir.

Publisher ve Distributor’u aynı sunucu üzerinde yapılandıracağımız için Replication kısmında Local Publication kısmında sağ tıklayıp New Publication.. denilir.

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

Gelen ekranda hangi veritabanımızı replica edeceksek seçim işlemi yapılmaktadır. İlgili veritabanı seçimi yaptıktan sonra Next denilir.

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

Gelen ekranda article olarak hangi nesne seçimini yapmak istiyorsak ilgili nesne seçimi yapılmaktadır.Biz sadece dbo.SnapshotReplicationTable tablosunu seçip Next diyoruz.

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.

Add butonuna tıklanarak filtreleme işlemi yapılabilir.

Kaldığımız yerden devam edecek olursak önceki resimde gelen 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. Belirli bir zamanda işlemin gerçekleşmesi istenirse Schedule the Snapshot Agent to run at the following times seçeneği ile belirlenebilir.

Bir sonraki ekranda Snapshot Agent ve Log Reader Agent’ın kullanacağı kullanıcı hesaplarını soruyor. Security Settings’e tıklayarak ilgili kullanıcıları set edebiliriz.

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ı.

Log Reader 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ı.

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

Veritabanları üzerinde tanımlanan servis hesapları ilgili veritabanlarında full kontrol yetkisine sahiptir. Kullanılan servis hesabı başlangıçta oluşturulan Snapshot dosyası üzerinde write yetkisi bulunmaktadır. Log Reader Agent içinde aynı hesabı kullanmış oldum.

Kendi ortamımda iki sql server engine ve agent servis hesabları ortak ayrıca ilgili veritabanları ve instancelarda full yetkili bu sebepten defaultta bulunan kullanıcımı seçip bir sonraki adıma geçiyorum.

Security Settings.. kısmına giriş yapılır.

Default’ta bulunan agent servis hesabı seçilmektedir.

OK butonu ile ilgili ekrandan çıkılır.

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.

Başarılı bir şekilde kurulum yapılmaktadır.

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. 

Aşağıdaki ekran görüntüsü, Snapshot Replication kurulumunun en kritik karar noktalarından biri olan Distribution Agent Location (Dağıtım Aracının Konumu) aşamasını gösteriyor.

Genel kullanım senaryolarının %90’ında ilk seçenek olan “Run all agents at the Distributor” (Push Subscription) tercih edilir. Detaylandıralım:

1. Seçenek: Run all agents at the Distributor (Push Subscriptions)

Verinin dağıtılma emri ve yönetimi merkezden (Distributor) kontrol edilir. Veri, Subscriber’a “itilir”.

  • Yönetimi çok daha kolaydır. Replication Monitor üzerinden tüm akışı tek bir merkezden izleyebilirsin. Eğer sunucuların aynı local network üzerindeyse en mantıklı yoldur.
  • Bu seçeneği seçmezsen, her bir abone (subscriber) kendi işini kendi takip etmek zorunda kalır. 10 tane aboneneniz olduğunu düşünürseniz, 10 ayrı yerden yönetim yapmanız gerekir.

2. Seçenek: Run each agent at its Subscriber (Pull Subscriptions)

Abone sunucu, belirli aralıklarla “yeni veri var mı?” diye merkez sunucuya sorar ve veriyi kendisi “çeker”.

  • Eğer ana sunucun (Publisher) donanımsal olarak çok zayıfsa ve 1. seçeneği seçersen, replication trafiği ana sunucuyu iyice yorabilir.
  • Eğer Publisher/Distributor sunucun üzerinde çok fazla yük (CPU/RAM) varsa ve bu yükü hafifletmek istiyorsan veya Subscriber sayısı çok fazlaysa (yüzlerce abone gibi) tercih edilir.

Bir sonraki ekranda aşağıdaki gibi replike edeceğimiz tabloları hangi instance’taki hangi veritabanına replike edeceğimizi soruyor. Add Subscriber diyerek ikinci olan sunucuyu yapılandırıyoruz.

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

Gelen 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 DB1 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 DB1 ü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.

Next denilip bir sonraki adıma geçilir.

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.

Bir sonraki ekranda, subscriber’a(asıl veritabanını replike edeceğimiz veritabanı,yani 2.instance’daki DB1) 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.

Finish diyerek işlemlerimizi tamamlıyoruz.

Başarılı bir şekilde kurulum gerçekleşmiş oldu.

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.

Bu makalede snapshot replication konusunu detaylı bir şekilde görmüş olduk. Başka makalede görüşmek dileğiyle..

Anne babaya kaba davranmayın İsra-23

Author: Yunus YÜCEL

Bir yanıt yazın

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