首页 > 代码库 > Configure Red Hat Enterprise Linux shared disk cluster for SQL Server——RHEL上的“类”SQL Server Cluster功能

Configure Red Hat Enterprise Linux shared disk cluster for SQL Server——RHEL上的“类”SQL Server Cluster功能

下面一步一步介绍一下如何在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的两个节点,请参考博文“SQL Server on Red Hat Enterprise Linux——RHEL上的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(摘自微软):

技术分享

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资源来防止一个共享路径被挂载多次。

 

    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: 文档比较基础,未来可能会继续更新。


 

[原创文章,转载请注明出处,仅供学习研究之用,如有错误请留言,谢谢支持]

Configure Red Hat Enterprise Linux shared disk cluster for SQL Server——RHEL上的“类”SQL Server Cluster功能