文章作者:携程技术团队
编辑整理:Hoh
内容来源:《携程架构实践》
出品平台:DataFunTalk
注:转载请在后台留言“转载”。
导读:飞机有两个发动机,用于实现高可用。如果一个发动机出现故障,另一个发动机还能够持续工作,数据库运维也是如此。我们需要多个副本,一旦某个节点发生故障,另外一个节点可以继续提供服务。我们还需要考虑到机房发生故障的场景,需要有快速切换到异地容灾机房的能力。
我们推荐使用数据库三副本,一主一从一异地容灾。如果想要节省成本,也可以只保留两副本,但是一旦其中一台服务器发生故障,服务器维修时间会比较长,那么在维修期间,数据库服务会处于单点状态,使得风险急剧上升。
本文主要介绍以下内容:
SQLServer高可用MySQL高可用Redis高可用01
SQLServer高可用
携程的SQLServer高可用架构经过了多次演进。最初使用的是镜像技术,如果服务器出现故障,在切换时,需要人工进行干预以切换到镜像节点。同时镜像节点不提供读服务,可扩展性比较差。后来引入了SAN存储,将计算和存储进行分离,可以实现自动切换,但SAN存储技术过于复杂,并且价格昂贵。年,我们开始将其逐步改造为AlwaysOn架构,这是SQLServer以后的版本所具有的功能。
图1显示了三副本的SQLServer数据库服务架构。主副本提供读写访问;一个辅助副本是同步模式,即和主副本数据保持一致;另一个辅助副本是异步模式,存放在异地机房。同步模式可以保证主从数据一致,在切换时不会丢失数据。但同步节点的性能可能会对主副本造成影响,每一个事务都需要在同步节点确认后,才算完成。所以,将同步节点和主节点放在同一网段内,可以减少网络开销,提升整体的响应速度。
SQLServer可以在主副本服务器发生故障时,自动切换到同步节点。在切换期间,数据库不可用,所以通常在1分钟之内完成。而切换到异步节点是手动触发的,因为是异步模式,可能会丢失数据,所以尽量不切换到异步节点。
SQLServer高可用在很大程度上依赖于底层操作系统。因为AlwaysOn架构依赖底层的Windows群集服务。一个Windows群集可以有多套AlwaysOn组。Windows群集服务可以这样设计:
尽量增加群集节点数量,一般保持在9个以上的奇数节点,避免一台或两台服务器故障导致整个群集不可用;因为群集节点多,所以增加regroup的超时时间,避免重组超时导致整个群集异常;增加文件共享仲裁,文件共享可以存放在第三机房,避免机房故障导致群集失去多数仲裁,同时在失去多数仲裁时,可以使用ForceQuorum模式强制启动Windows群集服务,尽快恢复业务。
图1三副本的SQLServer数据库服务架构
使用AlwaysOn架构可以极大减轻主节点的负载。数据库的全量备份或日志备份可以调整到异步节点上进行,无须担心数据库备份会对业务造成性能影响。我们会比较