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

来源:http://www.cnblogs.com/lavender000/archive/2017/06/05/6946848.html
-Advertisement-
Play Games

下麵簡單介紹一下如何在Red Hat Enterprise Linux上一步一步創建一個SQL Server AG(Always On Availability Group),以及配置過程中遇到的坑的填充方法。 之前發表過一篇類似的文章是Configure Always On Availabilit ...


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

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

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

另外在CREATE AVAILABILITY GROUP時可以指定CLUSTER TYPE:

  • 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 groups

 

接下來進入主題主要介紹一下高可用性結構的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 Clusters

 

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,來自永遠薰薰]


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 關於網路安全加密的介紹可以看之前文章: "1. 網路安全——數據的加密與簽名,RSA介紹" "2. Base64編碼、MD5、SHA1 SHA512、HMAC(SHA1 SHA512)" "3. When I see you again(DES、AES、RSA、Base64、MD5加密原理介紹,代碼 ...
  • Android系統在運行每一個程式應用的時候,都會創建一個Application對象,用於存儲與整個應用相關的公共變數。一個Android應用只會生成一個Application對象,在不同的Activity中獲取的Application對象是一樣的,所以Application對象是一個單例(Sing ...
  • 轉載請註明:http://www.cnblogs.com/igoslly/p/6947225.html 下一章是關於ListFragment的內容,首先先介紹ListView的相關配置,理解ListFragment也相較容易。 在fznpcy專欄:http://blog.csdn.net/fznpc ...
  • 目錄 零、主要參考網頁 一、概述 二、分區類型以及創建方式 三、分區表的管理 三、分區表的管理 四、獲取分區表信息 四、獲取分區表信息 五、分區的局限與分表 零、主要參考網頁 http://www.2cto.com/database/201503/380348.html【mysql分表和表分區詳解】 ...
  • 目錄 零、參考網頁 一、概述 二、語法 三、外鍵 四、索引 零、參考網頁 http://zhidao.baidu.com/link?url=ik8ZtrHL2qfZMgQStSFEcP2ORechkwBzbxBQjMQ15SoCV11-rRv5buPIPLZBZu570-YWRoAFsqANBiII ...
  • 卸載MariaDB CentOS7預設安裝MariaDB而不是MySQL,而且yum伺服器上也移除了MySQL相關的軟體包。因為MariaDB和MySQL可能會衝突,故先卸載MariaDB。 1、安裝新版mysql之前,我們需要將系統自帶的mariadb-lib卸載 2、到mysql的官網下載最新版 ...
  • 恢復內容開始 [20170603]12c Top Frequency histogram.txt--//個人對直方圖瞭解很少,以前2種直方圖類型對於目前的許多應用來講已經足夠,或者講遇到的問題很少.--//抽一點點時間,簡單探究12c Top Frequency histogram.--//以前的頻 ...
  • INFORMATION_SCHEMA PROFILING "Table" PROFILING表提供了語句分析信息。 其內容對應於SHOW PROFILES和SHOW PROFILE語句生成的信息. INFORMATION_SCHEMA Name|SHOW Name| Notes |: |: QUER ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...