SQL SERVER 2016 AlwaysOn 無域叢集+負載均衡搭建與簡測
之前和很多群友聊天發現對2016的無域和負載均衡滿心期待,畢竟可以簡單搭建而且可以不適用第三方負載均衡器,SQL自己可以負載了。windows2016已經可以下載使用了,那麼這回終於可以揭開令人憧憬嚮往的AlwaysOn2016 負載均衡叢集的神祕面紗了。
本篇主要描述個人叢集搭建中遇到的坑和一些注意事項,以及2016無域負載均衡的簡單體驗測試。
搭建體驗
基礎環境
想要不使用域環境來搭建AlwaysON 必須使用windows 2016 和sql server2016
本篇我使用3臺虛擬機器(主要是為了測試負載均衡,否則2臺就可以),為了搭建的純潔性,我3臺機器都是獨立安裝,沒有使用虛機複製。
主機名 | IP地址 |
sql16node1 | 192.168.3.113 |
sql16node2 | 192.168.3.114 |
sql16node3 | 192.168.3.115 |
sqlcluster2016(windows叢集) | 192.168.3.120 |
L_KK_AWO2016(AlwaysOn監聽) | 192.168.3.121 |
16作業系統介質 |
ed2k://|file|cn_windows_server_2016_x64_dvd_9327743.iso|6020876288|58F585A340248EF7603A48F832F08B6D|/ |
SQL16介質 |
ed2k://|file|cn_sql_server_2016_enterprise_x64_dvd_8699450.iso|2452795392|D8AFD8D6245F518F53F720C48E2819C0|/ |
遇到的問題
整體的系統,故障轉移叢集,AlwaysOn搭建都和2012和2014沒有太大差別,所以這裡只介紹幾個搭建時的特殊注意點。
1.因為沒有域所以需要在”計算機屬性“新增計算機的DNS字尾。
2.需要做域名解析(域名解析執行——>drivers,每個節點都需要配置)
3.圖形化建立會出現問題,匯出指令碼檢視發現指令碼不全
下面是建立AWO的指令碼(前提是各個節點已經還原的備份檔案)
注: 以下指令碼可以通過SSMS工具切換到SQLCMD模式執行
--- YOU MUST EXECUTE THE FOLLOWING SCRIPT IN SQLCMD MODE. :Connect sql16node1 IF (SELECT state FROM sys.endpoints WHERE name = N'Hadr_endpoint') <> 0 BEGIN ALTER ENDPOINT [Hadr_endpoint] STATE = STARTED END GO use [master] GO GRANT CONNECT ON ENDPOINT::[Hadr_endpoint] TO [NT Service\MSSQLSERVER] GO :Connect sql16node1 IF EXISTS(SELECT * FROM sys.server_event_sessions WHERE name='AlwaysOn_health') BEGIN ALTER EVENT SESSION [AlwaysOn_health] ON SERVER WITH (STARTUP_STATE=ON); END IF NOT EXISTS(SELECT * FROM sys.dm_xe_sessions WHERE name='AlwaysOn_health') BEGIN ALTER EVENT SESSION [AlwaysOn_health] ON SERVER STATE=START; END GO :Connect sql16node2 IF (SELECT state FROM sys.endpoints WHERE name = N'Hadr_endpoint') <> 0 BEGIN ALTER ENDPOINT [Hadr_endpoint] STATE = STARTED END GO use [master] GO GRANT CONNECT ON ENDPOINT::[Hadr_endpoint] TO [NT Service\MSSQLSERVER] GO :Connect sql16node2 IF EXISTS(SELECT * FROM sys.server_event_sessions WHERE name='AlwaysOn_health') BEGIN ALTER EVENT SESSION [AlwaysOn_health] ON SERVER WITH (STARTUP_STATE=ON); END IF NOT EXISTS(SELECT * FROM sys.dm_xe_sessions WHERE name='AlwaysOn_health') BEGIN ALTER EVENT SESSION [AlwaysOn_health] ON SERVER STATE=START; END GO :Connect sql16node3 IF (SELECT state FROM sys.endpoints WHERE name = N'Hadr_endpoint') <> 0 BEGIN ALTER ENDPOINT [Hadr_endpoint] STATE = STARTED END GO use [master] GO GRANT CONNECT ON ENDPOINT::[Hadr_endpoint] TO [NT Service\MSSQLSERVER] GO :Connect sql16node3 IF EXISTS(SELECT * FROM sys.server_event_sessions WHERE name='AlwaysOn_health') BEGIN ALTER EVENT SESSION [AlwaysOn_health] ON SERVER WITH (STARTUP_STATE=ON); END IF NOT EXISTS(SELECT * FROM sys.dm_xe_sessions WHERE name='AlwaysOn_health') BEGIN ALTER EVENT SESSION [AlwaysOn_health] ON SERVER STATE=START; END GO :Connect sql16node1 USE [master] GO CREATE AVAILABILITY GROUP [KK_AG_2016] WITH (AUTOMATED_BACKUP_PREFERENCE = SECONDARY, DB_FAILOVER = OFF, DTC_SUPPORT = NONE) FOR DATABASE [AWO_2016] REPLICA ON N'SQL16NODE1' WITH (ENDPOINT_URL = N'TCP://SQL16NODE1:5022', FAILOVER_MODE = AUTOMATIC, AVAILABILITY_MODE = SYNCHRONOUS_COMMIT, BACKUP_PRIORITY = 50, SECONDARY_ROLE(ALLOW_CONNECTIONS = ALL)), N'SQL16NODE2' WITH (ENDPOINT_URL = N'TCP://SQL16NODE2:5022', FAILOVER_MODE = AUTOMATIC, AVAILABILITY_MODE = SYNCHRONOUS_COMMIT, BACKUP_PRIORITY = 50, SECONDARY_ROLE(ALLOW_CONNECTIONS = ALL)), N'SQL16NODE3' WITH (ENDPOINT_URL = N'TCP://SQL16NODE3:5022', FAILOVER_MODE = AUTOMATIC, AVAILABILITY_MODE = SYNCHRONOUS_COMMIT, BACKUP_PRIORITY = 50, SECONDARY_ROLE(ALLOW_CONNECTIONS = ALL)); GO ------------這部分程式碼是圖形化工具中缺失的步驟
:Connect sql16node2 ALTER AVAILABILITY GROUP [KK_AG_2016] JOIN; GO ALTER DATABASE [AWO_2016] SET HADR AVAILABILITY GROUP = [KK_AG_2016]; GO :Connect sql16node3 ALTER AVAILABILITY GROUP [KK_AG_2016] JOIN; GO ALTER DATABASE [AWO_2016] SET HADR AVAILABILITY GROUP = [KK_AG_2016]; GO
建立監聽
:Connect sql16node1 USE [master] GO ALTER AVAILABILITY GROUP [KK_AG_2016] ADD LISTENER N'L_KK_AWO2016' ( WITH IP ((N'192.168.3.121', N'255.255.255.0') ) , PORT=8000); GO
測試
高可用測試
簡單的看起來與之前沒有什麼差別,依然依賴故障轉移群集,仲裁的的方式與2012R2基本相同,可以使用仲裁磁碟、仲裁資料夾或動態節點投票(偶數個節點依然會動態分配投票權),值得關注的是在windows2016的叢集中添加了雲仲裁,這個雲端配置先不說,真是對於之前配置的跨機房的叢集的福音。
負載均衡測試
配置負載均衡(此處只是簡單的做了一下主節點的負載)
alter availability group kk_ag_2016 modify replica on 'sql16node1' with ( primary_role ( read_only_routing_list = (('sql16node2','sql16node3'),'sql16node1') ) ) alter availability group kk_ag_2016 modify replica on N'sql16node1' with ( secondary_role (read_only_routing_url = N'tcp://sql16node1.kk.com:1433') ) go alter availability group kk_ag_2016 modify replica on N'sql16node2' with ( secondary_role (read_only_routing_url = N'tcp://sql16node2.kk.com:1433') ) go alter availability group kk_ag_2016 modify replica on N'sql16node3' with ( secondary_role (read_only_routing_url = N'tcp://sql16node3.kk.com:1433') ) go
測試的例子比較簡單,也沒使用什麼壓力工具就直接用SSMS管理工具。
使用監聽名稱連線或監聽IP加埠
另外必須在連線引數中指定ApplicationIntent=ReadOnly
開了5個視窗執行語句:
使用profiler抓取結果
只是看看能不能負載均衡,咋一看微軟還真沒騙人。但是要了解這只是只讀副本的負載,而不是寫入也可以負載!
另外要注意AlwaysOn的資料同步是有時間延遲的(就算是同步模式)!這點可以參見我另一篇的測試:AlwaysOn 同步時間的測試
--------------部落格地址------------------------------------------------------------------------------
如有轉載請保留原文地址!
-----------------------------------------------------------------------------------------------------
總結 : 文章只是簡單的搭建和測試了一下沒有做深入的研究,也許會給有興趣瞭解2016AlwaysOn叢集的朋友一點幫助吧,尤其是搭建過程,網上找到的基本都是英文文件,對於我這種看見鷹就發觸的選手,也算是一點福音吧。
2016的AlwaysOn可用組不需要域環境,可以負載均衡,還真的是有不小的吸引力。