首页 > 数据库 >Docker部署SQL Server 2019 Always On集群

Docker部署SQL Server 2019 Always On集群

时间:2022-09-29 12:00:38浏览次数:79  
标签:dbm Always Server 2019 sql docker server com mssql


Docker部署Always on集群

SQL Server在2016年开始支持Linux。随着2017和2019版本的发布,它开始支持Linux和容器平台上的HA/DR、Kubernetes和大数据集群解决方案。

在本文中,我们将在3个节点的Docker容器上安装SQL Server 2019,并创建AlwaysOn可用性组。

我们的目标是使用单个配置文件快速准备好环境。因此,开发人员或测试团队可以快速执行诸如兼容性、连通性、代码功能等测试。

在本节中,我们将首先准备一个基于Ubuntu的映像,以便能够在容器上安装可用性组。然后我们将执行必要的安装。

重要提示:不建议在生产环境中执行操作。安装是在Ubuntu 18.04上执行的。

安装Docker

安装Docker就不介绍了,自行安装即可.

架构

主机名

IP

端口

角色

sqlNode1

宿主机IP

1501:1433


sqlNode2

宿主机IP

1502:1433

副本

sqlNode3

宿主机IP

1503:1433

副本

端口表示:外网端口:内网端口

准备相关容器镜像

拉取操作系统和数据库的Docker镜像,如下

操作系统

docker pull ubuntu:18.04

SQL Server 2019

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

可通过​​docker images​​来查看已下载的镜像信息。

镜像地址:https://hub.docker.com/_/microsoft-mssql-server

开始配置-容器

环境准备完毕后,开始正式的配置安装。

步骤1:创建Dockerfile

创建目录用于存放dockerfile、docker-compose.yml等文件。

mkdir /sql2019ha
cd /sql2019ha
touch dockerfile
vi dockerfile
  • dockerfile内容如下
FROM ubuntu:18.04

RUN apt-get update

RUN apt install sudo wget curl gnupg gnupg1 gnupg2 -y
RUN apt install software-properties-common systemd vim -y
RUN wget -qO- https://packages.microsoft.com/keys/microsoft.asc | sudo apt-key add -

RUN add-apt-repository "$(wget -qO- https://packages.microsoft.com/config/ubuntu/18.04/mssql-server-2019.list)"
RUN apt-get update
RUN apt-get install -y mssql-server

RUN /opt/mssql/bin/mssql-conf set hadr.hadrenabled 1
RUN /opt/mssql/bin/mssql-conf set sqlagent.enabled true

EXPOSE 1433

ENTRYPOINT /opt/mssql/bin/sqlservr

说明

FROM:表示基于什么镜像进行安装的

RUN:在镜像中进行的操作

EXPOSE:指定服务端口

ENTRYPOINT:运行命令

步骤2:编译镜像

通过dockerfile来编译镜像,用于后面的安装,命令:​​docker build -t sqlag2019:ha .​

其中​​sqlag2019​​​为镜像名称,​​ha​​​是镜像标签,​​.​​表示在当前目录下编译,因为dockerfile就在当前目录下。

以下输出是精简的,实际上输出非常多…也需要一定时间(安装一些包、数据库等),由网速决定

$ docker build -t sqlag2019:ha .
Sending build context to Docker daemon 2.56kB
Step 1/12 : FROM ubuntu:18.04
---> c3c304cb4f22
Step 2/12 : RUN apt-get update
---> Running in 950e50f80f00
Get:1 http://archive.ubuntu.com/ubuntu bionic InRelease [242 kB]
Get:2 http://security.ubuntu.com/ubuntu bionic-security InRelease [88.7 kB]
Get:3 http://security.ubuntu.com/ubuntu bionic-security/main amd64 Packages [932 kB]
Get:4 http://archive.ubuntu.com/ubuntu bionic-updates InRelease [88.7 kB]...
Step 3/12 : RUN apt install sudo wget curl gnupg gnupg1 gnupg2 -y
---> Running in edc9d15b2383
..
..
Step 8/12 : RUN sudo apt-get install -y mssql-server
---> Running in 43d82a503f8a
Reading package lists...
Building dependency tree...
Reading state information...
The following additional packages will be installed:
Step 9/12 : RUN sudo /opt/mssql/bin/mssql-conf set hadr.hadrenabled 1
---> Running in 166c6596d2dd
SQL Server needs to be restarted in order to apply this setting. Please run
'systemctl restart mssql-server.service'.
Removing intermediate container 166c6596d2dd
---> bcdb057fed43
Step 10/12 : RUN sudo /opt/mssql/bin/mssql-conf set sqlagent.enabled true
---> Running in 22dd6a93d1ef
SQL Server needs to be restarted in order to apply this setting. Please run
'systemctl restart mssql-server.service'.
Removing intermediate container 22dd6a93d1ef
---> 6b90afbaf94e
Step 11/12 : EXPOSE 1433
---> Running in bcc14f3b0bad
Removing intermediate container bcc14f3b0bad
---> 4aae1563aa74
Step 12/12 : ENTRYPOINT /opt/mssql/bin/sqlservr
---> Running in 68b6ed45ff6a
Removing intermediate container 68b6ed45ff6a
---> b7467618c371
Successfully built b7467618c371
Successfully tagged sqlag2019:ha

最后出现​​Successfully​​表示编译成功,否则根据错误信息进行解决。

步骤3:创建容器

现在镜像编译好了,下面再通过​​docker-compose​​文件来创建、配置3个容器,具体内容如下:

$ touch docker-compose.yml
$ vi
version: '3'

services:
db1:
container_name: sqlNode1
image: sqlag2019:ha
hostname: sqlNode1
domainname: lab.local
environment:
SA_PASSWORD: "MyPassWord123"
ACCEPT_EULA: "Y"
ports:
- "1501:1433"
extra_hosts:
sqlNode2.labl.local: "172.16.238.22"
sqlNode3.labl.local: "172.16.238.23"
networks:
internal:
ipv4_address: 172.16.238.21

db2:
container_name: sqlNode2
image: sqlag2019:ha
hostname: sqlNode2
domainname: lab.local
environment:
SA_PASSWORD: "MyPassWord123"
ACCEPT_EULA: "Y"
ports:
- "1502:1433"
extra_hosts:
sqlNode1.lab.local: "172.16.238.21"
sqlNode3.lab.local: "172.16.238.23"
networks:
internal:
ipv4_address: 172.16.238.22

db3:
container_name: sqlNode3
image: sqlag2019:ha
hostname: sqlNode3
domainname: lab.local
environment:
SA_PASSWORD: "MyPassWord123"
ACCEPT_EULA: "Y"
ports:
- "1503:1433"
extra_hosts:
sqlNode1.lab.local: "172.16.238.21"
sqlNode2.lab.local: "172.16.238.22"
networks:
internal:
ipv4_address: 172.16.238.23

networks:
internal:
ipam:
driver: default
config:
- subnet: 172.16.238.0/24

步骤4:启动容器

然后通过​​docker-compose up -d​​​命令启动三个容器,其中​​-d​​表示在后台运行。

$ docker-compose up -d
Creating network "sql2019hademo_internal" with the default driver
Creating sqlNode2 ...
Creating sqlNode1 ...
Creating sqlNode2
Creating sqlNode3 ...
Creating sqlNode1
Creating sqlNode2 ... done

注意:docker-compose是需要单独安装的,就是一个可执行文件。可通过apt、yum来安装。

查看容器状态

$ docker-compose ps
Name Command State Ports
--------------------------------------------------------------------------
sqlNode1 /bin/sh -c /opt/mssql/bin/ ... Up 0.0.0.0:1501->1433/tcp
sqlNode2 /bin/sh -c /opt/mssql/bin/ ... Up 0.0.0.0:1502->1433/tcp
sqlNode3 /bin/sh -c /opt/mssql/bin/ ... Up 0.0.0.0:1503->1433/tcp

至此容器已经启动完成,下面通过SSMS连接数据库进行相关检查和配置ALWAYSON。

步骤5:SSMS连接MSSQL

通过宿主机的外网IP+端口连接相应的数据库,如下:

Docker部署SQL Server 2019 Always On集群_sql

注意:IP和端口之间是逗号

Docker部署SQL Server 2019 Always On集群_ubuntu_02


可以看到数据库的图标也是Linux的图标。

配置-数据库

这部分就是在数据库中进行相关配置,如:创建KEY加密文件,管理用户、可用组等。

步骤1:连接主库-sqlNode1

主库也就是节点1,端口是1501,连接方法如上图。

我们将证书和私钥提取到​​/tmp/dbm_certificate.cer​​​和​​/tmp/dbm_certificate.pvk​​文件中。

我们将这些文件复制到其他节点,并根据以下文件创建主密钥和证书:执行以下脚本

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 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

步骤2:连接从库-sqlNode2和sqlNode3

两个从库的端口分别是:1502和1503.然后重复主库执行的操作,如下:

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

步骤3:所有节点

在所有节点上执行以下命令

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];

启用开机自启动ALWAYON,在所有节点执行以下命令

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

步骤4:创建高可用组

可以用SSMS工具和T-SQL两种方式,下面以T-SQL为例:

运行以下脚本在​​主节点​​​中创建一个可用性组。 请注意,选择​​CLUSTER_TYPE = NONE​​选项是因为它是在没有诸如Pacemaker或Windows Server故障转移群集之类的群集管理平台的情况下安装的。

如果要在Linux上安装AlwaysOn AG,则应为Pacemaker选择CLUSTER_TYPE = EXTERNAL:

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

在从库中执行以下命令,将从库加入到AG组中

ALTER AVAILABILITY GROUP [ag1] JOIN WITH (CLUSTER_TYPE = NONE);
ALTER AVAILABILITY GROUP [ag1] GRANT CREATE ANY DATABASE;
GO

至此在Docker容器中安装SQL Server Alwayson集群已经完成了!

注意:当指定​​CLUSTER_TYPE = NONE​​创建可用组时,在执行故障转移时需执行以下命令

​ALTER AVAILABILITY GROUP [ag1] FORCE_FAILOVER_ALLOW_DATA_LOSS​

测试

在主库上创建一个数据库,并加入到可用组AG中。

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

通过SSMS查看同步状态是否正常.

参考连接

  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/​


标签:dbm,Always,Server,2019,sql,docker,server,com,mssql
From: https://blog.51cto.com/u_12946336/5722452

相关文章

  • TCP Server
    TCP服务器(单客户端)1.获取本地主机的IP和端口号若本地主机有多个IP地址,则需要获取本地主机所有IP地址,指定某个IP地址用于创建服务器。 char**addresses=NULL; char......
  • VS2022/VS2019安装WinForm打包程序,Microsoft Visual Studio Installer Projects 2022
    问题:使用VS2022创建WinForm程序,完了需要打包成安装程序,这时候我去下载MicrosoftVisualStudioInstallerProjects2022插件,速度超级慢,恶心人。总算是下载下来了,我存到我......
  • 【SQLServer】SQLServer执行计划运算符-第2部分
    1.【SQLServer】SQLServer执行计划概览2.【SQLServer】SQLServer执行计划的类型3.【SQLServer】如何分析图形化的SQL执行计划4.【SQLServer】SQLServer执行计划运算符-......
  • IMC服务安装过程提示:尝试创建数据库失败请确认是否存在文件夹'C:\Program Files\imc
    问题如图:登录到iMC服务器桌面,在服务器管理器中点击配置-服务,找到MSSQLSERVER,右键属性,在登录选项卡中选择登录身份为“本地系统账号”,如下图所示: 重新启动服务器,重......
  • Can’t connect to local MySQL server through socket 原因解析
    在连接mysql的时,经常会出现以下错误提示:ERROR2002(HY000):Can'tconnecttolocalMySQLserverthroughsocket'/var/lib/mysql/mysql.sock' 出现此错误提示的原因一......
  • [SWPU2019]EasiestRe-cnblog
    [SWPU2019]EasiestRe双进程保护,特殊的内存自修改,windows异常处理机制分析程序代码当int3+nop长度为5时,debugger传回了DBG_EXCEPTION_NOT_HANDLED(0x80010001)信号,告知......
  • C#通过KEPServer对PLC进行读写(二):读取
    在通过OPCAutomation我们先了解下这个类下的三个对象1.OPCServer:创建OPC的连接2.OPCBrowser:创建OPC浏览对象3.OPCGroups:OPC通信组对象4.OPCItem:单个代操作(读取的对象)......
  • C#通过KEPServer对PLC进行读写(一):安装OPCDAAuto.dll
    之前我们已经尝试了KEPServer连接PLC读取数据,并且还成功将读取到的数据写入到MYSQL,这次分享下上层系统通过OPCAutomation来对KEPServer中的数据进行读写。在这之前,我们需......
  • geoserver 安装
    下载满足要求的geoserverdockerpullkartoza/geoserver:2.21.1自定义用户密码启动docker,数据路径按需求挂载出来/opt/geoserver/data_dirdockerrun--namege......
  • 什么是 Serverless 架构?
    简介: 什么是Serverless架构?Serverless与AI机器学习之间怎样碰撞出火花? 随着时间的推移,Serverless架构变得越来越火热,凭借着极致弹性、按量付费、低成......