LINUX üzerinde SQL SERVER Alwayson Yapısı Kurulumu

Seyyid Ahmet Demir
6 min readMay 15, 2020

Merhabalar,

Bu yazımda sizlere Linux (Centos 7.6) işletim sistemi üzerinde SQL Server ve AlwaysOn yapısının kurulması konusunu anlatmaya çalışacağım.

İsterseniz öncelikle biraz kullandığımız kaynaklardan ve özelliklerinden bahsedelim.

Öncelikle SQL Server 2012 ile hayatımıza giren Always ON availability group servisinden bahsedelim. Bu servis bizlere SQL Server üzerinde high availability, disaster recovery, read-scale balancing gibi birçok konuda önemli bir avantaj sağlamaktadır.
AlwaysOn servisinin çalışabilmesi için elimizde bir cluster manager servisi bulunması gerekmektedir.
Windows sunucular üzerinde WSFC(Windows Server Failover Cluster) servisi bize bu hizmeti sağlamaktadır.
Linux sunucularda bu servis Pacemaker tarafından sağlanmaktadır.

Pacemaker nedir?

Pacemaker servisleri için yüksek erişilebilirlik sağlayan açık kaynak kodlu bir cluster yönetim yazılımıdır.
Clusterlabs tarafından dağıtımı yapılan bu servis gelişmiş ve scale olabilen HA(High available) bir yapı sunar.
Bu yazılımla beraber kullanılan Corosync ise uygulamalarda Yüksek Erişilebilirlik uygulayabilmek için ek özelliklere sahip bir grup iletişim sistemidir.
SQL Server ile Linux platformlarının buluşması ilk olarak SQL Server 2017 ile gerçekleşmiş daha sonra SQL Server 2019 ile beraber daha native bir hale gelerek popülaritesi artan bir yaklaşım haline gelmiştir.

Bu teorik bilgilendirmelerden sonra yavaş yavaş kuruluma geçelim. Elimizde 3 adet CentOS 7.6 kurulmuş sunucumuz bulunuyor. Bütün işlemlerimizi bu 3 sunucu üzerinde yapacağız.

SQL Server Linux üzerinde çalışmasının bize sağladığı yararlar nelerdir?

Linux ortamlarında desteklenmesi ile OS bağımlılığından kurtulup provisioning konularında bizi daha esnek davranabilir hale getirmektedir. Özellikle Openstack gibi bulut yönetim platformlarının popülaritesinin artmasından dolayı bu esneklik bize bu ortamlarda çok büyük avantaj sağlayacaktır.
Terraform ve Ansible gibi sistemler harmanlanıp bir pipeline’a bağlanıp kullanıldığında provisioning ve scaling gibi işlemleri otonom bir şekilde yönetmek mümkün hale geliyor. Ayrıca SQL Server’ı DaaS(Database as a Service) şeklinde bir hizmete dönüştürebiliyoruz.

SQL SERVER INSTALLATION

Öncelikle SQL Server 2019 Installation adımlarını aşağıdaki kod bloğunu sıra ile çalıştırarak tamamlayabilirsiniz.

https://paste.ubuntu.com/p/THqvbQtjMZ/

Yukarıdaki kodları sırayla çalıştırıp bitiminde aşağıdaki gibi deneme yapalirsiniz.

Buradan sonra Cluster servisi ve high availability için pacemaker kurulum konfigürasyonlarına eğileceğiz.

LINUX CLUSTER CONFIGURATION WITH PACEMAKER

Öncelikle her sunucuda host dosyasını editleyerek aşağıdaki gibi standart hale getirdikten sonra sunucularından herbirinden diğerlerine hostname ile pingleyip ip çözüyor mu diye kontrol etmemiz gerekmektedir.

vi /etc/hosts

Daha sonra aşağıdaki kod bloğunda açıklamalarını da ekleyerek yazdığım adımları uygulayarak Windows server üzerindeki WSFC(Windows Server Failover Cluster) hizmetini linux tarafında Pacemaker ile sağlamış olacağız.

https://paste.ubuntu.com/p/HrnnwhShjM/

Buraya kadar geldiyseniz epey bir yol aldık demektir. Buradan sonra Alwayson kurulum konfigurasyonları ile devam edeceğiz.

ALWAYS ON AG INSTALLATION AND CONFIGURATION

Buradaki ilk adımımız SQL Server üzerinde Pacemaker servisi için bir user oluşturup Alwayson AG üzerindeki işlemmleri yapabilmesi için yetkilendirme yapacağız. Bu user daha önceki adımlarda passwd dosyasının içine işlediğimiz “pcslogin” kullanıcısı ile aynı kullanıcı olduğundan şifresini de aynı verirseniz sizin için işler daha kolay yürüyecektir.

Ben burada herhangi bir yetkilendirme eksiğine takılmamak adına “pcslogin” kullanıcısına sysadmin rolü vererek kuruluma devam ettim. Eğer isterseniz siz aşağıdaki komutlarla sadece AG bazında yetkilendirme yapabilirsiniz.

—Bu komutları tüm nodelarda çalıştırmanız gerekmektedir.
Use [master]
GO

CREATE LOGIN pcslogin
WITH PASSWORD = ‘P@ssword’
GO

—Burada pcslogin kullanıcısına ag bazında yetkilendirme verilir.

Use [master]
GO

GRANT ALTER, CONTROL, VIEW, DEFINITION ON AVAILABILITY_GROUP::alwaysonlinuxag to pcslogin
GO

GRANT VIEW SERVER STATE TO pcslogin
GO

Bu adımdan sonra tüm nodelarda aşağıdaki gibi cluster agent kurulumu yapılır ve kontrol edilir. Bu agent Alwayson AG ile Linux cluster servisinin haberleşmesini sağlayan agent olduğundan bu adım önemlidir.

sudo yum install mssql-server-ha
sudo yum info mssql-server-ha

Daha sonra SQL servisinin nodelar arasındaki authentication ve haberleşmesini sağlayacak sertifikaları oluşturuyoruz. SQL Server bu sertifikalara Primary replikadan secondary replikalara transaction log kayıtlarını gönderirken ihtiyaç duyacaktır.

— Sadece Primary replika üzerinde çalışacak.
— Önce master key oluşturuyoruz.

USE [master]
GO
CREATE MASTER KEY ENCRYPTION BY PASSWORD = ‘P@ssword’;
GO

— Sertifika oluşturuyoruz.

USE [master]
GO
CREATE CERTIFICATE alwaysonnode1_cert
WITH SUBJECT = ‘ alwaysonnode1_cert certificate for Availability Group’
GO

— Oluşturduğumuz sertifikanın backup’ını alıyoruz.
USE master
GO
BACKUP CERTIFICATE alwaysonnode1_cert
TO FILE = ‘/var/opt/mssql/data/alwaysonnode1_cert.cer’;
GO

Buradan sonra sertifikalarımız aracılığıyla primary replica üzerinde database endpointlerini oluşturuyoruz.

— Sadece Primary replika üzerinde çalışacak.
USE master
GO

CREATE ENDPOINT Endpoint_AvailabilityGroup
STATE = STARTED
AS TCP
(
LISTENER_PORT = 5022, LISTENER_IP = ALL
)
FOR DATABASE_MIRRORING
(
AUTHENTICATION = CERTIFICATE alwaysonnode1_cert,
ENCRYPTION = REQUIRED ALGORITHM AES,
ROLE = ALL
);
GO

Daha sonra oluşturduğumuz sertifikaları diğer sunucularımıza linux arayüzünden scp(secure copy protocol) aracılığıyla diğer sunuculara gönderiyoruz.

sudo scp /var/opt/mssql/data/alwaysonnode1_cert.* root@node2:/var/opt/mssql/data/

sudo scp /var/opt/mssql/data/alwaysonnode1_cert.* root@node3:/var/opt/mssql/data/

Şimdi aynı işlemleri replica sunucular için tekrarlıyoruz.

—Aşağıdaki scriptleri node2 sunucumuzda çalıştırıyoruz. Daha sonra kodları “ctrl+h” yardımı ile düzenleyip diğer replika sunucularda kopyala yapıştır şeklinde çalışabiliriz. Ancak bunu yaparken herhangi bir noktayı kaçırmadığınıza emin olun.
— Önce master key oluşturuyoruz.

Use master
GO
Create master key encryption by password =’P@ssword’
GO

— Sertifika oluşturuyoruz.

Use master
GO
Create certificate alwaysonnode2_cert with subject = ‘alwaysonnode2 certificate for Availability Group’
GO

— Endpoint oluşturuyoruz.

Create ENDPOINT Endpoint_AvailabilityGroup
STATE=STARTED
AS TCP
(
LISTENER_PORT=5022, LISTENER_IP=ALL
)
FOR DATABASE_MIRRORING
(
AUTHENTICATION = CERTIFICATE alwaysonnode2_cert,
ENCRYPTION = REQUIRED ALGORITHM AES,
ROLE =ALL
);

— Sertifikanın backup’ını alıyoruz.

Backup Certificate alwaysonnode2_cert to file =’/var/opt/mssql/data/alwaysonnode2_cert.cer’;
GO

— Sertifikayı replikalara kopyalıyoruz.
—Burada sertifikayı üzerinde çalıştığımız sunucu hariç tüm sunuculara eksiksiz olarak kopyaladığınıza emin olun. Örneğin 3 adet sunucumuz var ise ve 3. sunucu üzerinde çalışıyorsak sertifikayı 1 ve 2. nodelara göndermeniz gerekiyor.
— Aşağıdaki kodları linux arayüzünde cli’da çalıştırmayı unutmayın.

sudo scp /var/opt/mssql/data/alwaysonnode2_cert.* root@node1:/var/opt/mssql/data/

sudo scp /var/opt/mssql/data/alwaysonlinux02_cert.* root@node3:/var/opt/mssql/data/

Tüm sunucularda sertifikaları oluşturup kopyalama işlemlerini bitirdikten sonra aşağıda bulunan kodu yine tüm sunucularınızda root user ile çalıştırarak “mssql” os kullanıcısını bu dosyalar üzerinde yetkili hale getirelim.

chown mssql:mssql /var/opt/mssql/data/alwaysonnode*

Bu işlemleri bitirdikten sonra linux sunuculardan herhangi birinde
cd /var/opt/mssql/data/” altına giderek “ls -latr” komutu ile dosyaları listeleyip aşağıdaki gibi bir görüntü ile karşılaşıyorsanır buraya kadar herşey yolunda demektir. Bi ara verin biraz kafanızı toparlayın çünkü burada yapılan en ufak yanlışın tespiti ve düzeltilmesi çok uzun zaman alıyor. Tecrübeyle sabittir :)

Şimdi sunucuların hepsinde yetkili bir user daha oluşturuyoruz. Bu user bize Alwayson AG kurulumu için replikalara endpointler üzerinden bağlanırken kolaylık sağlayacak. Aşağıdaki kodları sırayla tüm sunucularda çalıştırıyoruz.

— Aşağıdaki scriptleri primary sunucumuzda çalıştırıyoruz. Daha sonra kodları “ctrl+h” yardımı ile düzenleyip tüm sunucularda kopyala yapıştır şeklinde çalışabiliriz. Ancak bunu yaparken herhangi bir noktayı kaçırmadığınıza emin olun.
— Login ve user oluşturuyoruz.

USE master
CREATE LOGIN AG_login
WITH PASSWORD = ‘P@ssword’;
GO

CREATE USER AG_login
FOR LOGIN AG_login
GO

— Kullanıcımızı sertifikalar üzerinde yetkilendiriyoruz.
— Burada node1 üzerinde çalıştığımızdan kullnıcımızı 2 ve 3. sunucuların sertifikaları üzerinde yetkilendiriyoruz. Bu sayede AG kurulumu için diğer sunucuların endpointlerine bağlanırken herhangi bir problem yaşamıyoruz. Hangi node üzerinde çalışıyorsak onun dışında kalan nodelarda yetkilendirme yaptığımıza dikkat edelim.

CREATE CERTIFICATE alwaysonnode2_cert
AUTHORIZATION AG_login
FROM FILE = ‘/var/opt/mssql/data/alwaysonnode1_cert.cer’
GO

CREATE CERTIFICATE alwaysonnode3_cert
AUTHORIZATION AG_login
FROM FILE = ‘/var/opt/mssql/data/alwaysonnode3_cert.cer’
GO

— Kullanıcımıza endpoint’e bağlanma yetkisi veriyoruz

GRANT CONNECT ON ENDPOINT::Endpoint_AvailabilityGroup
TO AG_login;
GO

Buradan sonra AG kurulumu kısmına geçiş yapıyoruz. SSMS arayüzünden primary sunucumuza “AG_login” kullanıcısı ile bağlanarak bu işlemleri gerçekleştireceğiz.

Dikkat etmemiz gereken nokta External bir Cluster yapısı kurduğumuz için Cluster Type olarak sadece “EXTERNAL” seçeneğini seçebiliyoruz. Buradaki External cluster konfigurasyonu Pacemaker ile kurduğumuz yapı ile sağlanmaktadır.

NOT : Burada dikkat etmeniz gereken sunucuların hostname üzerinden pinglendiğinde IP çözebilmesidir. Ayrıca Listener DNS oluşturulabilmesi için SQL Server kullanıcınızın AD(Active Directory) yetkilendirmelerini de düzenlemeniz gerekmektedir.

https://paste.ubuntu.com/p/7ZsqX3xhWy/

Yukarıdaki kod satırında “node1,node2,node3” alanlarını kendi sunucu isimlerinizle , “node1.DOMAIN,node2.DOMAIN,node1.DOMAIN” kısımlarını ise kendi alan adlarınızla yani örneğin “node1.example.domain” örneğindeki gibi değiştirdikten sonra SSMS Query tabından SQLCMD Mode seçtikten sonra PRIMARY sunucuda çalıştırırsanız AG oluşturma ve sunucuları AG’ye dahil etme işlemleri hallolacaktır.

AG kurulduktan sonra listener dns adresini herhangi bir adresten pingleyebilir veya direkt olarak listener ile SSMS üzerinden bağlantı sağlayıp kurulumun başarılı olup olmadığını da kontrol edebilirsiniz. Bir diğer kontrol ise AG Dashboard üzerinden kontrol sağlamaktır. Ayrıca Deneme yapmak için bir database oluşturup AG’ye ekleyebilir ve replikasyonunun sağlandığından emin olmak için içerisine örnek data insert edebilirsiniz. Eğer tüm sunucularda aynı dataya ulaşabiliyorsanız AG üzerinden replikasyon başarılı bir şekilde gerçekleşiyor demektir.

AG RESOURCE CONFIGURATION WITH PACEMAKER

Son adım olarak linux sunucularımız üzerinde pacemaker ile AG ve Listener ayarlarını yaparak bitirişi yapıyoruz. Aşağıda paylaştığım kod bloğunu yorumları okuyarak sıra ile çalıştırdıktan sonra Cluster kurulumunu tamamlamış olacağız.

https://paste.ubuntu.com/p/xTk4sHT3vW/

NOT : Unutmayalım burada cluster yönetimi Pacemaker üzerinde olduğundan failover işlemlerini burada gerçekleştireceğiz.

FİNAL

Bütün bu işlemlerden sonra aşağıdaki gibi bir görüntüyle karşılaştıysanız herşey doğru konfigure edilmiş ve elinizde CentOS 7.6 üzerinde çalışan bir SQL Server Cluster’ına sahipsiniz demektir. Bence beraber büyük bir alkışı hak ettik :)

Sonraki yazılarımda Linux üzerinde SQL Server konfigurasyonlarını iyileştirme ve özelleştirme üzerine paylaşımlar yapmaya çalışacağım.
Ayrıca fırsat buldukça provisioning işlerini ansible ve terraform üzerinde nasıl otonom bir yapıya dönüştürebileceğimizden bahsetmeye çalışacağım.

Saygılarımla,

Ahmet Demir

--

--