Docker Container: SQL Server 2019 AlwaysOn Availability Group – Part 3

Serinin son bölümünde Docker Container üzerinde AlwaysOn AG kurulumunu tamamlayacağız. Bir önceki bölümde ayağa kaldırdığımız containerlara bağlantı testini gerçekleştirmiştik.

Önceki bölümlere Part 1 ve Part 2 linklerinden ulaşabilirsiniz.

Primary node’a yani 1501 portuna sahip node’umuza bağlanarak aşağıdaki script ile kullanacağım login, master key ve certificate oluşturacağız. Certificate ve private key’i /tmp/dbm_certificate.cer ve /tmp/dbm_certificate.pvk dosyalarına çıkartıyoruz. Bu dosyaları diğer nodelara kopyalayıp master key ve certificateleri bu dosyalara göre oluşturacağız:

USE master
GO

CREATE LOGIN dbm_login WITH PASSWORD = 'MyStr0ngPa$$w0rd';
CREATE USER dbm_user FOR LOGIN dbm_login;
GO

CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'MyStr0ngPa$$w0rd';
go
CREATE CERTIFICATE dbm_certificate WITH SUBJECT = 'dbm';
BACKUP CERTIFICATE dbm_certificate
TO FILE = '/tmp/dbm_certificate.cer'
WITH PRIVATE KEY (
        FILE = '/tmp/dbm_certificate.pvk',
        ENCRYPTION BY PASSWORD = 'MyStr0ngPa$$w0rd'
    );
GO

Docker host üzerinde aşağıdaki komutları çalıştırarak cer ve pvk uzantılı dosyalarımızı containerdan diğer nodelara kopyalacağız:

$ docker cp sqlNode1:/tmp/dbm_certificate.cer .
$ docker cp sqlNode1:/tmp/dbm_certificate.pvk .
$ docker cp dbm_certificate.cer sqlNode2:/tmp/
$ docker cp dbm_certificate.pvk sqlNode2:/tmp/
$ docker cp dbm_certificate.cer sqlNode3:/tmp/
$ docker cp dbm_certificate.pvk sqlNode3:/tmp/

Secondary nodelara yani 1502 ve 1503 portlu nodelara bağlanarak aşağıdaki scriptleri çalıştırarak login, master key ve certificate oluşturuyoruz:

CREATE LOGIN dbm_login WITH PASSWORD = 'MyStr0ngPa$$w0rd';
CREATE USER dbm_user FOR LOGIN dbm_login;
GO

CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'MyStr0ngPa$$w0rd';
GO
CREATE CERTIFICATE dbm_certificate   
    AUTHORIZATION dbm_user
    FROM FILE = '/tmp/dbm_certificate.cer'
    WITH PRIVATE KEY (
    FILE = '/tmp/dbm_certificate.pvk',
    DECRYPTION BY PASSWORD = 'MyStr0ngPa$$w0rd'
);
GO

AlwaysOn için endpointleri oluşturmak amacıyla tüm nodelarda aşağıdaki scripti çalıştırıyoruz:

CREATE ENDPOINT [Hadr_endpoint]
    AS TCP (LISTENER_IP = (0.0.0.0), LISTENER_PORT = 5022)
    FOR DATA_MIRRORING (
        ROLE = ALL,
        AUTHENTICATION = CERTIFICATE dbm_certificate,
        ENCRYPTION = REQUIRED ALGORITHM AES
        );
ALTER ENDPOINT [Hadr_endpoint] STATE = STARTED;
GRANT CONNECT ON ENDPOINT::[Hadr_endpoint] TO [dbm_login];
GO

Yine tüm nodelarda AlwaysOn’a ait extended event session’ı startupta aktif etmek için:

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

Primary nodeda availability group oluşturabilmek için aşağıdaki scripti çalıştırıyoruz. Dikkat edilirse CLUSTER_TYPE = NONE seçeneği Pacemaker ya da Windows Server Failover Cluster benzeri bir cluster yönetim platformu olmadan kurulum yapıldığı için tercih edildi. Linux üzerinde AlwaysOn AG kurulumunda Pacemaker için CLUSTER_TYPE = EXTERNAL tercih edilmelidir:

CREATE AVAILABILITY GROUP [AG1]
        WITH (CLUSTER_TYPE = NONE)
        FOR REPLICA ON
        N'sqlNode1'
            WITH (
            ENDPOINT_URL = N'tcp://sqlNode1:5022',
            AVAILABILITY_MODE = ASYNCHRONOUS_COMMIT,
                SEEDING_MODE = AUTOMATIC,
                FAILOVER_MODE = MANUAL,
            SECONDARY_ROLE (ALLOW_CONNECTIONS = ALL)
                ),
        N'sqlNode2'
            WITH (
            ENDPOINT_URL = N'tcp://sqlNode2:5022',
            AVAILABILITY_MODE = ASYNCHRONOUS_COMMIT,
                SEEDING_MODE = AUTOMATIC,
                FAILOVER_MODE = MANUAL,
            SECONDARY_ROLE (ALLOW_CONNECTIONS = ALL)
                ),
        N'sqlNode3'
            WITH (
            ENDPOINT_URL = N'tcp://sqlNode3:5022',
            AVAILABILITY_MODE = ASYNCHRONOUS_COMMIT,
                SEEDING_MODE = AUTOMATIC,
                FAILOVER_MODE = MANUAL,
            SECONDARY_ROLE (ALLOW_CONNECTIONS = ALL)
                );
    GO

Secondary nodeları AG’e dahil edeceğiz:

ALTER AVAILABILITY GROUP [ag1] JOIN WITH (CLUSTER_TYPE = NONE);
ALTER AVAILABILITY GROUP [ag1] GRANT CREATE ANY DATABASE;
GO

Secondary nodeların join işleminden sonra Primary nodeda yeni bir veri tabanı oluşturup AG’e dahil edeceğiz:

CREATE DATABASE agtestdb;
GO
ALTER DATABASE agtestdb SET RECOVERY FULL;
GO
BACKUP DATABASE agtestdb TO DISK = '/var/opt/mssql/data/agtestdb.bak';
GO
ALTER AVAILABILITY GROUP [ag1] ADD DATABASE [agtestdb];
GO

Son aşamada ise AlwaysOn Availability Groups Dashboard üzerinde AG’nin durumunu kontrol ediyoruz:

Böylece Docker Container üzerinde Always On availability group kurulumu tamamlamış olduk.

Ek bilgi olarak; CLUSTER_TYPE = NONE ile kurulum yapıldığı failover yapmak isterseniz
ALTER AVAILABILITY GROUP [ag1] FORCE_FAILOVER_ALLOW_DATA_LOSS ile kontrollü failover yapmanız gerekiyor.

Artık Docker compose ile kaldırdığımız stack’i durdurabiliriz.

$ docker-compose down
Stopping sqlNode1 ... done
Stopping sqlNode3 ... done
Stopping sqlNode2 ... done
Removing sqlNode1 ... done
Removing sqlNode3 ... done
Removing sqlNode2 ... done
Removing network sql2019hademo_internal

Görüşmek üzere, sağlıcakla kalın.

Faydalanılan kaynaklar:

  1. https://docs.microsoft.com/en-us/sql/linux/quickstart-install-connect-docker?view=sql-server-ver15
  2. https://docs.microsoft.com/en-us/sql/linux/quickstart-install-connect-ubuntu?view=sql-server-ver15
  3. https://docs.microsoft.com/en-us/sql/linux/sql-server-linux-create-availability-group?view=sql-server-ver15
  4. https://docs.microsoft.com/en-us/sql/linux/sql-server-linux-configure-mssql-conf?view=sql-server-ver15
  5. https://docs.microsoft.com/en-us/sql/linux/sql-server-linux-configure-environment-variables?view=sql-server-ver15
  6. https://docs.microsoft.com/en-us/sql/linux/sql-server-linux-availability-group-cluster-ubuntu?view=sql-server-linux-ver15
  7. https://docs.docker.com/engine/install/ubuntu/
  8. https://docs.docker.com/compose/

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir