作者 | 張樂奕:Oracle ACE 總監,ACOUG (中國 Oracle 用戶組)聯合發起人。Oracle 資料庫高可用解決方案與 Exadata 一體機專家。長於資料庫故障診斷,性能調優。作為多家知名論壇版主,熱衷社區技術分享,同時也是 Exadata 用戶組的發起人,組織策劃並作為技術分享者的活動已超過百場。
當微軟認真起來,我們發現一切皆有可能。
雖然在關係型資料庫領域Oracle是當之無愧的王者,但是SQL Server卻也一直排在前三,下圖是5月DB-Engines上的資料庫流行度排行。
在2017年,微軟宣布SQL Server將可以運行在Linux上,擁抱開源讓微軟贏得了很多讚譽,SQL Server 也成為了 2016年 DB-Engines 的年度資料庫,我們也發表過一些文章,回顧參考:SQL Server for Linux 下一版本的公共預覽。
在之前的預覽版中,Public preview of the next release of SQL Server on Linux,Always On Availability Groups 還是不支持的功能,但是在最新的 SQL Server 2017 on Linux 中,該功能已經引入。 讓我們一起了解SQL Server的變化。
在 Always On AG 中如果需要自動 Failover 至少需要集群中有 3 臺伺服器,但是我只是測試功能,因此只使用了兩臺伺服器。並且本文不涉及任何 Pacemaker 的設置,完全是資料庫層面的 AG 配置。
我使用的是 Google Compute Engine 的2臺 VM,最低配的 1vCPU,3.75GB 內存。
如果要通過遠程客戶端配置 SQL Server,則需要在 VPC network 的 Firewall rules 中將 1433 埠開放,如果是在虛擬機本地的 sqlcmd 中操作,則無需配置。
$ cat /etc/centos-release
CentOS Linux release 7.4.1708 (Core)
在 /etc/hosts 中配置雙方伺服器的名稱和IP位址的解析,以保證兩臺機器可以通過伺服器名稱互相訪問。
重要!伺服器主機的 hostname 必須少於等於 15 個字符,否則在配置過程會出現各種莫名其妙的權限報錯。
SQL Server for Linux 的安裝非常簡單,可以參考我之前的這篇文章。
Public preview of the next release of SQL Server on Linux
執行範圍:在所有機器上執行
安裝完的 SQL Server,默認是沒有啟用 AlwaysOn AG 功能的,需要手工開啟,開啟的方法很簡單。開啟該功能需要重啟資料庫實例。
sudo /opt/mssql/bin/mssql-conf set hadr.hadrenabled 1
sudo systemctl restart mssql-server
執行範圍:在所有機器上執行
這一步不是必須的。
ALTER EVENT SESSION AlwaysOn_health ON SERVER WITH (STARTUP_STATE=ON);
執行範圍:在所有機器上執行
CREATE LOGIN dbm_login WITH PASSWORD = 『YourPassword』;
CREATE USER dbm_user FOR LOGIN dbm_login;
執行範圍:在 Primary Replica 機器上執行
CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'YourPassword';
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 = 'YourPassword'
);
將生成的 dbm_certificate.cer 和 dbm_certificate.pvk 文件 scp 到另外一臺伺服器的相同位置並修改屬主,這臺伺服器就是 Secondary Replica。
cd /var/opt/mssql/data
chown mssql:mssql dbm_certificate.*
然後在這臺伺服器上導入認證。
執行範圍:在 Secondary Replica 機器上執行
CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'YourPassword';
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 = 'YourPassword'
);
執行範圍:在所有機器上執行
CREATE ENDPOINT [Hadr_endpoint]
AS TCP (LISTENER_PORT = 5022)
FOR DATA_MIRRORING (
ROLE = ALL,
AUTHENTICATION = CERTIFICATE dbm_certificate,
ENCRYPTION = REQUIRED ALGORITHM AES
);
ALTER ENDPOINT [Hadr_endpoint] STATE = STARTED;
use master
GRANT CONNECT ON ENDPOINT::[Hadr_endpoint] TO [dbm_login];
創建 Availability Groups
執行範圍:在 Primary Replica 機器上執行
CREATE AVAILABILITY GROUP [ag1]
WITH (CLUSTER_TYPE = EXTERNAL)
FOR REPLICA ON
N'centos1' WITH (
ENDPOINT_URL = N'tcp://centos1:5022',
AVAILABILITY_MODE = SYNCHRONOUS_COMMIT,
FAILOVER_MODE = EXTERNAL,
SEEDING_MODE = AUTOMATIC
),
N'centos2' WITH (
ENDPOINT_URL = N'tcp://centos2:5022',
AVAILABILITY_MODE = SYNCHRONOUS_COMMIT,
FAILOVER_MODE = EXTERNAL,
SEEDING_MODE = AUTOMATIC
);
ALTER AVAILABILITY GROUP [ag1] GRANT CREATE ANY DATABASE;
在主庫上創建了 AG 之後,備庫需要加入 AG。
執行範圍:在 Secondary Replica 機器上執行
ALTER AVAILABILITY GROUP [ag1] JOIN WITH (CLUSTER_TYPE = EXTERNAL);
ALTER AVAILABILITY GROUP [ag1] GRANT CREATE ANY DATABASE;
這裡新建一個資料庫 db1,將它加入到 ag1 中。由於上面設置的 SEEDING_MODE 參數為 AUTOMATIC,因此這個 db1 資料庫將會在備庫實例中自動創建,後續對於該庫進行的任何操作也會自動複製到備庫中。
執行範圍:在 Primary Replica 機器上執行
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];
允許 Secondary Replica 可以被只讀訪問
在以上的創建過程中創建出來的 AG 中的備庫是不允許被訪問的,如果要訪問將會遇到以下錯誤。
The target database, 『db1』, is participating in an availability group and is currently not accessible for queries. Either data movement is suspended or the availability replica is not enabled for read access. To allow read-only access to this and other databases in the availability group, enable read access to one or more secondary availability replicas in the group. For more information, see the ALTER AVAILABILITY GROUP statement in SQL Server Books Online.
執行範圍:在 Primary Replica 機器上執行,立刻生效。
use master
ALTER AVAILABILITY GROUP ag1
MODIFY REPLICA ON
N'centos2' WITH (
SECONDARY_ROLE (ALLOW_CONNECTIONS = ALL )
);
在主庫中隨便創建一張新表,再插入幾條記錄。
1> use db1
2> select * into t_test from sys.databases;
3> insert into t_test select * from t_test;
4> GO
Changed database context to 'db1'.
(5 rows affected)
(5 rows affected)
在備庫中查詢,這張表已經複製成功。
1> use db1
2> select count(*) from t_test;
3> GO
Changed database context to 'db1'.
--
10
(1 rows affected)
如果在備庫中嘗試更新數據,將會遇到以下錯誤。
1> delete from t_test;
2> GO
Msg 3906, Level 16, State 2, Server centos2, Line 1
Failed to update database "db1" because the database is read-only.
通過以下這些視圖可以監控 AG 中各個部分的狀態。
group的監控
select * from sys.availability_groups;
select * from sys.availability_groups_cluster;
select * from sys.dm_hadr_availability_group_states;
replica 的監控
select * from sys.availability_replicas;
select * from sys.dm_hadr_availability_replica_states;
select * from sys.dm_hadr_availability_replica_cluster_nodes;
select * from sys.dm_hadr_availability_replica_cluster_states;
在 AG 中的 database 的監控
select * from sys.availability_databases_cluster;
select * from sys.dm_hadr_database_replica_states;
select * from sys.dm_hadr_database_replica_cluster_states;
select name,database_id,replica_id,group_database_id from sys.databases;
參考文檔
本文配置步驟的參考文檔為:
https://docs.microsoft.com/en-us/sql/linux/sql-server-linux-availability-group-configure-ha?view=sql-server-linux-2017
註:詳情請戳原文連結
關注公眾號:數據和雲(OraNews)回復關鍵字獲取
『2017DTC』,2017 DTC 大會 PPT
『DBALIFE』,「DBA 的一天」海報
『DBA04』,DBA 手記4 經典篇章電子書
『RACV1』, RAC 系列課程視頻及 PPT
『122ARCH』,Oracle 12.2 體系結構圖
『2017OOW』,Oracle OpenWorld 資料
『PRELECTION』,大講堂講師課程資料