配置 SQL Server Always On 可用性组以在 Linux 上实现高可用性

适用于: SQL Server - Linux

本文介绍如何在 Linux 上创建 SQL Server Always On 可用性组 (AG) 以实现高可用性。 AG 有两种配置类型。 高可用性配置使用群集管理器提供业务连续性。 此配置还可包括读取缩放副本。 本文档介绍了如何创建 AG 以实现高可用性。

还可以在不使用群集管理器的情况下创建 AG 来实现读取缩放。 读取扩展 AG 仅提供只读副本用于性能横向扩展。它不提供高可用性。 若要创建用于读取缩放的 AG,请参阅在 Linux 上配置 SQL Server 可用性组用于读取缩放

用于保证高可用性和数据保护的配置需要两个或三个同步提交副本。 如果使用三个同步副本,即使一个服务器不可用,AG 也可以自动恢复。 有关详细信息,请参阅可用性组配置的高可用性和数据保护

所有服务器必须是物理服务器或虚拟服务器,并且虚拟服务器必须位于同一虚拟化平台上。 此要求是因为隔离代理是特定于平台的。 请参阅来宾群集策略

路线图

在 Linux 服务器上创建 AG 以获得高可用性的步骤与 Windows Server 故障转移群集上的步骤不同。 下面的列表对高级步骤进行了说明:

  1. Linux 上的 SQL Server 的安装指南

    重要

    AG 中的所有三个服务器都需要在同一个平台上(物理或虚拟),因为 Linux 高可用性使用隔离代理来隔离服务器上的资源。 隔离代理特定于每个平台。

  2. 创建 AG。 本文介绍了此步骤。

  3. 配置 Pacemaker 等群集资源管理器。

    配置群集资源管理器的方式取决于特定的 Linux 分发版。 有关特定于分发的说明,请参阅以下链接:

    重要

    生产环境需要隔离代理以实现高可用性。 本文中的示例不使用隔离代理。 它们仅用于测试和验证目的。

    Pacemaker 群集使用隔离将群集恢复到已知状态。 配置隔离的方式取决于分发版和环境。 目前,在某些云环境中无法使用隔离。 有关详细信息,请参阅 RHEL 高可用性群集的支持策略 - 虚拟化平台

    关于 SLES,请参阅 SUSE Linux Enterprise High Availability Extension(SUSE Linux 企业高可用性扩展)。

  4. 将 AG 添加为群集中的资源。

    将 AG 添加为群集中的资源的方式取决于 Linux 分发。 有关特定于分发的说明,请参阅以下链接:

有关多个网络接口 (NIC) 的注意事项

有关为具有多个 NIC 的服务器设置可用性组的信息,请参阅以下相关部分:

先决条件

创建可用性组前,需要:

  • 设置环境,以便所有托管可用性副本的服务器能够通信。
  • 安装 SQL Server。

在 Linux 上,必须先创建可用性组,然后再将其添加为群集管理的群集资源。 本文档举例说明了如何创建可用性组。

  1. 更新每个主机的计算机名。

    每个 SQL Server 实例名称必须:

    • 15 个字符或更少。
    • 在网络中唯一。

    若要设置计算机名,请编辑 /etc/hostname。 以下脚本可使用 vi 编辑 /etc/hostname

    sudo vi /etc/hostname
    
  2. 配置主机文件。

    注意

    如果在 DNS 服务器中使用主机 IP 地址注册主机名,则无需执行以下步骤。 验证要作为可用性组配置的一部分的所有节点是否可以互相通信。 (对主机名的 ping 应使用相应的 IP 地址进行回复。)此外,请确保 /etc/hosts 文件不包含将节点主机名映射到 localhost IP 地址 127.0.0.1 的记录。

    每个服务器上的主机文件包含将加入可用性组的所有服务器的 IP 地址和名称。

    以下命令将返回当前服务器的 IP 地址:

    sudo ip addr show
    

    更新 /etc/hosts。 以下脚本可使用 vi 编辑 /etc/hosts

    sudo vi /etc/hosts
    

    下面的示例演示了 node1 上的 /etc/hosts,并补充了 node1node2node3。 在此示例中,node1 指托管主要副本的服务器,node2node3 指托管次要副本的服务器。

    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 安装说明:

启用 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>'
    );

在所有副本上创建数据库镜像终结点

数据库镜像端点使用传输控制协议 (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;

注意

如果在一个节点上使用 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 端口必须对侦听器端口打开。

重要

对于 SQL Server 2017 (14.x),数据库镜像终结点支持的唯一身份验证方法是 CERTIFICATEWINDOWS 选项不可用。

有关详细信息,请参阅 数据库镜像端点 (SQL Server)

创建 AG

本节中的示例说明如何使用 Transact-SQL 创建可用性组。 还可以使用 SQL Server Management Studio 可用性组向导。 使用向导创建 AG 时,在将副本加入 AG 时,会返回错误。 若要解决此问题,请向 pacemaker 授予对所有副本上 AG 的 ALTERCONTROLVIEW DEFINITIONS 权限。 在主副本上授予权限后,通过向导将节点加入 AG,但为了使 HA 正常运行,请为所有副本授予权限。

若要实现可确保自动故障转移的高可用性配置,AG 至少需要三个副本。 以下任一配置均支持高可用性:

有关详细信息,请参阅可用性组配置的高可用性和数据保护

注意

可用性组可以包括其他同步或异步副本。

在 Linux 上创建 AG 以实现高可用性。 配合使用 CREATE AVAILABILITY GROUPCLUSTER_TYPE = EXTERNAL

  • 可用性组:CLUSTER_TYPE = EXTERNAL

    指定由外部群集实体管理 AG。 Pacemaker 是外部群集实体的一个示例。 当 AG 群集类型为外部时,

  • 设置主副本和次要副本:FAILOVER_MODE = EXTERNAL

    指定:副本与外部群集管理器(如 Pacemaker)交互。

以下 Transact-SQL 脚本为名为 ag1 的高可用性创建 AG。 脚本使用 SEEDING_MODE = AUTOMATIC 配置 AG 副本。 此设置会导致 SQL Server 在每个辅助服务器上自动创建数据库。 为环境更新以下脚本。 将 <node1><node2><node3> 值替换为托管副本的 SQL Server 实例的名称。 将 <5022> 替换为为数据镜像终结点设置的端口。 若要创建 AG,请在承载主副本的 SQL Server 实例上运行以下 Transact-SQL。

重要

在 SQL Server 资源代理的当前实现中,节点名称必须与实例中的 ServerName 属性匹配。 例如,如果节点名称为 node1,请确保 SERVERPROPERTY('ServerName') 在 SQL Server 实例中返回 node1。 如果存在不匹配,则在创建 Pacemaker 资源后,副本将进入“正在解析”状态。

此规则非常重要的一种情况是使用完全限定的域名。 例如,如果在群集设置过程中将 node1.yourdomain.com 用作节点名称,请确保 SERVERPROPERTY('ServerName') 返回 node1.yourdomain.com,而不只是返回 node1。 此问题的可能解决方法包括:

  • 将主机名重命名为 FQDN,并使用 sp_dropserversp_addserver 存储过程来确保 SQL Server 中的元数据与更改匹配。
  • 使用 pcs cluster auth 命令中的 addr 选项将节点名称与 SERVERPROPERTY('ServerName') 值匹配,并将静态 IP 用作节点地址。

仅运行以下脚本之一:

创建具有三个同步副本的可用性组

创建具有三个同步副本的 AG:

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;

重要

运行前一个脚本创建具有三个同步副本的 AG 后,请不要运行以下脚本:

创建具有两个同步副本和一个配置副本的可用性组

创建具有两个同步副本和一个配置副本的 AG:

重要

此体系结构允许任何版本的 SQL Server 承载第三个副本。 例如,第三个副本可以托管在 SQL Server Enterprise Edition 上。 在 Enterprise 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;

创建具有两个同步副本的可用性组

创建具有两个同步副本的 AG

包括具有同步可用性模式的两个副本。 例如,以下脚本创建一个名为 ag1 的 AG。 node1node2 以同步模式承载副本,具有自动种子设定和自动故障转移功能。

重要

仅运行以下脚本以创建具有两个同步副本的 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 用户需要具有对所有副本上可用性组的 ALTERCONTROLVIEW 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;

将数据库添加到可用性组

确保添加到可用性组的数据库处于完整恢复模式,并具有有效的日志备份。 如果数据库是测试数据库或新建的数据库,请执行数据库备份。 在主 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 添加为群集资源。 有关说明,请参阅相关内容

注解

重要

配置群集并将 AG 添加为群集资源后,无法使用 Transact-SQL 对 AG 资源进行故障转移。 Linux 上的 SQL Server 群集资源与此操作系统的耦合性不及在 Windows Server 故障转移群集 (WSFC) 上的耦合性高。 SQL Server 服务无法识别此群集是否存在。 所有业务流程都通过群集管理工具完成。 在 RHEL 或 Ubuntu 中,使用 pcs。 在 SLES 中使用 crm

重要

如果 AG 是群集资源,则当前版本中存在一个已知问题,即在数据丢失时强制故障转移到异步副本不起作用。 此问题将在即将发布的版本中得到解决。 手动或自动故障转移到同步副本成功。