Red Hat Enterprise Linux上为SQL Server配置共享磁盘集群
下面一步一步介绍一下如何在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
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资源来防止一个共享路径被挂载多次。