写点什么

基于 AWS 中国(宁夏)区域的三个可用区结合 SQL Server Always On Linux 可用性组提升业务连续性

2019 年 10 月 23 日

基于 AWS 中国(宁夏)区域的三个可用区结合 SQL Server Always On Linux 可用性组提升业务连续性

在由西云数据运营的 AWS 中国(宁夏)区域正式推出第 3 个可用区后,AWS 中国区域的用户可以更加灵活地来部署跨越 3 个可用区的应用程序及数据库架构,进一步加强系统高可用性和容错能力,并提升业务的连续性。


本文将重点介绍 SQL Server Always On Linux 可用性组在 AWS 中国(宁夏)区域的安装、配置、只读副本以及故障转移等。


(一) SQL Server Always On Linux 功能介绍

SQL Server 2017 现在支持在 Linux 上运行,并使用相同的 SQL Server 数据库引擎,具有许多相似的功能和服务,且不受操作系统的影响。


从 SQL Server 2012 开始引入的 Always On 可用性组,它将数据库的每个事务发送到另一个实例,从而提供数据库级别的保护,该实例称为副本,其中包含处于特定状态的数据库副本。可用性组可部署在 Standard 版本或 Enterprise 版本上。参与可用性组的实例可以是独立实例,也可以是 Always On 故障转移群集实例。由于在事务发生时将它发送到副本,建议在需要较低 RPO 和 RTO 的情况下使用 Always On 可用性组。副本之间的数据移动可以是同步的或异步的,Enterprise 版允许同步多达三个副本(包括主副本)。


可用性组具有一个数据库的完全读/写副本且位于主副本上,而其他所有次要副本仅提供只读功能。


(二) SQL Server Always On Linux 架构说明

Always On 可用性组的优点之一是可使用单个功能配置高可用性和灾难恢复。由于不需要确保共享存储也具有高可用性,可以更轻松地实现在一个数据中心内具有用于高可用性的本地副本,在其他数据中心内具有用于灾难恢复的远程备份,且每个备份都有单独的存储。确保冗余的代价是具有额外的数据库副本。


下面的示例为跨越多个数据中心的可用性组。一个主要副本负责确保所有次要副本保持同步。



(三) Always On 部署拓扑

基于 AWS 中国(宁夏)区域 3 个可用区的 SQL Server Always On Linux 可用性组部署架构,具体参考如下:



在 AWS 中国(宁夏)区域通过以上的部署方式,SQL Server Always On Linux 可用性组将能实现如下目标:


  • 更低的 RTO 与 RPO

  • 支持读/写分离、扩展多个只读副本

  • 更高的高可用性

  • 更简化的部署流程


(四) Always On 环境要求

基于 AWS 中国(宁夏)区域 EC2 计算资源配置清单如下所示:



下面将主要围绕 CentOS 7.4 来介绍 SQL Server Always On Linux 可用性组在 AWS 中国(宁夏)区域的安装及配置。请参考文档中心修改 EC2 主机名、调整操作系统时区、关闭操作系统防火墙、关闭 selinux、修改 VPC 安全组。


1) SQL Server On Linux 安装脚本

下载安装脚本,可以根据需要修改 MSSQL_SA_PASSWORD,SQL_INSTALL_USER 及 SQL_INSTALL_USER_PASSWORD 变量的值,SA 系统管理员的默认密码是 !Passw0rd,以 sudo 方式去运行 install-mssql.sh,采用的是国外 yum 源,速度可能不稳定。


2) SQL Server 客户端工具(可选)

SQL Server 管理工具主要包括 Windows 平台的 SQL Server Management Studio (SSMS)、Visual Studio Code、服务器端的 sqlcmd & bcp 等,以下的客户端工具主要用于其他平台的远程管理。


a) 基于 Python 的 MSSQL 客户端工具安装

Python


pip install mssql-cli
复制代码


b) 基于 macOS 的 MSSQL 客户端工具 sqlcmd & bcp

Python


brew tap microsoft/mssql-release https://github.com/Microsoft/homebrew-mssql-releasebrew updatebrew install --no-sandbox mssql-tools
复制代码


语法如下:


Python


mssql-cli -? 或sqlcmd -? 查看帮助sqlcmd -S <实例的IP地址> -U SA -P '!Passw0rd'
复制代码


(五) Always On 可用性组配置

1) 在所有节点上开启 Always On Availability Group 功能并重启服务:

Python


sudo /opt/mssql/bin/mssql-conf set hadr.hadrenabled 1sudo systemctl restart mssql-server
复制代码


2) 在所有节点上执行 SQL 语句开启 AlwaysOn_health 事件会话:

Python


ALTER EVENT SESSION AlwaysOn_health ON SERVER WITH (STARTUP_STATE=ON);GO
复制代码


3) 在所有节点上创建数据库镜像终结点的用户:

Python


CREATE LOGIN dbm_login WITH PASSWORD = '********';CREATE USER dbm_user FOR LOGIN dbm_login;
复制代码


4) 在主节点上创建证书:

Linux 上的 SQL Server 服务使用证书验证镜像终结点之间的通信:


Python


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>**'       );
复制代码


5) 复制证书文件到所有备用节点,并导入证书:

将主节点上生成的 dbm_certificate.cer 和 dbm_certificate.pvk 文件复制到所有备用节点的相同位置,并修改属主及权限,然后执行导入证书:


Python


CREATE MASTER KEY ENCRYPTION BY PASSWORD = '**<Master_Key_Password>**';CREATE CERTIFICATE dbm_certificate       AUTHORIZATION dbm_user    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>**'            );
复制代码


6) 在所有节点上创建数据库镜像终结点:

Python


CREATE ENDPOINT [Hadr_endpoint]    AS TCP (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];
复制代码


7) 在主节点上创建可用性组:

Python


CREATE AVAILABILITY GROUP [ag1]    WITH (CLUSTER_TYPE = NONE)    FOR REPLICA ON        N'mynode01' WITH (            ENDPOINT_URL = N'tcp://mynode01:5022',            AVAILABILITY_MODE = ASYNCHRONOUS_COMMIT,            FAILOVER_MODE = MANUAL,            SEEDING_MODE = AUTOMATIC,                    SECONDARY_ROLE (ALLOW_CONNECTIONS = ALL)            ),        N'mynode02' WITH (            ENDPOINT_URL = N'tcp://mynode02:5022',            AVAILABILITY_MODE = ASYNCHRONOUS_COMMIT,            FAILOVER_MODE = MANUAL,            SEEDING_MODE = AUTOMATIC,                    SECONDARY_ROLE (ALLOW_CONNECTIONS = ALL)            ),        N'mynode03' WITH (             ENDPOINT_URL = N'tcp://mynode03:5022',             AVAILABILITY_MODE = ASYNCHRONOUS_COMMIT,            FAILOVER_MODE = MANUAL,            SEEDING_MODE = AUTOMATIC,            SECONDARY_ROLE (ALLOW_CONNECTIONS = ALL)            );ALTER AVAILABILITY GROUP [ag1] GRANT CREATE ANY DATABASE;
复制代码


8) 在所有备用节点上执行加入可用性组:

Python


ALTER AVAILABILITY GROUP [ag1] JOIN WITH (CLUSTER_TYPE = NONE);ALTER AVAILABILITY GROUP [ag1] GRANT CREATE ANY DATABASE;
复制代码


9) 在主节点上创建数据库并添加到可用性组:

由于设置 SEEDING_MODE 参数为 AUTOMATIC,因此 db1 数据库将会在备库实例中自动创建,后续对于该库进行的任何操作也会自动复制到备库中。


Python


CREATE DATABASE [db1];ALTER DATABASE [db1] SET RECOVERY FULL;BACKUP DATABASE [db1]    TO DISK = N'/var/opt/mssql/data/db1.bak';ALTER AVAILABILITY GROUP [ag1] ADD DATABASE [db1];
复制代码


10) 在所有备用节点验证 db1 是否已经成功同步:

Python


SELECT * FROM sys.databases WHERE name = 'db1';GOSELECT DB_NAME(database_id) AS 'database', synchronization_state_desc FROM sys.dm_hadr_database_replica_states;
复制代码


11) 读写与只读验证测试:

在主节点建表并插入数据;


在所有备用节点查询并删除数据,查看删除操作的出错信息;


(六) Always On 故障转移配置

1) 在所有节点上安装 Pacemaker 软件包:

Python


sudo yum install pacemaker pcs fence-agents-all resource-agents
复制代码


2) 在所有节点上为安装 Pacemaker 包时创建的 hacluster 用户设置相同密码:

Python


sudo passwd hacluster
复制代码


###将在第 4 步使用此密码


3) 在所有节点上启用并开启 pcsd 和 Pacemaker 服务:

Python


sudo systemctl enable pcsd
sudo systemctl start pcsd
sudo systemctl enable pacemaker
sudo systemctl enable corosync
复制代码


4) 在主节点上创建群集:

Python


sudo pcs cluster auth mynode01 mynode02 mynode3 -u hacluster -p ********
sudo pcs cluster setup --name mycluster01 mynode01 mynode02 mynode03
sudo pcs cluster start --all
复制代码


备注:如果以前配置过群集,为了防止残余文件影响后期安装,可以先在所有节点执行如下命令删除已存在的群集:


Python


sudo pcs cluster destroy
sudo systemctl enable pacemaker
复制代码


5) 在所有节点上安装 SQL Server 资源代理,运行以下命令:

Python


sudo yum install mssql-server-ha
复制代码


6) 配置隔离并设置 start-failure-is-fatal:

``

Python


sudo pcs property set stonith-enabled=falsesudo pcs property set start-failure-is-fatal=false
复制代码


``

``7) 在所有节点上创建 Pacemaker 所用的 SQL Server 登录用户:

Python


USE [master]
GO
CREATE LOGIN [pacemakerLogin] with PASSWORD= N'ComplexP@$$w0rd!'
ALTER SERVER ROLE [sysadmin] ADD MEMBER [pacemakerLogin]
复制代码


8) 在所有节点上,保存 SQL Server Login 的信息:

Python


echo 'pacemakerLogin' >> ~/pacemaker-passwd
echo '<Your Password>' >> ~/pacemaker-passwd
sudo mv ~/pacemaker-passwd /var/opt/mssql/secrets/passwd
sudo chown root:root /var/opt/mssql/secrets/passwd
sudo chmod 400 /var/opt/mssql/secrets/passwd ### Only readable by root
复制代码


9) 在主节点上创建 AG 的资源:

``

Python


sudo pcs resource create ag1_cluster ocf:mssql:ag ag_name=ag1 master notify=true
复制代码


10) 在主节点上创建虚拟 IP 资源:

Python


sudo pcs resource create virtualip ocf:heartbeat:IPaddr2 ip=192.168.10.168 cidr_netmask=32 nic=eth0:1 op monitor interval=30s
复制代码


11) 在主节点上配置群集资源的依赖关系和启动顺序:

Python


sudo pcs constraint colocation add virtualip ag1_cluster-master INFINITY with-rsc-role=Master
sudo pcs constraint order promote ag1_cluster-master then start virtualip
复制代码


12) 在任何节点上查看群集状态:

Python


sudo pcs status
复制代码


请留意下图标识高亮的部分:


  • mynode01 是主节点,可以提供读写服务;

  • mynode02、mynode03 是备用节点,可以提供只读服务;

  • 虚拟 IP 地址是 192.168.10.168/32 已经可用;



13) 在任何节点上手动故障转移主节点到 mynode02 并查看群集状态:

Python


sudo pcs resource move ag1_cluster-master mynode02 --mastersudo pcs status
复制代码



(七) 总结及参考资源

关于数据库级别监视和故障转移触发器,对于 CLUSTER_TYPE = EXTERNAL,故障转移触发器语义与 Windows 故障转移(WSFC)不同。当 AG 在 WSFC 中的 SQL Server 实例上,转换为数据库的 ONLINE 状态导致的 AG 运行状况报告错误。作为响应,群集管理器会触发故障转移操作。


在 Linux 上,SQL Server 实例无法与群集通信,对数据库运行状况进行外部监控,如果用户选择数据库级别故障转移监控和故障转移(通过在创建 AG 时设置 DB_FAILOVER = ON 选项),群集将在每次运行监控操作时检查数据库状态是否为 ONLINE,群集查询 sys.databases 中的状态,对于与 ONLINE 不同的任何状态,它将自动触发故障切换(如果满足自动故障切换条件)。 故障转移的实际时间取决于监控操作的频率以及在 sys.databaseses 中更新的数据库状态,自动故障转移至少需要一个同步副本。


虚拟 IP 地址 192.168.10.168/32 会随主节点的故障转移进行漂移,可以在所有节点上禁用源/目标检查,结合脚本将 192.168.10.168/32 作为 Destination,主节点的实例 ID 作为 Target 来动态更新路由表,并实现 VPC 内对虚拟 IP 的访问。


相关文章:


  1. Amazon EC2 » Linux 实例用户指南 » Amazon EC2 实例 » 配置您的 Amazon Linux 实例» 更改 Linux 实例的主机名

  2. 快速入门参考部署指南» 架构

  3. Microsoft: Configure SQL Server Always On Availability Group for high availability on Linux


作者介绍:


蒋华


AWS 合作伙伴解决方案架构师,已获得AWS解决方案架构师专业级与 DevOps Engineer 专业级认证,主要负责 AWS (中国)合作伙伴的技术支持工作,同时致力于 AWS 云服务在国内的应用及推广,并在关系型数据库服务、存储服务、分析服务、HA/DR 及云端应用迁移方面有着丰富的设计和实战经验。加入 AWS 之前,曾在 IBM (中国)工作12年,历任数据库售前工程师、UNIX 服务器资深售前工程师及解决方案架构师,熟悉传统企业 IT 架构、私有云及混合云部署,在数据库、数据仓库、高可用容灾及企业应用架构等方面有多年实践经验。
复制代码


本文转载自 AWS 技术博客。


原文链接:


https://amazonaws-china.com/cn/blogs/china/sql-server-always-on-linux-availability-groups-to-enhance-business-continuity/


2019 年 10 月 23 日 08:00208

欲了解 AWS 的更多信息,请访问【AWS 技术专区】

评论

发布
暂无评论
发现更多内容

细说几种内聚

落英亭郎

高内聚 面向对象设计 面向对象思想

奈学教育《百万架构师》课程大纲(1)

奈学教育

架构师

TiDB原理解析

Chank

数仓大法好!跨境电商 Shopee 的实时数仓之路

Apache Flink

大数据 flink 流计算 实时计算 大数据处理

【面向对象】—依赖倒置、接口隔离

不二架构

极客大学架构师训练营 依赖倒置 接口隔离原则

使用wavm运行wasi wasm程序

Foliage

架构师-第二周

师哥

第二周总结

晨光

第二周-作业

JI

极客大学架构师训练营

Flink on Zeppelin (4) - 机器学习篇

章剑锋_Jeff

大数据 flink 学习 流计算 Zeppelin

第二周作业

Diven

数仓系列 | 深入解读 Flink 资源管理机制

Apache Flink

大数据 flink 流计算 实时计算

实时即未来?一个小微企业心中的流计算

Apache Flink

大数据 flink 流计算 实时计算 大数据处理

架构师训练营第二周课程感想1

tuuezzy

Java 架构师

记录一下,我的记录之道

非著名程序员

学习 程序员 提升认知 工作效率

【玩转写作平台】如何让专业编辑青睐你的文章?被推荐置顶?

InfoQ写作平台官方

写作平台 InfoQ 玩转写作平台

从字符串到常量池,一文看懂String类设计

程序员DMZ

JVM 常量池 intern

图解 Vue1.0 响应式系统

前端黑板报

源码分析 Vue Reactive

软件设计原则作业

行下一首歌

极客大学架构师训练营

二叉查找树的解读和实现

ytao

Java 数据结构

免费下载 | 阿里云实时计算整体解决方案白皮书重磅发布!

Apache Flink

大数据 flink 流计算 实时计算 大数据处理

Flink 在快手实时多维分析场景的应用

Apache Flink

大数据 flink 流计算 实时计算 大数据处理

第二周作业

晨光

面向开发者的 WSL2 安装指南

simpleapples

Python golang Windows 10 wsl

第二周-总结

JI

极客大学架构师训练营

Flink作业问题分析和调优实践

Apache Flink

大数据 flink 流计算 实时计算 大数据处理

Apache Flink 误用之痛

Apache Flink

大数据 flink 流计算 实时计算 数据处理

《实现领域驱动设计》拆书稿 DDD入门 & 领域、子域和限界上下文

三界

架构 领域驱动设计 DDD

奈学教育《百万架构师》课程大纲(1)

古月木易

极客大学架构师训练营

POJO类中布尔类型为啥不让用isXxx命名

Java课代表

XSKY发布S3 Console,助力企业轻松玩转非结构化数据可视化管理

XSKY融合存储

演讲经验交流会|ArchSummit 上海站

演讲经验交流会|ArchSummit 上海站

基于 AWS 中国(宁夏)区域的三个可用区结合 SQL Server Always On Linux 可用性组提升业务连续性-InfoQ