当前位置:Gxlcms > 数据库问题 > 【alwaysOn】sql server2016 无域控搭建alwayson 【转】

【alwaysOn】sql server2016 无域控搭建alwayson 【转】

时间:2021-07-01 10:21:17 帮助过:32人阅读

  技术图片

 

 

  3.图形化创建会出现问题,导出脚本查看发现脚本不全

  下面是创建AWO的脚本(前提是各个节点已经还原的备份文件)

  注: 以下脚本可以通过SSMS工具切换到SQLCMD模式运行

  技术图片

 

技术图片
  1. --- YOU MUST EXECUTE THE FOLLOWING SCRIPT IN SQLCMD MODE.
  2. :Connect sql16node1
  3. IF (SELECT state FROM sys.endpoints WHERE name = N‘Hadr_endpoint‘) <> 0
  4. BEGIN
  5. ALTER ENDPOINT [Hadr_endpoint] STATE = STARTED
  6. END
  7. GO
  8. use [master]
  9. GO
  10. GRANT CONNECT ON ENDPOINT::[Hadr_endpoint] TO [NT Service\MSSQLSERVER]
  11. GO
  12. :Connect sql16node1
  13. IF EXISTS(SELECT * FROM sys.server_event_sessions WHERE name=‘AlwaysOn_health‘)
  14. BEGIN
  15. ALTER EVENT SESSION [AlwaysOn_health] ON SERVER WITH (STARTUP_STATE=ON);
  16. END
  17. IF NOT EXISTS(SELECT * FROM sys.dm_xe_sessions WHERE name=‘AlwaysOn_health‘)
  18. BEGIN
  19. ALTER EVENT SESSION [AlwaysOn_health] ON SERVER STATE=START;
  20. END
  21. GO
  22. :Connect sql16node2
  23. IF (SELECT state FROM sys.endpoints WHERE name = N‘Hadr_endpoint‘) <> 0
  24. BEGIN
  25. ALTER ENDPOINT [Hadr_endpoint] STATE = STARTED
  26. END
  27. GO
  28. use [master]
  29. GO
  30. GRANT CONNECT ON ENDPOINT::[Hadr_endpoint] TO [NT Service\MSSQLSERVER]
  31. GO
  32. :Connect sql16node2
  33. IF EXISTS(SELECT * FROM sys.server_event_sessions WHERE name=‘AlwaysOn_health‘)
  34. BEGIN
  35. ALTER EVENT SESSION [AlwaysOn_health] ON SERVER WITH (STARTUP_STATE=ON);
  36. END
  37. IF NOT EXISTS(SELECT * FROM sys.dm_xe_sessions WHERE name=‘AlwaysOn_health‘)
  38. BEGIN
  39. ALTER EVENT SESSION [AlwaysOn_health] ON SERVER STATE=START;
  40. END
  41. GO
  42. :Connect sql16node3
  43. IF (SELECT state FROM sys.endpoints WHERE name = N‘Hadr_endpoint‘) <> 0
  44. BEGIN
  45. ALTER ENDPOINT [Hadr_endpoint] STATE = STARTED
  46. END
  47. GO
  48. use [master]
  49. GO
  50. GRANT CONNECT ON ENDPOINT::[Hadr_endpoint] TO [NT Service\MSSQLSERVER]
  51. GO
  52. :Connect sql16node3
  53. IF EXISTS(SELECT * FROM sys.server_event_sessions WHERE name=‘AlwaysOn_health‘)
  54. BEGIN
  55. ALTER EVENT SESSION [AlwaysOn_health] ON SERVER WITH (STARTUP_STATE=ON);
  56. END
  57. IF NOT EXISTS(SELECT * FROM sys.dm_xe_sessions WHERE name=‘AlwaysOn_health‘)
  58. BEGIN
  59. ALTER EVENT SESSION [AlwaysOn_health] ON SERVER STATE=START;
  60. END
  61. GO
  62. :Connect sql16node1
  63. USE [master]
  64. GO
  65. CREATE AVAILABILITY GROUP [KK_AG_2016]
  66. WITH (AUTOMATED_BACKUP_PREFERENCE = SECONDARY,
  67. DB_FAILOVER = OFF,
  68. DTC_SUPPORT = NONE)
  69. FOR DATABASE [AWO_2016]
  70. 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)),
  71. N‘SQL16NODE2‘ WITH (ENDPOINT_URL = N‘TCP://SQL16NODE2:5022‘, FAILOVER_MODE = AUTOMATIC, AVAILABILITY_MODE = SYNCHRONOUS_COMMIT, BACKUP_PRIORITY = 50, SECONDARY_ROLE(ALLOW_CONNECTIONS = ALL)),
  72. N‘SQL16NODE3‘ WITH (ENDPOINT_URL = N‘TCP://SQL16NODE3:5022‘, FAILOVER_MODE = AUTOMATIC, AVAILABILITY_MODE = SYNCHRONOUS_COMMIT, BACKUP_PRIORITY = 50, SECONDARY_ROLE(ALLOW_CONNECTIONS = ALL));
  73. GO
  74. ------------这部分代码是图形化工具中缺失的步骤<br>
  75. :Connect sql16node2
  76. ALTER AVAILABILITY GROUP [KK_AG_2016] JOIN;
  77. GO
  78. ALTER DATABASE [AWO_2016] SET HADR AVAILABILITY GROUP = [KK_AG_2016];
  79. GO
  80. :Connect sql16node3
  81. ALTER AVAILABILITY GROUP [KK_AG_2016] JOIN;
  82. GO
  83. ALTER DATABASE [AWO_2016] SET HADR AVAILABILITY GROUP = [KK_AG_2016];
  84. GO<br><br><br>
技术图片

 

创建监听

技术图片
  1. :Connect sql16node1
  2. USE [master]
  3. GO
  4. ALTER AVAILABILITY GROUP [KK_AG_2016]
  5. ADD LISTENER N‘L_KK_AWO2016‘ (
  6. WITH IP
  7. ((N‘192.168.3.121‘, N‘255.255.255.0‘)
  8. )
  9. , PORT=8000);
  10. GO
技术图片

 

测试

高可用测试

  简单的看起来与之前没有什么差别,依然依赖故障转移群集,仲裁的的方式与2012R2基本相同,可以使用仲裁磁盘、仲裁文件夹或动态节点投票(偶数个节点依然会动态分配投票权),值得关注的是在windows2016的集群中添加了云仲裁,这个云端配置先不说,真是对于之前配置的跨机房的集群的福音。

技术图片

 

负载均衡测试

配置负载均衡(此处只是简单的做了一下主节点的负载)

技术图片
  1. alter availability group kk_ag_2016
  2. modify replica on ‘sql16node1‘
  3. with
  4. (
  5. primary_role
  6. (
  7. read_only_routing_list = ((‘sql16node2‘,‘sql16node3‘),‘sql16node1‘)
  8. )
  9. )
  10. alter availability group kk_ag_2016
  11. modify replica on N‘sql16node1‘
  12. with
  13. (
  14. secondary_role (read_only_routing_url = N‘tcp://sql16node1.kk.com:1433‘)
  15. )
  16. go
  17. alter availability group kk_ag_2016
  18. modify replica on N‘sql16node2‘
  19. with
  20. (
  21. secondary_role (read_only_routing_url = N‘tcp://sql16node2.kk.com:1433‘)
  22. )
  23. go
  24. alter availability group kk_ag_2016
  25. modify replica on N‘sql16node3‘
  26. with
  27. (
  28. secondary_role (read_only_routing_url = N‘tcp://sql16node3.kk.com:1433‘)
  29. )
  30. go
技术图片

 

  测试的例子比较简单,也没使用什么压力工具就直接用SSMS管理工具。

  使用监听名称连接或监听IP加端口

  技术图片

  另外必须在连接参数中指定ApplicationIntent=ReadOnly

  技术图片

 

  开了5个窗口执行语句:

  技术图片

 

  使用profiler抓取结果

  技术图片

 

  技术图片

 

  只是看看能不能负载均衡,咋一看微软还真没骗人。但是要了解这只是只读副本的负载,而不是写入也可以负载!

  另外要注意AlwaysOn的数据同步是有时间延迟的(就算是同步模式)!这点可以参见我另一篇的测试:AlwaysOn 同步时间的测试

 

--------------博客地址------------------------------------------------------------------------------

人气教程排行