这篇关于Always On Availability Groups系列的文章将展示如何在Windows和Linux SQL实例之间配置SQL Server Always On Availability Groups。
简介
Microsoft 支持 Linux 上的 SQL Server,它有许多与 Windows 版本相同的功能。你可以将数据库从Windows恢复到Linux SQL,反之亦然。Linux SQL可以与Red Hat、Ubuntu、SUSE企业、Kubernetes容器和Docker一起使用。
基于Windows的SQL实例支持SQL Server Always On Availability Groups,用于高可用性和灾难恢复。如果你不熟悉Windows AG配置,请参考关于Always on Availability Group的广泛系列(底部的Toc)。
如果你同时拥有Windows和Linux SQL Server,是否可以在它们之间配置一个可用性组?让我们在本文中探讨一下这个问题。
要求
我们需要以下环境来实现Windows和Linux的永远在线。
- 一个基于Windows的SQL实例。对于这篇文章,我们使用SQL Server 2019开发者版。
- SQL实例:WindowsSQL
- 一个Linux的SQL实例。
- SQL实例:LinuxSQL
在Windows和Linux SQL之间配置SQL Server Always On可用性组的步骤
这篇文章在Windows和Linux SQL实例之间配置了跨平台的AG。你不能在这里使用集群,因为没有集群机制来管理Linux和Windows服务器。

第1步:配置Windows SQL实例的始终在线
在演示中,我们配置SQL Server Always On Availability Group的配置如下。
- 主AG:Windows SQL实例
- 二级AG:Linux SQL 实例
在Windows中启用始终可用组
启动 SQL Server 配置管理器,在选项上打勾 - 启用始终可用组。

单击 "确定 "并重新启动SQL服务以启用可用性组。

混合模式认证
连接到Windows SQL实例,在SQL Server属性中点击安全,并确保它对SQL实例使用混合模式认证(SQL Server和Windows认证模式)。

配置主机文件
在主机文件中,指定Linux服务器的IP地址和主机名。从C:\Windows\System32\drivers\etc中用记事本打开主机文件,添加Linux主机名、IP地址。
对于我的环境,我以下列格式输入Linux服务器的IP地址和主机名。
192.168.0.102 linuxsql
Windows 防火墙
如果你使用Windows防火墙,确保它允许1433和5022端口进行通信。
创建一个数据库用户
使用CREATE LOGIN和CREATE USER语句在主副本实例上创建一个数据库登录和密码。
CREATE LOGIN dbm_login WITH PASSWORD = 'Test@1234';
Go
CREATE USER dbm_user FOR LOGIN dbm_login;
GO
创建一个主密钥和证书,然后用私钥备份该证书
在这一步,我们创建一个数据库主密钥和证书。此外,我们对证书和它的私钥进行备份。稍后,我们需要使用这个证书备份来在Linux SQL实例上部署证书。
- 创建主密钥。
CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'Test@1234';
- 创建证书
CREATE CERTIFICATE dbm_certificate WITH SUBJECT = 'dbm';
- 备份证书,并用密码进行加密
BACKUP CERTIFICATE dbm_certificate
TO FILE = 'C:\temp\dbm_certificate.cer'
WITH PRIVATE KEY (
FILE = 'C:\temp\dbm_certificate.pvk',
ENCRYPTION BY PASSWORD = ' Test@1234'
);
GO
第2步:为Linux SQL实例配置永远在线
在Linux中启用永远在线的可用性组
Linux上的SQL Server提供了mssql-conf工具来启用HADR始终在线功能。运行以下命令,通过mssql-conf启用HADR。
sudo /opt/mssql/bin/mssql-conf set hadr.hadrenabled 1
一旦你启用了HADR功能,用以下命令重启SQL服务
sudo systemctl restart mssql-server.service
配置主机文件
在Linux环境下,主机文件位于/etc/hosts。使用vi编辑器输入Windows SQL Server的名称和IP地址。下面的屏幕截图为Windows操作系统指定了192.168.0.100的IP地址。

配置Linux防火墙
如果你在Linux中使用防火墙,确保它允许端口5022用于端点通信。
创建一个数据库用户
连接到Linux的SQL实例,用以下脚本创建一个登录。
CREATE LOGIN dbm_login WITH PASSWORD = 'Test@1234';
Go
CREATE USER dbm_user FOR LOGIN dbm_login;
GO
第3步:从Windows复制证书和私钥到Linux服务器
我们需要把证书备份和它的私钥从Windows复制到Linux SQL服务器。你可以用FileZilla等应用程序从Windows服务器复制文件到Linux。我们需要将证书和私钥保存在/var/opt/mssql/data中。
同时,使用以下脚本为mssql用户设置所有者和组的权限。
sudo chown mssql:mssql /var/opt/mssql/data/dbm_certificate.pvk
sudo chown mssql:mssql /var/opt/mssql/data/dbm_certificate.cer

第4步:在Linux实例上创建证书
这一步使用从Windows SQL复制的证书备份和私钥创建一个证书。
- 该脚本指定SQL用户 dbm_user 进行授权。
- 在 - DECRYPTION BY PASSWORD 一节中指定解密密码。这个密码应该与我们使用 ENCRYPTION BY PASSWORD 进行证书备份时使用的密码相同。
第5步:在Windows(主)和Linux(次)AG副本上创建端点
在Windows和Linux的AG副本上执行以下CREATE ENDPOINT脚本。它使用端口5022进行通信。
该脚本还启动了端点(STATE=STARTED),并授予端点上的SQL登录的连接权限。它为验证目的种下了证书。
第6步:在主副本上创建一个可用性组
在Windows SQL(主副本)上执行以下脚本以创建可用性组。该脚本使用以下值。
- cluster_type= none:我们在跨平台的SQL Server Always On可用性组中没有一个集群。因此,使用CLUSTER_TYP为NONE。
- 可用性模式:使用异步提交的可用性模式。
- 播种模式:使用手动播种模式,因为Windows和Linux中的数据库路径是不同的。
- FAILOVER_MODE:它只支持手动故障转移。
- secondary_role:允许二级AG的所有连接。
CREATE AVAILABILITY GROUP [ag1]
WITH (CLUSTER_TYPE = NONE)
FOR REPLICA ON
N'WindowsSQL'
WITH (
ENDPOINT_URL = N'tcp://WindowsSQL:5022',
AVAILABILITY_MODE = ASYNCHRONOUS_COMMIT,
SEEDING_MODE = MANUAL,
FAILOVER_MODE = MANUAL,
SECONDARY_ROLE (ALLOW_CONNECTIONS = ALL)
),
N'LinuxSQL'
WITH (
ENDPOINT_URL = N'tcp://LinuxSQL:5022',
AVAILABILITY_MODE = ASYNCHRONOUS_COMMIT,
SEEDING_MODE = MANUAL,
FAILOVER_MODE = MANUAL,
SECONDARY_ROLE (ALLOW_CONNECTIONS = ALL)
)
GO
第7步:在辅助副本上加入可用性组
在二级副本上,使用 ALTER AVAILABILITY GROUP 语句来加入可用性组。
ALTER AVAILABILITY GROUP
[ag1] JOIN WITH (CLUSTER_TYPE = NONE)
第8步:添加一个数据库到可用性组中
在主副本中创建一个新的数据库,并进行以下步骤。
- 在Windows(主)SQL上做一个完整的备份
- 使用FileZilla将完整备份复制到Linux SQL上。
- 在Linux SQL实例中把备份恢复到NORECOVERY模式。
- 在主副本上运行以下语句,将数据库添加到可用性组中
ALTER AVAILABILITY GROUP [ag1] ADD DATABASE [ImportDB]
GO
第9步:启动AG仪表板并查看其健康状况
在SSMS中连接到主SQL实例并启动AG仪表盘。如下图所示,可用性组的状态是健康的。AG是一个异步状态,因此,它的同步状态是同步的。 
跨平台系统中的SQL Server Always On可用性组故障转移
你可以通过两种方式在跨平台集群中从主副本到次副本进行故障切换。
- 手动故障切换,没有数据损失
- 强制故障切换,可能有数据丢失
让我们探讨一下AG故障切换的两种方法。
没有数据损失的手动故障转移
你可以按照下面的步骤进行无数据损失的手动故障切换。
- 连接到主副本并修改AG模式为同步提交。
ALTER AVAILABILITY GROUP [ag1]
MODIFY REPLICA ON N'linuxsql'
WITH (AVAILABILITY_MODE = SYNCHRONOUS_COMMIT);
Go
ALTER AVAILABILITY GROUP [ag1]
MODIFY REPLICA ON N'WindowsSQL'
WITH (AVAILABILITY_MODE = SYNCHRONOUS_COMMIT)
GO
它将副本变为同步状态。

使用以下ALTER AVAILABILITY GROUP语句将可用性组带入离线状态。
alter availability group [ag1] offline
将次要目标副本提升为主要副本。
ALTER AVAILABILITY GROUP
AG1 FORCE_FAILOVER_ALLOW_DATA_LOSS;
下面的语句将旧的主副本的角色改为次副本。 在旧的主副本上执行以下语句。
ALTER AVAILABILITY GROUP [AG1]
SET (ROLE = SECONDARY);
可用性组中的二级数据库仍然处于SUSPEND状态。你可以在二级实例上使用以下语句恢复可用性组的同步。
ALTER DATABASE [ImportDB] SET HADR RESUME
现在,你可以从新的主副本重新启动 AG 仪表盘,它显示 Linux SQL 实例正在作为主副本工作。

强制手动故障切换并导致数据丢失
假设主副本实例已经停机。因此,为了使数据库在次要副本中可用,你需要强制故障切换,这可能涉及到数据丢失。
在辅助副本(新的主副本)上,使用FORCE_FAILOVER_ALLOW_DATA_LOSS参数启动强制故障转移。
ALTER AVAILABILITY GROUP
[AG1] FORCE_FAILOVER_ALLOW_DATA_LOSS;
从可用性组中删除原始主副本。
ALTER AVAILABILITY GROUP [AG1]
REMOVE REPLICA ON N'linuxsql';
如果旧的主副本上线了,它就会尝试担任主副本的角色。因此,一旦它上线,立即将原主服务器上的AG1可用性组下线。
ALTER AVAILABILITY GROUP [AG1] OFFLINE
然后在原始(旧)主副本上放弃可用性组和数据库。
DROP AVAILABILITY GROUP [AG1];
USE [master]
GO
DROP DATABASE [ImportDB]
GO
总结
这篇文章在 Windows 和 Linux SQL Server 之间配置了跨平台的 SQL Server Always On Availability Groups。它对手动灾难恢复、迁移和读取规模的工作负载很有帮助。它不支持自动故障转移,因为没有跨平台的集群配置。

