服務器數量: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
Bash(all):工具
iptables -Fsqlserver
systemctl stop firewalld
systemctl disable firewalld
Bash(all):
vim /etc/hosts
192.168.1.191 m191
192.168.1.192 m192
192.168.1.193 m193
Bash(all):
Hostname m191
Hostname m191
Hostname m191
Bash(all):
bash
sudo yum install -y mssql-server
程序包安裝完成後,請運行 mssql-conf setup 命令並按提示設置 SA 密碼,而後選擇版本(我選擇的是6)。
sudo /opt/mssql/bin/mssql-conf setup
請確保爲 SA 賬戶指定強密碼(最少 8 個字符,包括大寫和小寫字母、十進制數字和/或非字母數字符號)。
systemctl status mssql-server
默認的 SQL Server 端口爲 TCP 1433。 若是對防火牆使用 FirewallD,可使用如下命令:
sudo firewall-cmd --zone=public --add-port=1433/tcp --permanent
sudo firewall-cmd --reload
在此狀況下,SQL Server 2019 RHEL 計算機上運行並已準備好使用 !
yum install mssql-server-agent
/opt/mssql/bin/mssql-conf set sqlagent.enabled true
若要建立數據庫,須要使用一個可以在 SQL Server 上運行 Transact-SQL 語句的工具進行鏈接。 如下步驟安裝 SQL Server 命令行工具: sqlcmd和bcp。
sudo curl -o /etc/yum.repos.d/msprod.repo https://packages.microsoft.com/config/rhel/7/prod.repo
sudo yum remove unixODBC-utf16 unixODBC-utf16-devel
sudo yum install -y mssql-tools unixODBC-devel
這樣就能夠在運行工具時不指定完整路徑。 請運行如下命令,以便修改登陸會話和交互/非登陸會話的 PATH:
echo 'export PATH="$PATH:/opt/mssql-tools/bin"' >> ~/.bash_profile
echo 'export PATH="$PATH:/opt/mssql-tools/bin"' >> ~/.bashrc
source ~/.bashrc
使用 SQL Server 名稱 (-S),用戶名 (-U) 和密碼 (-P) 的參數運行 sqlcmd。 在本教程中,用戶進行本地鏈接,所以服務器名稱爲 localhost。 用戶名爲 SA,密碼是在安裝過程當中爲 SA 賬戶提供的密碼。
bash複製
sqlcmd -S localhost -U SA -P '<YourPassword>'
提示
能夠在命令行上省略密碼,以收到密碼輸入提示。
提示
若是之後決定進行遠程鏈接,請指定 -S 參數的計算機名稱或 IP 地址,並確保防火牆上的端口 1433 已打開。
若是成功,應會顯示 sqlcmd 命令提示符:1>。
若是鏈接失敗,請首先嚐試根據錯誤消息診斷問題。 。
下面各部分將逐步介紹如何使用 sqlcmd 新建數據庫、添加數據並運行簡單查詢。
如下步驟建立一個名爲 TestDB 的新數據庫。
在 sqlcmd 命令提示符中,粘貼如下 Transact-SQL 命令以建立測試數據庫:
SQL複製
CREATE DATABASE TestDB
在下一行中,編寫一個查詢以返回服務器上全部數據庫的名稱:
SQL複製
SELECT Name from sys.Databases
前兩個命令沒有當即執行。 必須在新行中鍵入 GO 才能執行之前的命令:
SQL複製
GO
接下來建立一個新表 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
如今,運行查詢以從 Inventory 表返回數據。
經過 sqlcmd 命令提示符輸入查詢,以返回 Inventory 表中數量大於 152 的行:
SQL複製
SELECT * FROM Inventory WHERE quantity > 152;
執行命令:
SQL複製
GO
退出 sqlcmd 命令提示符
要結束 sqlcmd 會話,請鍵入 QUIT:
SQL複製
QUIT
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>
Bash(all):
sudo /opt/mssql/bin/mssql-conf set hadr.hadrenabled 1
sudo systemctl restart mssql-server
羣集資源代理程序 mssql-server-ha 是 Pacemaker 和 SQL Server 之間的接口
Bash(all)
yum install -y mssql-server-ha
yum info mssql-server-ha
Sql(all):
ALTER EVENT SESSION AlwaysOn_health ON SERVER WITH (STARTUP_STATE=ON);
GO
(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;
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'
);
Bash(主):
dbm_certificate.cer ##證書
dbm_certificate.pvk ##私鑰
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/
Bash(從);
cd /var/opt/mssql/data/
chown mssql.mssql dbm_certificate.*
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'
);
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
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服務纔會生效。
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;
Sql(從):
ALTER AVAILABILITY GROUP [AG1] JOIN WITH (CLUSTER_TYPE = EXTERNAL);
ALTER AVAILABILITY GROUP [AG1] GRANT CREATE ANY DATABASE
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];
至此AG配置已經完成,可是塔僅同步並不能shi先真正的高可用,還須要進行故障轉移,畢竟在企業中你不可能只管理一個數據庫,下章《配置集羣管理器Pacemaker》,是主推的高可用技術,AlwaysON固然也要提供必定的功能來實現這種「透明」切換,它提供了虛擬IP(vip)的感念。
刪除可用性組
DROP AVAILABILITY GROUP group_name
Red Hat Enterprise Linux (RHEL)
Bash(all)
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
Bash(all):
passwd hacluster (這裏密碼必定要設置成同樣的,我這設置的是123456.com)
Bash(all):
sudo systemctl enable pcsd
sudo systemctl start pcsd
sudo systemctl enable pacemaker
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
爲防止集羣中的異常文件殘留,須要先刪除已經存在的集羣。
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
pcs cluster status
ps aux | grep pacemaker
corosync-cfgtool -s
corosync-cmapctl | grep members
pcs status corosync
crm_verify -L -V
pcs property set stonith-enabled=false
pcs property set no-quorum-policy=ignore
隔離的目的是確保在配置資源過程當中引發服務中斷時,不會發生數據損壞,爲了測試環境相對簡單,須要禁用隔離,在實際環境中須要與管理員和設備供應商討論是否須要啓用。
Bash(all):
sudo pcs property set stonith-enabled=false
Bash(all):
yum install mssql-server-ha –y
sudo systemctl restart mssql-server
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
Sql(all):
USE [master]
GO
CREATE LOGIN [pacemakerLogin] with PASSWORD= N'1111.aaa';
ALTER SERVER ROLE [sysadmin] ADD MEMBER [pacemakerLogin]
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]
搭建好集羣以後,就能夠建立虛擬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.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
此次使用vip訪問sqlserver服務器,通常狀況下,1433端口能夠不加(sa,密碼123456.com)
以下圖咱們順利完成了搭建,在無端障的狀況下,當前DB(注意咱們使用vip鏈接,也就是可能你不知道具體的主節點在哪裏)如圖;
Sql(VIP):
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
-
使用命令停掉主節點的sql server服務(咱們指望它能發生自動故障轉移,而且但願在本例中主節點能轉移到m191或m192上面,同時又保證VIP能繼續使用,等待少量時間後/故障轉移須要必定的時間,特別是繁忙的大型系統,可能須要數秒到幾分鐘/)
Sql(主):
將m192轉換爲主數據庫
sudo pcs resource move ag_cluster-master m192 --master
[ge1] Only readable by root