Docker部署SQL Server 2019 Always On集群
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.04RUN apt-get updateRUN 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-serverRUN /opt/mssql/bin/mssql-conf set hadr.hadrenabled 1 RUN /opt/mssql/bin/mssql-conf set sqlagent.enabled trueEXPOSE 1433ENTRYPOINT /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 docker-compose.yml
version: '3'services:db1:container_name: sqlNode1image: sqlag2019:hahostname: sqlNode1domainname: lab.localenvironment: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.21db2:container_name: sqlNode2image: sqlag2019:hahostname: sqlNode2domainname: lab.localenvironment: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.22db3:container_name: sqlNode3image: sqlag2019:hahostname: sqlNode3domainname: lab.localenvironment: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.23networks:internal:ipam:driver: defaultconfig:- 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+端口连接相应的数据库,如下:
注意:IP和端口之间是逗号
可以看到数据库的图标也是Linux的图标。
配置-数据库
这部分就是在数据库中进行相关配置,如:创建KEY加密文件,管理用户、可用组等。
步骤1:连接主库-sqlNode1
主库也就是节点1,端口是1501,连接方法如上图。
我们将证书和私钥提取到/tmp/dbm_certificate.cer
和/tmp/dbm_certificate.pvk
文件中。
我们将这些文件复制到其他节点,并根据以下文件创建主密钥和证书:执行以下脚本
USE master
GOCREATE LOGIN dbm_login WITH PASSWORD = 'MyStr0ngPa$w0rd';
CREATE USER dbm_user FOR LOGIN dbm_login;
GOCREATE 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 dbm_certificate.pvk sqlNode3:/tmp/
步骤2:连接从库-sqlNode2和sqlNode3
两个从库的端口分别是:1502和1503.然后重复主库执行的操作,如下:
CREATE LOGIN dbm_login WITH PASSWORD = 'MyStr0ngPa$w0rd';
CREATE USER dbm_user FOR LOGIN dbm_login;
GOCREATE MASTER KEY ENCRYPTION BY PASSWORD = 'MyStr0ngPa$w0rd';
GO
CREATE CERTIFICATE dbm_certificate AUTHORIZATION dbm_userFROM 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 ONN'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查看同步状态是否正常.
参考连接
- https://docs.microsoft.com/en-us/sql/linux/quickstart-install-connect-docker?view=sql-server-ver15
- https://docs.microsoft.com/en-us/sql/linux/quickstart-install-connect-ubuntu?view=sql-server-ver15
- https://docs.microsoft.com/en-us/sql/linux/sql-server-linux-create-availability-group?view=sql-server-ver15
- https://docs.microsoft.com/en-us/sql/linux/sql-server-linux-configure-mssql-conf?view=sql-server-ver15
- https://docs.microsoft.com/en-us/sql/linux/sql-server-linux-configure-environment-variables?view=sql-server-ver15
- https://docs.microsoft.com/en-us/sql/linux/sql-server-linux-availability-group-cluster-ubuntu?view=sql-server-linux-ver15
- https://docs.docker.com/engine/install/ubuntu/
- https://docs.docker.com/compose/
Docker部署SQL Server 2019 Always On集群相关推荐
- Docker 部署SQL Server 2017
Docker 部署SQL Server 2017 一.部署步骤 1.下载镜像 2.创建容器并运行 二.参考文档 一.部署步骤 1.下载镜像 代码如下(示例): sudo docker pull mcr ...
- [转] 微软SQL Server 2008故障转移集群概述(Windows Server Failover Clustering (WSFC))
前言: 最近在研究微软的大数据解决方案,在收听MS TechNet "SQL Server 2012 AlwaysOn HA+DR设计模型.架构及最佳实践" 时,需要一些预备知识, ...
- SQL Server 2008故障转移集群+数据库镜像配置实例之三
前两篇文章已经建立了SQL 2008 的故障转移集群,由于故障转移集群存在一个单点故障,既是当网络存储设备不可用时,整个集群就不可用了.所以为了获得更好的高可用特性和容灾机制,我们可以将集群中的某一特 ...
- docker学习:docker部署dolphinscheduler1.3.9伪分布式集群
docker&dolphinscheduler 一.环境准备 二.构建镜像 (一).dolphinscheduler镜像 (二).mysql镜像(直接拉取) (三).zookeeper镜像(直 ...
- Redis practise(二)使用Docker部署Redis高可用,分布式集群
思路 鉴于之间学习过的Docker一些基础知识,这次准备部署一个简单的分布式,高可用的redis集群,如下的拓扑 tuopu.png 下面介绍下,对于这张拓扑图而言,需要了解的一些基础概念. Redi ...
- 在Windows Server 2012 R2中搭建SQL Server 2012故障转移集群
需要说明的是我们搭建的SQL Server故障转移集群(SQL Server Failover Cluster)是可用性集群,而不是负载均衡集群,其目的是为了保证服务的连续性和可用性,而不是为了提高服 ...
- docker mysql5.7 主从_使用Docker部署MySQL 5.78.0主从集群的方法步骤
> 部署 MySQL 5.7 集群 master & slave (仅测试用) 镜像版本 5.7 1.创建 overlay 网络 docker network create --driv ...
- 【云原生】-Docker部署SQL Server及最佳应用
- [Spark周边]--SQL Server 2019预览结合了SQL Server和Apache Spark来创建统一的数据平台
感谢原文作者:https://cloudblogs.microsoft.com/sqlserver/2018/09/24/sql-server-2019-preview-combines-sql-se ...
最新文章
- 登顶CLUE榜单,腾讯云小微与腾讯AI Lab联合团队提出基于知识的中文预训练模型...
- Matlab中用GUI做计算器,怎样用MATLAB中的GUI做一个简单计算器
- 放心,GPT-3 不会“杀死”编程
- [转载] Intention scheduling for BDI agent systems
- 北京AI产业联盟来了!百度牵头,小米美团滴滴旷视纷纷入会
- 手机 modem 开发(7)---3GPP协议下载地址
- mac flutter 开发环境配置 从0到1 流程
- mybatis中#{}和${}
- 有基础学python看什么书好_python入门学习看什么书好,有什么书籍推荐
- 软件开发工程师证书有用吗_java软件工程师证书有用吗?
- 基于SSM的汽车租赁系统
- qq三国华容道算法(拼图问题,8数码问题?)
- 杀毒软件会从哪些方面对计算机进行保护作用(360杀毒软件)
- 微信 html5 声音,Html5-video ,播放视频有声音无画面(微信H5页面)
- 电瓶车行驶过程中突然无动力,加速没反应,怎么办?
- 爬虫 403 增加header和代理ip也没用?有可能是cloudflare在搞事情
- Tomcat部署在Eclipse
- 如何使用 minio 进行 BR 备份
- 香港公司银行开户需要注意。
- 解决绝对定位留下来的空白