共计 11238 个字符,预计需要花费 29 分钟才能阅读完成。
下面一步一步介绍一下如何在 Red Hat Enterprise Linux 系统上为 SQL Server 配置共享磁盘集群(Shared Disk Cluster)及其相关使用(仅供测试学习之用,基础篇)
一. 创建共享磁盘和 Cluster
微软官方配置文档:https://docs.microsoft.com/en-us/sql/linux/sql-server-linux-shared-disk-cluster-red-hat-7-configure。
Linux Cluster 结构图如下:
具体配置步骤如下:
1. 安装及配置 SQL Server
a) 先安装两个 SQL Server 作为 Cluster 的两个节点,请参考博文“Red Hat Enterprise Linux 上安装部署 SQL Server 2017 http://www.linuxidc.com/Linux/2017-06/144837.htm”(如果需要更多节点则安装更多);
b) 在 Secondary 端停掉并禁用 SQL Server 服务:
sudo systemctl stop mssql-server
sudo systemctl disable mssql-server
c) 备份同步 Server Master Key(由于 Linux 中 SQL Server 是以本地用户 mssql 运行的,因此不同的节点无法识别别的节点的认证,所以需要备份同步加密 key 从 Primary 端到其它节点上以便于能够成功解密 Server Master Key):
- Secondary 端备份原来的 machine-key:
sudo su
cd /var/opt/mssql/secrets
mv machine-key machine-key.original.bak
- Primary 端把 machine-key 复制到 Secondary 端:
sudo su
cd /var/opt/mssql/secrets/
scp machine-key root@**<Secondary Node IP Address>**:/var/opt/mssql/secrets/
- Secondary 端检查是否成功备份过来并且添加相关权限:
ls
chown mssql:mssql machine-key
d) 在 Primary 端为 Pacemaker 程序创建一个 SQL 登录用户,并给足足够的权限运行 sp_server_diagnostics。
先开启 SQL Server 服务:
sudo systemctl start mssql-server
连接到 SQL Server 上:
sqlcmd -S localhost -U sa -P **<Your Password>**
执行以下 SQL 语句创建用户并赋予权限:
USE [master] CREATE LOGIN [<loginName>] with PASSWORD= N'<loginPassword>'
GRANT VIEW SERVER STATE TO <loginName>
GO
退出 sqlcmd:
exit
e) 在 Primary 端停掉并禁用 SQL Server 服务:
sudo systemctl stop mssql-server
sudo systemctl disable mssql-server
f) 配置每一个节点的 hosts 文件,保证互相能够识别。
sudo vi /etc/hosts
下图是配置完成后的例子:
2. 配置共享磁盘以及转移数据库文件
有很多种提供共享磁盘的解决方案。下面简单介绍配置 NFS 的共享磁盘。推荐使用 Kerberos 去配置 NFS 以提高安全性:https://www.certdepot.net/rhel7-use-kerberos-control-access-nfs-network-shares/。这里仅介绍最简单的方式用于简单测试和学习。
用 NFS 配置共享磁盘
找另一个 RHEL 系统机器作为 NFS Server,执行如下命令(由于仅是测试研究,这里选用 Cluster 的一个节点作为 NFS Server 也可):
a) 安装 NFS 软件包:
sudo yum -y install nfs-utils
b) 启用并开启 rpcbind 服务:
sudo systemctl enable rpcbind && systemctl start rpcbind
c) 启用并开启 nfs-server 服务:
sudo systemctl enable nfs-server && systemctl start nfs-server
d) 编辑 /etc/exports 文件去设置想要共享的存储路径,注意每一个共享是一行:
vi /etc/exports
设置完的例子如下:
e) 导出共享并确定是否成功:
sudo exportfs -rav
sudo showmount -e
f) 在 SELinux 中添加异常设置:
sudo setsebool -P nfs_export_all_rw 1
g) 防火墙中允许相关服务通信:
sudo firewall-cmd --permanent --add-service=nfs
sudo firewall-cmd --permanent --add-service=mountd
sudo firewall-cmd --permanent --add-service=rpc-bind
sudo firewall-cmd --reload
为 Cluster 所有节点设置 NFS
在所有的 Cluster 节点机器上执行如下命令,确保能访问 NFS 共享磁盘:
a) 安装 NFS 软件包:
sudo yum -y install nfs-utils
b) 防火墙中允许相关服务通信:
sudo firewall-cmd --permanent --add-service=nfs
sudo firewall-cmd --permanent --add-service=mountd
sudo firewall-cmd --permanent --add-service=rpc-bind
sudo firewall-cmd --reload
c) 确认是否可以看到 NFS 共享:
sudo showmount -e **<IP OF NFS SERVER>**
更多关于 NFS 的文档资源参考以下站点:
- NFS servers and firewalld | Stack Exchange
- Mounting an NFS Volume | Linux Network Administrators Guide
- NFS server configuration
设置数据库文件路径为共享磁盘
转移数据库文件到共享磁盘上:
a) 在 Primary 节点上先把数据库文件保存到临时路径 /var/opt/mssql/tmp 下,
su mssql
mkdir /var/opt/mssql/tmp
cp /var/opt/mssql/data/* /var/opt/mssql/tmp
rm /var/opt/mssql/data/*
exit
b) 在所有节点上编辑 /etc/fstab 文件,保证重启系统后自动挂载 NFS 共享磁盘:
<IP OF NFS SERVER>:<shared_storage_path> <database_files_directory_path> nfs timeo=14,intr
例子如下:
Note(摘自微软):
关于如何配置 Fencing,请参考 How To Configure VMware fencing using fence_vmware_soap in RHEL High Availability Add On(RHEL Pacemaker 中配置 STONITH)。
c) 挂载刚刚配置的 NFS 存储:
sudo mount -a
可以执行 mount 命令检测是否已经成功挂载:
d) 在 Primary 节点上把临时路径下的数据库文件复制到新挂载的路径下,并保证 mssql 这个本地用户有��写权限:
chown mssql /var/opt/mssql/data
chgrp mssql /var/opt/mssql/data
su mssql
cp /var/opt/mssql/tmp/* /var/opt/mssql/data/
rm /var/opt/mssql/tmp/*
exit
e) 在 Primary 节点上开启 SQL Server 服务验证是否成功,这时 SQL Server 已经使用 NFS 服务器上的共享磁盘了:
sudo systemctl start mssql-server
sudo systemctl status mssql-server
sudo systemctl stop mssql-server
f) 在其它非 Primary 节点上依次开启 SQL Server 服务验证是否成功。
Note:目前所有节点的 SQL Server 都使用这个 NFS 服务器共享磁盘了,根据微软推荐,为了防止冲突,需要使用一个 File System Cluster 资源来防止一个共享路径被挂载多次。
更多详情见请继续阅读下一页的精彩内容 :http://www.linuxidc.com/Linux/2017-06/144838p2.htm
3. 安装及配置 Pacemaker
在所有 Cluster 节点下依次执行以下操作:
a) 创建一个文件保存之前为 Pacemaker 创建的 SQL Server 登录用户账户密码信息:
sudo touch /var/opt/mssql/secrets/passwd
sudo echo '<loginName>' >> /var/opt/mssql/secrets/passwd
sudo echo '<loginPassword>' >> /var/opt/mssql/secrets/passwd
sudo chown root:root /var/opt/mssql/secrets/passwd
sudo chmod 600 /var/opt/mssql/secrets/passwd
b) 设置防火墙允许 Pacemaker 服务通信:
sudo firewall-cmd --permanent --add-service=high-availability
sudo firewall-cmd --reload
Note:如果使用的是其它防火墙工具,需要开启如下端口。
TCP: Ports 2224, 3121, 21064
UDP: Port 5405
c) 安装 Pacemaker 软件包:
sudo yum install pacemaker pcs fence-agents-all resource-agents
d) 设置安装 Pacemaker 和 Corosync 时创建的默认用户 hacluster 的密码:
sudo passwd hacluster
e) 启用并开启 pcsd 服务,以及启用 Pacemaker:
sudo systemctl enable pcsd && sudo systemctl start pcsd
sudo systemctl enable pacemaker
f) 安装 FCI 资源代理:
sudo yum install mssql-server-ha
4. 创建 Cluster
下面正式创建 Cluster:
a) 在 Primary 节点上创建 Cluster:
sudo pcs cluster auth **<nodeName1 nodeName2 …>** -u hacluster
sudo pcs cluster setup --name **<clusterName>** **<nodeName1 nodeName2 …>**
sudo pcs cluster start --all
例子如下:
b) 目前 CTP 2.1 中没有 HyperV 和 cloud 环境用的 fencing,因此暂时需要禁用 fencing 功能(不推荐在生产环境中禁用)
sudo pcs property set stonith-enabled=false
sudo pcs property set start-failure-is-fatal=false
c) 配置 Cluster 的相关资源信息,可能需要设置的信息如下:
SQL Server Resource Name——SQL Server 资源名字,
Timeout Value ——Cluster 等待一个资源起来的超时时间,如果是 SQL Server,则是 master database 启动的时间,
Floating IP Resource Name——虚拟 IP 资源的名字,
IP Address——用来连接 SQL Cluster 实例的 IP 地址,
File System Resource Name——文件系统资源的名字,
device——NFS 共享路径,
directory——本地挂载路径,
fstype——文件共享类型,比如 nfs。
脚本如下:
sudo pcs cluster cib cfg
sudo pcs -f cfg resource create **<sqlServerResourceName>** ocf:mssql:fci op defaults timeout=**<timeout_in_seconds>**
sudo pcs -f cfg resource create **<floatingIPResourceName>** ocf:heartbeat:IPaddr2 ip=**<ip Address>**
sudo pcs -f cfg resource create **<fileShareResourceName>** Filesystem device=**<networkPath>** directory=**<localPath>** fstype=**<fileShareType>**
sudo pcs -f cfg constraint colocation add **<virtualIPResourceName>** **<sqlResourceName>**
sudo pcs -f cfg constraint colocation add **<fileShareResourceName>** **<sqlResourceName> **
sudo pcs cluster cib-push cfg
例子如下:
sudo pcs cluster cib cfg
sudo pcs -f cfg resource create mssqlha ocf:mssql:fci op defaults timeout=60s
sudo pcs -f cfg resource create virtualip ocf:heartbeat:IPaddr2 ip=10.2.38.180
sudo pcs -f cfg resource create fs Filesystem device="10.2.38.178:/mnt/nfs" directory="/var/opt/mssql/data" fstype="nfs"
sudo pcs -f cfg constraint colocation add virtualip mssqlha
sudo pcs -f cfg constraint colocation add fs mssqlha
sudo pcs cluster cib-push cfg
配置完成后 SQL Server 会运行在 Cluster 其中一个节点上。
d) 使用如下命令确认 Cluster 中相关 SQL Server 服务是否正常:
sudo pcs status
下图是正常启动的情况:
e) 正常启动后就可以用 Cluster 虚拟 IP 访问 SQL Server 了:
Note:
- 如果某些资源启动的时候有问题,可以使用下面这个命令诊断启动:
sudo pcs resource debug-start **<resource id>**
如果没问题或者有问题修复后,则重启 Cluster 服务稍微等一段时间就好使了:
sudo pcs cluster stop --all
sudo pcs cluster start --all
2. 管理和使用 Cluster(基础篇)
- 微软官方介绍:https://docs.microsoft.com/en-us/sql/linux/sql-server-linux-shared-disk-cluster-red-hat-7-operate。
这里暂时只介绍一个常用的功能 Failover,可以转移某个资源到目的端节点上:
sudo pcs resource move **<sqlResourceName>** **<targetNodeName>**
sudo pcs resource clear **<sqlResourceName>**
- Linux 上为 SQL Server 搭建的共享磁盘集群系统和 Windows SQL Cluster 是不一样的(所以标题为“类”),它不能用 SQL Query 来判断是否是 Cluster 了,以下命令目前检测不出来是 Cluster 也获取不到任何信息:
select serverproperty(‘IsClustered’);
select * from ::fn_virtualservernodes();
select * from sys.dm_os_cluster_nodes,sys.dm_io_cluster_shared_drives;
从这个站点可以找到依据,但是不确定未来是否有变化:https://docs.microsoft.com/en-us/sql/linux/sql-server-linux-shared-disk-cluster-red-hat-7-configure。
- Pacemaker 是一个在 Linux 上很成熟的开源高可用性集群。下面这个站点介绍了 Pacemaker GUI 的使用:https://keithtenzer.com/2015/06/22/pacemaker-the-open-source-high-availability-cluster/?utm_source=tuicool&utm_medium=referral:
- 其它相关有用的站点:
- Configuring the Red Hat High Availability Add-On with Pacemaker — Fencing: Configuring STONITH
- Pacemaker Access Control Lists
- How to create and edit text files using vi editor, basic vi commands, command mode, insert mode.
- Linux mount and umount
Note: 文档比较基础,未来可能会继续更新。
本文永久更新链接地址 :http://www.linuxidc.com/Linux/2017-06/144838.htm
下面一步一步介绍一下如何在 Red Hat Enterprise Linux 系统上为 SQL Server 配置共享磁盘集群(Shared Disk Cluster)及其相关使用(仅供测试学习之用,基础篇)
一. 创建共享磁盘和 Cluster
微软官方配置文档:https://docs.microsoft.com/en-us/sql/linux/sql-server-linux-shared-disk-cluster-red-hat-7-configure。
Linux Cluster 结构图如下:
具体配置步骤如下:
1. 安装及配置 SQL Server
a) 先安装两个 SQL Server 作为 Cluster 的两个节点,请参考博文“Red Hat Enterprise Linux 上安装部署 SQL Server 2017 http://www.linuxidc.com/Linux/2017-06/144837.htm”(如果需要更多节点则安装更多);
b) 在 Secondary 端停掉并禁用 SQL Server 服务:
sudo systemctl stop mssql-server
sudo systemctl disable mssql-server
c) 备份同步 Server Master Key(由于 Linux 中 SQL Server 是以本地用户 mssql 运行的,因此不同的节点无法识别别的节点的认证,所以需要备份同步加密 key 从 Primary 端到其它节点上以便于能够成功解密 Server Master Key):
- Secondary 端备份原来的 machine-key:
sudo su
cd /var/opt/mssql/secrets
mv machine-key machine-key.original.bak
- Primary 端把 machine-key 复制到 Secondary 端:
sudo su
cd /var/opt/mssql/secrets/
scp machine-key root@**<Secondary Node IP Address>**:/var/opt/mssql/secrets/
- Secondary 端检查是否成功备份过来并且添加相关权限:
ls
chown mssql:mssql machine-key
d) 在 Primary 端为 Pacemaker 程序创建一个 SQL 登录用户,并给足足够的权限运行 sp_server_diagnostics。
先开启 SQL Server 服务:
sudo systemctl start mssql-server
连接到 SQL Server 上:
sqlcmd -S localhost -U sa -P **<Your Password>**
执行以下 SQL 语句创建用户并赋予权限:
USE [master] CREATE LOGIN [<loginName>] with PASSWORD= N'<loginPassword>'
GRANT VIEW SERVER STATE TO <loginName>
GO
退出 sqlcmd:
exit
e) 在 Primary 端停掉并禁用 SQL Server 服务:
sudo systemctl stop mssql-server
sudo systemctl disable mssql-server
f) 配置每一个节点的 hosts 文件,保证互相能够识别。
sudo vi /etc/hosts
下图是配置完成后的例子:
2. 配置共享磁盘以及转移数据库文件
有很多种提供共享磁盘的解决方案。下面简单介绍配置 NFS 的共享磁盘。推荐使用 Kerberos 去配置 NFS 以提高安全性:https://www.certdepot.net/rhel7-use-kerberos-control-access-nfs-network-shares/。这里仅介绍最简单的方式用于简单测试和学习。
用 NFS 配置共享磁盘
找另一个 RHEL 系统机器作为 NFS Server,执行如下命令(由于仅是测试研究,这里选用 Cluster 的一个节点作为 NFS Server 也可):
a) 安装 NFS 软件包:
sudo yum -y install nfs-utils
b) 启用并开启 rpcbind 服务:
sudo systemctl enable rpcbind && systemctl start rpcbind
c) 启用并开启 nfs-server 服务:
sudo systemctl enable nfs-server && systemctl start nfs-server
d) 编辑 /etc/exports 文件去设置想要共享的存储路径,注意每一个共享是一行:
vi /etc/exports
设置完的例子如下:
e) 导出共享并确定是否成功:
sudo exportfs -rav
sudo showmount -e
f) 在 SELinux 中添加异常设置:
sudo setsebool -P nfs_export_all_rw 1
g) 防火墙中允许相关服务通信:
sudo firewall-cmd --permanent --add-service=nfs
sudo firewall-cmd --permanent --add-service=mountd
sudo firewall-cmd --permanent --add-service=rpc-bind
sudo firewall-cmd --reload
为 Cluster 所有节点设置 NFS
在所有的 Cluster 节点机器上执行如下命令,确保能访问 NFS 共享磁盘:
a) 安装 NFS 软件包:
sudo yum -y install nfs-utils
b) 防火墙中允许相关服务通信:
sudo firewall-cmd --permanent --add-service=nfs
sudo firewall-cmd --permanent --add-service=mountd
sudo firewall-cmd --permanent --add-service=rpc-bind
sudo firewall-cmd --reload
c) 确认是否可以看到 NFS 共享:
sudo showmount -e **<IP OF NFS SERVER>**
更多关于 NFS 的文档资源参考以下站点:
- NFS servers and firewalld | Stack Exchange
- Mounting an NFS Volume | Linux Network Administrators Guide
- NFS server configuration
设置数据库文件路径为共享磁盘
转移数据库文件到共享磁盘上:
a) 在 Primary 节点上先把数据库文件保存到临时路径 /var/opt/mssql/tmp 下,
su mssql
mkdir /var/opt/mssql/tmp
cp /var/opt/mssql/data/* /var/opt/mssql/tmp
rm /var/opt/mssql/data/*
exit
b) 在所有节点上编辑 /etc/fstab 文件,保证重启系统后自动挂载 NFS 共享磁盘:
<IP OF NFS SERVER>:<shared_storage_path> <database_files_directory_path> nfs timeo=14,intr
例子如下:
Note(摘自微软):
关于如何配置 Fencing,请参考 How To Configure VMware fencing using fence_vmware_soap in RHEL High Availability Add On(RHEL Pacemaker 中配置 STONITH)。
c) 挂载刚刚配置的 NFS 存储:
sudo mount -a
可以执行 mount 命令检测是否已经成功挂载:
d) 在 Primary 节点上把临时路径下的数据库文件复制到新挂载的路径下,并保证 mssql 这个本地用户有��写权限:
chown mssql /var/opt/mssql/data
chgrp mssql /var/opt/mssql/data
su mssql
cp /var/opt/mssql/tmp/* /var/opt/mssql/data/
rm /var/opt/mssql/tmp/*
exit
e) 在 Primary 节点上开启 SQL Server 服务验证是否成功,这时 SQL Server 已经使用 NFS 服务器上的共享磁盘了:
sudo systemctl start mssql-server
sudo systemctl status mssql-server
sudo systemctl stop mssql-server
f) 在其它非 Primary 节点上依次开启 SQL Server 服务验证是否成功。
Note:目前所有节点的 SQL Server 都使用这个 NFS 服务器共享磁盘了,根据微软推荐,为了防止冲突,需要使用一个 File System Cluster 资源来防止一个共享路径被挂载多次。
更多详情见请继续阅读下一页的精彩内容 :http://www.linuxidc.com/Linux/2017-06/144838p2.htm