[ 云原生 | Docker ] 构建高可用性的 SQL Server:Docker 容器下的主从同步实现指南

本文涉及的产品
RDS SQL Server Serverless,2-4RCU 50GB 3个月
推荐场景:
云数据库 RDS SQL Server,基础系列 2核4GB
简介: 在当今信息化的时代,数据的安全性和稳定性显得尤为重要。数据库是许多企业和组织存储和管理数据的核心,因此如何保证数据库的高可用性和数据的同步性是一个非常关键的问题。而基于主从同步的技术可以有效地解决这个问题。本文将介绍如何在 Docker 环境下搭建 MS SQL Server 的主从同步,帮助读者了解主从同步的原理和实现方式,进而提高数据的可靠性和稳定性。

本系列博文还在更新中,收录在专栏:#MS-SQL Server 专栏中。

本系列文章列表如下:

【SQL Server】 Linux 运维下对 SQL Server 进行安装、升级、回滚、卸载操作
【SQL Server】数据库开发指南(一)数据库设计的核心概念和基本步骤
【SQL Server】数据库开发指南(二)MSSQL数据库开发对于库、表、数据类型、约束等相关操作
【SQL Server】数据库开发指南(三)面向数据分析的 T-SQL 编程技巧与实践
[ 云原生 | Docker ] 构建高可用性的 SQL Server:Docker 容器下的主从同步实现指南
【SQL Server】数据库开发指南(五)T-SQL 高级查询综合应用与实战
【SQL Server】数据库开发指南(六)索引和视图的使用技巧、方法与综合应用
【SQL Server】数据库开发指南(七)MS-SQL存储过程全面解析:种类、优点和创建方法详解
【SQL Server】数据库开发指南(八)高级数据处理技术 MS-SQL 事务、异常和游标的深入研究
【SQL Server】数据库开发指南(九)详细讲解 MS-SQL 触发器的基础概念与应用场景

@[toc]

一、前言

在当今信息化的时代,数据的安全性和稳定性显得尤为重要。数据库是许多企业和组织存储和管理数据的核心,因此如何保证数据库的高可用性和数据的同步性是一个非常关键的问题。而基于主从同步的技术可以有效地解决这个问题。本文将介绍如何在 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.
...

image.png

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

针对上述命令,相关参数的解释:

参数 含义
-e 'ACCEPT_EULA=Y' 此参数用于接受微软的许可证协议,表明你已经同意了微软的许可协议。
-e 'SA_PASSWORD=P@ssw0rd01' 此参数用于设置 SQL Server 的 SA 账户密码,你应该使用强密码。
-p 1433:1433 此参数用于暴露容器中的 1433 端口,使外部可以访问到 SQL Server 实例。
--name sqlserver-master 此参数用于为 SQL Server 设置容器的名称。
--hostname sqlserver-master 此参数用于为 SQL Server 设置主机名。
--network sync-net 此参数用于将 SQL Server 容器连接到指定的网络中。
-e "MSSQL_AGENT_ENABLED=True" 此参数用于启用 SQL Server 代理,以便可以自动执行定期任务。
-e "MSSQL_PID=Developer" 此参数用于指定 SQL Server 容器的产品ID,这里指定的是 Developer 版本。
-d mcr.microsoft.com/mssql/server:2019-latest 此参数用于指定 SQL Server 容器的镜像,这里使用的是最新的 SQL Server 2019 镜像。

请确确保在创建上述 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)"

image.png

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.1 创建从节点同步数据库

回到 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 的主从同步,并演示了如何进行配置和管理。通过本文的学习,你可以了解主从同步技术的实现原理和具体操作方法,并为提高数据可靠性和稳定性提供了一种有效的解决方案。同时,也需要认真考虑主从同步的一些限制和要求,并根据实际情况进行配置和管理。

相关实践学习
使用SQL语句管理索引
本次实验主要介绍如何在RDS-SQLServer数据库中,使用SQL语句管理索引。
SQL Server on Linux入门教程
SQL Server数据库一直只提供Windows下的版本。2016年微软宣布推出可运行在Linux系统下的SQL Server数据库,该版本目前还是早期预览版本。本课程主要介绍SQLServer On Linux的基本知识。 相关的阿里云产品:云数据库RDS SQL Server版 RDS SQL Server不仅拥有高可用架构和任意时间点的数据恢复功能,强力支撑各种企业应用,同时也包含了微软的License费用,减少额外支出。 了解产品详情: https://www.aliyun.com/product/rds/sqlserver
目录
相关文章
|
2月前
|
SQL Cloud Native 调度
云原生数据仓库使用问题之如何修改历史数据清理的SQL
阿里云AnalyticDB提供了全面的数据导入、查询分析、数据管理、运维监控等功能,并通过扩展功能支持与AI平台集成、跨地域复制与联邦查询等高级应用场景,为企业构建实时、高效、可扩展的数据仓库解决方案。以下是对AnalyticDB产品使用合集的概述,包括数据导入、查询分析、数据管理、运维监控、扩展功能等方面。
|
29天前
|
前端开发 PHP 开发者
React Server Component 使用问题之怎么使用Docker运行PHP应用
React Server Component 使用问题之怎么使用Docker运行PHP应用
|
2月前
|
SQL 存储 监控
SQL Server的并行实施如何优化?
【7月更文挑战第23天】SQL Server的并行实施如何优化?
58 13
|
2月前
|
SQL
解锁 SQL Server 2022的时间序列数据功能
【7月更文挑战第14天】要解锁SQL Server 2022的时间序列数据功能,可使用`generate_series`函数生成整数序列,例如:`SELECT value FROM generate_series(1, 10)。此外,`date_bucket`函数能按指定间隔(如周)对日期时间值分组,这些工具结合窗口函数和其他时间日期函数,能高效处理和分析时间序列数据。更多信息请参考官方文档和技术资料。
|
2月前
|
SQL 存储 网络安全
关系数据库SQLserver 安装 SQL Server
【7月更文挑战第26天】
44 6
|
23天前
|
Docker 容器
【Azure 应用服务】App Server 部署后,Docker报错,找不到8080端口
【Azure 应用服务】App Server 部署后,Docker报错,找不到8080端口
|
1月前
|
SQL 安全 Java
驱动程序无法通过使用安全套接字层(SSL)加密与 SQL Server 建立安全连接。错误:“The server selected protocol version TLS10 is not accepted by client
驱动程序无法通过使用安全套接字层(SSL)加密与 SQL Server 建立安全连接。错误:“The server selected protocol version TLS10 is not accepted by client
143 0
|
1月前
|
Linux Docker Windows
Windows——Docker拉取Windows Server镜像
Windows——Docker拉取Windows Server镜像
99 0
|
2月前
|
存储 SQL C++
对比 SQL Server中的VARCHAR(max) 与VARCHAR(n) 数据类型
【7月更文挑战7天】SQL Server 中的 VARCHAR(max) vs VARCHAR(n): - VARCHAR(n) 存储最多 n 个字符(1-8000),适合短文本。 - VARCHAR(max) 可存储约 21 亿个字符,适合大量文本。 - VARCHAR(n) 在处理小数据时性能更好,空间固定。 - VARCHAR(max) 对于大文本更合适,但可能影响性能。 - 选择取决于数据长度预期和业务需求。
|
2月前
|
SQL Oracle 关系型数据库
MySQL、SQL Server和Oracle数据库安装部署教程
数据库的安装部署教程因不同的数据库管理系统(DBMS)而异,以下将以MySQL、SQL Server和Oracle为例,分别概述其安装部署的基本步骤。请注意,由于软件版本和操作系统的不同,具体步骤可能会有所变化。
130 3