黎其宇
基于SQL Server Alwayson技术的负载均衡研究
黎其宇
民航中南空管局通信网络中心,广东 广州 510405
在主流关系型数据库中,Oracle有RAC群集,MySQL有HAProxy等多个负载均衡方案。虽然SQL Server 2012隆重推出了Alwayson高可用性技术,但始终没有实现真正意义上的负载均衡。因此,从Alwayson技术出发,基本实现了只读负载。
Alwayson高可用性;负载均衡;TDS协议
在这个大数据时代,需要处理的内容越来越多,我们需要更高性能的读写IO来实现我们的业务需求。
Alwayson是SQL Server新增的一个高可用性和灾难恢复解决方案。在Alwayson之前,SQL Server已有的高可用性方案,如数据库镜像、日志传送和故障转移群集均有各自的局限性。[1]而Alwayson则是提取了数据库镜像和故障转移群集的优点,并且有更简化的高可用性部署。
图1 Windows Server故障转移群集
如图1所示,Alwayson高可用性组允许将一组数据库同步到最多4个副本节点,在最新的SQL Server 2014则支持8个副本节点。每组可用性数据库都由一个“可用性副本”承载。有两种类型的可用性副本,分别为“主副本”和“辅助副本”。[2]前者用于承载主数据库,后者则承载一组辅助数据库并作为可用性组的潜在故障转移目标。主副本使主数据库可用于客户端的读写连接。此外,它在称为“数据同步”的过程中使用,在数据库级别进行同步。主副本将每个主数据库的事务日志记录发送到每个辅助数据库,然后将它们应用到相应的辅助数据库。主数据库与每个连接的辅助数据库独立进行数据同步。
Always高可用性组可以支持简单第一副本的负载均衡,但有较多的限制。
首先要将某“可用性组”的属性设置为:可读辅助副本“仅读意向”。
图2 可用性副本
然后通过执行sql脚本,建立read指针。在当前的primary上为每个sqlserver instance建立[instance name=>instance tcp url]的对应关系。再执行相应sql脚本,建立primary 与read only db的关系。在当前的primary上为各个primary建立对应的read only url 列表(有优先级概念)。最终访问侦听器IP则可以实现主节点和第一辅助节点的读写分离,而且不是均衡分配。这个负载是有限制的,要求客户端请求必须增加“ApplicationIntent=ReadOnly”连接串。为了实现这样的负载,程序需先判断出请求是否为只读,必须修改大量的程序代码,不利于实际应用。
Alwayson可用性组的监听器Listener是可以配置只读副本的负载,但只连接到可用的第一副本,并没有把只读IO均衡地分配到辅助副本上。
当 SQL Server 数据库引擎与应用程序通信时,它将使用称为“表格格式数据流”(TDS)数据包的 Microsoft 通信格式来格式化通信数据。服务器为每个网络协议创建一个称为“TDS 端点”的 SQL Server 对象。在服务器中,TDS 端点是在 SQL Server 安装过程中由 SQL Server 安装的。
TDS是一种协议,一系列描述两个计算机间如何传输数据的规则。[3]像别的协议一样,它定义了传输信息的类型和他们传输的顺序,描述了数据如何流动。表格数据流协议是建立在TCP/IP Net-Library之上的,包含在TCP数据段内。TDS用1433端口进行数据库通信。
TDS协议位于TCP的数据段内,结构为:IP,TCP,TDS头,TDS的DATA段。在知道了TDS协议的数据结构后,使用中间人会话代理的方式,建立一个中间节点服务器(暂称为Master),捕捉客户端发送过来的TDS数据包。当捕捉到TDS请求数据包,截取里面的请求内容。如果是只读请求的话,将该数据包的主要内容不修改,修改源地址为Master的IP,修改目标地址为只读副本,实现转发到Alwayson的只读副本(暂称为Slave)。这里面有两个细节,第一,如果请求内容没有包括Alter、Update、Insert以及Delete等关键字,则认为是只读请求;第二,如果有多个Slave,则存在Slave选择的问题,那么我们可以采取遍历Slave的分配方式,初步平衡各个只读副本的压力,这个均衡算法可以进一步优化。
Master同时还要监听Slave返回的响应数据包,用修改源地址和目标地址的方式转发响应数据包。至此完成客户端访问Slave的只读请求转发。
同样地,客户端要访问非只读请求时,Master则将这个TDS数据包转发到主节点(暂称主Slave),以此实现只写或读写请求的路由。
综上所述,Alwayson技术主打的亮点是数据的高可用性,并没有实现真正意义的负载均衡。通过Alwayson的监听器,实现了主节点与第一辅助节点的读写分离,要使用此功能需修改程序,使之适应访问字符串的。
为了让数据库服务器实现更好的负载均衡,可以通过中间数据包代理的方式,实现只读请求的负载。中间数据包代理的方式要求深入研究TDS的通信机制。
[1]宋沄剑.SQL Server 2012中的AlwaysOn尝试[EB/OL].[2012-03-20].http://www.cnblogs.com/CareySon/archive/2012/03/20/2407719.html.
[2]McKay.Sql server Always On 读写分离配置方法[EB/OL].[2014-04-22].http://www.cnblogs.com/aarond/p/3679915.html.
TP311.13
A
1009-6434(2016)04-0015-01