Ubuntu上配置SQL Server Always On Availability Group(Configure Always On Availability Group for SQL Server on Ubuntu)

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

下麵簡單介紹一下如何在Ubuntu上一步一步創建一個SQL Server AG(Always On Availability Group),以及配置過程中遇到的坑的填充方法。 目前在Linux上可以搭建兩種類型的SQL Server AG,一種是高可用性的結構同時使用Cluster伺服器提供業務連續 ...


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

 

目前在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 Ubuntu——Ubuntu上的SQL Server(全截圖)中的介紹,安裝兩個Ubuntu機器和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   Ubuntu1604Bob2”這行被我註釋了,否則開啟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 [UbuntuAG]
    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 [UbuntuAG] GRANT CREATE ANY DATABASE;

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

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

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

ALTER AVAILABILITY GROUP [UbuntuAG] JOIN WITH (CLUSTER_TYPE = EXTERNAL);
ALTER AVAILABILITY GROUP [UbuntuAG] 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 [UbuntuAG] 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 [UbuntuAG]
    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 [UbuntuAG] GRANT CREATE ANY DATABASE;

把Secondary節點加到AG中命令:

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

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

 

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

具體步驟如下:

a)       在所有的Cluster節點上安裝和配置Pacemaker:

先設置防火牆允許相關埠通過(包括Pacemaker high-availability service、SQL Server Instance和Availability Group Endpoint),

sudo ufw allow 2224/tcp
sudo ufw allow 3121/tcp
sudo ufw allow 21064/tcp
sudo ufw allow 5405/udp
sudo ufw allow 1433/tcp # Replace with TDS endpoint
sudo ufw allow 5022/tcp # Replace with DATA_MIRRORING endpoint
sudo ufw reload

或者也可以直接禁用防火牆:

sudo ufw disable

在所有節點上安裝Pacemaker軟體包:

sudo apt-get install pacemaker pcs fence-agents resource-agents

設置Pacemaker和Corosync軟體包在安裝時創建的預設用戶的密碼,需保證所有節點上密碼一樣:

sudo passwd hacluster

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

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

執行過程中可能出現這個錯誤”pacemaker Default-Start contains no runlevels, aborting.”,可以暫時忽略。

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

這時可能會出現這個錯誤”Job for corosync.service failed because the control process exited with error code. See "systemctl status corosync.service" and "journalctl -xe" for details.”診斷解決方法如下:

  • 根據2-a)中的描述查看是否有問題;
  • 使用如下命令查看配置文件中的Log路徑是什麼。
vi /etc/corosync/corosync.conf

  • 查看相關文件是否存在,如不存在,則創建相關文件,假設上圖中logfile路徑為/var/log/cluster/corosync.log同時該文件還不存在,則執行如下命令,
sudo mkdir /var/log/cluster
sudo chmod 777 /var/log/cluster
sudo echo >> /var/log/cluster/corosync.log

d)      配置隔離:STONITH。目前測試環境為了簡單,暫時不配置了,以後會更新。正常來說生產環境需要一個fencing agent去隔離資源,關於支持信息請參考這裡:Support Policies for RHEL High Availability Clusters - Virtualization Platforms

另外我們這裡先執行以下命令禁用隔離:

sudo pcs property set stonith-enabled=false

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 apt-get 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::UbuntuAG 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=UbuntuAG --master meta notify=true

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

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

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.204)訪問這個AG:

 

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

 

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-ubuntu)。

參考鏈接:

 

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

 

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

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


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

-Advertisement-
Play Games
更多相關文章
  • 本書被Android開發者譽為Android學習經典。全書系統全面、循序漸進地介紹了Android軟體開發的知識、經驗和技巧。 第2版基於Android7.0對第1版進行了全面更新,將所有知識點都在新的Android系統上進行重新適配,使用全新的Android Studio開發工具代替之前的Ecli ...
  • 由柯元旦編著的《Android內核剖析》詳細分析了Android內核的內部機制,包括視窗管理系統、Activity管理系統、輸入法框架、編譯系統等,為Android內核定製及高級應用程式開發提供技術參考。 《Android內核剖析》適合於所有Android相關的工程師及產品經理,還可作為相關培訓機構 ...
  • 前幾天看到新聞,Google將Kotlin語言作為Android應用開發的一級語言, 與Java並駕齊驅, 這則消息在開發界一下就炸開了鍋( 好像平息的很快。。。)! 連Google的親兒子go語言也沒有這種待遇。Kotlin是什麼鬼,感覺隱隱約約好像在哪裡見過啊,對IDEA新建工程時可以看到。 大 ...
  • 以前做前端開發的時候,使用最多的工具就是 Fiddler ,用來定位問題、模擬特定場景非常方便,極大提升了開發效率。而轉做 iOS 開發以後,一大頭疼的問題是 Fiddler 沒有 Mac 版,幸虧找到了 Charles Proxy 這個還不錯的替代工具,不過使用上與 Fiddler 還是有不少區別 ...
  • 如題,我在網上也找過相關解決方法,很多解答都是這麼一句SQL語句: select Id,AccountId,Mark,max(CreateTime) as Latest from AccountMark as b group by AccountId 使用Max函數。但是在我查出來的數據中似乎有些不 ...
  • 這是一個簡單的數據生產導入的故事,原本故事情節應該是這樣的:數據整理-->測試驗證-->生產發佈-->生產驗證,然後就是各回各家,所以這本來應該是一個平淡的故事,然而實際卻變成瞭如下情節:數據整理-->測試驗證-->生產發佈-->生產驗證-->校驗失敗(預期數據未導入)-->問題排查-->解決問題- ...
  • 目錄 1.獲取當前系統時間 2.Oracle中union與union all 1.獲取當前系統時間,並做些加減運算。 2.Oracle中union與union all 如果我們需要將兩個select語句的結果作為一個整體顯示出來,我們就需要用到union或者union all關鍵字。 union和u ...
  • 本文使用的IDE是Visual Studio 2015 ,驅動程式是Neo4j官方的最新版本:Neo4j Driver 1.3.0 ,創建的類庫工程(Project)要求安裝 .NET Framework 4.6版本,Neo4j官方提供的驅動程式使用起來非常簡單,非常依賴於Cypher語言,但是,官 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...