专栏首页数据库架构之美数据库高可用架构浅析

数据库高可用架构浅析

数据库作为信息系统重要的基础设施,一直承担着压舱石的角色。互联网应用的高并发、海量数据使得数据库的负载越来越重,这在数据大集中的情况下愈发明显。而数据库作为信息系统唯一的“单点”,稳定性、可用性是首先要保证的目标。这里的单点并不是指数据库没有高可用方案,而是因为数据库只要涉及到数据的复制就一定是有状态的,有状态的应用更加难以运维,并且在遭遇异常时并不能做到真正意义上的无缝切换。

传统关系型数据库经过几十年的发展,目前高可用方案都已经非常成熟,目前数据库常用的高可用方案主要包括:主机HA、数据库主备和数据库集群方案。主机HA由于其适用范围广、切换时间短被广泛应用于生产环境的各类数据库上,主机层面的高可用这里不再讨论。

主备方案

主备方案是目前数据库最常用的高可用方案。主备模式主要涉及到两个问题:①数据同步问题;②主备切换问题。

数据同步涉及到不同同步模式的选择,如果采用同步模式备机宕机可能影响主机业务,同时影响性能,如果采用异步模式可能造成数据的丢失。由于银行业务的特殊性,信息系统的rpo要求等于0,即不允许数据的丢失,所以银行业一般采用同步模式,同时现在的数据库产品为了保证性能和可用性会在同步和异步之间有一个折中方案。下面就以DB2 HADR、ORACLE ADG、MYSQL半同步为例介绍一下主备方案。

DB2 High Availability Disaster Recovery

上图是hadr的架构图,可以看到hadr总共有四种同步模式:

SYNC:主备数据库都将日志成功落盘,应用才能提交。这是最大数据保护模式,但性能损耗较大。

NEARSYNC:日志只要写到主机磁盘和备机的缓冲区,就可以提交。这种模式类似半同步,也是生产环境一般采用的方式。

ASYNC:日志只要写到主机磁盘同时发送到主机的TCP层,就可以进行提交,可能造成数据丢失。

SUPERASYNC:主库只要成功落盘,就可以提交。性能最好,可能造成数据丢失。

如果因为网络问题造成复制延迟过大,不能及时同步日志信息的话,DB2数据库会自动切换为异步模式,来保证主库的可用性。DB2 V9.7开始,HADR 开始支持ROS(Read On Standby),备机可以接收连接,执行读操作。Db2数据库执行”db2pd -hadr”命令可以查看hadr当前的状态,包括 Local Catchup、Remote Catchup、Remote Catchup Pending、Peer、Disconnect Peer、Disconnected几种。

Local Catchup:备机正在从本地磁盘读取日志并进行重放。

Remote Catchup:主机正在将日志发送给备机,备机正在接收日志,写到磁盘并且应用日志。

Remote Catchup Pending:备机读取完本机的日志后会进入该状态。

Peer:日志不是从磁盘中读取,而是直接通过网络传输到备机,进行应用。

Disconnect Peer:主备之间网络有延迟,但是延迟的窗口还在hadr_peer_window参数值以内,这部分事务是无法提交的,当网络恢复后变为peer状态。这样保证了数据不丢失的同时有一定的网络波动容忍性。

Disconnected:主备之间网络中断,如果设置了hadr_peer_window延迟缓冲窗口,超过了hadr_peer_wait_limit设置的值就认为主备连接中断,如果未设置hadr_peer_window窗口,则超过hadr_timeout参数值就认为连接中断。

Oracle Active DataGuard

Oracle从11g开始推出active data guard功能,支持备库以read only的方式打开,同时应用日志,这样就从另一个层面支持了读写分离。oracle adg支持三种数据保护模式。

最大保护模式:该模式提供了最大级别的数据保护,redo日志在至少一个物理备库成功应用后主库才可以提交,如果备库发生宕机,主库找不到可以写入的备库时,主库的业务会中断。该模式对性能影响较大。

最大可用模式:redo日志在至少一个物理备库成功应用后主库才可以提交,如果备库发生宕机,主库找不到可以写入的备库时,会自动降级为最大性能模式,这种模式是一种折中方式,在提供数据保护的情况下保证了主库的可用性,是生产环境中一般采用的方案。

最大性能模式:主库的提交不受备库的影响,保证了主库的可用性和性能,但是可能造成数据丢失。

下图为adg架构图:

主库向备库发送日志有两种方式,一是通过归档进程arch发送,这样的话就需要等待redo日志切换归档日志生成后才能进行发送,这个明显是异步的。另一种方式是通过lgwr进程进行发送,lgwr在写redo的同时将redo通过lns进程发送到备库,备库通过rfs进程进行redo日志接收,mrp进程进行日志apply。另外,adg支持备库的实时应用(real_time_apply),使用该功能需要在备库创建standby redo log,srl只在备库是活动的,srl大小必须和orl的大小一致,个数一版按照每个日志线程N+1的数量来配置,使用srl的好处除了支持实时应用外还能提高性能。通过alter database recover managed standbydatabase using current logfile;命令启动实时应用。

MySQL semi-replication

Mysql从5.7开始支持半同步,下图是mysql半同步的原理图,与db2和oracle不同的是,mysql半同步不是基于物理redo的同步,而是基于binlog的偏逻辑的复制。主库将数据改变记录到binlog日志中,dump线程不断读取binlog中的内容,从库的io线程负责接收binlog并写入中继日志relay log中,同时io线程会更新master.info文件中的位置信息。从库的sql线程负责对relay log中的信息进行apply,已经应用过得relay log会进行清理。

在Mysql5.7之前的版本,主库先提交事务,然后将binlog传递到备库并刷到relay log中,然后备库会返回给主库ack表示已经收到relay log,这时主库才给应用返回提交ok。这种方式如果在发送binlog的时候主库宕机则会有数据丢失的风险。

5.7之后支持after_sync模式,主库必须等到备库的relay log落盘后返回的ack才能进行提交,这样就保证所有改变都写入到了备库的relay log,解决了数据丢失的问题。半同步通过rpl_semi_sync_master_timeout参数控制窗口大小,如果超过该窗口未收到反馈,就会变成异步模式。

总结

对于数据库来说,其实任何主备方案都涉及到几个问题:

一是同步方案的选择,如果要做到rpo=0一定要支持同步,同时要支持同步模式的智能切换,在备库宕机时不能一直影响主库的业务;

二是考量同步对性能的影响,以及业务读写分离对一致性的要求,像db2、postgresql都提供了三种以上的同步模式,根据性能要求选择合适的同步模式,例如数据是发送到备库的缓存,还是落盘,亦或是落盘后apply成功主库才能提交?

三是关于切换方案怎么做,可能现在数据库都只会提供主从复制,但是很少有直接提供切换方案的,这个时候就需要考虑是否有开源的主流切换方案,如果没有是否可以使用虚拟机或者主机层面的集群软件,亦或是自行开发网关,进行探活、切换、注册等。

本文分享自微信公众号 - 数据库架构之美(databasekernel),作者:数据库架构之美

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-06-15

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • PostgreSQL主备流复制搭建

    Postgresql9开始支持流复制(stream replication),作为pg原生的复制技术,有着很好的性能。本文从几个方面全面介绍pg的流复制技术。

    数据库架构之美
  • 我们使用PostgreSQL的物理复制槽做什么?

    不知道是否有人关注到下面这个错误日志,在一个异步流复制的环境中,我们在主库看到如下日志:

    数据库架构之美
  • PostgreSQL为什么要设置hot_standby_feedback?

    Postgresql从9.1开始支持流复制,流复制的出现是一次革命,因为它速度非常快,性能很好。流复制是基于wal日志的复制技术,主库不断发送wal日志至备库,...

    数据库架构之美
  • Java算术运算性能设计要点

    如果想进行快速安全的金融财务有关的算术计算,也就是浮点的加减乘除算术运算,请遵循下列条件:

    物流IT圈
  • 大白话讲解word2vec到底在做些什么

    word2vec也叫word embeddings,中文名“词向量”,作用就是将自然语言中的字词转为计算机可以理解的稠密向量(Dense Vector)。在wo...

    机器学习AI算法工程
  • ECCV 2020 | 空间-角度信息交互的光场图像超分辨,性能优异代码已开源

    光场相机可以记录当前场景不同视角的图像,每个视角图像的上下文信息(空间信息)与不同视角之间的互补信息(角度信息)都有助于提升图像超分辨的性能。

    CV君
  • 异常处理第一讲(SEH),筛选器异常,以及__asm的扩展,寄存器注入简介

    异常处理第一讲(SEH),筛选器异常,以及__asm的扩展 一丶__Asm的扩展知识 ①丶使用关键字,解决局部变量申请问题 昨天已经介绍了__asm的基本用法,...

    IBinary
  • Python网络爬虫笔记(五):下载、分析京东P20销售数据

    1、      翻页的时候,谷歌F12的Network页签可以看到下面的请求。(这里的翻页指商品评价中1、2、3页等)

    free赖权华
  • 刚刚,小灰 “逃学” 被抓了!

    今天是周末,咱们就不聊技术了,小灰给大家分享一件有趣的事情,这是小灰的前两天的亲身经历。

    小灰
  • 浅谈ClickableSpan , 实现TextView文本某一部分文字的点击响应

    听着music睡

扫码关注云+社区

领取腾讯云代金券