Merhaba,

Bu içerikte, Ubuntu ya da CentOS üzerinde çalışan MSSQL Always On mimarisinden ve yapılandırmasından bahsedeceğim. MSSQL 2017 ile GNU/Linux üzerinde çalışma desteği geldi ancak bazı özellikler hala tam desteklenmiyor. MSSQL Server 2019 on Linux sürümünde de bu özelliklerin desteklenmesiyle ilgili adım atılmış değil ve 2019 daha preview modda olduğu için birçok bug söz konusu. İçeriğe geçmeden önce en önemli avantaj, cross platform olarak kurulum yapabiliyorsunuz. Hem Windows hem de Linux ortamda çalışan yapılar için ortak SQL Always On mimarisi kurmanız mümkün. Bunun anlatımını da ileride yapabilirim. Sözü uzatmadan Unsupported feature listesini aşağıda paylaşıyorum.

Şimdi gelelim kısa ve öz temel gereksinimlere:

Sistemin stabil çalışması için tavsiye edilen minimum hard level 8GB ram ve en az 2 core cpu. (Bu tüm nodelar için geçerli.) Enterprise Edition lisansa sahipseniz de maksimum 9 node kadar çıkabiliyorsunuz. (Cluster yapınız da en az 3 sunucudan oluşmalı. Primary node ve secondary nodelar olmak üzere.) Tüm nodeları local-virtual network üzerinden konuşturmanızı da tavsiye ederim. Production ortam için kullanacaksanız eğer MSSQL lisansı da haliyle gerekiyor 🙂 *Floating IP, VMWare ve Hyper-V’de default destekleniyor. AWS, Azure, Oracle, Alibaba, Google Cloud üzerinde kendi distroları dışında farklı bir distro kullanımında desteklenmiyor!

Gelelim “How to install MSSQL 2019 on Linux?” sorusunu cevaplamaya:

Anlatıma eklediğim görseller CentOS üzerine MSSQL 2019 AG kurulumunun görselleri ancak MSSQL Server 2019 versiyonunda bazı buglar gözlemledim. Daha preview durumda olduğundan stabil denemez. Bu nedenle hem SQL 2017-SQL 2019 AG kurulumundan hem de CentOS-Ubuntu üzerine kurulum adımlarından ayrı ayrı bahseceğim.

Bu kısım, CentOS üzerine MSSQL Server 2017 ve 2019 kurulumunu içeriyor:

  1. Tercihinize göre 3 adet Ubuntu ya da CentOS sunucu kurun. RAM ve CPU’ya dikkat edin. Sunucular local haberleşebilsinler.

2. Sunucuların kurulum ve updateleri tamamlandıktan sonra MSSQL reposunu çekip, kurulumu gerçekleştirin. Bunun için adımlar şöyle:

MSSQL Server 2017 on CentOS 7.x kurulumu için:

curl https://packages.microsoft.com/config/rhel/7/mssql-server-2017.repo -o /etc/yum.repos.d/mssql-server-2017.repo
curl https://packages.microsoft.com/config/rhel/7/prod.repo -o /etc/yum.repos.d/msprod.repo
yum -y install mssql-server mssql-tools unixODBC-devel
Yukarıdaki adımları sırasıyla tüm nodelar üzerinde uygulayın. Görseller 2019 kurulumunu yaparken aldığım ekran görüntüleridir!

Kurulum tamamlandıktan sonra aşağıdaki komutu uygulayıp SQL’in kurulum ve konfigürasyonunu başlatın. Anlatım için Evaluation seçerek ilerledim. Eğer elinizde BYOL lisans varsa Enteperise ya da Standard sürümü seçip ilerleyebilirsiniz. Size iki defa Y/N soracak, Yes diyerek ilerleyin.

/opt/mssql/bin/mssql-conf setup

Bash ekranında sqlcmd kullanabilmek için profile path tanımlayın ve SQL Server Agent’ı başlatın.

echo 'export PATH=$PATH:/opt/mssql-tools/bin' > /etc/profile.d/mssql.sh
source /etc/profile.d/mssql.sh
sudo /opt/mssql/bin/mssql-conf set sqlagent.enabled true 
sudo systemctl restart mssql-server.service
sudo systemctl status mssql-server.service

MSSQL Server 2017 on Ubuntu 16.04 kurulumu için:

Neden Ubuntu 16.04 derseniz, POC ortamımda 16.04 ile test ettim. Benzer adımları 18.04 için kullanabilirsiniz. CentOS ile kurulumları hemen hemen aynı sadece paketler farklı. İlerleyen adımda Ubuntu ve CentOS yapılandırmasını bir götüreceğim.

Sırasıyla aşağıdaki adımları uygulayın. Bu adımların detaylarını CentOS aşamasında bahsetmiştim. Aynı işlemlerin Ubuntu hali…

wget -qO- https://packages.microsoft.com/keys/microsoft.asc | sudo apt-key add -
sudo add-apt-repository "$(wget -qO- https://packages.microsoft.com/config/ubuntu/16.04/mssql-server-2017.list)"
sudo apt-get update
sudo apt-get install -y mssql-server
sudo /opt/mssql/bin/mssql-conf setup
sudo /opt/mssql/bin/mssql-conf set sqlagent.enabled true
curl https://packages.microsoft.com/keys/microsoft.asc | sudo apt-key add -
curl https://packages.microsoft.com/config/ubuntu/16.04/prod.list | sudo tee /etc/apt/sources.list.d/msprod.list
sudo apt-get update
sudo apt-get install mssql-tools unixodbc-dev -y
sudo systemctl restart mssql-server.service
sudo systemctl status mssql-server.service
echo 'export PATH="$PATH:/opt/mssql-tools/bin"' >> ~/.bash_profile
echo 'export PATH="$PATH:/opt/mssql-tools/bin"' >> ~/.bashrc source ~/.bashrc

MSSQL Server 2019 on CentOS 7.x kurulumu için:

Bu dokümanın görsellerindeki adımlardır. MSSQL 2019 kurulum adımlarını aşağıya yazıyorum. Sırasıyla tüm nodelar üzerinde uygulayın.

sudo curl -o /etc/yum.repos.d/mssql-server.repo https://packages.microsoft.com/config/rhel/7/mssql-server-preview.repo
sudo yum makecache
sudo yum install -y mssql-server
sudo /opt/mssql/bin/mssql-conf setup
sudo /opt/mssql/bin/mssql-conf set sqlagent.enabled true 
sudo curl -o /etc/yum.repos.d/msprod.repo https://packages.microsoft.com/config/rhel/7/prod.repo
sudo yum -y install mssql-tools unixODBC-devel
sudo systemctl restart mssql-server.service
sudo systemctl status mssql-server.service
echo 'export PATH=$PATH:/opt/mssql/bin:/opt/mssql-tools/bin' | sudo tee /etc/profile.d/mssql.sh
source /etc/profile.d/mssql.sh

Bu aşamaya kadar hem Ubuntu üzerinde MSSQL Server 2017 kurulumunu hem de CentOS üzerinde MSSQL Server 2017 ve 2019 kurulum adımından bahsettim. Aynı zamanda bash screen üzerinde sqlcmd ve SQL Agent aktif etmekten bahsettim. Sonraki adımlar ortaktır, bu yüzden tek içerik gibi ilerleyeceğim.

MSSQL Server on Linux – Always ON Pre-Installation Steps:

Tüm nodeların birbirleriyle dns üzerinden konuşmalarını sağlayacağız. Böylelikle IP değişim durumunda cluster yeniden kurgulamak ya da konfigürasyonunu değiştirmeye gerek kalmayacak. Bunun için üç sunucunun hostnamelerini değiştirip, 15 karakteri geçmeyecek şekilde isimlendirin. SQL Server, 15 karakterden fazlasını algılamıyor. Sonra tüm sunucuların hosts dosyasına IP adresleriyle beraber ekleyin.

DNS tanımlarını yapıp, ping attığınızda çözümleniyorsa bir sonraki aşamaya geçebilirsiniz. Şayet ping atamıyorsanız firewall veya selinux ayarlarını gözden geçirip bir sonraki aşamaya geçin. Bir sonraki aşamada SQL Always On’u aktif edeceğiz. Bunun için aşağıdaki adımı uygulayın.

sudo /opt/mssql/bin/mssql-conf set hadr.hadrenabled 1
sudo systemctl restart mssql-server

Detaylı troubleshooting yapılmasını sağlayan AG Extended Events özelliğini aktif etmek için bütün nodelarda sorguyu çalıştırın. İster sqlcmd isterseniz de SQL Management Studio (SSMS) üzerinden uygulayın. 

ALTER EVENT SESSION AlwaysOn_health ON SERVER WITH (STARTUP_STATE=ON);
GO

Daha sonra Primary node üzerinde aşağıdaki sorguyu çalıştırın. Bunun nedeniyse Linux ortamında tüm nodelar haberleşme için sertifika kullanıyor. Sertifika şifresi için “Deneme123” kısmını değiştirmeyi unutmayın.

CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'Deneme123';
CREATE CERTIFICATE dbm_certificate WITH SUBJECT = 'dbm';
BACKUP CERTIFICATE dbm_certificate
TO FILE = '/var/opt/mssql/data/dbm_certificate.cer'
WITH PRIVATE KEY (
FILE = '/var/opt/mssql/data/dbm_certificate.pvk',
ENCRYPTION BY PASSWORD = 'Deneme123'
);

Primary node’da, /var/opt/mssql/data altında oluşan dbm ile başlayan iki sertifika dosyasını diğer iki secondary node içinde /var/opt/mssql/data/ altına kopyalayın. Dosyaların sahipliğini mssql.mssql olarak değiştirmeyi unutmayın. Secondary nodelar üzerinde aşağıdaki sorguyu çalıştırarak sertifikayı her iki sunucuya da import edin.

CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'Deneme123';
CREATE CERTIFICATE dbm_certificate
FROM FILE = '/var/opt/mssql/data/dbm_certificate.cer'
WITH PRIVATE KEY (
FILE = '/var/opt/mssql/data/dbm_certificate.pvk',
DECRYPTION BY PASSWORD = 'Deneme123'
);

Bu işlemi de tamamladıktan sonra Availability Group’un endpointini oluşturacağız. Burada database mirroring yaparken kullanılacak olan portu (5022) ve iletişim için kullanacağımız sertifikayı belirtiyoruz. Tüm nodelarda bu komutu çalıştırın.

CREATE ENDPOINT [Hadr_endpoint]
AS TCP (LISTENER_PORT = 5022)
FOR DATABASE_MIRRORING (
ROLE = ALL,
AUTHENTICATION = CERTIFICATE dbm_certificate,
ENCRYPTION = REQUIRED ALGORITHM AES
);
ALTER ENDPOINT [Hadr_endpoint] STATE = STARTED;

Firewall üzerinde 2224, 3121, 21064, 5405, 1433, 5022 portlarına erişim izni verin. (1433 dışında tüm portlara sadece nodelar arasında erişim izni verebilirsiniz. Public networke açmanıza gerek yok.)

Linux ortamında, MSSQL Server Cluster yönetimi sadece External olarak sağlanabiliyor. Yani WCSF yok. Bu nedenle cluster yönetimi denince akla ilk gelenlerden olan Pacemaker kullanacağız. Tüm nodelarda aşağıdaki adımları uygulayın.

CentOS ortam için:
yum install pacemaker pcs fence-agents resource-agents -y

Ubuntu ortam için:
sudo apt-get install pacemaker pcs fence-agents resource-agents -y

Her iki ortam için de ortak komut:
systemctl start pcsd
systemctl start pacemaker
systemctl enable pcsd
systemctl enable pacemaker

Daha önce kullandıysanız bilirsiniz, Pacemaker kurulum sonunda hacluster adında bir kullanıcı oluşturur. Bunun şifresini değiştirin. Bunun için de tüm nodelar üzerinde aşağıdaki komutu uygulayın.

sudo passwd hacluster

Şimdi pacemaker kurulumunda oluşturulan default cluster konfigürasyonunu kaldıracağız. Bunun için de aşağıdaki komutları uygulayın.

sudo pcs cluster destroy

Yeni bir cluster üzerinde, nodeları cluster haline getirmek için aşağıdaki komutları sırasıyla Primary Node üzerinde uygulayın. Burada exevolium_ag diye belirttiğim kısmı kendinize göre düzenleyin. Aynı zamanda ip-17-NODE1 kısmını hosts dosyasına yazdığınız tanımlarla değiştirin. exevolium_ag kısmına yazacağınız tanım, sizin AG isminiz olacak.

sudo pcs cluster auth ip-17-NODE1 ip-17-NODE2 ip-17-NODE3 -u hacluster -p <hacluster için tanımladığınız şifre>
sudo pcs cluster setup --name exevolium_ag ip-17-NODE1 ip-17-NODE2 ip-17-NODE3
sudo pcs cluster start --all
sudo pcs cluster enable --all

En önemli aşamalardan biri de STONITH’i devre dışı bırakmak. Tüm nodelar üzerinde bu komutu uygulayın.

sudo pcs property set stonith-enabled=false

Not: What’s STONITH?

Bir sonraki aşamada da, Pacemaker ile entegrasyon için HA Agenti kurun.

CentOS için:
sudo yum install mssql-server-ha -y
Ubuntu için:
sudo apt-get install mssql-server-ha -y

Pacemaker cluster yapılandırması için SQL kullanıcıları oluşturup, bu kullanıcılar için tanımladığımız kimlik bilgilerini SQL’e kaydedin. Bunun için de tüm nodelar üzerinde aşağıdaki T-SQL sorgusunu çalıştırın.

USE [master]
GO
CREATE LOGIN [hacluster] with PASSWORD= N'Parolanız'

ALTER SERVER ROLE [sysadmin] ADD MEMBER [hacluster]

Oluşturduğunuz kullanıcının bilgilerini SQL Server’a kaydetmek için de tüm nodelar üzerinde aşağıdaki komutları sırasıyla çalıştırın.

echo 'hacluster' >> ~/pacemaker-passwd
echo 'Parolanız' >> ~/pacemaker-passwd
sudo mv ~/pacemaker-passwd /var/opt/mssql/secrets/passwd
sudo chown root:root /var/opt/mssql/secrets/passwd
sudo chmod 400 /var/opt/mssql/secrets/passwd

Pre-installation adımlarının tamamı bitti. Şimdi Availability Group oluşturabiliriz. DNS’i kullanacağımız kısma geldik. Primary node üzerinde aşağıdaki T-SQL sorgusunu çalıştırın.

CREATE AVAILABILITY GROUP [exevolium_ag]
WITH (DB_FAILOVER = ON, CLUSTER_TYPE = EXTERNAL)
FOR REPLICA ON
N'ip-17-NODE1'
WITH (
ENDPOINT_URL = N'tcp://ip-17-NODE1:5022',
AVAILABILITY_MODE = SYNCHRONOUS_COMMIT,
FAILOVER_MODE = EXTERNAL,
SEEDING_MODE = AUTOMATIC
),
N'ip-17-NODE2'
WITH (
ENDPOINT_URL = N'tcp://ip-17-NODE2:5022',
AVAILABILITY_MODE = SYNCHRONOUS_COMMIT,
FAILOVER_MODE = EXTERNAL,
SEEDING_MODE = AUTOMATIC
),
N'ip-17-NODE3'
WITH(
ENDPOINT_URL = N'tcp://ip-17-NODE3:5022',
AVAILABILITY_MODE = SYNCHRONOUS_COMMIT,
FAILOVER_MODE = EXTERNAL,
SEEDING_MODE = AUTOMATIC
);

ALTER AVAILABILITY GROUP [exevolium_ag] GRANT CREATE ANY DATABASE;

Bu işlemden sonra Secondary nodelar üzerinde aşağıdaki T-SQL sorgularını çalıştırarak clustera dahil edin. exevolium_ag değiştirmeyi unutmayın.

ALTER AVAILABILITY GROUP [exevolium_ag] JOIN WITH (CLUSTER_TYPE = EXTERNAL);

ALTER AVAILABILITY GROUP [exevolium_ag] GRANT CREATE ANY DATABASE;

Bu işlem sonunda da tüm nodelar üzerinde aşağıdaki sorguyu çalıştırarak Pacemaker’ın yönetimi için oluşturacağınız kullanıcıya yetki verin. (hacluster kullanıcısını kullanarak ilerledim. Siz de öyle yapabilir ya da değiştirebilirsiniz.)

GRANT ALTER, CONTROL, VIEW DEFINITION ON AVAILABILITY GROUP::exevolium_ag TO <pacemaker_kullanıcısı>
GRANT VIEW SERVER STATE TO <pacemaker_kullanıcısı>

Bu işlem sonunda da bir veritabanı oluşturup, Availability Group’a dahil edin. Primary node üzerinde bu sorguyu çalıştırın. Bölümleri değiştirmeyi unutmayın.

CREATE DATABASE [exevolium];
ALTER DATABASE [exevolium] SET RECOVERY FULL;
BACKUP DATABASE [exevolium]
TO DISK = N'/var/opt/mssql/data/exevolium.bak';

ALTER AVAILABILITY GROUP [exevolium_ag] ADD DATABASE [exevolium];

Bu adımlardan sonra floating IP yapılandırması için bash ekranına dönün. Primary node bash ekranında aşağıdaki komutları sırasıyla çalıştırın.

sudo pcs resource create ag_cluster ocf:mssql:ag ag_name=exevolium_ag meta failure-timeout=30s --master meta notify=true
sudo pcs resource create virtual_ip ocf:heartbeat:IPaddr2 ip=172.xx.xxx.xxx cidr_netmask=32 op monitor interval=30s
sudo pcs constraint colocation add virtual_ip ag_cluster-master INFINITY with-rsc-role=Master
sudo pcs constraint order promote ag_cluster-master then start virtual_ip

Birinci komut ile Pacemaker üzerinde Availability Group kaynağını oluşturduk ve failure timeout süresi belirledik.
İkinci komut ile de Listener IP (Floating IP) belirledik. Burada listener IP için kullanacağınız ve ConnectionString tanımında belirteceğiniz IP’yi girin. Bu şekilde master node devre dışı kaldığında, virtual IP diğer sunucuların interface eklenerek istekleri yeni primary olan node üzerinden karşılamaya devam edecek. Böylelikle hem DR hem HA olarak kullanabilirsiniz.
Üçüncü komut ile de virtual IP’yi üzerinde tutan sunucuda çalışması için constraint eklemiş oldunuz.

Bir sonraki aşamadaysa tüm nodelar üzerinde aşağıdaki ayarları oluşturun. Bu kısım çok önemli. Aksi halde senkronizasyon yapılandırmanız ve listener IP (floating IP) yapılandırmanız eksik olur.

Üstteki görselde 2 diye belirttiğim adımı tüm nodelar üzerinde uygulamalısınız. Aksi durumda sadece Primary node üzerinde read yapılabilir. Diğer nodelar not accessible durumda olur.

Bu aşamayı da tamamladıktan sonra aşağıdaki adımı da uygulayarak Availability Group için listener IP adresini tanımlamalısınız. Bu da HA kısmı için önemli bir adım. Floting IP tanımında geçen IP’yi eklemelisiniz.

Aşağıdaki komut ile de senkronizasyon durumunu görebilirsiniz. Bilgileri kendinize göre değiştirmeyi unutmayın. Çıktısı bir üstteki görseldeki gibidir.

SELECT * FROM sys.databases WHERE name = 'exevolium';
GO
SELECT DB_NAME(database_id) AS 'database', synchronization_state_desc FROM sys.dm_hadr_database_replica_states;

Böylelikle hem HA hem DR hem de production için kullanabileceğiniz bir ortam yapılandırdık. Cluster yönetimi için Google’da kısa bir araştırma yapabilirsiniz. Eğer bir sorunla karşılaşır ya da sistemin yönetimiyle ilgili kafanıza takılan bir soru olursa sosyal medya aracılığıyla ulaşabilirsiniz.

MSSQL on Linux üzerine merak ettiğiniz diğer tüm yapılandırma içeriklerine Microsoft’un dokümanları üzerinden ulaşabilirsiniz.
Not2:Configure SQL Server on Linux with the mssql-conf tool

Umarım zamandan kazanmanızı sağlar.