Sqlserver on linux 高可用集羣搭建

 

1、環境準備

1 部署環境:

服務器數量:3臺linux

Ip地址:192.168.1.191(主)sql

         192.168.1.192(從)數據庫

         192.168.1.193(從)vim

操做系統:CentOS Linux release 7.6.1810 (Core)bash

Cpu:2核服務器

內存:4Gcurl

存儲20GBtcp

2 部署前準備工做:

2.1 關閉防火牆

Bash(all):工具

iptables -Fsqlserver

systemctl stop firewalld

systemctl disable firewalld

2.2 修改hosts文件

Bash(all):

vim /etc/hosts

192.168.1.191 m191

192.168.1.192 m192

192.168.1.193 m193

 

2.3 修改主機名

Bash(all):

Hostname m191

Hostname m191

Hostname m191

2.4 更新主機名

Bash(all):

bash

2、安裝 SQL Server

1 安裝mssql server:

1.1 下載 Microsoft SQL Server 2019 Red Hat 存儲庫配置文件:

sudo curl -o /etc/yum.repos.d/mssql-server.repo https://packages.microsoft.com/config/rhel/7/mssql-server-2019.repo

1.2 運行如下命令,安裝 SQL Server:

sudo yum install -y mssql-server

程序包安裝完成後,請運行 mssql-conf setup 命令並按提示設置 SA 密碼,而後選擇版本(我選擇的是6)。

sudo /opt/mssql/bin/mssql-conf setup

請確保爲 SA 賬戶指定強密碼(最少 8 個字符,包括大寫和小寫字母、十進制數字和/或非字母數字符號)。

 

1.3 配置完成後,請驗證服務是否正在運行:

systemctl status mssql-server

 

1.4 若要容許遠程鏈接,請在 RHEL 上打開防火牆上的 SQL Server 端口。 

默認的 SQL Server 端口爲 TCP 1433。 若是對防火牆使用 FirewallD,可使用如下命令:

sudo firewall-cmd --zone=public --add-port=1433/tcp --permanent

sudo firewall-cmd --reload

在此狀況下,SQL Server 2019 RHEL 計算機上運行並已準備好使用 !

1.5啓動 SQL Server 代理(默認已安裝,沒有可單獨安裝)

 

yum install mssql-server-agent

/opt/mssql/bin/mssql-conf set sqlagent.enabled true

 

 

2 安裝 SQL Server 命令行工具

若要建立數據庫,須要使用一個可以在 SQL Server 上運行 Transact-SQL 語句的工具進行鏈接。 如下步驟安裝 SQL Server 命令行工具: sqlcmdbcp

2.1 下載 Microsoft Red Hat 存儲庫配置文件。

sudo curl -o /etc/yum.repos.d/msprod.repo https://packages.microsoft.com/config/rhel/7/prod.repo

2.2 若是你有舊版mssql 工具安裝,請刪除任何較舊的 unixODBC 包。

sudo yum remove unixODBC-utf16 unixODBC-utf16-devel

2.3 運行如下命令以安裝 mssql-tools 和 unixODBC 開發人員包。

sudo yum install -y mssql-tools unixODBC-devel

 

2.4 將 /opt/mssql-tools/bin/ 添加到 PATH 環境變量。 

這樣就能夠在運行工具時不指定完整路徑。 請運行如下命令,以便修改登陸會話和交互/非登陸會話的 PATH:

echo 'export PATH="$PATH:/opt/mssql-tools/bin"' >> ~/.bash_profile

echo 'export PATH="$PATH:/opt/mssql-tools/bin"' >> ~/.bashrc

source ~/.bashrc

 

3 本地鏈接

3.1 如下步驟使用 sqlcmd 本地鏈接到新的 SQL Server 實例。

使用 SQL Server 名稱 (-S),用戶名 (-U) 和密碼 (-P) 的參數運行 sqlcmd。 在本教程中,用戶進行本地鏈接,所以服務器名稱爲 localhost。 用戶名爲 SA,密碼是在安裝過程當中爲 SA 賬戶提供的密碼。

bash複製

sqlcmd -S localhost -U SA -P '<YourPassword>'

 提示

能夠在命令行上省略密碼,以收到密碼輸入提示。

 提示

若是之後決定進行遠程鏈接,請指定 -S 參數的計算機名稱或 IP 地址,並確保防火牆上的端口 1433 已打開。

若是成功,應會顯示 sqlcmd 命令提示符:1>。

若是鏈接失敗,請首先嚐試根據錯誤消息診斷問題。 。

 

3.2 建立和查詢數據

下面各部分將逐步介紹如何使用 sqlcmd 新建數據庫、添加數據並運行簡單查詢。

3.2.1 新建數據庫

如下步驟建立一個名爲 TestDB 的新數據庫。

在 sqlcmd 命令提示符中,粘貼如下 Transact-SQL 命令以建立測試數據庫:

SQL複製

CREATE DATABASE TestDB

在下一行中,編寫一個查詢以返回服務器上全部數據庫的名稱:

SQL複製

SELECT Name from sys.Databases

前兩個命令沒有當即執行。 必須在新行中鍵入 GO 才能執行之前的命令:

SQL複製

GO

3.3.2 插入數據

接下來建立一個新表 Inventory,而後插入兩個新行。

在 sqlcmd 命令提示符中,將上下文切換到新的 TestDB 數據庫:

SQL複製

USE TestDB

建立名爲 Inventory 的新表:

SQL複製

CREATE TABLE Inventory (id INT, name NVARCHAR(50), quantity INT)

將數據插入新表:

SQL複製

INSERT INTO Inventory VALUES (1, 'banana', 150); INSERT INTO Inventory VALUES (2, 'orange', 154);

要執行上述命令的類型 GO:

SQL複製

GO

3.2.3 選擇數據

如今,運行查詢以從 Inventory 表返回數據。

經過 sqlcmd 命令提示符輸入查詢,以返回 Inventory 表中數量大於 152 的行:

SQL複製

SELECT * FROM Inventory WHERE quantity > 152;

執行命令:

SQL複製

GO

退出 sqlcmd 命令提示符

要結束 sqlcmd 會話,請鍵入 QUIT:

SQL複製

QUIT

 

3、SQL Server 證書及權限配置

Sql server版本:Microsoft SQL Server 2019 (CTP2.4) - 15.0.1400.75 (X64)   Mar 16 2019 11:53:26   Copyright (C) 2019 Microsoft Corporation  Enterprise Edition (64-bit) on Linux (CentOS Linux 7 (Core)) <X64>

1 激活Always On Availability Group功能

Bash(all):

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

sudo systemctl restart mssql-server

 

 

 

1.1全部服務器:爲 SQL Server AlwaysOn AG 安裝Linux資源代理

羣集資源代理程序 mssql-server-ha 是 Pacemaker 和 SQL Server 之間的接口
Bash(all)
yum install -y mssql-server-ha

yum info mssql-server-ha

 

2 啓用AlwaysOn_health事件會話

Sql(all):

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

GO

 

3 在全部節點上建立書庫鏡像端點(endPoint)用戶

(linux上須要建立一個登陸名(login)爲dbm_login和用戶名(user)爲dbm_user的用戶,它專用於端點,注意使用強密碼)

Sql(all):

CREATE LOGIN dbm_login WITH PASSWORD = '1111.aaa';

CREATE USER dbm_user FOR LOGIN dbm_login;

 

4 在主節點建立證書

Sql(主):

CREATE MASTER KEY ENCRYPTION BY PASSWORD = '1111.aaa';

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 = '1111.aaa'

       );

 

4.1 此時,在主上面的數據目錄下會產生兩個文件:

Bash(主):

dbm_certificate.cer     ##證書

dbm_certificate.pvk     ##私鑰

 

 

 

4.2 而後將這兩個文件複製到全部從服務器上相同目錄中

Bash(主):

cd /var/opt/mssql/data/

scp dbm_certificate.* 192.168.1.192:/var/opt/mssql/data/

scp dbm_certificate.* 192.168.1.193:/var/opt/mssql/data/

 

 

 

 

4.3 對從服務器上的證書進行受權

Bash(從);

cd /var/opt/mssql/data/

chown mssql.mssql dbm_certificate.*

 

 

5 在輔助節點上建立證書

Sql(從):

CREATE MASTER KEY ENCRYPTION BY PASSWORD = '1111.aaa';

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 = '1111.aaa'

            );

 

6 建立數據庫鏡像端點

Sql(all);

CREATE ENDPOINT [Hadr_endpoint]

    AS TCP (LISTENER_PORT = 5022)

    FOR DATABASE_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];

 

執行完畢以後在(all)上面查看是否啓用了對應的端口並開放端口5022

 

 

 

sudo firewall-cmd --zone=public --add-port=5022/tcp --permanent

sudo firewall-cmd --reload

 

 

7 在主節點上建立AG

7.1 檢查sqlserver主機名成

Sql(all);

select @@SERVERNAME;

正確的話會顯示:

 

 

 

不正確的話用命令進行修改;

8.1.1 select * from Sys.SysServers;    //查看全部系統名稱

8.1.2 sp_dropserver 'localhost'      //刪除servername-localhost

8.1.3 sp_addserver 'm192','LOCAL'    //修改主機名爲m190、

修改完畢以後必定要重啓sqlserver服務纔會生效。

 

 

 

7.2 在主節點上建立AG

Sql(主):

CREATE AVAILABILITY GROUP [AG1]

     WITH (DB_FAILOVER = ON, CLUSTER_TYPE = EXTERNAL)

     FOR REPLICA ON

         N'm191'

          WITH (

             ENDPOINT_URL = N'tcp://m192:5022',

             AVAILABILITY_MODE = SYNCHRONOUS_COMMIT,

             FAILOVER_MODE = EXTERNAL,

             SEEDING_MODE = AUTOMATIC,

              SECONDARY_ROLE (ALLOW_CONNECTIONS = ALL)

             ),

         N'm192'

          WITH (

             ENDPOINT_URL = N'tcp://m192:5022',

             AVAILABILITY_MODE = SYNCHRONOUS_COMMIT,

             FAILOVER_MODE = EXTERNAL,

             SEEDING_MODE = AUTOMATIC,

              SECONDARY_ROLE (ALLOW_CONNECTIONS = ALL)

             ),

N'm193'

          WITH (

             ENDPOINT_URL = N'tcp://m193:5022',

             AVAILABILITY_MODE = SYNCHRONOUS_COMMIT,

             FAILOVER_MODE = EXTERNAL,

             SEEDING_MODE = AUTOMATIC,

              SECONDARY_ROLE (ALLOW_CONNECTIONS = ALL)

             );

 

ALTER AVAILABILITY GROUP [AG1] GRANT CREATE ANY DATABASE;

 

7.3 將從節點添加進去

Sql(從):

 

ALTER AVAILABILITY GROUP [AG1] JOIN WITH (CLUSTER_TYPE = EXTERNAL);        

ALTER AVAILABILITY GROUP [AG1] GRANT CREATE ANY DATABASE

 

7.4 測試建立數據庫db1

Sql(主):

CREATE DATABASE [db1];

ALTER DATABASE [db1] SET RECOVERY FULL;

BACKUP DATABASE [db1]

   TO DISK = N'/var/opt/mssql/data/db1.bak';

ALTER AVAILABILITY GROUP [AG1] ADD DATABASE [db1];

 

 

7.5 在從節點上面再次點擊db1,發現能夠點開

 

 

 

 

 

至此AG配置已經完成,可是塔僅同步並不能shi先真正的高可用,還須要進行故障轉移,畢竟在企業中你不可能只管理一個數據庫,下章《配置集羣管理器Pacemaker》,是主推的高可用技術,AlwaysON固然也要提供必定的功能來實現這種「透明」切換,它提供了虛擬IP(vip)的感念。

7.6 AG操做

刪除可用性組

DROP AVAILABILITY GROUP group_name

 

4、配置集羣管理器Pacemaker

1 安裝必備工具包

Red Hat Enterprise Linux (RHEL)

Bash(all)

  1. 使用如下語法註冊服務器。 系統會提示輸入有效的用戶名和密碼。

  sudo subscription-manager register

 

  列出可用的註冊池。

  sudo subscription-manager list –available

 

  運行如下命令,將 RHEL 高可用性與訂閱相關聯

  sudo subscription-manager attach --pool=<PoolID>

其中,「PoolId」是上一步中高可用性訂閱的池 ID 。

 

  使存儲庫可以使用高可用性加載項。

sudo subscription-manager repos --enable=rhel-ha-for-rhel-7-server-rpms

 

Bash(all):

yum install pacemaker pcs resource-agents corosync fence-agents-all -y

2 對全部節點配置公共密碼

Bash(all):

passwd hacluster  (這裏密碼必定要設置成同樣的,我這設置的是123456.com)

 

3 啓動相應服務

Bash(all):

sudo systemctl enable pcsd

sudo systemctl start pcsd

sudo systemctl enable pacemaker

 

 

 

3.1在全部羣集節點上,打開 Pacemaker 防火牆端口。 若要使用 firewalld 打開這些端口,請運行如下命令:

firewall-cmd --add-service=high-availability --zone=public --permanent

firewall-cmd --zone=public --add-port=2224/tcp --permanent

firewall-cmd --zone=public --add-port=3121/tcp –permanent

firewall-cmd --zone=public --add-port=5405/udp --permanent 

firewall-cmd --reload

4 建立集羣

爲防止集羣中的異常文件殘留,須要先刪除已經存在的集羣。

Bash(all):

sudo pcs cluster destroy

sudo systemctl enable pacemaker

建立對應的集羣,此處須要一個節點(通常在主節點)運行

Bash(主):

sudo pcs cluster auth m191 m192 m193 -u hacluster -p 123456.com

sudo pcs cluster setup --name AG1 m191 m192 m193

 

 

 

 

chown -R hacluster.haclient /var/log/cluster

pcs cluster start --all
pcs cluster enable –all

 

4.1查看當前集羣狀態:

pcs cluster status

 

 

4.2檢查pacemaker服務:

ps aux | grep pacemaker

 

4.3檢驗Corosync的安裝及當前corosync狀態:

corosync-cfgtool -s

corosync-cmapctl | grep members

pcs status corosync

 

 

4.4檢查配置是否正確(倘若沒有輸出任何則配置正確):

crm_verify -L -V

 

4.5禁用STONITH(all):

pcs property set stonith-enabled=false

 

4.6沒法仲裁時候,選擇忽略(all):

pcs property set no-quorum-policy=ignore

 

 

 

5 全部節點隔離(STONITH)資源

隔離的目的是確保在配置資源過程當中引發服務中斷時,不會發生數據損壞,爲了測試環境相對簡單,須要禁用隔離,在實際環境中須要與管理員和設備供應商討論是否須要啓用。

Bash(all):

sudo pcs property set stonith-enabled=false

 

 

6 在全部節點安裝資源包

Bash(all):

yum install mssql-server-ha –y

sudo systemctl restart mssql-server

 

7 設置羣集屬性羣集從新檢查間隔(可不配置)

cluster-recheck-interval 指示檢查羣集資源參數、 約束或其餘羣集選項中的更改的輪詢間隔。 若是副本出現故障,羣集將嘗試從新啓動的時間間隔,由綁定的副本failure-timeout值和cluster-recheck-interval值。 例如,若是failure-timeout設置爲 60 秒和cluster-recheck-interval設置爲 120 秒,在從新啓動嘗試的時間間隔大於 60 秒,但不超過 120 秒。 咱們建議將故障超時設置爲 60 秒和羣集從新檢查的間隔超過 60 秒的值。 不建議將羣集從新檢查間隔設置爲較小的值。

若要將屬性值更新爲2 minutes運行:

sudo pcs property set cluster-recheck-interval=2min

 

(包括 RHEL 7.3 和 7.4) 的全部使用最新可用 Pacemaker 包 1.1.18-11.el7 分佈引入開始失敗-是的致命羣集設置的行爲更改其值爲 false。 此更改會影響故障轉移工做流。 若是主副本發生服務中斷,羣集應故障轉移到其中一個可用的輔助副本。 相反,用戶會注意到該羣集會一直嘗試啓動失敗的主副本。 若是該主永遠不會處於聯機狀態 (因爲的永久中斷),羣集永遠不會故障轉移到另外一個可用的輔助副本。 因爲此更改,之前推薦的配置來設置開始失敗-是的致命將再也不有效,須要恢復回其默認值設置true。 此外,須要更新,以包含 AG 資源failover-timeout屬性。

若要將屬性值更新爲true運行:

sudo pcs property set start-failure-is-fatal=true

若要更新ag_cluster資源屬性failure-timeout到60s運行:

pcs resource update AG1 meta failure-timeout=60s

8.1 在全部節點上建立基於Pacemaker的使用帳戶

Sql(all):

USE [master]

GO

CREATE LOGIN [pacemakerLogin] with PASSWORD= N'1111.aaa';

 

ALTER SERVER ROLE [sysadmin] ADD MEMBER [pacemakerLogin]

 

 

9 全部節點保存登錄信息

Bash(all):

sudo echo 'pacemakerLogin' >> ~/pacemaker-passwd

sudo echo '1111.aaa' >> ~/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 [ge1] 

 

10 搭建主節點配置AG,建立虛擬IP

搭建好集羣以後,就能夠建立虛擬Ip,這裏選用192.168.1.220爲VIP

Bash(主)

sudo pcs resource create ag_cluster ocf:mssql:ag ag_name=AG1 meta failure-timeout=60s master notify=true

 

sudo pcs resource create virtualip ocf:heartbeat:IPaddr2 ip=192.168.1.220

執行完以後查看是否綁定成功

ip  addr show

 

 

 

 

11 設置主節點(或副本)執行集羣依賴關係和啓動順序

11.1目的在於當集羣擁有兩個以上的節點,且發生故障轉移時,應選擇哪一節點做爲新的主節點。

11.1.1用戶問題pcs resource move到可用性組主副本從節點 1 到節點 2。

11.1.2節點 1 上虛擬 IP 資源中止。

11.1.3節點 2 上虛擬 IP 資源啓動。

 

此時,IP 地址暫時指向節點 2,同時節點 2 仍爲故障轉移前的次要副本。

11.1.4節點 1 上的可用性組主要副本降級爲次要副本。

11.1.5節點 2 上的可用性組次要副本升級爲主要副本。

Bash(主)

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

 

 

 

11.2  查看集羣狀態

sudo pcs status

 

 

 

12 訪問VIP

此次使用vip訪問sqlserver服務器,通常狀況下,1433端口能夠不加(sa,密碼123456.com)

以下圖咱們順利完成了搭建,在無端障的狀況下,當前DB(注意咱們使用vip鏈接,也就是可能你不知道具體的主節點在哪裏)如圖;

Sql(VIP):

 

 

 

 

13 首先咱們要了解當前狀態,使用下面語句查看AG信息

Sql(VIP):

-- group info

SELECT

    g.name as ag_name,

    rgs.primary_replica,

    rgs.primary_recovery_health_desc as recovery_health,

    rgs.synchronization_health_desc as sync_health

From sys.dm_hadr_availability_group_states as rgs

JOIN sys.availability_groups AS g

                      ON rgs.group_id = g.group_id

 

--replicas info

SELECT

         g.name as ag_name,

         r.replica_server_name,

         rs.is_local,

         rs.role_desc as role,

         rs.operational_state_desc as op_state,

         rs.connected_state_desc as connect_state,

         rs.synchronization_health_desc as sync_state,

         rs.last_connect_error_number,

         rs.last_connect_error_description

From sys.dm_hadr_availability_replica_states AS  rs

JOIN sys.availability_replicas AS r

         ON rs.replica_id = r.replica_id

JOIN sys.availability_groups AS g

         ON g.group_id = r.group_id

 

 

--DB level

SElECT

     g.name as ag_name,

     r.replica_server_name,

     DB_NAME(drs.database_id) as [database_name],

     drs.is_local,

     drs.is_primary_replica,

     synchronization_state_desc as sync_state,

     synchronization_health_desc as sync_health,

     database_state_desc as db_state

FROM sys.dm_hadr_database_replica_states AS drs

     JOIN sys.availability_replicas AS r

     ON r.replica_id = drs.replica_id

     JOIN sys.availability_groups AS g

     ON g.group_id = drs.group_id

ORDER BY g.name, drs.is_primary_replica DESC;

GO

 

 

 

 

-

14 模擬故障轉移

使用命令停掉主節點的sql server服務(咱們指望它能發生自動故障轉移,而且但願在本例中主節點能轉移到m191或m192上面,同時又保證VIP能繼續使用,等待少量時間後/故障轉移須要必定的時間,特別是繁忙的大型系統,可能須要數秒到幾分鐘/)

 

 

14.1 故障轉移(手動)

Sql(主):

將m192轉換爲主數據庫

sudo pcs resource move ag_cluster-master m192 --master

 

 

 

 

 

14.2 查看vip地址是否能夠漂移到m192上

 

 

 

 

14.3 至此,集羣模式搭建完成

 

 

 

 

 

 

 

 


 [ge1] Only readable by root

相關文章
相關標籤/搜索