sqlserver on linux always on 安装配置

以下步骤仅为个人安装测试记录,未在生产环境实际用过,谨慎用于生产环境。

一、 不支持的功能和服务

类型 不支持的功能或服务 备注
数据库引擎 事务复制 所有数据更改都会以事务为单位,按照其在发布服务器上发生的顺序,同步到订阅服务器上,2019起支持
合并复制 允许用户同时修改订阅服务器和发布服务器上的数据,并把这些修改“合并”成一个统一的结果,2019起支持
Stretch DB SQLServer 2016中的新特性,它支持数据库一部分存在于本地,另一部分存在于Azure SQL数据库云服务中。企业使用StretchDB可以“延伸”其部署数据库到云端,比如“热”数据可以存储在本地部署的SQL Server实例中,而“冷”数据很显然可以存储到Azure中
PolyBase SQLServer 2016中的新特性,PolyBase 支持在 SQL Server 中使用以下方案:
1. 通过 SQL Server 或 PDW 查询 Hadoop 中存储的数据
2. 查询存储在 Azure Blob 存储中的数据
3. 将数据导出、导入到 Hadoop、Azure Blob 存储或 Azure Data Lake Store
4. 与 BI 工具集成 
使用第三方连接的分布式查询  
与 SQL Server 以外的数据源的链接的服务器 不能建立到其他类型数据库的 link server
系统扩展的存储过程(XP_CMDSHELL 等) 在sqlserver中执行windows命令
Filetable,FILESTREAM SQL Server 2008中引入的FILESTREAM数据类型来存储非结构化数据,如文档,视频,音频,图像,数据库中存储的是文件系统上的一个指针

SQL Server 2012的FileTable则进一步增强,它可以让应用程序通过引入FileTable整合其存储和数据管理组件,允许非事务性访问,提供集成的对非结构化数据和元数据的全文搜索和语义搜索
带有 EXTERNAL_ACCESS 或 UNSAFE 权限集的 CLR 程序集 windows中在 SQL Server 数据库中创建程序集时,可以指定代码以下安全级别的哪一种下运行:SAFE、EXTERNAL_ACCESS 或 UNSAFE
缓冲池扩展 SQL Server 2014 中引入的缓冲池扩展提供数据库引擎缓冲池的非易失性随机存取内存(即SSD)扩展的无缝集成,从而显著提高 I/O 吞吐量。
SQL Server 代理 子系统: CmdExec、PowerShell、队列读取器、SSIS、SSAS、SSRS CmdExec:运行可执行程序
PowerShell:运行 PowerShell 脚本作业步骤
队列读取器:运行激活复制队列读取器代理的作业步骤
SSIS:ETL工具,把数据库的数据抽取到数据仓库
SSAS:Cube(多维数据库)工具,把数据仓库转换成多维数据库
SSRS:报表工具,用多维数据库作为数据源来呈现报表
Alerts 事件由SQL Server生成并输入Microsoft Windows应用程序日志。SQL Server代理读取应用程序日志,并将写入的事件与您定义的警报进行比较。当SQL Server代理找到匹配项时,它会触发警报,这是对事件的自动响应。除了监视SQL Server事件之外,SQL Server代理还可以监视性能条件和Windows Management Instrumentation(WMI)事件。

要定义警报,请指定:
警报的名称。
触发警报的事件或性能条件。
SQL Server代理响应事件或性能条件所采取的操作。
日志读取器代理 运行激活复制日志读取器代理的作业步骤
变更数据捕获 更改数据捕获记录插入,更新和删除应用于SQL Server表的活动
托管备份 Microsoft Azure 的 SQL Server 托管备份管理并自动执行将 SQL Server 备份到 Windows Azure Blob 存储服务
高可用性 数据库镜像 以后版本也不会支持
Security 可扩展的密钥管理  
链接服务器的 AD 身份验证  
可用性组 (Ag) 的 AD 身份验证  
第三方 AD 工具 (Centrify,Vintela,Powerbroker)  
服务 SQL Server Browser  
SQL Server R Services 用于机器学习,2019起支持
StreamInsight  
Analysis Services  
Reporting Services  
Data Quality Services  
Master Data Services  
分布式的事务处理协调器 (DTC) 在 Linux 中不支持 Microsoft 分布式事务处理协调器 (DTC) SQL Server 2017 (14.x)。 如果您的应用程序需要使用分布式事务,并且需要 AG,部署 SQL Server在 Windows 上,2019起支持

二、 操作系统设置

  编号 需求项 操作环境 需求细节内容 说明
分配主机 1 操作系统要求 所有节点 linux版本:Red Hat Enterprise Linux 7.3 or 7.4 Workstation, Server, and Desktop

如果使用VMWare,则关闭vmware的overcommit。
 
2 文件系统要求 所有节点 文件系统:XFS or EXT4

如果使用网络文件系统 (NFS) ,远程共享,请注意以下支持要求:
1. 使用 NFS 版本4.2 或更高版本。 较旧版本的 NFS 不支持所需的功能,例如 fallocate 和稀疏文件创建
2. 仅定位 /var/opt/mssql上 NFS 装入的目录。 不支持其他文件,如 SQL Server 系统二进制文件。
3. 请确保装载的远程共享时,NFS 客户端使用 nolock 选项。
 
3 磁盘空间要求 所有节点 不小于6GB
4 内存要求 所有节点 不小于2GB  
5 处理器要求 所有节点 处理器速度: 不低于2 GHz
处理器核心: 不少于2核
处理器类型: 仅 x64 兼容
 
6 关闭文件系统/分区的atime选项 所有节点 cat /etc/fstab,看到对应的分区是noatime ,nodiratime 修改:
vi /etc/fstab   在对应的分区处添加noatime,nodiratime

重启后生效
7 开启透明大页 所有节点 cat /sys/kernel/mm/transparent_hugepage/enabled
应该看到[always]

如果这个文件不存在,则检查
cat /sys/kernel/mm/redhat_transparent_hugepage/enabled

如果2个文件都不存在,那么就是在系统内核中移除了THP。
设置重启服务器后生效

参考官方文档:
https://docs.microsoft.com/en-us/sql/linux/sql-server-linux-performance-best-practices?view=sql-server-2017
8 禁用SELinux 所有节点 当前生效: setenforce 0
重启后生效:
vi /etc/selinux/config
SELINUX=disabled
 
9 NTP时间同步 所有节点 可以选择
1. 物理机和虚拟机时间同步
2. 虚拟机ntp时间同步(建议采用,crontab使用ntpdate)

注:默认配置中,虽然物理机上启用NTP与内网NTP服务器进行时间同步,但是虚拟机和物理机的时间同步是关闭的。
如果没有打开物理机和虚拟机之间的时间同步,会导致系统日志记录时间有问题。启动阶段(此时还不能ssh登录),在日志中的记录时间会往前推进一个小时,等启动完成后,日志中的时间再回退一个小时。
防火墙实施 10 防火墙要求 所有节点 主从库之间,需要双向打通1433及5022端口  
所有节点 关闭并禁用本地防火墙
systemctl stop firewalld
systemctl disable firewalld
 
网络规划 11 public ip 所有节点 由主机或者网络组分配IP 注:要求两个节点网卡名相同
12 VIP 所有节点 只需额外预留,不需添加网卡  
13 主机名要求 所有节点 vi /etc/hosts

127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4

192.168.2.237  mssql01
192.168.2.238  mssql02
192.168.2.240  LINUX-SQLAG
主机名称要求:
少于15 个字符
在网络中是唯一的
CPU设置 14 CPU frequency governor 所有节点 自定义tuned-adm方案

先启用tuned服务
systemctl start tuned
systemctl enable tuned

mkdir -p /usr/lib/tuned/mssql

cp /usr/lib/tuned/latency-performance/* /usr/lib/tuned/mssql/

cd /usr/lib/tuned/mssql

vi tuned.conf

#根据mssql官方文档推荐设置以下参数

[main]
summary=Optimize for deterministic performance at the cost of increased power consumption

[cpu]
governor=performance
energy_perf_bias=performance
min_perf_pct=100
C-States=C1 only

[sysctl]

#for mssql
kernel.sched_min_granularity_ns = 10000000
kernel.sched_wakeup_granularity_ns = 15000000
vm.dirty_ratio = 40
vm.dirty_background_ratio = 10
vm.swappiness=10
kernel.numa_balancing=0
vm.max_map_count=262144

使用自定义方案
tuned-adm profile mssql
建议值:performance
15 ENERGY_PERF_BIAS 所有节点 建议值:performance
16 min_perf_pct 所有节点 建议值:100
17 C-States 所有节点 建议值:C1 only
多节点NUMA系统上
禁用自动NUMA平衡
18 kernel.numa_balancing 所有节点 建议值:0
虚拟地址空间内核设置 19 vm.max_map_count 所有节点 建议值:262144
磁盘设置 20 sysctl 设置 所有节点 建议值:
kernel.sched_min_granularity_ns = 10000000
kernel.sched_wakeup_granularity_ns = 15000000
vm.dirty_ratio = 40
vm.dirty_background_ratio = 10
vm.swappiness=10
21 磁盘预读 所有节点 /sbin/blockdev --setra 4096 /dev/sd* 检查
blockdev --report
虚拟机和动态内存设置 22 虚拟机和动态内存设置 所有节点 如果Linux SQL Server运行在虚拟机中,请确保为虚拟机保留的内存量,不要使用 HYPER-V 动态内存等功能。  

三、 SQLSERVER安装

操作环境 需求细节内容 说明
所有节点 yum -y install bzip2       
yum -y install gdb
yum -y install libsss_nss_idmap
yum -y install cyrus-sasl
yum -y install cyrus-sasl-gssapi
yum -y install resource-agents  -- for ha
 
所有节点 [root@mssql01 install]# rpm -ivh mssql-server-14.0.3037.1-2.x86_64.rpm
warning: mssql-server-14.0.3037.1-2.x86_64.rpm: Header V4 RSA/SHA256 Signature, key ID be1229cf: NOKEY
Preparing...                          ################################# [100%]
Updating / installing...
   1:mssql-server-14.0.3037.1-2       ################################# [100%]
 
所有节点 [root@mssql01 install]# /opt/mssql/bin/mssql-conf setup
Choose an edition of SQL Server:
  1) Evaluation (free, no production use rights, 180-day limit)
  2) Developer (free, no production use rights)
  3) Express (free)
  4) Web (PAID)
  5) Standard (PAID)
  6) Enterprise (PAID)
  7) Enterprise Core (PAID)
  8) I bought a license through a retail sales channel and have a product key to enter.
...
Enter your edition(1-8): 7
...
Do you accept the license terms? [Yes/No]:yes

Enter the SQL Server system administrator password:
Confirm the SQL Server system administrator password:
Configuring SQL Server...
...
Created symlink from /etc/systemd/system/multi-user.target.wants/mssql-server.service to /usr/lib/systemd/system/mssql-server.service.
Setup has completed successfully. SQL Server is now starting.
1. 第6安装产品名为: Microsoft SQL Server Enterprise (64-bit);第7安装产品名为: Microsoft SQL Server Enterprise: Core-based Licensing (64-bit)

2. Enterprise Per Core license 模式最大计算能力限制为操作系统最大值,而Enterprise
Server+CAL license 模式为20核
 
3. 该步骤会启动mssql服务并将其设置为开机自启动
所有节点 rpm -ivh unixODBC-2.3.1-11.el7.x86_64.rpm

[root@mssql01 install]# rpm -ivh msodbcsql17-17.2.0.1-1.x86_64.rpm
warning: msodbcsql17-17.2.0.1-1.x86_64.rpm: Header V4 RSA/SHA256 Signature, key ID be1229cf: NOKEY
Preparing...                          ################################# [100%]
The license terms for this product can be downloaded from
https://aka.ms/odbc172eula and found in
/usr/share/doc/msodbcsql17/LICENSE.txt . By entering 'YES',
you indicate that you accept the license terms.

Do you accept the license terms? (Enter YES or NO)
yes
Updating / installing...
   1:msodbcsql17-17.2.0.1-1           ################################# [100%]
msodbcsql17 >= 17.2.0.0 is needed by (installed) mssql-tools-17.2.0.1-1.x86_64
msodbcsql17 < 17.3.0.0 is needed by (installed) mssql-tools-17.2.0.1-1.x86_64

如果有安装旧版mssql工具或较旧的 unixODBC包,请先删除
yum remove mssql-tools unixODBC-utf16-devel
所有节点 [root@mssql01 install]# rpm -ivh mssql-tools-17.2.0.1-1.x86_64.rpm
warning: mssql-tools-17.2.0.1-1.x86_64.rpm: Header V4 RSA/SHA256 Signature, key ID be1229cf: NOKEY
Preparing...                          ################################# [100%]
The license terms for this product can be downloaded from
http://go.microsoft.com/fwlink/?LinkId=746949 and found in
/usr/share/doc/mssql-tools/LICENSE.txt . By entering 'YES',
you indicate that you accept the license terms.

Do you accept the license terms? (Enter YES or NO)
yes
Updating / installing...
   1:mssql-tools-17.2.0.1-1           ################################# [100%]
sqlcmd与bcp工具
所有节点 mkdir -p /data001/prd/mssql/CU10/{data,cnf,log,dump,backup,audit}
chown mssql.mssql -R /data001
chmod 755 -R /data001
 
所有节点 systemctl stop mssql-server

/opt/mssql/bin/mssql-conf set-collation
Enter the collation: Chinese_PRC_CI_AS

/opt/mssql/bin/mssql-conf set telemetry.customerfeedback false
/opt/mssql/bin/mssql-conf set filelocation.defaultdatadir /data001/prd/mssql/CU10/data
/opt/mssql/bin/mssql-conf set filelocation.defaultlogdir /data001/prd/mssql/CU10/data
/opt/mssql/bin/mssql-conf set filelocation.defaultdumpdir /data001/prd/mssql/CU10/dump
/opt/mssql/bin/mssql-conf set filelocation.errorlogfile /data001/prd/mssql/CU10/log/errorlog
/opt/mssql/bin/mssql-conf set filelocation.defaultbackupdir /data001/prd/mssql/CU10/backup
/opt/mssql/bin/mssql-conf set telemetry.userrequestedlocalauditdirectory /data001/prd/mssql/CU10/audit

systemctl start mssql-server
改server排序规则(高危操作,非新建必须先备份)

/opt/mssql/bin/mssql-conf set-collation
Enter the collation: Chinese_PRC_CI_AS

配置客户反馈
/opt/mssql/bin/mssql-conf set telemetry.customerfeedback false

默认数据目录
/opt/mssql/bin/mssql-conf set filelocation.defaultdatadir /data001/prd/mssql/CU10/data

默认日志目录
/opt/mssql/bin/mssql-conf set filelocation.defaultlogdir /data001/prd/mssql/CU10/data

默认转储目录
/opt/mssql/bin/mssql-conf set filelocation.defaultdumpdir /data001/prd/mssql/CU10/dump

默认错误日志目录
/opt/mssql/bin/mssql-conf set filelocation.errorlogfile /data001/prd/mssql/CU10/log/errorlog

默认备份目录
/opt/mssql/bin/mssql-conf set filelocation.defaultbackupdir /data001/prd/mssql/CU10/backup

本地审核目录
/opt/mssql/bin/mssql-conf set telemetry.userrequestedlocalauditdirectory /data001/prd/mssql/CU10/audit
所有节点 启用 SQL Server 代理
/opt/mssql/bin/mssql-conf set sqlagent.enabled true

重新启动 SQL Server:
systemctl restart mssql-server
从SQL Server 2017 CU4开始,SQL Server Agent是随附mssql server封装,并预设为停用;在之前版本需要额外安装mssql-server-agent,否则会报错
所有节点 Root用户

echo 'export PATH="$PATH:/opt/mssql-tools/bin"' >> ~/.bash_profile
echo 'export PATH="$PATH:/opt/mssql-tools/bin"' >> ~/.bashrc
source ~/.bash_profile
source ~/.bashrc
 
所有节点 sqlcmd -S localhost -U SA -P
1> select name from sys.databases;
2> GO
 
所有节点 新增4个数据文件(最多与CPU数相同),初始5GB,自动增长100MB
日志文件初始100MB,自动增长100MB
Linux安装sqlserver时无法选择tempdb文件个数,需要自行添加

四、 创建业务数据库及用户

用SSMS连接跟普通windows操作没区别,这里不记录了。

五、 创建AlwaysOn AG

编号 需求项 操作环境 需求细节内容 说明
1 打开Always On AG特性 所有节点 /opt/mssql/bin/mssql-conf set hadr.hadrenabled 1
systemctl restart mssql-server
 
2 安装ha组件 所有节点 rpm -ivh mssql-server-ha-14.0.3037.1-2.x86_64.rpm  
3 启用 AlwaysOn_health 事件会话 所有节点 ALTER EVENT SESSION  AlwaysOn_health ON SERVER WITH (STARTUP_STATE=ON);
GO
可以选择启用 AlwaysOn 可用性组扩展的事件,以便在对某一可用性组进行故障排除时帮助诊断根本原因
4 创建数据库主密钥 所有节点 USE master 
CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'xxxx'; 
GO
既然节点没有加入域,那么就不能用域认证,只能用证书认证,因此需要创建证书和端点。xxxx为ag用户密码
5 为实例创建加密证书 所有节点 USE master 
CREATE CERTIFICATE mssql01_cert WITH SUBJECT = 'mssql01 certificate for Availability Group'
GO
Linux 上的 SQL Server 服务使用证书验证镜像端点之间的通信
红色部分根据各节点情况修改
6 使用实例证书创建端点 所有节点 USE master 
CREATE ENDPOINT Endpoint_AvailabilityGroup
STATE = STARTED
AS TCP
(
   LISTENER_PORT = 5022, LISTENER_IP = ALL

FOR DATABASE_MIRRORING
(
   AUTHENTICATION = CERTIFICATE mssql01_cert,
   ENCRYPTION = REQUIRED ALGORITHM AES,
   ROLE = ALL
); 
GO
数据库端点使用TCP协议在参与数据库镜像会话或承载可用性副本的服务器实例之间发送和接收消息。 数据库端点在唯一的 TCP 端口号上进行侦听,端口可以修改但必须保持一致

红色部分根据各节点情况修改
7 备份证书文件 所有节点 USE master 
BACKUP CERTIFICATE mssql01_cert
TO FILE = '/data001/prd/mssql/CU10/data/mssql01_cert.cer'; 
GO
红色部分根据各节点情况修改
8 拷贝证书文件至其他节点 所有节点 节点1
scp /data001/prd/mssql/CU10/data/mssql01_cert.cer mssql@mssql02:/data001/prd/mssql/CU10/data

节点2
scp /data001/prd/mssql/CU10/data/mssql02_cert.cer mssql@mssql01:/data001/prd/mssql/CU10/data

运行完后每个节点都应该有2个(有几个节点就几个)certificate files,可以运行以下命令查看
ll /data001/prd/mssql/CU10/data/
注意属主属组应该是mssql.mssql
9 为其他系统创建登录名 所有节点 USE master
CREATE LOGIN login_AvailabilityGroup
WITH PASSWORD = 'xxxx'; 
GO
4~8称为配置出站连接
9~12称为配置入站连接
10 创建使用该登录名的用户 所有节点 USE master 
CREATE USER login_AvailabilityGroup 
FOR LOGIN login_AvailabilityGroup 
GO
 
11 关联用户与证书 所有节点 节点1
USE master 
CREATE CERTIFICATE mssql02_cert
AUTHORIZATION login_AvailabilityGroup 
FROM FILE = '/data001/prd/mssql/CU10/data/mssql02_cert.cer
GO

节点2
USE master 
CREATE CERTIFICATE mssql01_cert
AUTHORIZATION login_AvailabilityGroup 
FROM FILE = '/data001/prd/mssql/CU10/data/mssql01_cert.cer
GO
红色部分根据各节点情况修改,各节点互相关联其他节点用户与证书,有几个节点关联几个
12 授予对该端点的登录名 CONNECT 权限 所有节点 USE master  
GRANT CONNECT ON ENDPOINT::Endpoint_AvailabilityGroup
TO [login_AvailabilityGroup];   
GO
 
13 为待添加用户数据库做全备 主节点 BACKUP DATABASE [testag] TO DISK = N'/var/opt/mssql/data/demodb.bak' with copy_only,COMPRESSION,STATS = 10  
14 创建AG 主节点 USE [master]
GO
 
CREATE AVAILABILITY GROUP [LINUX_SQLAG]
WITH
(
   AUTOMATED_BACKUP_PREFERENCE = PRIMARY,
   DB_FAILOVER = ON,
   DTC_SUPPORT = NONE,
   CLUSTER_TYPE = EXTERNAL
)
FOR DATABASE [testag]
REPLICA ON
N'mssql01' WITH
(
   ENDPOINT_URL = N'TCP://mssql01:5022',
   FAILOVER_MODE = EXTERNAL,
   AVAILABILITY_MODE = SYNCHRONOUS_COMMIT,
   SEEDING_MODE = AUTOMATIC,
   SECONDARY_ROLE
   (
      ALLOW_CONNECTIONS = NO
   )
),
N'mssql02' WITH
(
   ENDPOINT_URL = N'TCP://mssql02:5022',
   FAILOVER_MODE = EXTERNAL,
   AVAILABILITY_MODE = SYNCHRONOUS_COMMIT,
   SEEDING_MODE = AUTOMATIC,
   SECONDARY_ROLE
   (
      ALLOW_CONNECTIONS = NO)
   )
   GO
如果主机名太长,sqlserver会截取前15位导致无法认到主机报以下错误

Msg 35237, Level 16, State 1, Server DBA-SQLServer-A, Line 2
None of the specified replicas for availability group LINUX_SQLAG maps to the instance of SQL Server to which you are connected. Reenter the command, specifying this server instance to host one of the replicas. This replica will be the initial primary replica.
15 启用AG 从节点 ALTER AVAILABILITY GROUP [LINUX_SQLAG] JOIN WITH (CLUSTER_TYPE = EXTERNAL)
ALTER AVAILABILITY GROUP [LINUX_SQLAG] GRANT CREATE ANY DATABASE;
GO
 
16 添加AG监听IP 主节点 USE [master]
GO
ALTER AVAILABILITY GROUP [LINUX_SQLAG]
ADD LISTENER N'LINUX-SQLAG'
(
WITH IP
(
     (N'192.168.2.240', N'255.255.255.0')
),   
PORT=1433
);
GO
 
17 验证 所有节点 ping LINUX-SQLAG 目前这个就是ping不通的,但应该可以看到主机名对应的ip

六、 配置Pacemaker

编号 需求项 操作环境 需求细节内容 说明
1 安装Pacemaker及相关程序 所有节点 yum -y install pacemaker pcs fence-agents-all resource-agents corosync 会在安装 pacemaker 的时候一起安装,pcs 是需要独立安装的,MSDN 文档中规定,还需要安装额外的两个程序 fence-agents-all和resource-agents

(a) pcs,即Pacemaker Configuration System,是Pacemaker和Corosync配置工具
(b)Fence Agents,隔离代理,允许Pacemaker隔离和阻止行为异常的节点影响群集可用性
(c)Resource Agents,资源代理,允许Pacemaker管理服务和资源的软件,像启动或停止SQL Server AlwaysOn AG资源,像Windows上的群集资源DLL。
2 启动服务 所有节点 systemctl start pcsd
systemctl enable pcsd 
systemctl enable pacemaker.service
systemctl enable corosync.service
 
3 为hacluster用户设置密码 所有节点 passwd hacluster  安装Pacemaker时会自动创建用户,密码各节点要设成一样
4 节点间配置认证 任意节点 pcs cluster auth mssql01 mssql02 -u hacluster  
5 创建Linux集群 任意节点 pcs cluster setup --name LINUXHACLUS mssql01 mssql02 任一台机器执行即可,-name后为集群名,集群名后为各节点主机名
6 启动Linux集群 任意节点 pcs cluster start --all  
7 设置Linux集群开机启动 任意节点 pcs cluster enable --all [root@mssql01 ~]# pcs cluster enable --all
mssql01: Cluster Enabled
mssql02: Cluster Enabled
8 配置fencing 任意节点 pcs property set stonith-enabled=false  生产环境不建议设为false,但启用该功能需要额外硬件(如UPS或远端电源管理装置)
表示应隔离失败的节点及包含无法停止资源的节点,如果设定为 true或未设定,则在配置更多 STONITH 属性之前,该集群会拒绝启动资源。
9 设置群集重新检查间隔 任意节点 pcs property set cluster-recheck-interval=2min Cluster-recheck-interval表示检查群集资源参数、约束和其他群集选项中的更改的轮询间隔,建议将其设为不小于60s的值。如果副本出现故障,群集尝试在一定的时间间隔内重启副本,该间隔由failure-timeout值和cluster-recheck-interval值确定。如果failure-timeout设置为60秒,cluster-recheck-interval设置为120秒,重启尝试间隔大于60秒并且小于120秒。
10 配置failure-timeout 任意节点 pcs resource update LINUX_SQLAG meta failure-timeout=60s
11 配置start-failure-is-fatal 任意节点 pcs property set start-failure-is-fatal=true 标志特定节点资源启动失败后是否还继续尝试启动。当设为false时,集群会根据当前启动失败次数和migration-threshold(失败上限次数)的值决定是否继续启动。如果设为true,启动失败将导致当前启动失败次数被设置为INFINITY,导致资源立即移动到其他节点
12 为Pacemaker创建login账户 所有节点 USE master 
GO
CREATE LOGIN pacemakerLogin
WITH PASSWORD = 'xxxx'; 
GO
 
13 授权 所有节点 USE master 
GO
GRANT ALTER, CONTROL, VIEW DEFINITION ON AVAILABILITY GROUP::LINUX_SQLAG TO pacemakerLogin
GO
GRANT VIEW SERVER STATE TO pacemakerLogin
GO 
 
14 配置密码文件 所有节点 vi /var/opt/mssql/secrets/passwd
输入pacemakerLogin用户及其密码
15 查看集群状态 任意节点 pcs status --full  
16 Pacemaker创建AG资源 任意节点 pcs resource create LINUX_SQLAG ocf:mssql:ag ag_name=LINUX_SQLAG master notify=true  
17 创建VIP资源 任意节点 pcs resource create AGListener_VIP ocf:heartbeat:IPaddr2 ip=192.168.2.240 cidr_netmask=24  
19 创建排列约束 与创建VIP资源节点相同 pcs constraint colocation add AGListener_VIP LINUX_SQLAG-master INFINITY with-rsc-role=Master 配置VIP资源与AG资源运行在同一节点
20 创建排序约束 同上 pcs constraint order promote LINUX_SQLAG-master then start AGListener_VIP 资源的启动关闭顺序
21 集群状态检查 任意节点 pcs status  
22 在数据库查询集群信息 任意节点 使用VIP连接到数据库

SELECT @@SERVERNAME as replica_name, @@VERSION, host_platform, host_distribution, host_release
FROM sys.dm_os_host_info
GO 
SELECT a.name as AG_Name, a.cluster_type_desc,
b.dns_name,
c.ip_address, c.ip_subnet_mask
FROM sys.availability_groups a
INNER JOIN sys.availability_group_listeners b
ON a.group_id=b.group_id
INNER JOIN sys.availability_group_listener_ip_addresses c
ON b.listener_id=c.listener_id
 

七、 新增节点

编号 需求项 操作环境 需求细节内容 说明
1 操作系统配置 新增节点 见【操作系统设置】部分  
2 添加新主机名信息 所有节点 [root@mssql03 ~]# vi /etc/hosts
127.0.0.1   localhost localhost.localdomain

192.168.2.237  mssql01
192.168.2.238  mssql02
192.168.2.240  LINUX-SQLAG

192.168.2.239  mssql03
 
3 安装配置sqlserver软件 新增节点 见【SQLSERVER安装】部分  
4 配置AG准备 新增节点 见【创建AlwaysOn AG】部分 1-4  
5 创建证书 新增节点 USE master 
CREATE CERTIFICATE mssql03_cert WITH SUBJECT = 'mssql03 certificate for Availability Group'
GO
Linux 上的 SQL Server 服务使用证书验证镜像端点之间的通信
红色部分根据各节点情况修改
6 创建 endpoint 新增节点 USE master 
CREATE ENDPOINT Endpoint_AvailabilityGroup
STATE = STARTED
AS TCP
(
   LISTENER_PORT = 5022, LISTENER_IP = ALL

FOR DATABASE_MIRRORING
(
   AUTHENTICATION = CERTIFICATE mssql03_cert,
   ENCRYPTION = REQUIRED ALGORITHM AES,
   ROLE = ALL
); 
GO
数据库镜像端点使用传输控制协议 (TCP) 在参与数据库镜像会话或承载可用性副本的服务器实例之间发送和接收消息。 数据库镜像端点在唯一的 TCP 端口号上进行侦听

红色部分根据各节点情况修改
7 备份证书文件 新增节点 USE master 
BACKUP CERTIFICATE mssql03_cert
TO FILE = '/data001/prd/mssql/CU10/data/mssql03_cert.cer'; 
GO
红色部分根据各节点情况修改
8 拷贝证书文件至其他节点 所有节点
节点1
scp /data001/prd/mssql/CU10/data/mssql01_cert.cer mssql@mssql03:/data001/prd/mssql/CU10/data

节点2
scp /data001/prd/mssql/CU10/data/mssql02_cert.cer mssql@mssql03:/data001/prd/mssql/CU10/data

节点3
scp /data001/prd/mssql/CU10/data/mssql03_cert.cer mssql@mssql01:/data001/prd/mssql/CU10/data

scp /data001/prd/mssql/CU10/data/mssql03_cert.cer mssql@mssql02:/data001/prd/mssql/CU10/data

运行完后每个节点都应该有3个(有几个节点就几个)certificate files,可以运行以下命令查看
ll /data001/prd/mssql/CU10/data/
注意属主属组应该是mssql.mssql
9 创建LOGIN账户 新增节点 USE master 
CREATE LOGIN login_AvailabilityGroup
WITH PASSWORD = 'xxxx'; 
GO
 
10 为LOGIN账户创建user 新增节点 USE master 
CREATE USER login_AvailabilityGroup 
FOR LOGIN login_AvailabilityGroup 
GO
 
11 关联用户与证书 新增节点 节点1
USE master 
CREATE CERTIFICATE mssql03_cert
AUTHORIZATION login_AvailabilityGroup 
FROM FILE = '/data001/prd/mssql/CU10/data/mssql03_cert.cer
GO

节点2
USE master 
CREATE CERTIFICATE mssql03_cert
AUTHORIZATION login_AvailabilityGroup 
FROM FILE = '/data001/prd/mssql/CU10/data/mssql03_cert.cer
GO

节点3
USE master 
CREATE CERTIFICATE mssql01_cert
AUTHORIZATION login_AvailabilityGroup 
FROM FILE = '/data001/prd/mssql/CU10/data/mssql01_cert.cer
GO

USE master 
CREATE CERTIFICATE mssql02_cert
AUTHORIZATION login_AvailabilityGroup 
FROM FILE = '/data001/prd/mssql/CU10/data/mssql02_cert.cer
GO
红色部分根据各节点情况修改,各节点互相关联其他节点用户与证书,有几个节点关联几个
12 授权登录端点 新增节点 USE master  
GRANT CONNECT ON ENDPOINT::Endpoint_AvailabilityGroup
TO [login_AvailabilityGroup];   
GO
 
13 新增可用性副本 主节点 ALTER AVAILABILITY GROUP [LINUX_SQLAG] ADD REPLICA ON
 N'mssql03' WITH
(
   ENDPOINT_URL = N'TCP://mssql03:5022',
   FAILOVER_MODE = EXTERNAL,
   AVAILABILITY_MODE = SYNCHRONOUS_COMMIT,
   SEEDING_MODE = AUTOMATIC,
   SECONDARY_ROLE
   (
      ALLOW_CONNECTIONS = NO)
   )
   GO
1> ALTER AVAILABILITY GROUP [LINUX_SQLAG] ADD REPLICA ON
2>  N'mssql03' WITH
3> (
4>    ENDPOINT_URL = N'TCP://mssql03:5022',
5>    FAILOVER_MODE = EXTERNAL,
6>    AVAILABILITY_MODE = SYNCHRONOUS_COMMIT,
7>    SEEDING_MODE = AUTOMATIC,
8>    SECONDARY_ROLE
9>    (
10>       ALLOW_CONNECTIONS = NO)
11>    )
12>    GO
14 启用AG 新增节点 ALTER AVAILABILITY GROUP [LINUX_SQLAG] JOIN WITH (CLUSTER_TYPE = EXTERNAL)
ALTER AVAILABILITY GROUP [LINUX_SQLAG] GRANT CREATE ANY DATABASE;
GO
[root@mssql03 ~]# sqlcmd -S localhost -U SA -P xxxx           
1>
2> ALTER AVAILABILITY GROUP [LINUX_SQLAG] JOIN WITH (CLUSTER_TYPE = EXTERNAL)
3> ALTER AVAILABILITY GROUP [LINUX_SQLAG] GRANT CREATE ANY DATABASE;
4> GO
15 验证 新增节点 ping LINUX-SQLAG

[root@mssql03 ~]# sqlcmd -S localhost -U SA -P xxxx
1>  select name from sys.databases;
2> GO
看是否有同步AG数据库
16 安装Pacemaker及相关程序 新增节点 yum -y install pacemaker pcs fence-agents-all resource-agents corosync 会在安装 pacemaker 的时候一起安装,pcs 是需要独立安装的,MSDN 文档中规定,还需要安装额外的两个程序 fence-agents-all和resource-agents
17 启动服务 新增节点 systemctl start pcsd
systemctl enable pcsd 
systemctl enable pacemaker.service
systemctl enable corosync.service
 
18 为hacluster用户设置密码 新增节点 passwd hacluster  安装Pacemaker时会自动创建用户,密码各节点要设成一样
19 节点间配置认证 新增节点 pcs cluster auth mssql01 mssql02 mssql03 -u hacluster  [root@mssql03 ~]# pcs cluster auth mssql01 mssql02 mssql03 -u hacluster
Password:
mssql03: Authorized
mssql02: Authorized
mssql01: Authorized
20 将新增节点加入集群 主节点 pcs cluster node add mssql03 [root@mssql02 ~]# pcs cluster node add mssql03
Disabling SBD service...
mssql03: sbd disabled
Sending remote node configuration files to 'mssql03'
mssql03: successful distribution of the file 'pacemaker_remote authkey'
mssql01: Corosync updated
mssql02: Corosync updated
Setting up corosync...
mssql03: Succeeded
Synchronizing pcsd certificates on nodes mssql03...
mssql03: Success
Restarting pcsd on the nodes in order to reload the certificates...
mssql03: Success
21 验证添加情况 所有节点 添加后可以看到corosync.conf文件已更新
cat /etc/corosync/corosync.conf 
 
22 配置fencing 所有节点 pcs property set stonith-enabled=false  生产环境不建议设为false,但启用该功能需要额外硬件(如UPS或远端电源管理装置)
表示应隔离失败的节点及包含无法停止资源的节点,如果设定为 true或未设定,则在配置更多 STONITH 属性之前,该集群会拒绝启动资源。
23 设置群集属性群集重新检查间隔 所有节点 pcs property set cluster-recheck-interval=2min 指示检查群集资源参数、 约束或其他群集选项中的更改的轮询间隔,建议将其设为不小于60s的值(比如两分钟)
24 配置resource-level 所有节点 pcs property set start-failure-is-fatal=true If the cluster property start-failure-is-fatal is set to true (which is the default), start failures cause the failcount to be set to INFINITY and thus always cause the resource to move immediately. 
25 配置failure-timeout 所有节点 pcs resource update LINUX_SQLAG meta failure-timeout=60s
26 为Pacemaker创建login账户 新增节点 USE master 
GO
CREATE LOGIN pacemakerLogin
WITH PASSWORD = 'xxxx'; 
GO
 
27 授权 新增节点 USE master 
GO
GRANT ALTER, CONTROL, VIEW DEFINITION ON AVAILABILITY GROUP::LINUX_SQLAG TO pacemakerLogin
GO
GRANT VIEW SERVER STATE TO pacemakerLogin
GO 
 
28 配置密码文件 新增节点 vi /var/opt/mssql/secrets/passwd
输入pacemakerLogin用户及其密码
 
29 启动Linux集群 新增节点 pcs cluster start  
30 设置Linux集群开机启动 新增节点 pcs cluster enable [root@mssql03 ~]# pcs cluster enable --all
mssql01: Cluster Enabled
mssql02: Cluster Enabled
mssql03: Cluster Enabled
31 查看集群状态 任意节点 pcs status --full  

八、 故障转移

  编号 需求项 操作环境 需求细节内容 说明
手动故障转移 1 故障转移命令 主节点 pcs resource move LINUX_SQLAG-master mssql03 --master 当设置CLUSTER_TYPE = EXTERNAL时,FAILOVER_MODE也只能为EXTERNAL,使用这些设置,所有手动或自动故障转移操作都由外部集群管理器执行。此时不要再使用Transact-SQL、SSMS或powershell进行故障转移,而应该使用集群管理工具
2 删除位置约束 主节点 pcs constraint list --full
pcs constraint remove cli-prefer-LINUX_SQLAG-master
在手动故障转移期间,pcs命令move或crm命令migrate会为要放置在新目标节点上的资源添加位置约束。为避免之后手动转移失败,需要把位置约束删掉。
强制故障转移 3 配置可用性组资源不再由集群管理 从节点 pcs resource unmanage LINUX_SQLAG 如果未能将资源模式设置为非托管模式,请删除该资源(当你删除某个资源时,还将删除所有关联的约束)
pcs resource delete
4 设置会话上下文变量external_cluster 从节点 EXEC sp_set_session_context @key = N'external_cluster', @value = N'yes';  
5 故障转移命令 从节点 ALTER AVAILABILITY GROUP LINUX_SQLAG FORCE_FAILOVER_ALLOW_DATA_LOSS;  
6 重新配置可用性组资源由集群管理 新主节点 pcs resource manage LINUX_SQLAG 如果前面删除了群集资源,需要重新创建
7 重新启动的群集资源监视 新主节点 pcs resource cleanup LINUX_SQLAG  

你可能感兴趣的:(SQLServer,Linux,alwayson,sqlserver,linux,数据库)