切换导航
{{systemName}}
{{ info.Title }}
{{info.Title}}
{{ menu.Title }}
{{menu.Title}}
登录
|
退出
搜索
数据库集群 SQLserver AlwaysOn部署
作者:ych
### AlwaysOn核心价值 1、在故障转移群集基础上完成部署 2、读写分离,支持负载均衡 3、最多3个写入节点实现故障转移 4、最多三个数据实时同步节点 5、SqlServer 2012 支持1+4 部署 6、SqlServer 2016 支持1+8 部署 ### 为何没有2008 SQL Server 2012的新功能,特别是always on技术、列存储索引技术、商业智能等。在老版本数据库中没有这一项功能。 ### 搭建带域的AlwaysOn #### 服务器规划 1、多个Windows服务器节点 2、节点必须要在同一个域 3、AlwaysOn部署必须在Windows故障转移群集中完成 4、需要准备的目标环境,且都在同一个域 主机名|主机地址|作用|备注 -|-|-|-|- jyw-dc|192.168.12.110|dc域节点| jyw-node1|192.168.12.112|副本1| jyw-node2|192.168.12.113|副本2| jyw-node3|192.168.12.114|副本3| 密码都使用: ``` xm^BBA666 ``` #### 配置域 ip改为使用静态ip保证一致性。 dc域节点需要安装dc和dns 设置域名:jiyuwu.com ``` xm^BBA666 ``` 将dns副本节点改为dc域节点地址 给计算机设置域并使用(JIYUWU\administrator)域账户登录。 在配置域安装共享磁盘(选两个)ISCSI(cluster)->mycluster->设置各副本到白名单 之后各个节点的ISCSI进行发起连接。 磁盘管理最初要先格式化一下,如果是脱机需要进行一下联机(GPT)。 #### 各副本配置故障转移群集 验证群集->输入(jyw-node1,jyw-node2,jyw-node3) 安装故障转移群集(jywcluster)(使用一个没有使用的地址) (虚拟机需要配置双网卡,网络选择仅本机) 然后设置管理群集访问点。 #### 配置副本登录 sqlserver服务配置域登录 #### 设置文件共享 数据库要先创建一个库 这个共享文件必须有一个完整备份(everyone) 之后设置AlwaysON指定可用性组(jywAlwaysON) 选择数据同步首选项(完整的数据库或日志) #### 添加可用性监听器 jywAlwaysONMinitor,1433(默认),使用静态ip(使用一个没有使用的地址) ### 搭建无域的AlwaysOn #### 服务器规划 1、多个Windows服务器节点 2、节点必须要可以相互访问 3、AlwaysOn部署必须在Windows故障转移群集中完成 4、需要准备相同目标环境并配置证书 主机名|主机地址|作用|备注 -|-|-|-|- jyw-node1|192.168.137.145|副本1| jyw-node2|192.168.137.147|副本2| jyw-node3|192.168.137.141|副本3| ``` IPv4 地址 . . . . . . . . . . . . : 192.168.137.147 子网掩码 . . . . . . . . . . . . : 255.255.255.0 默认网关. . . . . . . . . . . . . : 192.168.137.2 DNS. . . . . . . . . . . . . . . :192.168.137.180 ``` 修改计算机名称(dns后缀要一致:jiyuwu.com) 密码都使用: ``` xm^BBA666 ``` #### 配置故障转移集群 安装一下,然后配置一个没有使用的静态ip地址。 #### 配置dns 高级部分等 ``` C:\Windows\System32\drivers\etc ``` ``` 192.168.137.145 jyw-node1 192.168.137.145 jyw-node1.jiyuwu.com 192.168.137.147 jyw-node2 192.168.137.147 jyw-node2.jiyuwu.com 192.168.137.141 jyw-node3 192.168.137.141 jyw-node3.jiyuwu.com 192.168.137.180 cluster 192.168.137.180 cluster.jiyuwu.com 192.168.137.181 listener 192.168.137.181 listener.jiyuwu.com ``` ping ``` PING 192.168.137.147 PING jyw-node2 PING jyw-node2.jiyuwu.com ``` #### 各副本配置故障转移群集 验证群集->输入(jyw-node1.jiyuwu.com,jyw-node2.jiyuwu.com,jyw-node3.jiyuwu.com) 安装故障转移群集(cluster)(192.168.137.180) (虚拟机需要配置双网卡,网络选择仅本机) 然后设置管理群集访问点。 #### 配置副本登录 sqlserver服务登录(.\Administrator)和alwaysON 数据库使用jyw-node1,jyw-node2,jyw-node3登录。 #### 设置文件共享 ##### 证书共享 \\JYW-NODE1\SQLAlwaysOnShare 既然节点没有加入域,那么就不能用域认证,只能用证书认证,因此需要在每个节点的数据库中创建其他节点的数据库证书。(请留意我连接数据库的账户,在创建端口的代码中有用到) 因此在配置可用性组前先在各节点配置证书认证信任。 分别在两个节点数据库上创建证书,并且彼此还原对方的证书,SQL代码如下: ``` ------------------------节点1执行 ------------------------ USE [master] GO --创建证书 CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'jiyuwu@123456' GO CREATE CERTIFICATE cert_node1 --证书名称 WITH SUBJECT='alwayson node1 local certificate', --主题 EXPIRY_DATE='9999-12-31' --有效时间 GO --备份证书到创建的指定文件夹中 BACKUP CERTIFICATE cert_node1 TO FILE='\\JYW-NODE1\SQLAlwaysOnShare\cert_node1.cer' GO --使用指定的证书,创建镜像端点 CREATE ENDPOINT [SQLAG_Endpoint] --镜像名称 STATE=STARTED AS TCP (LISTENER_PORT = 5022, LISTENER_IP = ALL) FOR DATA_MIRRORING (ROLE = ALL,AUTHENTICATION = CERTIFICATE cert_node1, --证书名称 ENCRYPTION = REQUIRED ALGORITHM AES) GO ``` ``` ------------------------节点2执行 ------------------------ USE [master] GO --创建证书 CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'jiyuwu@123456' GO CREATE CERTIFICATE cert_node2 --证书名称 WITH SUBJECT='alwayson node2 local certificate', --主题 EXPIRY_DATE='9999-12-31' --有效时间 GO --备份证书到创建的指定文件夹中 BACKUP CERTIFICATE cert_node2 TO FILE='\\JYW-NODE1\SQLAlwaysOnShare\cert_node2.cer' GO --使用指定的证书,创建镜像端点 CREATE ENDPOINT [SQLAG_Endpoint] --镜像名称 STATE=STARTED AS TCP (LISTENER_PORT = 5022, LISTENER_IP = ALL) FOR DATA_MIRRORING (ROLE = ALL,AUTHENTICATION = CERTIFICATE cert_node2, --证书名称 ENCRYPTION = REQUIRED ALGORITHM AES) GO ``` ``` ------------------------节点3执行 ------------------------ USE [master] GO --创建证书 CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'jiyuwu@123456' GO CREATE CERTIFICATE cert_node3 --证书名称 WITH SUBJECT='alwayson node3 local certificate', --主题 EXPIRY_DATE='9999-12-31' --有效时间 GO --备份证书到创建的指定文件夹中 BACKUP CERTIFICATE cert_node3 TO FILE='\\JYW-NODE1\SQLAlwaysOnShare\cert_node3.cer' GO --使用指定的证书,创建镜像端点 CREATE ENDPOINT [SQLAG_Endpoint] --镜像名称 STATE=STARTED AS TCP (LISTENER_PORT = 5022, LISTENER_IP = ALL) FOR DATA_MIRRORING (ROLE = ALL,AUTHENTICATION = CERTIFICATE cert_node3, --证书名称 ENCRYPTION = REQUIRED ALGORITHM AES) GO ``` >注:我是在节点1上用administrator登录服务器,使用Windows身份登录SQL Server。在节点2上也是用administrator登录服务器,使用Windows身份登录SQL Server 执行证书 ``` --节点一上执行:创建节点二和三的证书 USE master; GO CREATE CERTIFICATE cert_node2 FROM FILE = '\\JYW-NODE1\SQLAlwaysOnShare\cert_node2.cer'; GO CREATE CERTIFICATE cert_node3 FROM FILE = '\\JYW-NODE1\SQLAlwaysOnShare\cert_node3.cer'; GO --节点二上执行:创建节点一和三的证书 USE master; GO CREATE CERTIFICATE cert_node1 FROM FILE = '\\JYW-NODE1\SQLAlwaysOnShare\cert_node1.cer'; GO CREATE CERTIFICATE cert_node3 FROM FILE = '\\JYW-NODE1\SQLAlwaysOnShare\cert_node3.cer'; GO --节点三上执行:创建节点一和二的证书 USE master; GO CREATE CERTIFICATE cert_node1 FROM FILE = '\\JYW-NODE1\SQLAlwaysOnShare\cert_node1.cer'; GO CREATE CERTIFICATE cert_node2 FROM FILE = '\\JYW-NODE1\SQLAlwaysOnShare\cert_node2.cer'; GO ``` ##### 库共享 数据库要先创建一个库 这个共享文件必须有一个完整备份(everyone) 之后设置AlwaysON指定可用性组(jywAlwaysON) 选择数据同步首选项(完整的数据库或日志) #### 添加可用性监听器 listener,1433(默认),使用静态ip(使用一个没有使用的地址)192.168.137.181 无法连接可以设置下sa账号。 ``` 1.域内使用监听:192.168.137.181(ApplicationIntent=ReadOnly:找只读节点),不加找主节点。(域外加ApplicationIntent=ReadOnly直接报错,因为找不到对应ip下的数据库) 2.域外使用集群:192.168.137.180(ApplicationIntent=ReadOnly:找只读节点),不加这个链接无效。 3.非集群ApplicationIntent=ReadOnly添加后不会影响链接。 ``` 报错:在与 SQL Server 建立连接时出现与网络相关的或特定于实例的错误。未找到或无法访问服务器。请验证实例名称是否正确并且 SQL Server 已配置为允许远程连接。 (provider: TCP Provider, error: 0 - 等待的操作过时。) 在非标准域环境或复杂的混合网络中: >路由 URL (READ_ONLY_ROUTING_URL):永远建议写 IP 地址 ##### 解决方案 原因找到了,外部找不到对应的节点,可以直接设置对应的ip解决上面无法登录问题。 方案一:直接使用实例对应的只读路由ip解决  方案二:在每个需要使用数据库的PC设置hosts,帮助其进行解析链接对应的数据库服务器。 C:\Windows\System32\drivers\etc ``` 192.168.50.147 node1.jiyuwu.com 192.168.50.147 node1 192.168.50.251 node2.jiyuwu.com 192.168.50.251 node2 ``` #### 实现切换秘钥 ``` ---------------主 USE master; GO -- 1. 安全清理:删除旧的、配置错误的端点 (不影响业务,只影响同步) IF EXISTS (SELECT * FROM sys.database_mirroring_endpoints) DROP ENDPOINT [SQLAG_Endpoint]; GO -- 2. 创建主密钥 (如果已有,忽略报错) IF NOT EXISTS (SELECT * FROM sys.symmetric_keys WHERE name = '##MS_DatabaseMasterKey##') CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'MyStrongPassword@2025'; -- 【密码1】 GO -- 3. 创建全新的证书 (有效期设为 9999 年) -- 删除证书 DROP CERTIFICATE [cert_node1]; DROP CERTIFICATE [cert_node2]; CREATE CERTIFICATE cert_node1 WITH SUBJECT = 'alwayson node1 local certificate', EXPIRY_DATE = '9999-12-31'; GO -- 4. 重建正确的端点 (指定使用证书验证) CREATE ENDPOINT [SQLAG_Endpoint] STATE = STARTED AS TCP (LISTENER_PORT = 5022) FOR DATABASE_MIRRORING ( AUTHENTICATION = CERTIFICATE cert_node1, -- 绑定上面创建的新证书 ENCRYPTION = REQUIRED ALGORITHM AES, ROLE = ALL ); GO -- 5. 导出证书 (存到 C 盘 Backup 目录,请确保目录存在) -- 这一步会生成文件,一会要考给副本 BACKUP CERTIFICATE cert_node1 TO FILE = 'C:\SQLAlwaysOnShare\cert_node1.cer'; GO ----辅库 USE master; GO -- 1. 安全清理 IF EXISTS (SELECT * FROM sys.database_mirroring_endpoints) DROP ENDPOINT [SQLAG_Endpoint]; GO -- 2. 创建主密钥 IF NOT EXISTS (SELECT * FROM sys.symmetric_keys WHERE name = '##MS_DatabaseMasterKey##') CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'MyStrongPassword@2025'; GO -- 3. 创建全新的证书 -- 删除证书 DROP CERTIFICATE [cert_node1]; DROP CERTIFICATE [cert_node2]; CREATE CERTIFICATE cert_node2 WITH SUBJECT = 'alwayson node2 local certificate', EXPIRY_DATE = '9999-12-31'; GO -- 4. 重建端点 CREATE ENDPOINT [SQLAG_Endpoint] STATE = STARTED AS TCP (LISTENER_PORT = 5022) FOR DATABASE_MIRRORING ( AUTHENTICATION = CERTIFICATE cert_node2, ENCRYPTION = REQUIRED ALGORITHM AES, ROLE = ALL ); GO -- 5. 导出证书 BACKUP CERTIFICATE cert_node2 TO FILE = 'C:\SQLAlwaysOnShare\cert_node2.cer'; GO 拷贝证书 ---主库 USE master; GO -- 导入副本发来的证书 CREATE CERTIFICATE cert_node2 FROM FILE = 'C:\SQLAlwaysOnShare\cert_node2.cer'; GO ---辅库 USE master; GO -- 导入主库发来的证书 CREATE CERTIFICATE cert_node1 FROM FILE = 'C:\SQLAlwaysOnShare\cert_node1.cer'; GO --- 重启辅库服务,加入再次AG,这个有可能不需要执行 ALTER AVAILABILITY GROUP [jywAlwaysON] JOIN; GO ``` #### 检查版本并升级版本介绍 ##### 第一阶段:获取版本 ``` SELECT SERVERPROPERTY('Edition') AS Edition, SERVERPROPERTY('ProductVersion') AS Version; ``` 当前结果通常显示:Enterprise Edition (代表 Server + CAL 模式)。 目标结果:Enterprise Edition: Core-based Licensing (代表按核模式)。 ##### 第二阶段:更改所有“辅助副本” (Secondary) 请对每一个辅助节点依次执行: 登录辅助节点服务器。 打开 SQL Server Installation Center(安装中心)。 选择 Maintenance(维护) -> Edition Upgrade(版本升级)。 一路下一步,在 Product Key 页面,输入新的 Enterprise Core 版秘钥。 注意:系统可能会检测到您已经是 Enterprise 版,但只要秘钥不同(即授权模式不同),向导通常允许继续。 点击 Upgrade。 向导完成后,SQL Server 服务会自动重启。 验证: 服务启动后,在该节点运行 SELECT SERVERPROPERTY('Edition'),确认结果是否已变为 Enterprise Edition: Core-based Licensing。 在主节点检查 Always On 面板,等待该节点恢复为 Synchronized(已同步)。 ##### 第三阶段:执行故障转移 (Failover) 所有从节点都变成 Core 版后: 在主节点 SSMS 中,右键可用性组 -> Failover。 将主副本切换到已完成更改的某个辅助副本上。 业务验证:此时业务运行在新主节点(Core版)上,确认连接正常。 ##### 第四阶段:更改“旧的主副本” (Old Primary) 现在登录到原来的主节点(现在是辅助节点): 打开安装中心 -> Maintenance -> Edition Upgrade。 输入 Enterprise Core 秘钥 并执行。 等待服务重启并完成数据同步。 ##### 第五阶段:重新查询 ``` SELECT SERVERPROPERTY('Edition') AS CurrentEdition; ``` ### 更多参考 https://www.jianshu.com/p/bad1fc5b2cbe https://blog.csdn.net/weixin_45130813/article/details/121139599 https://blog.csdn.net/chahuoci6454/article/details/100962657 https://blog.csdn.net/niechel/article/details/146883070
相关推荐
SQL Server 复制订阅后如何修改表结构
从零使用sqlserver打造一个选课系统数据库
评论区
先去登录
版权所有:机遇屋在线 Copyright © 2021-2025 jiyuwu Co., Ltd.
鲁ICP备16042261号-1