暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

同城双活-DB篇

Hubble技术架构 2021-04-18
3409

1 引言

目前使用的主流数据库包含,Oracle、Mysql关系型数据库。
本文将讲解这2种数据库的同城双活方案,让你直观的了解数据库怎样实现两地三中心的双活高可用架构;

2 双活架构

    2.1 ORACLE篇

ORACLE常规架构

1:数据集群本身,采用高可用的RAC架构,默认IDC数据库支持读写操作,双活IDC数据库只支持读操作;

2:常规情况下,双活IDC数据库还承担LDR、ADG、温备等角色;

3:常规情况下,默认IDC和双活IDC的应用全部连接默认IDC的数据库;

4:常规情况下,默认IDC的数据会通过Dataguard的方式把数据同步到双活IDC的数据库中;

5:应用通过域名(通过域名对应用进行数据库切换)方式连接数据库,不能使用IP方式进行连接;

ORACLE容灾切换后架构
1:切换后应用需全部连接到双活IDC的数据库,此时双活IDC数据库成了主数据库,支持读写操作;
2:同时原默认IDC的数据库变成了从数据库,只支持读操作;
3:切换后,数据同步的转换,会变成双活IDC数据库同步到默认IDC数据库;
    2.2 Mysql篇

常规架构

Mysql高可用架构:主从复制+MHA(Master High Availability),灵活方便,低成本,可用性较高,当半同步降级时发生主从切换会有少量数据丢失

1:应用全部连接Mysql集群的Master节点,支持读写操作;

2:Slave节点支持只读操作;

3:当Master出现故障,MHA会自动识别,并把一个Slave节点提升为Master节点;

4:MHA本身的高可用由MHA Manager(Backup)来支持,MHA Manager(主)挂了后,需要启动备用 MHA Manager来工作;

5:切换到同IDC-A的Slave1支持自动主从切换,跨IDC-B的Slave2节点不支持自动主从切换,如果IDC-A出现故障,需要手工将IDC-B的节点手工启用,并切换为Master,并修改域名DNS解析;

Mysql容灾切换后架构

1:IDC级别的容灾切换,需要手工切换Mysql Master节点,也就是把原来IDC-B的Slave切换为Mater节点,并切换DNS解析到IDC-B这边;

2:由于是主从复制的架构,当半同步降级时发生主从切换会有少量数据丢失;

3 切换注意事项

1、数据库同步时效指标:Oracle/MySQL数据库规范约定,RPO同城小于5分钟,跨中心小于15分钟。

2、跨数据中心的切换时效指标:跟应用系统RPO关联。

若应用可以接受数据损失,比如5分钟RPO,则仅依赖切换时间,大概1~2分钟完成;
若应用不能接受数据损失,则需进行数据检查和补偿,则大概10~15分钟。
3、数据一致性和可用性的权衡:不同应用系统可以选择不同的策略,根据自身的业务特点确定优先保证一致性或者优先可用性。
4、被动切换和主动切换
       主动切换:DBA需要跟业务系统进行沟通,确认切换时间窗口。
       被动切换:若为灾难性故障(比如数据中心级别),无法确定生产库的现行状态,无法保证数据的一致性;
       关于数据一致性,Oracle数据库的探讨方案是依靠采样、监控来尽量保证从库的同步延时在可控范围之内,对于MySQL,则未来跨数据中心更多地是会采用TDSQL方案。

5、跨数据中心切换的方法

       一是通过自动工具自动探测,结合日志等进行自动切换;

       二是授权值班同事,人工一键触发切换操作。

       目前切换需要人工确认。

6、切换之后应用系统的操作:需要应用系统评估,建议应用系统结合日志、监控、工具等给出切换的过程和切换的影响的报告,根据报告和指标确定后续具体处理操作。

7、切换对应用系统的要求

       修改为使用域名对接数据库;

       需要应用系统支持幂等;

       切换时效需要关注DNS Cache缓存(默认1分钟刷新)的问题

       应用系统连接数据库需要有超时机制,在DB出错的情况下,进行重连。

       要求每个应用系统都在测试环境进行切换模拟测试,观察表现;

8、数据库故障切换测试

       可由测试负责人和DBA测试接口人(段义强、刘雪峰)讨论切换测试步骤和方案,按照方案进行执行。

       分不同的测试场景:

        1)网络故障&恢复:网络恢复自动就会恢复,连接池会重建连接。

        2)数据库实例故障&恢复:如Oracle RAC架构,DBA直接进行切换即可,连接池会重建连接。

        3)存储故障&恢复: 涉及到数据库一致性问题,应用系统需要关注并确认数据一致性问题。

9、大事务的同步时延问题

     原则上不允许出现大事务,需要应用系统改造,可通过代码分析以及联系DBA确认是否有大事务存在。

10、切换的方法和流程:操作上会提供切换工具。流程上:

被动切换:一般是出现生产事务,通过电话会议(开发参与)决定是否发起切换;
主动切换:一般是在进行变更,遵守运营流程。
为解决数据库连接hold住的场景,需要先行停止原数据库服务一段时间,确保应用系统连接回新数据库后,才启动原数据库,确保切换。
Venus不会主动重建连接,需要有连接请求触发,或者通过Apollo触发重新初始化连接池。

11、切换从库后主库恢复正常是否切换回原主库,需要具体分析

如果观澜和保税区的主从数据库是对等的可以不回切。
另外需要考虑跨机房访问数据库对批量任务造成影响。

12、数据库连接池的配置

需要考虑单个机房承载100%流量对连接数配置的要求,主要对maxActive最大连接数的评估,需要满足100%流量带来的并发数。
4 数据库连接池

建议推荐使用druid,按内部架构给的连接池配置参数进行配置,这样配合域名DNS解析切换以便达到自动重连的目的;

应用系统要根据应用的SQL复杂度以及应用之间接口的超时合理配置超时参数

主要超时参数说明如下:

connectTimeout:连接超时,配置在url上,默认30s:

示例:jdbc:mysql://xxx.xx.xx.xxx:3306/xxx?connectTimeout=1000,单位s


socketTimeout:读取超时时间,配置在url,默认无,不超时:

示例:jdbc:mysql://xxx.xx.xx.xxx:3306/xxx?socketTimeout=60000,单位ms


loginTimeout:登录超时事件,配置在properties中,默认0,不超时:

示例:loginTimeout=2,单位s


maxWait:获取数据库连接最大等待时间,配置在properties中,默认-1,不超时:

示例:maxWait=3000,单位ms


queryTimeout:查询SQL超时时间,默认无,单位s,按需配置:

1、在连接池中设置:queryTimeout,优先级 3

2、在mybatis配置文件设置默认值:defaultStatementTimeout优先级 2

3、在mybatis mapper文件中对每一个sql方法设置timeout值 ,优先级 1

4、在JDBC Statement设置 setQueryTimeout ,优先级 1


transactionQueryTimeout:事务中操作SQL超时,默认无,按需配置:

示例:transactionQueryTimeout=10 ,单位s


5 问题和挑战

1 容灾切换时,域名DNS解析延迟:IDC-A与IDC-B连接数据库时,无论是oracle还是mysql都推荐适用域名进行连接,当发送容灾切换时,DNS解析对于应用是有延迟的,所以在切换时需要注意生效的时间是否能满足应用的要求

2 数据一致性:Oracle使用的是Dataguard同步数据,Mysql使用主从复制的方式同步数据(半同步,异步),双活IDC数据库节点会出现数据一致性问题,这个需要业务考虑清楚,故障切换带来的数据一致性问题

3 Mysql同城切换:Mysql的主从复制与MHA的架构,只支持同IDC的自动切换,如果发生IDC级别的故障,需要人工介入,手工启动同城容灾的数据库为Master节点,这里的操作与判断需要运营人员快速响应

6 总结

通过本文对数据库架构的剖析,了解到Oracle与Mysql双活架构以及容灾切换,更好的知道自己的应用如何使用数据库;
数据库双活通过域名切换,对应用本身来说是透明,应用自身的双活与数据库的双活,两者不可缺失;



作者:陈强 (CHENQIANG747 ),网金研发团队架构师

在此感谢DBA团队王鹏冲、孙少卿的指导。

本文系个人观点,描述不当或不正确,欢迎指正。

文章转载自Hubble技术架构,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论