Docker部署SQL Server 2017 Always On集群

文章目录

Docker部署SQL Server 2017 Always On集群

1.Docker部署Always on集群

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

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

2.前提工作

注意: 所有机器操作

2.1安装Docker

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

2.2配置时间同步
复制代码
crontab -e #增加
* * * * *  /usr/sbin/ntpdate time.windows.com && /usr/sbin/hwclock -w >/dev/null 2>&1

3.架构

主机名 IP 端口 角色
sql01 192.168.1.30 1433:14335022:5022
sql02 192.168.1.31 1433:14335022:5022 副本
sql03 192.168.1.32 1433:14335022:5022 副本

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

4.准备相关容器镜像

注意: 所有机器操作

拉取数据库的Docker镜像,如下

4.1SQL Server 2017
复制代码
docker pull mcr.microsoft.com/mssql/server:2017-latest

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

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

5.开始配置-容器

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

5.1创建Dockerfile

注意: 所有机器操作

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

复制代码
vi dockerfile

说明

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

RUN:在镜像中进行的操作

5.2编译镜像

注意: 所有机器操作

通过dockerfile来编译镜像,用于后面的安装,命令:docker build -t mcr.microsoft.com/mssql/server:2017-ty .

其中mcr.microsoft.com/mssql/server为镜像名称,2017-ty是镜像标签,.表示在当前目录下编译,因为dockerfile就在当前目录下。

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

5.3创建master容器

在sql01执行:

复制代码
docker run --name sql01 \
--hostname sql01 \
-p 1433:1433 \
-p 5022:5022 \
-e 'ACCEPT\_EULA=Y' \
-e 'SA\_PASSWORD=P@ssw0rd02' \
-e "MSSQL\_AGENT\_ENABLED=True" \
-e "MSSQL\_PID=Developer" \
-d mcr.microsoft.com/mssql/server:2017-ty
5.4创建slave容器

在sql02执行:

复制代码
docker run --name sql02 \
--hostname sql02 \
-p 1433:1433 \
-p 5022:5022 \
-e 'ACCEPT\_EULA=Y' \
-e 'SA\_PASSWORD=P@ssw0rd02' \
-e "MSSQL\_AGENT\_ENABLED=True" \
-e "MSSQL\_PID=Developer" \
-d mcr.microsoft.com/mssql/server:2017-ty

在sql03执行:

复制代码
docker run --name sql03 \
--hostname sql03 \
-p 1433:1433 \
-p 5022:5022 \
-e 'ACCEPT\_EULA=Y' \
-e 'SA\_PASSWORD=P@ssw0rd02' \
-e "MSSQL\_AGENT\_ENABLED=True" \
-e "MSSQL\_PID=Developer" \
-d mcr.microsoft.com/mssql/server:2017-ty

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

5.5SSMS连接MSSQL

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

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

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

6.配置-数据库

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

6.1连接主库-sql01

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

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

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

复制代码
USE master
GO
 
CREATE LOGIN dbm_login WITH PASSWORD = 'Test@13579';
CREATE USER dbm_user FOR LOGIN dbm_login;
GO
 
CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'Test@13579';
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 = 'Test@13579'
    );
GO

将文件拷贝到其他两个节点:

复制代码
#sql01操作
docker cp sql01:/tmp/dbm_certificate.cer ./
docker cp sql01:/tmp/dbm_certificate.pvk ./
scp dbm_certificate.* 192.168.1.31:/data/ty/
scp dbm_certificate.* 192.168.1.32:/data/ty/
#sql02操作
docker cp dbm_certificate.cer sql02:/tmp/
docker cp dbm_certificate.pvk sql02:/tmp/
#sql03操作
docker cp dbm_certificate.cer sql03:/tmp/
docker cp dbm_certificate.pvk sql03:/tmp/
6.2连接从库-sql02和sql03

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

复制代码
CREATE LOGIN dbm_login WITH PASSWORD = 'Test@13579';
CREATE USER dbm_user FOR LOGIN dbm_login;
GO
 
CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'Test@13579';
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 = 'Test@13579'
);
GO
6.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];
GO

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

复制代码
ALTER EVENT SESSION  AlwaysOn_health ON SERVER WITH (STARTUP_STATE=ON);
GO
6.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'sql01'
            WITH (
            ENDPOINT_URL = N'tcp://192.168.1.30:5022',
            AVAILABILITY_MODE = ASYNCHRONOUS_COMMIT,
                SEEDING_MODE = AUTOMATIC,
                FAILOVER_MODE = MANUAL,
            SECONDARY_ROLE (ALLOW_CONNECTIONS = ALL)
                ),
        N'sql02'
            WITH (
            ENDPOINT_URL = N'tcp://192.168.1.31:5022',
            AVAILABILITY_MODE = ASYNCHRONOUS_COMMIT,
                SEEDING_MODE = AUTOMATIC,
                FAILOVER_MODE = MANUAL,
            SECONDARY_ROLE (ALLOW_CONNECTIONS = ALL)
                ),
        N'sql03'
            WITH (
            ENDPOINT_URL = N'tcp://192.168.1.32: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;
-- 尝试进行优雅的故障转移,如果不能完成,则允许丢失数据
-- ALTER AVAILABILITY GROUP [ag1] FAILOVER;
6.5测试

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

复制代码
--创建数据库
CREATE DATABASE agtestdb;


![img](https://img-blog.csdnimg.cn/img_convert/70dd59528dcbe04da165c1c2bdc471b6.png)
![img](https://img-blog.csdnimg.cn/img_convert/f2078c2d57c27a925e63f928a7f95f96.png)
![img](https://img-blog.csdnimg.cn/img_convert/6f47b6a80afba0676d1dcf0ad8908bac.png)

NONE`创建可用组时,在执行故障转移时需执行以下命令
> 
> 
> 
> ```
> -- 将主角色转移到可用性组中的某个备份副本
> ALTER AVAILABILITY GROUP [ag1] FORCE_FAILOVER_ALLOW_DATA_LOSS;
> -- 尝试进行优雅的故障转移,如果不能完成,则允许丢失数据
> -- ALTER AVAILABILITY GROUP [ag1] FAILOVER;
> 
> ```
> 
> 


#### 6.5测试


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

--创建数据库

CREATE DATABASE agtestdb;

外链图片转存中...(img-bcgtomBz-1725879206817)

外链图片转存中...(img-fAuQtMx3-1725879206818)

外链图片转存中...(img-l53VOmGl-1725879206819)

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上运维知识点,真正体系化!

相关推荐
jugt1 小时前
CentOS 7.9安装Nginx1.24.0时报 checking for LuaJIT 2.x ... not found
linux·运维·centos
21号 13 小时前
9.进程间通信
linux·运维·服务器
阿福不是狗5 小时前
Python使用总结之Mac安装docker并配置wechaty
python·macos·docker
叶落闲庭8 小时前
【k8s】k8s集群搭建
云原生·容器·kubernetes
搬码临时工8 小时前
电脑同时连接内网和外网的方法,附外网连接局域网的操作设置
运维·服务器·网络
藥瓿亭8 小时前
K8S认证|CKS题库+答案| 3. 默认网络策略
运维·ubuntu·docker·云原生·容器·kubernetes·cks
xyhshen8 小时前
k8s下离线搭建elasticsearch
elasticsearch·容器·kubernetes
Gaoithe8 小时前
ubuntu 端口复用
linux·运维·ubuntu
椰汁菠萝9 小时前
k8s集群安装坑点汇总
云原生·容器·kubernetes
背太阳的牧羊人9 小时前
sudo docker exec -it backend bash 以交互方式(interactive)进入正在运行的 Docker 容器的命令行环境
docker·容器·bash