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

news/2024/10/11 16:36:17/

文章目录

    • 一、前言
    • 二、SQL Server 主从同步的原理介绍
    • 三、具体的搭建过程
      • 3.1 准备工作
        • 3.1.1 卸载旧版本(如果有,可选,非必须)
        • 3.1.2 安装 Docker
        • 3.1.3 验证本地 Docker 是否安装成功
      • 3.2 创建 Docker 网络
      • 3.3 创建主从节点的 SQL Server 容器
      • 3.4 创建主从同步端点
        • 3.4.1 配置主节点的同步端点
        • 3.4.2 配置从节点的同步端点
      • 3.5 创建主从同步数据库
        • 3.5.1 创建主节点同步数据库
        • 3.5.1 创建从节点同步数据库
      • 3.6 开启主从同步
      • 3.7 验证同步状态
    • 五、总结

一、前言

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

在这里插入图片描述

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


http://www.ppmy.cn/news/53624.html

相关文章

Nestjs全网最佳翻译-概况-守卫-Guards

守卫 带上装饰器 Injectable() 并实现了 CanActivate 接口的类,就是守卫。 守护只做一件事情。他们根据运行时的某些条件(如权限、角色、ACL等)来决定一个给定的请求是否会被路由处理程序处理。这通常被称为授权。在传统的Express应用程序中…

4.24日报

Redis 有哪些功能? 数据缓存功能 分布式锁的功能 支持数据持久化 支持事务 支持消息队列 181. Redis 和 memcache 有什么区别? 存储方式不同:memcache 把数据全部存在内存之中,断电后会挂掉,数据不能超过内存大小&…

修炼汇编语言第二章:内存地址空间(概述)

目录 前言 一、主板和接口卡 二、存储器各类芯片 三:内存地址空间 总结 前言 什么是内存地址空间呢?如果地址线为10,那么可以寻址1024个地址空间,这1024个地址空间就构成这个CPU的内存地址空间,下面本文将会介绍…

Redis Set 用了 2 种数据结构来存储,到现在才知道

Sets 无序集合,他的功能就好像你熟悉的 Java 中的 HashSet 一样。集合是通过散列表实现的,所以添加、删除、查找元素的时间复杂度是 O(1)。 1. 是什么 Sets 是 String 类型的无序集合,集合中的元素是唯一的,集合中不会出现重复的数…

基于JS简单甘特图(IT枫斗者)

基于JS简单甘特图 基于JS简单甘特图 先来看一下效果吧,这里的需求是从早上的5点为开始时间,到第二天到凌晨5点 前期准备 其实网上有很多甘特图的实现方式,但是他们都只能具象到天,不能具体到某个时间点,而且每一个…

【环境配置】Window上Git clone 如何提高速度

步骤一:得到ip 在下列网站上 https://www.ipaddress.com/ 分别搜索: github.global.ssl.fastly.netgithub.com然后记录得到的IP地址 步骤二: 修改host 在Windows中,先进入:C:\Windows\System32\drivers\etc 目录 …

HTML 颜色名

所有浏览器支持的颜色名称 所有现代浏览器均支持以下 140 种颜色名称(单击颜色名称或十六进制值可将颜色查看为背景颜色与不同的文本颜色的搭配): 有关 HTML 颜色的完整概述,请访问我们的颜色教程。 颜色名十六进制颜色值颜色AliceBlue#F0F8FFAntiqueWhite#FAEBD7Aqua#00…

elasticsearch结构化查询

在上一篇中我们介绍了DSL相关的知识,接下来我们将会学习elasticsearch的结构化查询,同时也实践一下上一篇的DSL的查询用法 什么是结构化搜索? 从《Elasticsearch权威指南》上摘取部分解释如下: 结构化搜索是指查询包含内部结构的数据。日期&#xff0…