适用于:Linux 上的 SQL Server
本文介绍如何在 Linux 上创建 SQL Server Always On 可用性组 (AG) 以实现高可用性。 AG 有两种配置类型。 高可用性配置使用群集管理器提供业务连续性。 此配置还可包括读取缩放副本。 本文介绍如何创建 AG 以实现高可用性。
还可以在不使用群集管理器的情况下创建 AG 来实现读取缩放。 读取扩展 AG 仅提供只读副本用于性能横向扩展。它不提供高可用性。 要创建用于读取扩展的可用性组,请参阅在 Linux 上配置用于读取扩展的 SQL Server 可用性组。
用于保证高可用性和数据保护的配置需要两个或三个同步提交副本。 如果使用三个同步副本,即使一个服务器不可用,AG 也可以自动恢复。 有关详细信息,请参阅可用性组配置的高可用性和数据保护。
所有服务器必须是物理服务器或虚拟服务器,并且虚拟服务器必须位于同一虚拟化平台上。 之所以有此要求,是因为隔离智能体具有平台特异性。 请参阅来宾群集策略。
安装步骤
在 Linux 服务器上创建 AG 以实现高可用性的步骤与 Windows Server 故障转移群集上的步骤不同。 下面的列表对高级步骤进行了说明:
-
Important
AG 中的所有三个服务器都需要在同一个平台上(物理或虚拟),因为 Linux 高可用性使用隔离代理来隔离服务器上的资源。 隔离代理特定于每个平台。
创建 AG。 本文介绍了此步骤。
配置 Pacemaker 等群集资源管理器。
配置群集资源管理器的方式取决于特定的 Linux 分发版。 请参阅以下链接以获取分发特定说明:
Important
生产环境需要隔离设备以实现高可用。 本文中的示例不使用隔离代理。 它们仅用于测试和验证。
Pacemaker 群集使用隔离将群集恢复到已知状态。 配置隔离的方式取决于 Linux 发行版和环境。 目前,在某些云环境中无法使用隔离。 有关详细信息,请参阅 RHEL 高可用性群集的支持策略 - 虚拟化平台。
关于 SLES,请参阅 SUSE Linux Enterprise High Availability Extension(SUSE Linux 企业高可用性扩展)。
将 AG 添加为群集中的资源。
将 AG 添加为群集中的资源的方式取决于 Linux 分发。 请参阅以下链接以获取分发特定说明:
有关多个网络接口 (NIC) 的注意事项
有关为具有多个 NIC 的服务器设置可用性组的信息,请参阅以下相关部分:
先决条件
在创建可用性组之前,请完成以下步骤:
- 设置环境,以便托管可用性副本的所有服务器都可以通信。
- 安装 SQL Server。
在 Linux 上,必须先创建可用性组,然后才能将其添加为群集管理的群集资源。 本文提供了创建可用性组的示例。
更新每个主机的计算机名。
每个 SQL Server 实例名称必须:
- 15 个字符或更少。
- 在网络中唯一。
若要设置计算机名,请编辑
/etc/hostname。 以下示例演示如何使用/etc/hostname进行编辑:sudo vi /etc/hostname配置主机文件。
Note
如果 DNS 服务器使用其 IP 地址注册主机名,则无需完成以下步骤。 验证要作为可用性组配置的一部分的所有节点是否可以互相通信。 (对主机名的 ping 应使用相应的 IP 地址进行回复。)此外,请确保
/etc/hosts文件不包含将节点主机名映射到 localhost IP 地址 127.0.0.1 的记录。每台服务器上的主机文件都包含参与可用性组的所有服务器的 IP 地址和名称。
以下命令将返回当前服务器的 IP 地址:
sudo ip addr show更新
/etc/hosts。 以下示例演示如何使用/etc/hosts进行编辑:sudo vi /etc/hosts下面的示例演示了
/etc/hosts上的node1,并补充了node1、node2和node3。 在此示例中,node1指托管主要副本的服务器,node2和node3指托管次要副本的服务器。127.0.0.1 localhost localhost4 localhost4.localdomain4 ::1 localhost localhost6 localhost6.localdomain6 10.128.18.12 node1 10.128.16.77 node2 10.128.15.33 node3
安装 SQL Server
安装 SQL Server。 以下链接指向适用于各种分发的 SQL Server 安装说明:
- 快速入门:在 Red Hat Enterprise Linux 上安装 SQL Server 并创建数据库
- 快速入门:在 SUSE Linux Enterprise Server 上安装 SQL Server 并创建数据库
- 快速入门:安装 SQL Server 并在 Ubuntu 上创建数据库
Note
从 SQL Server 2025(17.x)开始,不支持 SUSE Linux Enterprise Server (SLES)。
启用 Always On 可用性组
在托管 SQL Server 实例的每个节点上启用 Always On 可用性组,然后启动 mssql-server。 运行以下脚本:
sudo /opt/mssql/bin/mssql-conf set hadr.hadrenabled 1
sudo systemctl restart mssql-server
启用 AlwaysOn_health 事件会话
可选择性地启用扩展事件 (XE),以便在对可用性组进行故障排除时帮助诊断根本原因。 在每个 SQL Server 实例上运行以下命令:
ALTER EVENT SESSION AlwaysOn_health ON SERVER
WITH (STARTUP_STATE = ON);
GO
有关此 XE 会话的详细信息,请参阅配置可用性组扩展事件。
创建证书
Linux 上的 SQL Server 服务使用证书验证镜像终结点之间的通信。
以下 Transact-SQL 脚本创建主密钥和证书。 然后备份证书,并使用私钥保护文件。 使用强密码更新脚本。 连接到主要 SQL Server 实例。 若要创建证书,请运行以下 Transact-SQL 脚本:
CREATE MASTER KEY ENCRYPTION BY PASSWORD = '<master-key-password>';
CREATE CERTIFICATE dbm_certificate
WITH SUBJECT = 'dbm';
BACKUP CERTIFICATE dbm_certificate
TO FILE = '/var/opt/mssql/data/dbm_certificate.cer'
WITH PRIVATE KEY (
FILE = '/var/opt/mssql/data/dbm_certificate.pvk',
ENCRYPTION BY PASSWORD = '<private-key-password>'
);
现在主 SQL Server 副本的证书位于 /var/opt/mssql/data/dbm_certificate.cer,私钥位于 /var/opt/mssql/data/dbm_certificate.pvk。 将这两个文件复制到所有要托管可用性副本的服务器上的同一位置。 使用 mssql 用户或为 mssql 用户授予访问这些文件的权限。
例如,在源服务器上,以下命令可将文件复制到目标计算机。 将 <node2> 值替换为承载副本的 SQL Server 实例的名称。
cd /var/opt/mssql/data
scp dbm_certificate.* root@<node2>:/var/opt/mssql/data/
在每个目标服务器上,为 mssql 用户授予访问证书的权限。
cd /var/opt/mssql/data
chown mssql:mssql dbm_certificate.*
在辅助服务器上创建证书
以下 Transact-SQL 脚本根据在主 SQL Server 副本上创建的备份创建主密钥和证书。 使用强密码更新脚本。 解密密码与在此前的步骤中创建 .pvk 文件使用的密码相同。 若要创建证书,请在所有辅助服务器上运行以下脚本:
CREATE MASTER KEY ENCRYPTION BY PASSWORD = '<master-key-password>';
CREATE CERTIFICATE dbm_certificate
FROM FILE = '/var/opt/mssql/data/dbm_certificate.cer'
WITH PRIVATE KEY (
FILE = '/var/opt/mssql/data/dbm_certificate.pvk',
DECRYPTION BY PASSWORD = '<private-key-password>'
);
在上一示例中,将 <private-key-password> 替换为在主副本上创建证书时使用的同一密码。
在所有副本上创建数据库镜像终结点
数据库镜像端点使用传输控制协议 (TCP) 在参与数据库镜像会话或承载可用性副本的服务器实例之间发送和接收消息。 数据库镜像终结点在唯一的 TCP 端口号上进行侦听。
以下 Transact-SQL 脚本为可用性组创建名为 Hadr_endpoint 的侦听终结点。 它启动终结点,并向创建的证书授予连接权限。 在运行该脚本之前,替换 < ... > 之内的值。 (可选)可以包含 IP 地址 LISTENER_IP = (0.0.0.0)。 侦听器 IP 地址必须是 IPv4 地址。 还可以使用 0.0.0.0。
为所有 SQL Server 实例上的环境更新以下 Transact-SQL 脚本:
CREATE ENDPOINT [Hadr_endpoint]
AS TCP (LISTENER_PORT = 5022)
FOR DATABASE_MIRRORING
(
ROLE = ALL,
AUTHENTICATION = CERTIFICATE dbm_certificate,
ENCRYPTION = REQUIRED ALGORITHM AES
);
ALTER ENDPOINT [Hadr_endpoint]
STATE = STARTED;
Note
如果在一个节点上使用 SQL Server Express Edition 托管仅限配置的副本,则 ROLE 的唯一有效值为 WITNESS。 在 SQL Server Express Edition 上运行以下脚本:
CREATE ENDPOINT [Hadr_endpoint]
AS TCP (LISTENER_PORT = 5022)
FOR DATABASE_MIRRORING
(
ROLE = WITNESS,
AUTHENTICATION = CERTIFICATE dbm_certificate,
ENCRYPTION = REQUIRED ALGORITHM AES
);
ALTER ENDPOINT [Hadr_endpoint]
STATE = STARTED;
必须为侦听器端口打开防火墙上的 TCP 端口。
Important
数据库镜像终结点仅支持的身份验证方法是CERTIFICATE。
WINDOWS 选项不可用。
有关详细信息,请参阅数据库镜像终结点(SQL Server)。
创建 AG
本节中的示例说明如何使用 Transact-SQL 创建可用性组。 还可以使用 SQL Server Management Studio 可用性组向导。 当您使用向导创建可用性组时,在将副本加入可用性组时会返回错误。 要修复此错误,请在所有副本上的可用性组中向 pacemaker 授予 ALTER、CONTROL 和 VIEW DEFINITIONS 权限。 向主副本授予权限后,请通过向导将节点加入 AG,但要使 HA 正常运行,请对所有副本授予权限。
若要实现可确保自动故障转移的高可用性配置,AG 至少需要三个副本。 以下任一配置均支持高可用性:
有关详细信息,请参阅可用性组配置的高可用性和数据保护。
Note
可用性组可以包括其他同步或异步副本。
在 Linux 上创建 AG 以实现高可用性。 将 CREATE AVAILABILITY GROUP 语句与 CLUSTER_TYPE = EXTERNAL 一起使用。
可用性组:
CLUSTER_TYPE = EXTERNAL指定由外部群集实体管理 AG。 Pacemaker 是外部群集实体的一个示例。 当 AG 群集类型为外部时,
设置主副本和次要副本:
FAILOVER_MODE = EXTERNAL。指定:副本与外部群集管理器(如 Pacemaker)交互。
以下 Transact-SQL 脚本创建一个用于高可用性的 AG,名为 ag1。 脚本使用 SEEDING_MODE = AUTOMATIC 配置 AG 副本。 此设置会导致 SQL Server 在每个辅助服务器上自动创建数据库。 为环境更新以下脚本。 将 <node1>、<node2> 或 <node3> 值替换为托管副本的 SQL Server 实例的名称。 将 <5022> 替换为为数据镜像终结点设置的端口。 若要创建 AG,请在承载主副本的 SQL Server 实例上运行以下 Transact-SQL。
仅运行以下脚本之一:
将节点名称与 ServerName 属性匹配
在 SQL Server 资源代理的当前实现中,节点名称必须与实例中的 ServerName 属性匹配。 例如,如果节点名称为 node1,请确保 SERVERPROPERTY('ServerName') 在 SQL Server 实例中返回 node1 。 如果权限不匹配,在创建 Pacemaker 资源后,您的副本将进入“解决”状态。
使用完全限定的域名时,此规则非常重要。 例如,如果在群集设置期间用node1.contoso.onmicrosoft.com作为节点名称,请确保SERVERPROPERTY('ServerName')返回node1.contoso.onmicrosoft.com,而不仅仅是返回node1。 若要解决此问题,可以:
- 将主机名重命名为 FQDN,并使用
sp_dropserver和sp_addserver存储过程以确保 SQL Server 中的元数据与更改匹配。 - 在
addr命令中使用pcs cluster auth选项,将节点名称与SERVERPROPERTY('ServerName')值匹配,并使用静态 IP 作为节点地址。
创建具有三个同步副本的可用性组
创建一个包含三个同步副本的可用性组:
CREATE AVAILABILITY GROUP [ag1]
WITH (DB_FAILOVER = ON, CLUSTER_TYPE = EXTERNAL)
FOR REPLICA ON
N'<node1>'
WITH (
ENDPOINT_URL = N'tcp://<node1>:<5022>',
AVAILABILITY_MODE = SYNCHRONOUS_COMMIT,
FAILOVER_MODE = EXTERNAL,
SEEDING_MODE = AUTOMATIC
),
N'<node2>'
WITH (
ENDPOINT_URL = N'tcp://<node2>:<5022>',
AVAILABILITY_MODE = SYNCHRONOUS_COMMIT,
FAILOVER_MODE = EXTERNAL,
SEEDING_MODE = AUTOMATIC
),
N'<node3>'
WITH(
ENDPOINT_URL = N'tcp://<node3>:<5022>',
AVAILABILITY_MODE = SYNCHRONOUS_COMMIT,
FAILOVER_MODE = EXTERNAL,
SEEDING_MODE = AUTOMATIC
);
ALTER AVAILABILITY GROUP [ag1] GRANT CREATE ANY DATABASE;
Important
运行前一个脚本创建具有三个同步副本的 AG 后,请不要运行以下脚本:
创建具有两个同步副本和一个配置副本的可用性组
创建包含两个同步副本和一个配置副本的 AG:
Important
此体系结构允许任何版本的 SQL Server 承载第三个副本。 例如,第三个副本可以托管在 SQL Server Enterprise Edition 上。 对于 Express Edition,唯一有效的终结点类型是 WITNESS。
CREATE AVAILABILITY GROUP [ag1]
WITH (CLUSTER_TYPE = EXTERNAL)
FOR REPLICA ON
N'<node1>' WITH (
ENDPOINT_URL = N'tcp://<node1>:<5022>',
AVAILABILITY_MODE = SYNCHRONOUS_COMMIT,
FAILOVER_MODE = EXTERNAL,
SEEDING_MODE = AUTOMATIC
),
N'<node2>' WITH (
ENDPOINT_URL = N'tcp://<node2>:<5022>',
AVAILABILITY_MODE = SYNCHRONOUS_COMMIT,
FAILOVER_MODE = EXTERNAL,
SEEDING_MODE = AUTOMATIC
),
N'<node3>' WITH (
ENDPOINT_URL = N'tcp://<node3>:<5022>',
AVAILABILITY_MODE = CONFIGURATION_ONLY
);
ALTER AVAILABILITY GROUP [ag1] GRANT CREATE ANY DATABASE;
创建具有两个同步副本的可用性组
创建一个包含两个同步副本的可用性组。
包括具有同步可用性模式的两个副本。 例如,以下脚本创建一个名为 ag1 的 AG。
node1 和 node2 主机副本处于同步模式,具有自动初始化和自动故障转移功能。
Important
仅运行以下脚本以创建具有两个同步副本的 AG。 如果运行了前面任一脚本,则不要运行以下脚本。
CREATE AVAILABILITY GROUP [ag1]
WITH (CLUSTER_TYPE = EXTERNAL)
FOR REPLICA ON
N'node1' WITH (
ENDPOINT_URL = N'tcp://node1:5022',
AVAILABILITY_MODE = SYNCHRONOUS_COMMIT,
FAILOVER_MODE = EXTERNAL,
SEEDING_MODE = AUTOMATIC
),
N'node2' WITH (
ENDPOINT_URL = N'tcp://node2:5022',
AVAILABILITY_MODE = SYNCHRONOUS_COMMIT,
FAILOVER_MODE = EXTERNAL,
SEEDING_MODE = AUTOMATIC
);
ALTER AVAILABILITY GROUP [ag1] GRANT CREATE ANY DATABASE;
还可以使用 SQL Server Management Studio 或 PowerShell 配置带有 CLUSTER_TYPE=EXTERNAL 的 AG。
将次要副本联接到 AG
Pacemaker 用户需要在所有副本的可用性组上具有ALTER、CONTROL和VIEW DEFINITION权限。 若要授予这些权限,请在主副本上创建可用性组后运行以下 Transact-SQL 脚本。 将脚本添加到可用性组后立即在每个次要副本上运行。 在运行脚本之前,请将 <pacemakerLogin> 替换为 Pacemaker 用户帐户的名称。 如果没有 Pacemaker 的登录名,请为 Pacemaker 创建 SQL Server 登录名。
GRANT ALTER, CONTROL, VIEW DEFINITION ON AVAILABILITY GROUP::ag1 TO <pacemakerLogin>
GRANT VIEW SERVER STATE TO <pacemakerLogin>
以下 Transact-SQL 脚本会将 SQL Server 实例加入一个名为 ag1 的可用性组(AG)。 为环境更新脚本。 在托管次要副本的每个 SQL Server 实例上运行以下 Transact-SQL,以加入 AG。
ALTER AVAILABILITY GROUP [ag1] JOIN WITH (CLUSTER_TYPE = EXTERNAL);
ALTER AVAILABILITY GROUP [ag1] GRANT CREATE ANY DATABASE;
Note
对于配置副本,只需执行加入步骤。
将数据库添加到可用性组
确保添加到可用性组的数据库处于完整恢复模式,并具有有效的日志备份。 如果数据库是测试数据库或新建的数据库,请执行数据库备份。 在主 SQL Server 上,运行以下 Transact-SQL (T-SQL) 脚本,创建名为 db1 的数据库并进行备份:
CREATE DATABASE [db1];
GO
ALTER DATABASE [db1]
SET RECOVERY FULL;
GO
BACKUP DATABASE [db1]
TO DISK = N'/var/opt/mssql/data/db1.bak';
在主 SQL Server 副本上,运行以下 T-SQL 脚本,将名为 db1 的数据库添加到名为 ag1 的可用性组:
ALTER AVAILABILITY GROUP [ag1] ADD DATABASE [db1];
验证是否已在辅助服务器上创建了数据库
在每个次要 SQL Server 副本上,运行以下查询,查看是否已创建并同步 db1 数据库:
SELECT *
FROM sys.databases
WHERE name = 'db1';
GO
SELECT DB_NAME(database_id) AS 'database',
synchronization_state_desc
FROM sys.dm_hadr_database_replica_states;
GO
创建 AG 后,必须配置与 Pacemaker 等群集技术的集成,以实现高可用性。 对于使用 AG 的读取缩放配置,从 SQL Server 2017 (14.x) 开始,不再需要设置群集。
如果您按照本文中的步骤操作,则已创建了一个尚未形成集群的 AG。 下一步是添加群集。 此配置适用于读取扩展和负载均衡场景,但对于高可用性而言尚不完整。 为实现高可用性,需要将 AG 添加为群集资源。 有关说明,请参阅相关内容。
Remarks
配置群集并将 AG 添加为群集资源后,无法使用 Transact-SQL 对 AG 资源进行故障转移。 Linux 上的 SQL Server 群集资源与操作系统的耦合程度不如 Windows Server 故障转移群集 (WSFC) 那样紧密。 SQL Server 服务无法识别此群集是否存在。 所有业务流程都通过群集管理工具完成。 在 RHEL 或 Ubuntu 中,使用 pcs。 在 SLES 中,使用 crm。
如果 AG 是集群资源,则当前版本中存在一个已知问题:强制故障转移至异步副本时会导致数据丢失,且该操作无法正常进行。 此问题将在即将发布的版本中修复。 手动或自动故障转移到同步副本成功。