Windows 2012 always on 读写分离集群搭建配置
Windows 2012 always on 读写分离集群搭建配置。
Always on简介
AlwaysOn 可用性组 (SQL Server)
AlwaysOn 可用性组功能是一个提供替代数据库镜像的企业级方案的高可用性和灾难恢复解决方案。SQL Server 2012 中引入了 AlwaysOn 可用性组功能,此功能可最大程度地提高一组用户数据库对企业的可用性。"可用性组"针对一组离散的用户数据库(称为"可用性数据库",它们共同实现故障转移)支持故障转移环境。一个可用性组支持一组读写主数据库以及一至八组对应的辅助数据库。(可选)可使辅助数据库能进行只读访问和/或某些备份操作。
可用性组在可用性副本级别进行故障转移。故障转移不是由诸如因数据文件丢失而使数据库成为可疑数据库、删除数据库或事务日志损坏等此类数据库问题导致的。
Always on 优点:
AlwaysOn 可用性组提供了一组丰富的选项来提高数据库的可用性并改进资源使用情况。主要组件如下:
· 支持最多九个可用性副本。"可用性副本"是可用性组的实例化,此可用性组由特定的 SQL Server 实例承载,该实例维护属于此可用性组的每个可用性数据库的本地副本。每个可用性组都支持一个主副本和最多八个辅助副本
支持替代可用性模式:
· 异步提交模式。此可用性模式是一种灾难恢复解决方案,适合于可用性副本的分布距离较远的情况。
· 同步提交模式。此可用性模式相对于性能而言更强调高可用性和数据保护,为此付出的代价是事务延迟时间增加。一个给定的可用性组可支持最多三个同步提交可用性副本(包括当前主副本)。
支持几种形式的可用性组故障转移:自动故障转移、计划的手动故障转移(通常简称为"手动故障转移")和强制的手动故障转移(通常简称为"强制故障转移")。
· 支持几种形式的可用性组故障转移:自动故障转移、计划的手动故障转移(通常简称为"手动故障转移")和强制的手动故障转移(通常简称为"强制故障转移")。有关详细信息,请参阅故障转移和故障转移模式(AlwaysOn 可用性组)。
· 使您能够将给定的可用性副本配置为支持以下一种或两种活动辅助功能:
o 利用只读连接访问,与副本的只读连接可以在此副本作为辅助副本运行时访问和读取其数据库。有关详细信息,请参阅活动辅助副本:可读辅助副本(AlwaysOn 可用性组)。
o 当副本作为辅助副本运行时,对副本的数据库执行备份操作。有关详细信息,请参阅活动辅助副本:辅助副本备份(AlwaysOn 可用性组)。
通过使用活动辅助功能,可更好地利用辅助硬件资源,从而提高 IT 效率并降低成本。此外,通过将读意向应用程序和备份作业转移到辅助副本,有助于提高针对主副本的性能。
· 支持每个可用性组的可用性组侦听器。"可用性组侦听器"是一个服务器名称,客户端可连接到此服务器以访问 AlwaysOn 可用性组的主副本或辅助副本中的数据库。可用性组侦听器将传入连接定向到主副本或只读辅助副本。侦听器在可用性组故障转移后提供快速应用程序故障转移。有关详细信息,请参阅可用性组侦听器、客户端连接和应用程序故障转移 (SQL Server)。
· 支持灵活的故障转移策略以便更好地控制可用性组故障转移。
· 支持用于避免页损坏的自动页修复。
· 支持加密和压缩,这提供了安全且高性能的传输方式。
· 提供了一组集成的工具来简化部署和管理可用性组,这些工具包括:
o 用于创建和管理可用性组的 Transact-SQL DDL 语句。有关详细信息,请参阅AlwaysOn 可用性组的 Transact-SQL 语句概述 (SQL Server)。
o SQL Server Management Studio 工具,如下所示:
§ 新建可用性组向导 创建和配置可用性组。在某些环境中,此向导还可以自动准备辅助数据库并且为每个数据库启动数据同步。有关详细信息,请参阅使用"新建可用性组"对话框 (SQL Server Management Studio)。
§ 将数据库添加到可用性组向导 向现有可用性组添加一个或多个主数据库。在某些环境中,此向导还可以自动准备辅助数据库并且为每个数据库启动数据同步。有关详细信息,请参阅使用"将数据库添加到可用性组"向导 (SQL Server)。
§ 将副本添加到可用性组向导 向现有可用性组添加一个或多个辅助副本。在某些环境中,此向导还可以自动准备辅助数据库并且为每个数据库启动数据同步。有关详细信息,请参阅使用"将副本添加到可用性组向导"(SQL Server Management Studio)。
§ 故障转移可用性组向导 启动对可用性组的手动故障转移。根据您指定为故障转移目标的辅助副本的配置和状态,该向导可以指定计划的手动故障转移或强制手动故障转移。有关详细信息,请参阅使用故障转移可用性组向导 (SQL Server Management Studio)。
o AlwaysOn 面板 监视 AlwaysOn 可用性组、可用性副本和可用性数据库,并且评估 AlwaysOn 策略的结果。有关详细信息,请参阅使用 AlwaysOn 面板 (SQL Server Management Studio)。
o "对象资源管理器详细信息"窗格显示有关现有可用性组的基本信息。关详细信息,请参阅使用对象资源管理器详细信息监视可用性(SQLServer Management Studio)。
o PowerShell cmdlet。有关详细信息,请参阅AlwaysOn 可用性组PowerShell Cmdlet 概述 (SQL Server)。
文档出处,详见:https://msdn.microsoft.com/zhcn/library/hh610230(v=sql.120).aspx
测试环境:
4台Windows 2012 R2 服务器。
服务器功能 | 服务器IP | 系统 | 服务 |
AD节点 | 10.92.37.2 | Windows 2012 R2 | AD |
Sql 2012节点 | 10.92.37.3 | Windows 2012 R2 | 故障转移+sql2012 |
Sql 2012节点 | 10.92.37.4 | Windows 2012 R2 | 故障转移+sql2012 |
Sql 2012节点 | 10.92.37.5 | Windows 2012 R2 | 故障转移+sql2012 |
一、安装故障转移
Always on 集群需要故障转移集群支持。首先需要搭建故障转移集群。
在10.92.37.2安装域控。打开服务器管理器,打开-管理-添加角色和功能。
勾选Active Directory 域服务。
等待所有安装完成。
配置域控服务器。,点击下图是所示按钮。
选择"添加新林",在根域名填入您域的名称。
输入还原密码。
下一步
等待系统分配NetBIOS名称。然后一直下一步。等待完成,重启服务器。重启完成注意需要用域账号登陆。例如jianjian\administrator
安装
注:域控配置好之后会自动把网卡dns改成127.0.0.1,或者您安装域控前手动改成127.0.0.1,sql节点的dns为了加入域需要改成域控的地址:10.92.37.2
二、Sql 节点服务器加入域。
配置sql节点服务器的网卡(和域控在同段)DNS为域控的地址。确保可以解析域控名称。
开始我的电脑右键属性à更改设置à更改à选择域,填入域控名称。确定,输入域控的管理员账号和密码加入域。重启服务器。
重启后通过域用户登陆服务器。例如:jianjian\administrator
三、安装故障转移角色。
在sql节点的所有服务器安装故障转移角色服务。
安装方式都一样,下一步即可。
故障转移磁盘配置。完整的故障转移集群需要仲裁磁盘和数据盘、MSDTC盘。在发生转移的时候磁盘也会整体进行转移从而起到2边数据同步的作用。具体可以参考相关文档。
此次我们为3节点(奇数)集群,并不需要创建仲裁。
四、建立故障转移集群。
下一步
下一步
下一步
角色不选,直接下一步
选择功能-故障转移集群。
下一步直接到安装结束。
浏览查找您需要添加到集群的节点,为了更好辨认建议更改计算机名称。
下一步
下一步
下一步
下一步
下一步
五、安装sql 2012。
Sql2012在安装正常操作即可,需要注意的就是服务账号配置的(如图1)时候使用域账号。分别在3台节点安装sql 2012。安装完成后,(图2所示)打开sql server 配置管理器-SQL Server(MSSQLSERVER)--右键属性。启用always on 可用性组。重启数据库服务。
图(1)
图(2)
六、配置读写集群。
首先在你选择的主节点导入您的数据库。读写集群配置需要数据库的完整备份。选择数据库,右键属性-选项-调整恢复类型为完整。
对这个数据做完整备份。
always on 集群配置。
输入名称。随性即可。
点击添加副本使用域账号连接其他2个sql节点。勾选(自动故障转移)和(同步提交)
辅助副本"可读辅助副本"选择为仅只读意向。备份首选项默认即可。
添加侦听器。也可以在创建完后再添加。选择子网,输入指定的IP地址即可。注意监听的端口sql server为1433
"所有副本可访问的共享网络位置。"在任意节点建立共享文件夹,并且在另外2台挂载(注意开机挂载)。即可。
验证结果全部成功即可。下一步等待创建完成即可。完成后结果如下。在主节点可以看到"主要"字样。此时可以做到3台服务器数据同步(同步有1-2s延迟)并且可以实现故障转移。当主节点故障后其他节点可以自动成为主节点接替工作。
此时数据库集群还无法做到读写分离。由于always on局限性需要手动配置只读路由表,这个路由表大致结构是主节点----对应2个只读节点。并且只读节点有优先级,前面的优于后面的。 无法实现2个或者多个只读节点实现负载。其实只为热备。只读路由表通过T-sql语言实现,具体如下。更改相关参数保存为.sql文件,通过sqlcmd命令执行。Sqlcmd -S 服务器名称 -U 用户 -P 密码 -i 脚本
GO
ALTER AVAILABILITY GROUP [weitui_sql_wr]
MODIFY REPLICA ON N'WIN-2N0I1AI1BHC' WITH
(
SECONDARY_ROLE (ALLOW_CONNECTIONS = READ_ONLY)
);
GO
ALTER AVAILABILITY GROUP [weitui_sql_wr]
MODIFY REPLICA ON N'WIN-2N0I1AI1BHC' WITH
(
SECONDARY_ROLE (READ_ONLY_ROUTING_URL = N'TCP://10.92.37.3:1433')
);
GO
ALTER AVAILABILITY GROUP [weitui_sql_wr]
MODIFY REPLICA ON N'WIN-K0VKE108NM8' WITH
(
SECONDARY_ROLE (ALLOW_CONNECTIONS = READ_ONLY)
);
GO
ALTER AVAILABILITY GROUP [weitui_sql_wr]
MODIFY REPLICA ON N'WIN-K0VKE108NM8' WITH
(
SECONDARY_ROLE (READ_ONLY_ROUTING_URL = N'TCP://10.92.37.6:1433')
);
GO
ALTER AVAILABILITY GROUP [weitui_sql_wr]
MODIFY REPLICA ON N'WIN-LF5RK32CE87' WITH
(
SECONDARY_ROLE (ALLOW_CONNECTIONS = READ_ONLY)
);
GO
ALTER AVAILABILITY GROUP [weitui_sql_wr]
MODIFY REPLICA ON N'WIN-LF5RK32CE87' WITH
(
SECONDARY_ROLE (READ_ONLY_ROUTING_URL = N'TCP://10.92.37.5:1433')
);
GO
ALTER AVAILABILITY GROUP [weitui_sql_wr]
MODIFY REPLICA ON N'WIN-2N0I1AI1BHC' WITH
(
PRIMARY_ROLE (READ_ONLY_ROUTING_LIST=(N'WIN-K0VKE108NM8',N'WIN-LF5RK32CE87',N'WIN-2N0I1AI1BHC'))
);
GO
ALTER AVAILABILITY GROUP [weitui_sql_wr]
MODIFY REPLICA ON N'WIN-K0VKE108NM8' WITH
(
PRIMARY_ROLE (READ_ONLY_ROUTING_LIST=(N'WIN-2N0I1AI1BHC',N'WIN-K0VKE108NM8','WIN-LF5RK32CE87'))
);
GO
ALTER AVAILABILITY GROUP [weitui_sql_wr]
MODIFY REPLICA ON N'WIN-LF5RK32CE87' WITH
(
PRIMARY_ROLE (READ_ONLY_ROUTING_LIST=(N'WIN-K0VKE108NM8',N'WIN-LF5RK32CE87','WIN-2N0I1AI1BHC'))
);
GO
验证读写路由表。使用同样的命令验证。
select a.*,c.is_local,c.role_desc,d.endpoint_url,d.read_only_routing_url
from sys.dm_hadr_availability_replica_cluster_nodes a
join sys.dm_hadr_availability_replica_cluster_states b
on a.replica_server_name = b.replica_server_name
join sys.dm_hadr_availability_replica_states c
on b.replica_id = c.replica_id
join sys.availability_replicas d
on c.replica_id = d.replica_id
测试只读路由是否生效。Always on 集群web链接过程中需要传递ApplicationIntent = ReadOnly 此类参数。测试方式如下。
完成以上操作后点链接。如果可以连接到只读节点,并且符合只读路由表的顺序表示配置完成。