SQL Server複製狀況下的高可用方案(一)鏡像+複製

數據庫鏡像能夠與事務複製一塊兒使用實現數據庫總體的高可用性和高性能,其中鏡像能夠提供故障檢測和故障轉移,複製則用於實現讀寫分離。
數據庫鏡像涉及一個數據庫的兩個副本,這兩個副本一般駐留在不一樣的計算機上。 在任何給定時間都只有一個數據庫副本可供客戶端使用。 該副本稱爲主體數據庫。 客戶端對主體數據庫所作的更新應用到數據庫的另外一副本(稱爲鏡像數據庫)。 鏡像涉及將在主體數據庫上執行的每一個插入、更新或刪除操做的事務日誌應用到鏡像數據庫上。
複製將數據和數據庫對象從一個數據庫複製和分發到另外一個數據庫,而後在數據庫之間進行同步以保持一致性。
主體數據庫和鏡像數據庫必須共享分發服務器
主體數據庫/發佈數據庫:10.86.3.100,機器名WIN-3-100
鏡像數據庫:10.86.3.101,機器名WIN-3-101
分發數據庫:10.86.3.102,機器名WIN-3-102
訂閱數據庫1:10.86.3.103,機器名WIN-3-103
數據庫名稱mydb,端口都是1433
鏡像配置的驗證方式採用證書驗證
步驟1:配置鏡像
  • 經過備份方式準備鏡像數據庫
在主體數據庫上建立完整備份和日誌備份,官方文檔指出,須要至少一個日誌備份:
BACKUP DATABASE [mydb] TO DISK = N'D:\backup\mydb.bak' WITH NOFORMAT, NOINIT,  NAME = N'mydb-完整數據庫備份 ', SKIP, NOREWIND, NOUNLOAD,  STATS = 10
GO
BACKUP LOG [mydb] TO  DISK = N'D:\backup\mydb.trn' WITH NOFORMAT, NOINIT,  NAME = N'mydb-事務日誌 備份' , SKIP , NOREWIND , NOUNLOAD ,  STATS = 10
GO

將備份拷貝到鏡像服務器上,在鏡像服務器上恢復備份,須要指定RESTORE WITH NORECOVERY數據庫

RESTORE DATABASE [mydb] FROM  DISK = N'D:\backup\mydb.bak' WITH   FILE = 1,  NORECOVERY ,  NOUNLOAD ,  STATS = 10
GO
RESTORE LOG [mydb] FROM  DISK = N'D:\backup\mydb.trn' WITH   FILE = 1,   NORECOVERY,  NOUNLOAD,  STATS = 10
GO
  • 配置出站鏈接和證書

主體數據庫配置以下:安全

--建立密鑰
CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'password'
SELECT * FROM sys.symmetric_keys
--建立證書
CREATE CERTIFICATE cert_3_100
   WITH SUBJECT = 'HOST_A certificate for database mirroring',
   EXPIRY_DATE = '1/1/2020'
SELECT * FROM sys.certificates ;
--建立端點
CREATE ENDPOINT master_instance
   STATE = STARTED
   AS TCP (
      LISTENER_PORT=5022
      , LISTENER_IP = ALL
   )
   FOR DATABASE_MIRRORING (
      AUTHENTICATION = CERTIFICATE cert_3_100
      , ENCRYPTION = REQUIRED ALGORITHM AES
      , ROLE = ALL
   )
SELECT name , role_desc , state_desc , connection_auth_desc , encryption_algorithm_desc
   FROM sys.database_mirroring_endpoints
--備份證書到其餘系統
BACKUP CERTIFICATE cert_3_101 TO FILE = 'd:\cert_3_100.cer';
GO  

鏡像數據庫配置以下:服務器

--建立密鑰
CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'password'
SELECT * FROM sys.symmetric_keys
--建立證書
CREATE CERTIFICATE cert_3_101
   WITH SUBJECT = 'HOST_A certificate for database mirroring',
   EXPIRY_DATE = '1/1/2020'
SELECT * FROM sys.certificates ;
--建立端點
CREATE ENDPOINT backup_instance
   STATE = STARTED
   AS TCP (
      LISTENER_PORT=5022
      , LISTENER_IP = ALL
   )
   FOR DATABASE_MIRRORING (
      AUTHENTICATION = CERTIFICATE cert_3_101
      , ENCRYPTION = REQUIRED ALGORITHM AES
      , ROLE = ALL
   )
SELECT name , role_desc , state_desc , connection_auth_desc , encryption_algorithm_desc
   FROM sys.database_mirroring_endpoints
--備份證書到其餘系統
BACKUP CERTIFICATE cert_3_101 TO FILE = 'd:\cert_3_101.cer';
GO
  • 配置入站鏈接和證書

主體數據庫配置以下:性能

USE master
--爲其餘系統建立登陸名
CREATE LOGIN login_3_101 WITH PASSWORD = 'password';
SELECT * FROM sys.server_principals
--建立一個使用該登陸名的用戶
CREATE USER user_3_101 FOR LOGIN login_3_101
SELECT * FROM sys.sysusers
--將證書與用戶關聯,並將鏡像庫生成的證書文件放到指定目錄中
CREATE CERTIFICATE cert_3_101
   AUTHORIZATION user_3_101
   FROM FILE = 'd:\cert_3_101.cer'
SELECT * FROM sys.certificates
--受權對遠程鏡像端點的登陸名的 CONNECT權限,受權完成後,完成對登陸到所需的證書身份驗證的設置
GRANT CONNECT ON ENDPOINT::master_instance TO login_3_101

鏡像數據庫配置以下:測試

USE master
--爲其餘系統建立登陸名
CREATE LOGIN login_3_100 WITH PASSWORD = 'password';
SELECT * FROM sys.server_principals
--建立一個使用該登陸名的用戶,並將主體庫生成的證書文件放到指定目錄中
CREATE USER user_3_100 FOR LOGIN login_3_100
SELECT * FROM sys.sysusers
--將證書與用戶關聯
CREATE CERTIFICATE cert_3_100
   AUTHORIZATION user_3_100
   FROM FILE = 'd:\cert_3_100.cer'
SELECT * FROM sys.certificates
--受權對遠程鏡像端點的登陸名的 CONNECT權限,受權完成後,完成對登陸到所需的證書身份驗證的設置
GRANT CONNECT ON ENDPOINT::backup_instance TO login_3_100
  • 配置鏡像

選擇主體數據庫mydb數據庫對象右鍵->任務->鏡像->配置安全性spa

由於要採用高性能方式,因此不須要見證服務器3d

 

當同步完成後,主體數據庫會顯示「(主體,已同步)」,鏡像數據庫會顯示(已同步,正在還原)代理

步驟2:配置分發服務器日誌

  • 在發佈服務器、分發服務器和訂閱服務器配置hosts文件,加入以下配置:
10.86.3.101    WIN-3-101
10.86.3.102    WIN-3-102
10.86.3.103    WIN-3-103
10.86.3.104    WIN-3-104
  • 將10.86.3.102配置成分發服務器,分發數據庫的快照文件建議配置相應的訪問權限,由於個人帳戶有訪問權限,因此略去這步
在分發服務器上,選擇複製->配置分發,按照下圖操做:

點擊添加code

 

剩下的就直接下一步,直到完成便可
  • 在分發服務器屬性對話框中啓用發佈服務器
在分發服務器複製選項->分發服務器屬性->發佈服務器,點擊添加按鈕,選擇發佈服務器WIN-3-100,在彈出須要設置管理連接密碼的對話框中,輸入管理連接的密碼

  • 在主體數據庫(發佈數據庫)和鏡像數據庫中指定分發數據庫
首先在WIN-3-100上配置,在複製功能上右鍵->配置分發,按照圖中指示配置,選擇"使用如下服務器做爲分發服務器",點擊添加按鈕,選擇WIN-3-102做爲分發服務器

輸入管理密碼與步驟3中配置的管理連接密碼一致
 
下一步,直至完成。而後如法炮製,在鏡像服務器中將WIN-3-102配置爲分發服務器,指向同一分發數據庫和快照文件
 
步驟3配置發佈服務器
選擇複製->本地發佈->新建發佈,按照以下步驟操做

若是要發佈的數據庫很是大,建議選擇業務空閒期進行初始化快照

 

配置用於故障轉移的複製代理(快照代理和日誌讀取代理)
啓動複製監視器,選擇發佈服務器,選擇快照代理,右鍵代理配置,選擇代理配置文件

輸入代理名稱,取消勾選「僅顯示次配置文件中使用的參數」,指定 –PublisherFailoverPartner 代理參數的鏡像名稱WIN-3-100

 

按照上述方法,設置日誌讀取器代理,指定–PublisherFailoverPartner 代理參數的鏡像名稱WIN-3-100
建立完成以後還有關鍵的一步,就是在主體和鏡像服務器上執行 DBCC TRACEON(1448,-1),若是能夠重啓最好加入到實例的啓動參數中去。若是不設置該參數,會報復制的事務正等待下一第二天志備份或等待鏡像夥伴更新
 
步驟4配置訂閱服務器
在訂閱服務器中(WIN-3-103)中創建訂閱複製,選擇複製->本地訂閱(右鍵)->新建訂閱

步驟5測試
鏈接發佈庫,向測試表中插入數據並查詢
USE mydb
INSERT INTO Admin( user_name) VALUES('master' )
SELECT * FROM admin WHERE user_name='master'

鏈接訂閱庫,查詢插入數據

USE mydb
SELECT * FROM admin WHERE user_name='master'

故障切換:
中止主體數據庫服務,過一會在鏡像庫執行強制接收
use master ;
alter database mydb set partner FORCE_SERVICE_ALLOW_DATA_LOSS; --強制接收
切換成功後,新的主體數據庫顯示‘主體,已斷開鏈接’
在新的主體服務器執行:
USE mydb
INSERT INTO Admin( user_name) VALUES('mirror' )
SELECT * FROM admin WHERE user_name='mirror'

在訂閱服務器查看:

USE mydb
SELECT * FROM admin WHERE user_name='mirror'
測試成功(測試成功的圖竟然忘記截了。。。)
當宕機的原主體數據庫鏈接上來後,如今的主體數據庫狀態由「主體,已斷開」變成「主體,掛起」,此時須要在現主體數據庫上執行恢復操做,主體數據庫狀態變爲「主體,已同步」
use master ;
alter database mydb set partner resume;
相關文章
相關標籤/搜索