構建高可用性的 SQL Server:Docker 容器下的主從同步實現

2023-06-25 18:00:32
摘要:本文將介紹如何在 Docker 環境下搭建 MS SQL Server 的主從同步,幫助讀者瞭解主從同步的原理和實現方式,進而提高資料的可靠性和穩定性。

一、前言

在當今資訊化的時代,資料的安全性和穩定性顯得尤為重要。資料庫是許多企業和組織儲存和管理資料的核心,因此如何保證資料庫的高可用性和資料的同步性是一個非常關鍵的問題。而基於主從同步的技術可以有效地解決這個問題。本文將介紹如何在 Docker 環境下搭建 MS SQL Server 的主從同步,幫助讀者瞭解主從同步的原理和實現方式,進而提高資料的可靠性和穩定性。

二、SQL Server 主從同步的原理介紹

主從同步是一種常用的技術,用於在多個 SQL Server 範例之間保持資料同步。在主從同步中,一個 SQL Server 範例被用作資料的源,而另一個或多個 SQL Server 範例則作為資料的接收端。當主節點上的資料發生更改時,這些更改將被捕獲並儲存到一個事務紀錄檔中。從節點會定期檢查主節點的事務紀錄檔,並將主節點上的更改應用到自己的資料庫中,從而保持兩個資料庫之間的資料同步。

三、具體的搭建過程

3.1 準備工作

在開始安裝之前,需要確保CentOS上已經安裝了Docker和Docker Compose。可以通過以下命令來進行安裝:

3.1.1 解除安裝舊版本(如果有,可選,非必須)

sudo yum remove docker \
              docker-client \
              docker-client-latest \
              docker-common \
              docker-latest \
              docker-latest-logrotate \
              docker-logrotate \
              docker-selinux \
              docker-engine-selinux \
              docker-engine

3.1.2 安裝 Docker

按照下列步驟依次進行安裝,中間過程直接略過

# 1.安裝需要的軟體包:
sudo yum install -y yum-utils
# 2.設定docker的stable儲存庫:
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
# 3.安裝docker:
sudo yum install -y docker-ce docker-ce-cli containerd.io
# 4.啟動docker服務:
sudo systemctl start docker
# 5.設定開機自啟動docker服務:
sudo systemctl enable docker
挖坑002:後續會寫關於docker文章,對於docker image 邏輯原理,進行講解
問答區有人提問該問題:https://ask.csdn.net/questions/7923009/54161100

3.1.3 驗證本地 Docker 是否安裝成功

sudo docker run hello-world
Hello from Docker!
This message shows that your installation appears to be working correctly.
...

3.2 建立 Docker 網路

在進行主從搭建之前,需要先建立一個 Docker 網路。這個網路用於連線所有的 SQL Server 容器。
在建立網路之前,需要先確認已經啟動了 Docker:

sudo systemctl start docker

然後,可以使用以下命令來建立一個名為sync-net的 Docker 網路:

[root@hecs-bluetata ~]# docker network create -d bridge sync-net
538c142757e91c0b798ce0e45dc02b6038f00adaf37cfe3b09659dea8c950c93

其中引數 -d 指定了網路的型別,bridge 指的是橋接網路,sync-net 指的是新建立的網路的名稱。

3.3 建立主從節點的 SQL Server 容器

建立 SQL Server 容器之前,需要先準備 SQL Server 的 Docker 映象。可以通過以下命令來獲取 SQL Server 2019 的 Docker 映象:

docker pull mcr.microsoft.com/mssql/server:2019-latest

獲取到 Docker 映象之後,就可以建立 SQL Server 容器了。可以通過以下命令來建立2個 SQL Server 容器,分別命名為 sqlserver-master、和 sqlserver-slave,並加入所建立的 Docker 網路中。

docker run --name sqlserver-master --hostname sqlserver-master --network sync-net \
    -p 1433:1433 \
    -e 'ACCEPT_EULA=Y' \
    -e 'SA_PASSWORD=P@ssw0rd01' \
    -e "MSSQL_AGENT_ENABLED=True" \
    -e "MSSQL_PID=Developer" \
    -d mcr.microsoft.com/mssql/server:2019-latest
docker run --name sqlserver-slave --hostname sqlserver-slave --network sync-net \
    -p 1434:1433 \
    -e 'ACCEPT_EULA=Y' \
    -e 'SA_PASSWORD=P@ssw0rd02' \
    -e "MSSQL_AGENT_ENABLED=True" \
    -e "MSSQL_PID=Developer" \
    -d mcr.microsoft.com/mssql/server:2019-latest

針對上述命令,相關引數的解釋:

請確確保在建立上述 Docker 的過程中沒有錯誤。

如果在建立過程中出現埠佔用,或者名稱佔用等錯誤,可以檢視相應容器,選擇性的刪除容器後,重新建立,相關命令:

docker ps -a
docker rm d3d3a4712b5f
docker stop d3d3a4712b5f

3.4 建立主從同步端點

3.4.1 設定主節點的同步端點

進入 SQL Server 主節點容器,並建立主從同步端點:

docker exec -it sqlserver-master /opt/mssql-tools/bin/sqlcmd \
-S localhost -U SA -P P@ssw0rd01 \
-Q "CREATE ENDPOINT endpoint_mirroring STATE = STARTED AS TCP (LISTENER_PORT=7022) FOR DATABASE_MIRRORING (ROLE=PARTNER)"

3.4.2 設定從節點的同步端點

進入 SQL Server 從節點容器,並建立主從同步端點:

docker exec -it sqlserver-slave /opt/mssql-tools/bin/sqlcmd \
-S localhost -U SA -P P@ssw0rd02 \
-Q "CREATE ENDPOINT endpoint_mirroring STATE = STARTED AS TCP (LISTENER_PORT=7022) FOR DATABASE_MIRRORING (ROLE=PARTNER)"

3.5 建立主從同步資料庫

3.5.1 建立主節點同步資料庫

回到 SQL Server 主節點容器,並建立主從同步資料庫:

docker exec -it sqlserver-master /opt/mssql-tools/bin/sqlcmd \
-S localhost -U SA -P P@ssw0rd01 \
-Q "CREATE DATABASE mydb" \
-Q "BACKUP DATABASE mydb TO DISK='/var/opt/mssql/data/mydb.bak'" \
-Q "RESTORE DATABASE mydb WITH NORECOVERY" \
-Q "ALTER DATABASE mydb SET PARTNER = 'TCP://sqlserver-slave:7022'"

3.5.2 建立從節點同步資料庫

回到 SQL Server 從節點容器,並建立主從同步資料庫:

docker exec -it sqlserver-slave /opt/mssql-tools/bin/sqlcmd -S localhost -U SA -P P@ssw0rd02
docker exec -it sqlserver-slave /opt/mssql-tools/bin/sqlcmd -S localhost -U SA -P P@ssw0rd02' \
-Q "CREATE DATABASE mydb" \
-Q "RESTORE DATABASE mydb FROM DISK='/var/opt/mssql/data/mydb.bak' WITH NORECOVERY" \
-Q "ALTER DATABASE mydb SET PARTNER = 'TCP://sqlserver-master:7022'"

3.6 開啟主從同步

回到 SQL Server 主節點容器,並啟動主從同步:

docker exec -it sqlserver-master /opt/mssql-tools/bin/sqlcmd `
-S localhost -U SA -P P@ssw0rd01 \
-Q "ALTER DATABASE mydb SET PARTNER SAFETY OFF" \
-Q "ALTER DATABASE mydb SET PARTNER SAFETY ON" \

3.7 驗證同步狀態

回到 SQL Server 主節點容器,並檢視主從同步狀態:

docker exec -it sqlserver-master /opt/mssql-tools/bin/sqlcmd \
-S localhost -U SA -P P@ssw0rd01 \
-Q "SELECT database_id, synchronization_state_desc FROM sys.database_mirroring WHERE database_id = DB_ID('mydb')"

可以看到以下的輸出結果:

database_id synchronization_state_desc
-----------  ------------------------
5            SYNCHRONIZED

這表示主從同步已經成功地建立,並且 mydb 資料庫已經在主從節點之間同步。

注意:這裡我這裡使用了開發版的 SQL Server 映象,如果你在生產環境中使用 SQL Server,請使用適當版本的映象,並根據需要進行調整。

四、總結

本文介紹了在 Docker 環境下搭建 MS SQL Server 的主從同步,並演示瞭如何進行設定和管理。通過本文的學習,你可以瞭解主從同步技術的實現原理和具體操作方法,併為提高資料可靠性和穩定性提供了一種有效的解決方案。同時,也需要認真考慮主從同步的一些限制和要求,並根據實際情況進行設定和管理。

 

點選關注,第一時間瞭解華為雲新鮮技術~