Bu makalede Sql Server Database Mirroring kavramını ele alacağız. Uygulamalı olarak işlemlere başlamadan önce database mirroring kavramından bahsedelim.
Sql server sunucusunda bulunan bir database’in anlık olarak başka bir sunucuya yazılma işlemidir. Bu işlem database bazlı yapılmaktadır. Bu kopyalama işlemi birden fazla sunucuya aynı anda yapılmaktadır. Mirroring yapılan veritabanımız iki sunucuda aynı büyüklükte ve yapıda tutulmaktadır. Primary olan sunucumuzun başına bir iş geldiğinde veritabanı otomatik veya manuel bir şekilde ikinci sunucuya devri olmaktadır. Ana sunucunun başına herhangi bir sıkıntı geldiğinde Witness sunucu vasıtasıyla yedek sunucu devreye giriyor. Bu işlem failover cluster yapısıyla benzer bir özellik taşır.
Arada witness bağlantısı olmadığında da makinalar doğrudan birbirleriyle haberleşiyor. Burada ise failover işlemi otomatik olarak yapılmaz. Herhangi bir sorun anında manuel bir şekilde yapılmaktadır. Aşağıdaki resimde görüldüğü gibi arada herhangi bir bağlantımız yok.
Mirroring durmuşsa, yeniden başlatılmadan önce primary veritabanındaki bütün transaction log backup’lar secondary sunucuya with no recovery ile restore edilmelidir. Sistem veritabanları mirroring yapılamaz. Veritabanı mirror yapılmışsa mirror bozulmadan ismi değiştirilemez. FileStream desteklemez. File Stream File Group’u olan bir veritabanını mirror yapamazsınız. İki sunucu arasında standart olarak 5022 default portunu kullanır.
Database mirroring’in birden fazla yöntemi vardır. Bunlardan bir tanesi High performance yöntemidir. Bu yapıda databaseler asenkron bir şekilde veriler ilk başta principal veritabanına yazılır sonra mirror database’e yazılmaktadır. Bu yapıda witness server rolü kullanılmaz. Herhangi bir failover durumunda database değişimi manuel olmaktadır. Bu yapıda herhangi bir failover anında veri kaybına sebebiyet verecektir. Çünkü veri principal database’e yazılırken failover durumunda veri mirror database’e yazılmadığı için veri kaybına sebep olacaktır. Perfomans açısında ise bize iyi bir katkı sağlayacaktır.
Database mirroring’in ikinci bir yöntemide High Safety with automatic failover yöntemidir. Bu modda database bazlı yapılan işlemler önce mirror veritabanına yazılır sonra princial database’e yazılır. Bu yapı performans sorunlarına sebep olmaktadır. Database mirroring yapısı alwayson yapısındaki senkron ve asenkron modun aynısıdır. Senkron olduğu için Witness server role kullanır. Witness server role bu yapıda tek kullanılmaktadır. Konfigürasyon ekranındaki üçüncü seçeneğimizdir.
High Safety without automatic failover yöntemi ise High Safety with automatic failover yöntemiyle aynıdır. Tek farkı otomatik failover işlemi gerçekleşmez. Senkron durumun witness’sız halidir.
Şimdi Sunuculu database mirroring işlemini uygulamalı bir şekilde gerçekleştirelim. Bunun için elimde aynı domainde ve network’de S2,S3 ve S4 sunucusu bulunmakta. Bu sunucularda olması gereken özelliklerden bahsedeyim.
NOT: Bazı makalelerde database mirroring yapısında Witness server için Sql Server Express Edititon veya Web sürümün şart olması gerektiğini söylüyor. Yanlış bilgi olduğunu aşağıdaki 2. örnekte web veya Express sürümü olmadan Enterprice sürümü ile gerçekleştirmiş olacağız. Aşağıdaki 3 sunucumda Enterprice Edition sürümü bulunmakta.
- Bu sunucuların hepsinde sql server 2019 kurulu durumda. Hepsinde aynı sürüm ve versiyonun olması gerekiyor. Aynı instance’ın olduğunuda görmüş oluyoruz. Sürüm farklı olunca database mirroring kurulumunda hata alınmaktadır.
- Principal(S3) ve Mirror(S4) sunucular aynı domainde olması gerekmektedir.
2.Database Mirroring yapılandırılması yapacak kullanıcı domain ve server seviyesinde yönetici olmalıdır. SqlUser bizim servis kullanıcısıdır.
3. Sql Server servis hesapları domain kullanıcısı olması gerekmektedir. Farklı hesaplar veya aynı hesaplar olmasında bir sakınca yoktur.
Şimdi bu sunucularımın ne iş yapacağına değinip uygulamalı bir şekilde işlemlerimi gerçekleştireyim. 2 Örnek gerçekleştirmiş olacağım ilk yapacağım örnek Witness yapısı OLMADAN ikinci örneğimizde ise Witness kullarak makalemi tamamlamayı planlıyorum.
S3: Princepal database’in olduğu sunucu
S4: Mirror database’in olduğu sunucu
S2: principal ve mirror database arasındaki bağlantıyı sağlayan Witness sunucusu.(2. Örnekte kullanılacak.)
Sql server database mirroring işlemlerimize başlayabiliriz.
Princepal database’in olduğu sunucuda(S3) YUCELTEST adında bir database oluşturalım.
İnstance altında bulunan Databases sekmesine sağ tıklayıp New Database diyiyoruz. Options kısmından Recovery Model’in full olması gerekmektedir.
Database oluşturduktan sonra oluşturulan database üzerine sağ tıklayıp Properties kısmına geliyoruz.
Gelen ekranda sol alt tarafta bulunan Mirroring kısmına tıklayıp işlemlerime başlıyorum.
Gelen ekranda Configure Security bölümüne tıklıyorum.
Gelen ilk sayfada Do not show this starting page again’i seçerek Next diyoruz.
Gelen ekranda witness server kullanıp kullanmayacağımızı soruyor. Birinci örnek olarak witness server OLMADAN kullanacağımız için No deyip bir sonraki aşamaya geçiyorum.
Gelen ekranda Principal server instance S3\TEST yapımız. Aşağıda listener port kısmı 3 sunucudaki database’in haberleşeceği endpoint için kullanılacak port. Herhangi bir güvenlik duvarı varsa sunucularımızda kapatılması lazım ya da ilgili portlara izin verilmesi gerekmektedir. Firewall tarafında. Bu işlemlerden sonra next deyip bir sonraki aşamaya geçiyorum. Burada bulunan Endpoint Name diğer sunuculardan gelen connectionları almak için kullanılır. Encrypt data sent through this endpoint bu ikon endpoint üzerinde gönderilen dataların şifrelenip şifrelenmeyeceğini belirtiriz.
Burada şunu belirtmek gerekiyor. Listener port kısmı eğer kuracağımız principal, mirror ve witness aynı sunucu altında farklı instance yapısında ise farklı listener port verilir. Farklı sunucularda bu yapıyı oluşturursak 5022 olarak bırakılabilir. Bu yüzden benim senaryomda farklı sunucularda olduğu için default olan yapı kullanılır. Ya da kendimiz elle bir değer set edebiliriz. AlwaysOn yapısında da bu yapı böyledir.
Gelen ekranda Mirror Server Instance kısmında makalenin başında belirtiğimiz gibi S4 sunucusunu seçiyorum. Connect seçeneğine tıklayarak sunucuma bağlanıyorum. Bu işlemlerden sonra next deyip bir sonraki aşamaya geçiyorum.
Gelen ekranda principal ve mirror sunucularının sql servis hesaplarını tanımlıyorum. localde bir kullanıcı seçerseniz hata mesajıyla karşılaşırsınız. Makalenin başında belirttiğimiz gibi aynı servis hesaplarının olması gerekmektedir.
Next deyip bir sonraki aşamaya geçtiğimizde özet ekranımızı görmekteyiz.
Finish deyip işlemimizi başarılı bir şekilde oluşturmuş oluyoruz.
İşlemi tamamlayıp Close dedikten sonra Start Mirroring kısmından başlatabiliriz. Database mirroring işlemini hemen başlatmayıp Do not Start Mirroring kısmını seçip sonra konfigürasyon yapabiliriz.
Start Mirroring dediğimizde aşağıdaki hatayı almış olduk. Bu hatayı almamızın sebebi S4 mirror sunucusunda YUCELTEST veritabanının olmaması bunun için principal sunucusunda backup alıp mirror sunucusuna restore edeceğiz restore yaparken veritabanımızı no recovery modda olması gerekmektedir.
Aşağıdaki ekranda Start Mirroring diyerek database mirroring işlemini başlatıyorum.
Başlatmadan önce YUCELTEST veritabanının full ve log backup alıp ikinci sunucuya no recovery modunda restore etmemiz gerekiyor.
Aşağıdaki resimde şuna da dikkat etmek gerekiyor. Yapımızda witness olmadığı için Operating mode kısmında High safety without automatic failover kısmı işaretlenmiş. Bu verilerin senkron şekilde yazılacağını gösterir. High performans seçeneğide seçilebilirdi. Buda asenkron olarak verilerin atılmasını sağlar.
ilk başta S3 sunucusunda YUCELTEST veritabanının full yedeğini alıp S4 sunucusuna no recovery modda restore ediyorum. Bu işlemleri göstermeyip sonucu aşağıda gösteriyorum. Full den sonra log backupda S4 sunucusunda restore edilebilir. Canlı veri akışı olmadığı için gerek duymadım.
Sonuç olarak mirror sunucusuna restoring modda restore işlemini gerçekleştirmiş oldum.
Tekrar Principal(S3) sunucuma gelip Start Mirroring diyiyorum.
Start Mirroring dediğimde aşağıdaki hata mesajını almış oldum.
Tekrar full ve log backup alıp S4 mirror sunucusunda oluşturduğumda aynı hatayı almış oldum.
YUCELTEST2 adında başka bir veritabanı oluşturup aynı işlemleri yaptığımda başarılı bir şekilde database mirroring işlemlerimin olduğunu gözlemledim. Yukarıda başlangıç adımları için yaptığım her şeyi yeni database için yaptım. Sunucu veya sql bazında başka bir değişiklik yapmadım. Database’imiz bozulmuş olabilir.
Başarılı bir şekilde database mirroring yaptıktan sonra S3 ve S4 sunucumda databaselerimizi kontrol edelim.
Witness server yapımız olmadığı için herhangi bir sorun anından failover işlemi gerçekleşemez. Failover işleminin manuel şekilde gerçekleştiğini belirtmiştik. Failover işleminden önce principal sunucumuzda veritabanına bir tablo ekleyelim.
Not: Mirror sunucusunda database bazında kullanıcı bir işlem yapamaz.
Tablo oluşturup içerisine veri yazdıktan sonra şimdi failover işlemine geçelim. Failover işlemini geçmeden önce database mirroring monitörden sunucularımızın durumuna bakalım.
Principal veritabanımıza sağ tıklayıp Task bölümünden Launch Database Mirroring Monitor.. kısmına tıklıyoruz.
Gelen ekranda Go bölümünden Database Mirroring Monitor kısmına tıklıyoruz.
Gelen ekranda Register mirrored database bölüme tıklıyoruz.
Connect deyip principal olan sunucumuz seçiyoruz. Sunucu seçiminde sonra alt bölüme gelen Register seçeneğine tıklayıp OK diyiyorum.
Database Mirroring Monitor alt kısmında database’imiz gelmiş oldu.
YUCELTEST2 database’ine tıkladığımda monitör ekranından Synchronized olduğunu görmüş olduk.
Failover işlemi yapacağım principal sunucumda database mirroring kısmına geliyorum. Witness yapımız olmadığı için failover manuel yapılıyor. Bu yapıda kurulan sistemlerde herhangi bir sorun anında database kendini karşı sunucuya atmaz manuel elle kendimizin failover yapması gerekmektedir. Makalenin başında belirttiğim ikinci örnek ise manuel failover yapmaya gerek kalmadan kendisi halletmiş olacak.
Aşağıdaki resimdede görüldüğü gibi High performance ve High safety without automatic failover aktif olduğunu görüyoruz. Yapımızda witness olmadığı için witness bölümü boş gelir ve High safety with automatic failover kısmı pasiftir.
Failover’a tıkladığım failover yapılsın mı diye bir uyarı ekranı karşıma geliyor. Yes diyip failover yapımı başlatıyorum.
Failover işlemi tamamlandıktan sonra S4 sunucumun principal olduğunu görmüş oluyorum. S3 sunucusunda failover olmadan önce oluşturmuş olduğum tablo ve içindeki verilerinde yeni principal’a(S4) geldiğini görmüş oluyorum.
S3 sunucum mirror database oldu.
Son olarak mirroring dashboard ekranından senkronizasyon durumumuza bakalım. Yeni principalda monitör ekranını açmak için yeni principal sunucuyu girmemiz gerekiyor.
Başarılı bir şekilde senkronizasyon ekranını görmüş olduk.
Birinci örneğimizi başarılı bir şekilde tamamlamış olduk. Şimdi ikinci örneğimiz olan Witness sunucu olacak şekilde bağlantımızı sağlayalım.
Not: Yukarıdaki resimde history kısmından sunucuların kaç saniyede bir haberleştiğini veri yazdığını görebiliriz.
2. ÖRNEK
Şimdi ikinci örneğimizde witness sunucusu kullanarak yapımızı oluşturalım.
Önceden oluşturduğumuz database’de Mirroring ekranına geliyorum.
Configure Security diyoruz. Gelen ilk sayfada Do not show this starting page again’i seçerek Next diyoruz.
Bir sonraki ekranda witness server kullanıp kullanmayacağımızı soruyor. Yes seçili iken Next diyoruz.
Gelen ekranda witness server ikonu işaretli iken next diyiyoruz.
Gelen ekranda principal sunucum ve kullandığı endpoint görülmektedir. Ayrıca bu endpoint üzerinden gönderilen dataları şifreleyip şifrelemeyeceğimizi belirleyebiliyoruz. Encrypt data sent through this endpoint’i seçersek şifreliyoruz. Next deyip bir sonraki ekrana geçiyoruz.
Gelen ekranda Mirror Server Sunucu ve İnstance’ı seçiyorum. İlgili sunucuya bağlanıp Next diyiyoruz.
Gelen ekranda Witness Server İnstance’ı seçiyoruz. Next deyip bir sonraki adıma geçiyorum.
Gelen ekranda servis hesaplarını istiyor. Buraya yazmamız veya yazmamız bir şey değiştirmez. Bu yüzden Next deyip bir sonraki adıma geçiyorum. Zaten arka tarafta mirroring yapımız kontrolü sağlıyor.
Özet ekranda kontrollerimi yaptıktan sonra Finish deyip adımlarımı sonlandırıyorum.
Başarılı bir şekilde konfigürasyonumu yapmış oldum.
Kurulumu ekranıma gelip Start Mirroring’e tıklayarak işlemlerimi sonlandırıyorum.
Database Mirroring yapımız kurulmamış oldu. Aşağıda görülen hatayı vermiş oldu. Şimdi bu hata üzerine yoğunlaşarak database mirroring yapımızı oluşturmaya çalışalım.
Bu hata alındıktan sonra sql server servis hesaplarındaki kullanıcıların kontrol edilmesi gerekmektedir. Makalenin başında da belirttiğim gibi servis hesaplarının aynı domain hesapları olması gerektiğiydi. 3 sunucumda servis hesaplarında domaindeki bir kullanıcı olduğunu gözlemledim.
Daha sonra yapmış olduğum araştırma sunucuların birbirleriyle haberleştiği endpointlerin aktif olup olmadığını gözlemlemekti. Aşağıdaki komut ile sunucularımdaki endpointin açık olduğunu gözlemlemiş oldum. Bu işlemi 3 sunucu için kontrol ettim.
SELECT name,state_desc FROM sys.database_mirroring_endpoints;
Bir sonraki yapmış olduğum adım sunucularımdaki endpoint yapılandırmasını değiştirmekti. Bunun için instance altında bulunan Server Object kısmından Endpoints kısmından Database Mirroring tabında ilgili endpoint’imizi görüyoruz.
Daha sonra endpoint üzerine sağ tıklayıp Script Endpoint as> CREATE To>New Query Editor Windows kısmından bu endpoint’in scprit’ini alıyoruz.
Aşağıda default olarak tanımlanan endpoint önümüze gelmekte.
USE [master] GO /****** Object: Endpoint [Hadr_endpoint] Script Date: 10.06.2024 00:02:49 ******/ CREATE ENDPOINT [Hadr_endpoint] STATE=STARTED AS TCP (LISTENER_PORT = 5022, LISTENER_IP = ALL) FOR DATA_MIRRORING (ROLE = ALL, AUTHENTICATION = WINDOWS NEGOTIATE , ENCRYPTION = REQUIRED ALGORITHM AES) GO
Yeni penceremizde scprit’i açtıktan sonra Hadr_endpoint’i siliyorum.
Endpoint’i sildikten sonra aşağıdaki komutla endpoint’i değiştirip tekrar yeni baştan bir endpoint portu vererek endpoint oluşturdum. Bu işlemleri S3 ve S4 sunucularından aynı instance altında gerçekleştirdim.
USE [master] GO /****** Object: Endpoint [Mirroring] Script Date: 10.06.2024 00:03:33 ******/ CREATE ENDPOINT [Hadr_endpoint] STATE=STARTED AS TCP (LISTENER_PORT = 5026, LISTENER_IP = ALL) FOR DATA_MIRRORING (ROLE = ALL, AUTHENTICATION = WINDOWS NEGOTIATE , ENCRYPTION = REQUIRED ALGORITHM RC4) GO
USE [master] GO /****** Object: Endpoint [Hadr_endpoint] Script Date: 10.06.2024 00:06:21 ******/ CREATE ENDPOINT [Hadr_endpoint] STATE=STARTED AS TCP (LISTENER_PORT = 5026, LISTENER_IP = ALL) FOR DATA_MIRRORING (ROLE = ALL, AUTHENTICATION = WINDOWS NEGOTIATE , ENCRYPTION = REQUIRED ALGORITHM AES) GO
Principal ve Mirror sunucularımda endpoint değişim işlemlerimi yaptıktan sonra witness rolünü üstlenecek S2\TEST sunucusunda bu işlemlerimi yapıyorum.
Gelen kod bloğunu gördükten sonra S2\TEST’den ilgili kısımdaki database mirroring’in altındaki endpoint’i siliyorum.
İlgili database mirroring kısmında sildikten sonra delete deyip siliyoruz. Daha sonra öncede scriptini almış olduğum portu değiştiriyorum.
USE [master] GO /****** Object: Endpoint [Mirroring] Script Date: 10.06.2024 00:13:11 ******/ CREATE ENDPOINT [Mirroring] STATE=STARTED AS TCP (LISTENER_PORT = 5030, LISTENER_IP = ALL) FOR DATA_MIRRORING (ROLE = ALL, AUTHENTICATION = WINDOWS NEGOTIATE , ENCRYPTION = REQUIRED ALGORITHM AES) GO
3 sunucumda da endpoint değişikliği yaptıktan sonra tekrar Witness database mirroring yapısını oluşturalım.
Database mirroring oluşturacağım database üzerine sağ tıklayıp Task>Mirror.. kısmına tıklıyorum.
Gelen ekranda Configure Security bölümüne tıklayıp işlemlerimi gerçekleştiriyorum. Dikkat edersek yukarıda endpoint değişimimiz Principil’a yansımış.
Gelen ilk sayfada Do not show this starting page again’i seçerek Next diyoruz.
Gelen ekranda witness server kullanıp kullanmayacağımızı soruyor. Birinci örnek olarak witness server kullanacağımız için Yes deyip bir sonraki aşamaya geçiyorum.
Gelen ekranda witness server kuracağımız için ilgili ikonu seçiyoruz.
Gelen ekranda Principal server instance S3\TEST yapımız. Aşağıda listener port kısmı 3 sunucudaki database’in haberleşeceği endpoint için kullanılacak port. Herhangi bir güvenlik duvarı varsa sunucularımızda kapatılması lazım ya da ilgili portlara izin verilmesi gerekmektedir. Firewall tarafında. Bu işlemlerden sonra next deyip bir sonraki aşamaya geçiyorum. Burada bulunan Endpoint Name diğer sunuculardan gelen connectionları almak için kullanılır. Encrypt data sent through this endpoint bu ikon endpoint üzerinde gönderilen dataların şifrelenip şifrelenmeyeceğini belirtiriz.
Burada şunu belirtmek gerekiyor. Listener port kısmı eğer kuracağımız principal, mirror ve witness aynı sunucu altında farklı instance yapısında ise farklı listener port verilir. Farklı sunucularda bu yapıyı oluşturursak 5022 olarak bırakılabilir. Bu yüzden benim senaryomda farklı sunucularda olduğu için default olan yapı kullanılır. Ya da kendimiz elle bir değer set edebiliriz. AlwaysOn yapısında da bu yapı böyledir.
Gelen ekranda Mirror Server Instance kısmında makalenin başında belirtiğimiz gibi S4 sunucusunu seçiyorum. Connect seçeneğine tıklayarak sunucuma bağlanıyorum. Bu işlemlerden sonra next deyip bir sonraki aşamaya geçiyorum.
Gelen ekranda Witness Server İnstance kısmında witness kuracağımız sunucu ve instance seçiyoruz. Listener Port değiştirdiğimiz gibi 5030, next deyip bir sonraki aşamaya geçiyoruz.
Gelen ekranda hiçbir servis hesabı tanımlamadan da Next deyip bir sonraki aşamaya geçebiliriz. Ama ben servis hesaplarımı hata aldığımız ilk bölümde tanımlamamıştık burada tanımlamak istiyorum.
Next deyip bir sonraki aşamaya geçtiğimizde özet ekranımızı görmekteyiz.
Finish deyip işlemimizi başarılı bir şekilde oluşturmuş oluyoruz.
İşlemi tamamlayıp close dedikten sonra Start Mirroring kısmından başlatabiliriz. Database mirroring işlemini hemen başlatmayıp Do not Start Mirroring kısmını seçip sonra konfigürasyon yapabiliriz.
Do Not Start Mirroring dedikten sonra gelen ekranda High safety with automatic failover Witness sunucu oluşturduğumuzda önümüze geldiğini söylemiştik. Start Mirroring diyerek database mirroring yapımızı başlatıyorum.
Başarılı bir şekilde Database Mirroring yapımızın oluştuğunu görmüş oluyoruz.
Witness sunucumuzun görüntüsü
S4 sunucumuzun görüntüsü
S3 sunucumuzun görüntüsü
Son olarak mirroring dashboard ekranından senkronizasyon durumumuza bakalım. Principal’da monitör ekranını açmak için principal sunucuyu girmemiz gerekiyor.
Gelen ekranda Go bölümünden Database Mirroring Monitor kısmına tıklıyoruz.
Gelen ekranda Register mirrored database bölüme tıklıyoruz.
Connect deyip principal olan sunucumuz seçiyoruz. Sunucu seçiminde sonra alt bölüme gelen Register seçeneğine tıklayıp OK diyiyorum.
Database Mirroring Monitor alt kısmında database’imiz gelmiş oldu.
Başarılı bir şekilde senkronizasyon ekranını görmüş olduk. Witness address’in oluştuğunuda görmüş oluyoruz.
Şimdi otomatik failover işlemimizi yapalım bakalım sistem kendini otomatikmen S4 sunucusuna atıyormu. Bunun için S3\TEST sunucusunda servisi disable yapıyorum.
Tekrardan sunucularımızda refresh yapıyoruz. Bakalım yeni principal sunucumuz S4 olmuş mu?
S4 sunucumuzun principal olduğunu gördükten sonra şimdi tekrardan S3 sunucumuzun servisini açalım. Tekrar açıldıktan sonra yeni mirror sunucumuz S3 olmuş oldu.
Bu makalede Database Mirroring yapısını witness kullanarak veya kullanmayarak oluşturmaya çalıştım. Başka bir makalede görüşmek dileğiyle.
0 Yorum