缘起

早在2015年的时候,随着阿里云业务突飞猛进的发展,SQLServer业务也积累了大批忠实客户,其中一些体量较大的客户在类似大促的业务高峰时RDS的单机规格(规格是按照 内存CPUIOPS 一定比例分配,根据底层资源不同都会有各自上限)已经不能满足用户的业务需求,在我们看来也需要做Scale Out了,但SQLServer并没有完备的中间件产品,所以无论是逻辑Sharding还是只读分离,都需要用户配合做应用改造,而从用户角度看Sharding改动量很大不是一时间能完成的,那么更多寄希望我们提供读写分离的方案来满足业务需求。

那么读写分离我们第一个想到的即是AlwaysOn技术,但由于当时AlwaysOn对域控和Windows群集都是强依赖,而这两者又对我们所依赖的基础设施有很大挑战,需要做很多的突破产品限制的非标准化操作才有可能实现并且还有安全风险,所以最后我们只能放弃AlwaysOn技术方案,重新设计方案帮助用户度过难关。

最后,面对这类客户需求我们的方案如何产品化是值得我们思考的。

产品快速发展

除了读写分离,产品上还有很多更重要的问题急需我们去解决,所以从2015年到2017年我们经历了一个飞速发展阶段,围绕产品稳定性、多样性以及用户体验做了非常多的事情,举几个点:

在这当中依旧不断有读写分离的用户需求,每次遇到我们都先引导到了IaaS层用ECS自建实现,因为PaaS化的时机并不成熟,具体原因跟SQLServer当前的技术栈和云产品的结合有着密切的关系,这里也可以把我们背后的一些思考分享出来。

读写分离

首先明确我们讨论的读写分离是什么,MySQL的读写分离大部分是利用中间层做路由解析,基本上可以实现对应用端透明只有少部分场景需要用户做适配。

SQLServer并没有成熟的中间件产品,本质上讲是TDS(Tabular Data Stream)不完全开放的原因,如果要做也是有办法的,只是投入的成本远大于收益;基于此,SQLServer无论利用当前何种技术实现读写分离,对应用来讲都需要做一些适配,即使是使用AlwaysOn技术在链接驱动的参数配置上也会不同,所以我们后面讨论的读写分离都是基于这个前提。

技术选型

我们对比了SQLServer所有相关的技术栈

其中数据安全、HA(High Availability 高可用)、DR(Disaster Recovery 灾难恢复)以及备库是否可读是我们最关注的;这里的HA是指原生技术本身是否支持自动HA,当结合了部分云产品后我们也有能力把不支持变为支持,数据安全和灾难恢复的时间基本是原生技术决定的,备库是否可读是对单一技术的说明但做一些技术组合是可以把不可读变为可读的(比如Database Mirroring+Database Snapshots),最终综合来看Transactional Replication和AlwaysOn是我们觉得有机会做读写分离产品化的技术。

接着我们单独来看这两种技术对比

原理上讲Replication是逻辑复制,对比AlwaysOn的物理复制在性能、延迟、可靠性上都会有一定的差距;并且在产品复杂度读、可控性上和易用性上,由于Replication过于灵活细到表、列级别很难控制,无论用户使用还是我们做产品化整个复杂度非常高;所以最终我们选用AlwaysOn。

AlwaysOn技术

AlwaysOn是原生支持High Availability和Disaster Recovery的技术,本身又分为Failover Cluster Instances(后续简称FCI)和Availability Groups(后续简称AG),下面的图是FCI和AG的基础架构

其中FCI和常规版本的AG都依赖Windows Server Failover Clustering(后续简称WSFC),不同点是FCI是Share Storage而AG是Share Nothing,FCI是实例级别同步而AG是DB级别,那么很容易想到Share Nothing会有同步和异步的区别(和镜像技术类似),其中两者的区别点需要我们知道AlwaysOn的基本同步过程

首先在Primary节点的日志(Commit/Log Block Write)会从Log Cache刷到磁盘,同时Primary节点的Log Capture也会把日志发送到其它所有Replica节点,对应节点的Log Receive线程把收到的日志同样从Log Cache刷到磁盘,最后会由Redo Thread应用这些日志刷到数据文件里。

这其中还有一步,就是在Secondary端刷日志的时候,如果Primary节点等待这次返回的Acknowlege Commit,那么就是同步模式,反之如果Primary端不等Secondary的返回那么就是异步模式,两者的区别由此展开。

这是基本的同步过程,但无论是AlwaysOn还是Database Mirroring都存在一种情况,即同步模式下如果Secondary端异常,Primary端没有收到他的心跳也没有收到这次的Acknowlege Commit,那么也并不会算作写入失败,因为它一旦认定Secondary异常就不会等这次ACK,而是退化为类似异步的模式,但会把Secondary端的异常状态记录在基表里,通过相关视图(sys.dm_hadr_database_replica_states、sys.database_mirroring)暴露出来,就是我们常见的NOT SYNCHRONIZING/Disconnect状态,这时候自动化运维系统或者DBA就需要做判断处理,等到Secondary修复重新联机后会向Primary报告End of Log (EOL) LSN,Primary端再向它发送EOL LSN 之后hardened的所有日志,一旦Secondary端开始接收到这些日志并逐步刷到日志文件中,那么整个AG或者Mirroring相关的视图又会标记其状态为Synchronizing,表明正在追赶直到Last Hardened (LH) LSN达到主备一致状态,这时重新回到同步模式。

以前的情况一直是这样,直到SQLServer 2017 CU 1引入了REQUIRED_SYNCHRONIZED_SECONDARIES_TO_COMMIT这个参数,参数名字很长但也基本包含了他的作用,应对刚才的场景是可以让Primary端一直等到Secondary节点重新联机并同步后在提供服务。

了解了AG同步、异步以及FCI,在总结下我们关心的点

在实际方案中这些也可以结合起来,最终再和阿里云产品整合做一个整体方案,之前也讲到阿里云从15年就开始做类似方案来解决用户问题,一直到最终PaaS化也过度了三个版本。

云上演进

第一版本我们使用了ECS、SSD云盘、OSS、VPC、SLB作为基础;在SQL技术上,我们使用SQL+WSFC+AD的方式,目前看这种方式支持的版本也非常多,从12到17都可以;验证方式既可以用域控也可以用证书。

但他有2个缺点:第一是成本高,除了Primary和两个Secondary节点还要有两个AD节点,毕竟我们每个环节都要保证高可用;
第二点是稳定性不够,网络抖动的情况非常容易让WSFC判断异常,SQL端DB同时出现不可用;

这是第二版的架构,跟第一版相比我们用到了HAVIP来解决监听器问题,去掉了AD只能用证书做验证,但也因此最小资源开销降低到3;这个方案也是之前在阿里云上用的比较多的,但同第一个方案一样,在网络稳定性上会有很多挑战,因为我们未来面对的场景不只是同城跨可用区还会有更多跨Region以及打通海外的场景,所以这个方案也只能Cover一部分用户的需求,但对我们不是一个最终方案。

最终我们找到了方案三,去除了WSFC和AD,只关注基础云产品和SQL本身;最终要的是跟方案二相比,对网络的抖动敏感度会更低也更可控,最多是在Primary端出现Send Queue的堆积,这个我们完全可以通过SQLServer相关的Performance Counter监控并做一些修复调整。

但没有方案是完美的,可控性强的代价是这种无群集无域控架构原生是不具备HADR能力的,这点熟悉WSFC的同学可以知道之前架构的HA都是依赖WSFC,他包括健康检查、资源管理、分布式元数据通知维护以及故障转移,所以这时候就必须我们自己去解决这个问题;为此我们也做了很多努力,最终实现了支持AlwaysOn无域控无群集的HA系统,不依赖Cluster完全自主可控的HA。

产品化

最终的产品架构如下,首先会保证有2个同步节点做主备,并且尽量分配在不同的可用区,其它只读节点默认是异步,最多可以有7个只读节点;用户的访问链路可以有三种:

  • 第一种是读写链路,会指向两个同步节点,由我们的HA来保证高可用
  • 第二种是统一只读链路,根据用户需求设定,把指定的Replica节点绑定到一起按照一定的权重比例分配链接
  • 第三种是单一只读链路,即每个只读节点会提供一个单独的链接,让用户也可以自己灵活配置,比如用户的APP Server就是在可用区A那么就可以直接访问可用区A的只读地址,避免再通过统一只读被路由到其它区域

至此SQLServer AlwaysOn已经在阿里云PaaS化,当然目前只是支持最主要功能,后续还有很多可以完善丰富的地方,希望有更多用户了解和使用这个产品并帮他们解决实际问题。

阅读原文​​​​​​​

更多技术干货 请关注阿里云云栖社区微信号 :yunqiinsight

SQLServer AlwaysOn在阿里云的前世今生的更多相关文章

  1. 阿里云ECS安装sqlserver,本地无法连接问题排查思路

    1. 阿里云控制台-对应的ECS实例的安全组是否添加了响应的端口(1433)可以访问: 2. 服务器-sqlserver服务是否开启: 3. 服务器-sqlserver配置器,对应的端口是否启用,已经 ...

  2. 阿里云重磅发布RDS for SQL Server AlwaysOn集群版

    2018年双十一刚过,阿里云数据库发布RDS for SQL Server AlwaysOn集群版,这是业界除微软云SQL Database外,首家云计算公司基于SQL Server最新AlwaysO ...

  3. 阿里云服务器SQLSERVER 2019 远程服务器环境搭建【原创】【转载请注明出处】

    之前做过本地服务器SQLSERVER环境搭建.局域网环境SQLSERVER搭建.一直没有尝试自己完成一个云端服务器的环境搭建.今天就根据一个成功的例子给大家分享一下. 一.云端数据库安装与搭建 我的服 ...

  4. 阿里云服务器安装SQLServer本地无法远程访问

    新买的阿里云服务器,安装上sqlserver2012,本机连接测试没有问题,但是回到本地,使用ip远程连接报错. 尝试了网上各种办法,都是失败.最后找到原因,原来在阿里云的控制台上有设置: 首先进入安 ...

  5. 二步实现 远程连接 阿里云SqlServer 2012 数据库服务器

    前言:在使用 阿里云 上的一些产品时,遇到不少坑. 安装IIS 时,遇到 因买的配置过低,虚拟内存不足,而导致 IIS 总是安装失败: 现在 在上面安装了个 Sql Sever 2012,远程老是 不 ...

  6. (转)二步实现 远程连接 阿里云SqlServer 2012 数据库服务器

    前言:在使用 阿里云 上的一些产品时,遇到不少坑. 安装IIS 时,遇到 因买的配置过低,虚拟内存不足,而导致 IIS 总是安装失败: 现在 在上面安装了个 Sql Sever 2012,远程老是 不 ...

  7. 8年前诞生于淘宝,细数阿里云RPA 的前世今生!

    9月10日,踏入55岁的马云正式卸任阿里巴巴董事局主席一职,由阿里巴巴集团CEO张勇接任.公寓创业.西湖论剑.美国敲钟,从成立到登顶中国最值钱的公司,阿里巴巴只用了20年. 阿里云RPA,2011年诞 ...

  8. 阿里云系列——7.阿里云IIS系列详解(过程+通用+最新)

    网站部署之~阿里云系列汇总 http://www.cnblogs.com/dunitian/p/4958462.html 先讲IIS系列,Linux部署以后再继续讲 先打开主机管理平台,确认域名绑定 ...

  9. 【阿里云产品公测】rds测试感受

    阿里云用户:cncbase 公司于10.1决定改变原来的服务器自建数据库,使用rds.于近日开通rds,进行了一些测试. 信息量:500字节左右每条信息,约200万条信息/小时的吞吐量.     信息 ...

随机推荐

  1. JavaSE---多线程---线程组

    1.概述 1.1 Java中使用ThreadGroup表示线程组,可以对一批线程进行分类管理: Java运行程序直接对  线程组 进行控制,对线程组的控制相当于 同时控制这组线程: 一旦线程加入某一组 ...

  2. 转载:有好多是Elastic官方博客上的内容,具体看文档

    Elastic官方博客地址:https://blog.csdn.net/UbuntuTouch 这个地址是在CSDN上面的,看不惯CSDN网站的广告,同时官方博客讲述的也都十分详细,自己保留一份作为参 ...

  3. java 读取html字符串替换字符

    import org.jsoup.Jsoup; import org.jsoup.nodes.Document; import org.jsoup.nodes.Element; import org. ...

  4. delphi 判断WIN8 , WIN8.1 , WIN10 系统版本

    今天测试了WIN8, WIN8.1, WIN10 系统下GetVersionEx 函数,居然取出来的版本都是6.2 . 于是网上查找各种获取内核版本号的方法, 终于找到几种有用的方法, 记录下来以作备 ...

  5. php开发面试题---php缓存总结

    php开发面试题---php缓存总结 一.总结 一句话总结: 缓存主要分本地缓存和分布式缓存两种 可以用分布式本地缓存:把那些常用的.不容易变的页面.数据都存下来 1.常用的缓存构架? 分布式本地缓存 ...

  6. leetcode上一些常见的链表问题

    92-按规定区间反转链表 思路:可以考虑成一种把前后数字的结点断开重新组合的问题 /** * Definition for singly-linked list. * struct ListNode ...

  7. MySQL高级学习笔记(五):查询截取分析

    文章目录 慢查询日志 是什么 怎么玩 说明 查看是否开启及如何开启 默认 开启 那么开启了慢查询日志后,什么样的SQL才会记录到慢查询日志里面呢? Case 配置版 日志分析工具mysqldumpsl ...

  8. 泛微weaver_oa filebrowser.jsp 任意目录遍历

    url//document/imp/filebrowser.jsp?dir=/etc/

  9. jmeter 后台运行 setsid bin/jmeter -n -t .jmx文件 -l .jtl文件

    备注: 另外,在Linux下我们有时候希望线程可以在后台运行,这样我们关闭当前连接后,线程依然可以运行,这里提供一个将 jmeter命令设置为后台线程的方法. 使用setsid命令:  setsid  ...

  10. Android组件内核之Activity调用栈分析(一)

    阿里P7Android高级架构进阶视频免费学习请点击:https://space.bilibili.com/474380680 导语 我们陈述一下Activity,Activity是整个应用用户交互的 ...