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

来源:https://www.cnblogs.com/huaweiyun/archive/2023/06/25/17503054.html
-Advertisement-
Play Games

摘要:本文將介紹如何在 Docker 環境下搭建 MS SQL Server 的主從同步,幫助讀者瞭解主從同步的原理和實現方式,進而提高數據的可靠性和穩定性。 一、前言 在當今信息化的時代,數據的安全性和穩定性顯得尤為重要。資料庫是許多企業和組織存儲和管理數據的核心,因此如何保證資料庫的高可用性和數 ...


摘要:本文將介紹如何在 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 的主從同步,並演示瞭如何進行配置和管理。通過本文的學習,你可以瞭解主從同步技術的實現原理和具體操作方法,併為提高數據可靠性和穩定性提供了一種有效的解決方案。同時,也需要認真考慮主從同步的一些限制和要求,並根據實際情況進行配置和管理。

 

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


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • Maven 是一種軟體項目管理和理解工具;它基於項目對象模型(POM),從中央位置管理項目的構建、報告和文檔,並幫助開發人員輕鬆管理依賴項並自動化構建過程。 1、簡介 1.1、項目目錄 Maven 使用約定優於配置的原則,提倡使用一個共同的標準目錄結構。 目錄說明 ${basedir} 項目根目錄, ...
  • > 內容摘自我的學習網站:topjavaer.cn ## 什麼是MySQL MySQL是一個關係型資料庫,它採用表的形式來存儲數據。你可以理解成是Excel表格,既然是表的形式存儲數據,就有表結構(行和列)。行代表每一行數據,列代表該行中的每個值。列上的值是有數據類型的,比如:整數、字元串、日期等等 ...
  • 大家好,我是沙漠盡頭的狼。 網站使用Blazor重構上線一天了,用Blazor開發是真便捷,空閑時間查查gpt和github,又上線一個 [正則表達式線上驗證工具](https://dotnet9.com/tools/regextester) 和幾個線上小游戲,比如 [井字棋游戲](https:// ...
  • 在`WPF`中,命令是一種用於處理用戶交互操作的機制。它將操作行為與界面元素解耦,使得界面元素可以通過命令進行觸發和執行相應的邏輯。`WPF`中的命令模型通過`ICommand`介面和相關的實現類來實現。命令模式的設計思想是將命令的發送者(例如按鈕)與命令的執行者(例如視圖模型中的方法)解耦,使得它... ...
  • 問題應該算挺常見的但是一句話還挺難說清楚,所以百度特別難搜。 場景就是,有一堆以員工名稱命名的文件(名稱可能還有字母數字等前尾碼),現在給定一個員工清單,需要從這些文件中篩選出員工清單上列出的員工的文件,並複製到另外一個目錄中。 輸入: 1. 許多文件名包含員工名稱的文件 2.一個清單文件,裡面包含 ...
  • 哈嘍大家好,我是鹹魚 今天跟大家分享一個關於 zabbix Timeout 值設置不當導致的問題,這個問題不知道大家有沒有碰到過 ## 問題 事情經過是這樣的: 把某一臺 zabbix agent 的模板由原來的 `Template OS Windows by Zabbix agent` 換成了 ` ...
  • # Spark Spark是一種快速、通用、可擴展的大數據分析引擎,2009年誕生於加州大學伯克利分校AMPLab,2010年開源,2013年6月成為Apache孵化項目,2014年2月成為Apache的頂級項目,2014年5月發佈spark1.0,2016年7月發佈spark2.0,2020年6月 ...
  • ![file](https://img2023.cnblogs.com/other/3195851/202306/3195851-20230625185718639-2144905227.jpg) > 近日,Apache SeaTunnel 正式發佈 2.3.2 版本。此時距離上一版本 2.3.1 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...