SQL Server 2019 AlwaysOn Availability Group on Docker Container – Part III

Primary node, yani 1501 numaralı porta sahip node’a bağlanarak, aşağıdaki komut dosyasıyla login, master key ve certificate oluşturacağız.

Master key ve certificate’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 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 hostta aşağıdaki komutları çalıştırarak, cer ve pvk uzantılı dosyaları diğer nodelara kopyalıyoruz:

$ 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 bağlanıyoruz. (1502 ve 1503 portlu olan containerlar). Aşağıdaki scriptleri çalıştırarak login, master key ve certificateleri 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 komutları ç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

Startupta tüm nodelarda AlwaysOn’a ait extended event session’ı etkinleştirmek için:

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

Primary nodeda Availability Group oluşturmak için aşağıdaki komutları çalıştırıyoruz. Pacemaker veya Windows Server Failover Cluster gibi bir Cluster Manager olmadan kurulduğu için CLUSTER_TYPE = NONE seçeneğinin seçildiğini unutmayın.

AlwaysOn AG’yi Linux üzerinde kuracaksanız, Pacemaker için CLUSTER_TYPE = EXTERNAL seçmelisiniz:

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 join 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 node üzerinde bir database 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 olarak, AlwaysOn Availability Group Dashboard üzerinde son durumu kontrol edelim:

Böylece Docker Container üzerinde AlwaysOn Availability Group kurulumunu başarıyla tamamlamış olduk.

Ek olarak; “CLUSTER_TYPE = NONE” ile kurulum yaptığınızda, failover gerçekleştirmek istiyorsanız aşağıdaki komut ile kontrollü bir failover yapmanız gerekmektedir. Ancak önce, failover gerçekleştirmek istediğiniz secondary node’un last commit time değerini kontrol etmenizi öneririm.

ALTER AVAILABILITY GROUP [ag1] FORCE_FAILOVER_ALLOW_DATA_LOSS;

Artık Docker compose stack’ini 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