Configure Always On Availability Group for SQL Server on RHEL——Red Hat Enterprise Linux上配置SQL Server

下面簡單介紹一下如何在Red Hat Enterprise Linux上一步一步建立一個SQL Server AG(Always On Availability Group),以及配置過程當中遇到的坑的填充方法。html

以前發表過一篇相似的文章是Configure Always On Availability Group for SQL Server on Ubuntu——Ubuntu上配置SQL Server Always On Availability Group,有對Ubuntu感興趣的請看那一篇。node

目前在Linux上能夠搭建兩種類型的SQL Server AG,一種是高可用性的結構同時使用Cluster服務器提供業務連續性。這種結構包括read-scale節點。接下來就會介紹這種AG的搭建方法。另一種是沒有Cluster服務的read-scale AG,這種結構僅僅提供只讀的可擴展性,不提供高可用性功能。關於如何建立這種簡單的AG請參考:Configure read-scale availability group for SQL Server on Linuxlinux

另外在CREATE AVAILABILITY GROUP時能夠指定CLUSTER TYPE:sql

  • WSFC:Windows server failover cluster。這個是Windows系統上的默認值;
  • EXTERNAL:非Windows server上的failover cluster,好比Linux上的Pacemaker;
  • NONE:不包含cluster manager,指的是建立read-scale類型的Availability Group。

其中Linux可使用EXTERNAL或NONE,我理解的是EXTENRAL功能就是相似目前SQL Server中的AG,NONE則是一種新類型,沒有Cluster功能的不支持高可用性和災難恢復的AG。主要做用是分擔主服務器的負載,支持多個只讀備用節點,同時這種類型也支持Windows上使用,是SQL Server 2017新支持的功能。更多詳細的信息請參考這裏:Read-scale availability groupswindows

 

接下來進入主題主要介紹一下高可用性結構的Availability Group的搭建方法。服務器

1.      安裝及配置SQL Server

一個SQL AG至少有兩個以上的節點,因爲環境有限,這裏只安裝一個最簡單的包含兩個節點的AG。首先是按照SQL Server on Red Hat Enterprise Linux——RHEL上的SQL Server(全截圖)中的介紹,安裝兩個RHEL機器和SQL Server。網絡

Note:同一個AG的多個節點必須都是實體機或者虛擬機,當都是虛擬機的時候也必須都在同一個虛擬化平臺上,緣由是因爲Linux須要用fencing agent去隔離節點上的資源,不一樣平臺fencing agent類型是不一樣的,詳細參考Policies for Guest Clusterstcp

 

2.      建立AG

在Linux上,必須先建立AG才能把它當成一個資源加到Cluster中進行管理。下面介紹一下如何建立AG。工具

a)       準備工做:學習

更新每個節點服務器的機器名符合這個要求:15個字符或者更少;網絡上是惟一的。若是不符合要求可使用以下命令更改機器名:

sudo vi /etc/hostname

使用以下命令修改Hosts文件以保證同一個AG中多個節點能夠互相通訊

sudo vi /etc/hosts

這裏必定注意:修改後能夠用ping命令嘗試ping hostname,必須返回對應的真正IP地址才行,也就是Hosts文件中不能包含相似hostname和127.0.0.1的對應記錄,配置後以下,注意其中」127.0.1.1 RHEL73Bob3」這行被我註釋了,不然開啓Cluster 服務的時候可能會有問題:

若是不註釋,ping hostname的返回結果是127.0.1.1,註釋後返回的是真正IP:

須要返回真正IP後期配置纔好使。

另外能夠用這個命令查看當前server的IP:

sudo ip addr show

b)      在全部節點SQL Server上開啓Always On Availability Group功能並重啓服務:

sudo /opt/mssql/bin/mssql-conf set hadr.hadrenabled  1
sudo systemctl restart mssql-server

c)       在全部節點上執行SQL語句開啓AlwaysOn_health事件會話以方便診斷問題:

ALTER EVENT SESSION  AlwaysOn_health ON SERVER WITH (STARTUP_STATE=ON);
GO

更多關於Event Session信息能夠參考:AlwaysOn Extended Events

d)      建立db mirroring endpoint使用的用戶:

CREATE LOGIN dbm_login WITH PASSWORD = '**<Your Password>**';
CREATE USER dbm_user FOR LOGIN dbm_login;

e)      建立證書:

Linux上的SQL Server Mirroring Endpoint是用證書去認證通訊的。下面的命令建立一個master key和證書並備份。鏈接到Primary端SQL Server並執行以下命令:

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>**'
       );

f)        把證書的備份複製到全部的非Primary節點上,同時使用它建立證書:

先在Primary節點上執行以下命令複製證書的備份到其它節點上:

cd /var/opt/mssql/data
scp dbm_certificate.* root@**<node2>**:/var/opt/mssql/data/

Note:若是遇到Permission denied,可使用sz和rz命令經過主機來傳輸文件。

再在目的端Secondary節點上執行以下命令給用戶mssql添加足夠的權限:

cd /var/opt/mssql/data
chown mssql:mssql dbm_certificate.*

最後在目的端Secondary節點上利用備份的證書建立證書:

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>**'
            );

g)       在全部節點上建立database mirroring endpoint:

CREATE ENDPOINT [Hadr_endpoint]
    AS TCP (LISTENER_IP = (0.0.0.0), 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];

Note:這裏Listener IP暫時不能修改,只能是0.0.0.0,目前有BUG,將來可能會修復。

h)      在Primary節點上建立AG:

CREATE AVAILABILITY GROUP [RHELAG]
    WITH (DB_FAILOVER = ON, CLUSTER_TYPE = EXTERNAL)
    FOR REPLICA ON
        N'**<node1>**'
        WITH (
            ENDPOINT_URL = N'tcp://**<node1>**:**<5022>**',
            AVAILABILITY_MODE = SYNCHRONOUS_COMMIT,
            FAILOVER_MODE = EXTERNAL,
            SEEDING_MODE = AUTOMATIC
            ),
        N'**<node2>**'
        WITH (
            ENDPOINT_URL = N'tcp://**<node2>**:**<5022>**',
            AVAILABILITY_MODE = SYNCHRONOUS_COMMIT,
            FAILOVER_MODE = EXTERNAL,
            SEEDING_MODE = AUTOMATIC
            );
ALTER AVAILABILITY GROUP [RHELAG] GRANT CREATE ANY DATABASE;

Note:執行過程當中可能會出現這個警告」Attempt to access non-existent or uninitialized availability group with ID」,暫時忽略便可,將來版本可能會修復。

下圖中RHELAG是新建立的AG,Secondary節點還處於OFFLINE狀態:

i)        把其它Secondary節點加入到AG中:

ALTER AVAILABILITY GROUP [RHELAG] JOIN WITH (CLUSTER_TYPE = EXTERNAL);
ALTER AVAILABILITY GROUP [RHELAG] GRANT CREATE ANY DATABASE;

下圖爲添加完節點後的狀態:

j)        測試:建立一個DB並加入到剛剛建立的AG中:

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

k)       驗證:在Secondary端查看DB是否已經成功同步過去了:

SELECT * FROM sys.databases WHERE name = 'db1';
GO
SELECT DB_NAME(database_id) AS 'database', synchronization_state_desc FROM sys.dm_hadr_database_replica_states;

 

這時,一個簡單的AG就建立好了,可是它不能提供高可用性和災難恢復功能,必須配置一個Cluster技術才能好使。若是上述h)和i)步驟的TSQL更換成如下兩個,則建立出來的就是read-scale類型的AG。

  • 建立AG命令:
CREATE AVAILABILITY GROUP [RHELAG]
    WITH (CLUSTER_TYPE = NONE)
    FOR REPLICA ON
        N'**<node1>**' WITH (
            ENDPOINT_URL = N'tcp://**<node1>**:**<5022>**',
            AVAILABILITY_MODE = ASYNCHRONOUS_COMMIT,
            FAILOVER_MODE = MANUAL,
            SEEDING_MODE = AUTOMATIC,
                    SECONDARY_ROLE (ALLOW_CONNECTIONS = ALL)
            ),
        N'**<node2>**' WITH (
            ENDPOINT_URL = N'tcp://**<node2>**:**<5022>**',
            AVAILABILITY_MODE = ASYNCHRONOUS_COMMIT,
            FAILOVER_MODE = MANUAL,
            SEEDING_MODE = AUTOMATIC,
            SECONDARY_ROLE (ALLOW_CONNECTIONS = ALL)
            );
ALTER AVAILABILITY GROUP [RHELAG] GRANT CREATE ANY DATABASE;
  • 把Secondary節點加到AG中命令:
ALTER AVAILABILITY GROUP [RHELAG] JOIN WITH (CLUSTER_TYPE = NONE);
ALTER AVAILABILITY GROUP [RHELAG] GRANT CREATE ANY DATABASE;

Note:這時的AG是沒有Listener的,目前版本也暫時沒法建立Listener。

 

3.      配置一個集羣資源管理器,如Pacemaker

具體步驟以下:

a)       在全部的Cluster節點上安裝和配置Pacemaker:

先設置防火牆容許相關端口經過,

sudo firewall-cmd --permanent --add-service=high-availability
sudo firewall-cmd --reload

Note:若是使用其它firewall工具,須要開啓以下這幾個端口:

TCP: Ports 2224, 3121, 21064

UDP: Port 5405

在全部節點上安裝Pacemaker軟件包:

sudo yum install pacemaker pcs fence-agents-all resource-agents

設置Pacemaker和Corosync軟件包在安裝時建立的默認用戶的密碼,需保證全部節點上密碼同樣:

sudo passwd hacluster

b)      啓用並開啓pcsd和Pacemaker服務:

sudo systemctl enable pcsd
sudo systemctl start pcsd
sudo systemctl enable pacemaker

c)       建立Cluster並啓動:

首先爲了防止有Cluster的殘餘配置文件影響後期搭建,能夠先執行以下命令刪除已經存在的Cluster:

sudo pcs cluster destroy # On all nodes
sudo systemctl enable pacemaker

而後建立並配置Cluster:

sudo pcs cluster auth **<nodeName1>** **<nodeName2>**  -u hacluster -p **<password for hacluster>**
sudo pcs cluster setup --name **<clusterName>** **<nodeName1>** **<nodeName2…>**
sudo pcs cluster start --all

d)      配置隔離:STONITH。目前測試環境爲了簡單,暫時不配置了,這裏先執行如下命令禁用隔離:

sudo pcs property set stonith-enabled=false

若是想配置,參考How To Configure VMware fencing using fence_vmware_soap in RHEL High Availability Add On——RHEL Pacemaker中配置STONITH

e)      設置start-failure-is-fatal爲false:

pcs property set start-failure-is-fatal=false

默認值是true,當爲true的時候,若是Cluster第一次啓動資源失敗,在自動Failover操做後,須要用戶手動清空資源啓動失敗的數量記錄,使用這個命令重置資源配置:

pcs resource cleanup <resourceName>

 

4.      添加AG到Cluster集羣中

具體步驟以下:

a)       在全部節點上安裝與Pacemaker集成的SQL Server資源包:

sudo yum install mssql-server-ha

b)      在全部節點上建立Pacemaker用的SQL Server登陸用戶:

USE [master]
GO
CREATE LOGIN [pacemakerLogin] with PASSWORD= N'<Your Password>'
ALTER SERVER ROLE [sysadmin] ADD MEMBER [pacemakerLogin]

也能夠不給sysadmin權限,給上以下足夠的權限便可:

GRANT ALTER, CONTROL, VIEW DEFINITION ON AVAILABILITY GROUP::RHELAG TO pacemakerLogin

c)       在全部節點上,保存SQL Server Login的信息:

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

d)      在Cluster中Primary節點上建立AG的資源:

sudo pcs resource create ag_cluster ocf:mssql:ag ag_name=RHELAG --master meta notify=true

e)      在Cluster中Primary節點上建立虛擬IP資源:

sudo pcs resource create virtualip ocf:heartbeat:IPaddr2 ip=**<10.2.38.202>**

f)        配置Cluster資源的依賴關係和啓動順序:

sudo pcs constraint colocation add virtualip ag_cluster-master INFINITY with-rsc-role=Master
sudo pcs constraint order promote ag_cluster-master then start virtualip

g)       最後查看Cluster狀態以下:

sudo pcs status

 

能夠用虛擬IP(10.2.38.202)訪問這個AG:

至此,Red Hat Enterprise Linux上的Cluster管理的SQL Server Always On Availability Group就搭建完成了。

最後附一張配置了STONITH成功的截圖:

 

Note:

  • 當把AG加入到Cluster中做爲一個資源的時候,就不能再使用TSQL去failover AG了。SQL Server服務端是不知道Cluster的存在的,整個系統是經過Linux Cluster來控制的,在Ubuntu和RHEL中用pcs命令,在SLES中用crm命令。
  • 所有配置完成後,可使用虛擬IP去訪問整個AG,這時能夠在DNS中手動註冊一個Listener名字指向這個虛擬IP,就能夠當成Windows中的AG Listener使用了。
  • SQL Server 2017 CTP 1.4中新引入了一個sequence_number的概念防止數據丟失,詳細參考Understand SQL Server resource agent for pacemaker(https://docs.microsoft.com/en-us/sql/linux/sql-server-linux-availability-group-cluster-rhel )。

參考連接:

 

本文主要介紹瞭如何配置AG以及如何解決配置過程當中遇到的問題,關於AG的管理使用上之後再詳細介紹,若有錯誤或者介紹不夠,敬請見諒。

 

[原創文章,轉載請註明出處,僅供學習研究之用,若有錯誤請留言,如喜歡請推薦,謝謝支持]

[原文:http://www.cnblogs.com/lavender000/p/6946848.html,來自永遠薰薰]

相關文章
相關標籤/搜索