读写分离

最近更新时间:2019-09-20 14:59:46

1. 背景说明

云数据库 MariaDB 默认支持读写分离能力,架构中的每个从机都能支持只读能力,如果配置有多个从机,将由网关集群(TProxy)自动分配到低负载从机上。

2. 全局自动读写分离

云数据库 MariaDB 支持全局自动读写分离能力,即业务无需做任何改动,即将所有 SELECT 请求发送到从机;该功能为灰度发布功能,需 提交工单,说明“账号信息、实例所在地域、实例 ID、需开启自动读写分离,以及是否知悉全局读写分离风险”。

全局读写分离风险:从机天然存在数据延迟,全局自动读写分离即系统默认将所有 SELECT 请求发送到从机,并无任何策略(请参考只读账号的读写分离),因此可能导致业务读取到不可控的历史数据,造成数据失真,该功能仅建议用于对数据一致性无要求的业务系统。

注意:

您一旦提交工单开启该功能,即您已经确认自身业务系统能够承担该类风险。

3. 基于只读帐号的读写分离

只读帐号是一类仅有读权限的账户,其默认从数据库集群中的从机(或只读实例)中读取数据。MariaDB 可以在【帐号管理】功能中,设置只读帐号和读策略,如下图:

在只读帐号设置选项中,您可以设置【只读请求分配策略】,定义在备机故障(或延迟较大)时的读策略。【只读备机延迟参数】,定义数据同步延迟时间,并与“只读请求分配策略”配合使用,如下图:

配置建议:
假设您设计的是某交易系统:

  • 核心交易模块:设置常规帐号,可读写。
  • 余额查询模块:设置只读帐号,默认读备机;请求分配策略:备机故障读主机,并将延迟参数设置在十秒内;以保证主从性能和用户查询的数据一致性。
  • 批量查询模块:设置只读帐号,默认读备机;请求分配策略:备机故障报错,延迟参数可设置在三十秒以上;以保证不影响主库性能。

另外,由于强同步机制是将数据写入从机事务日志后,即返回应答,这时从机库表数据可能并未更新,因此也会有延迟。

4. 基于注释的读写分离

在每条需要从机“读”的 SQL 前,增加/*slave*/字段,并且 mysql 后面要增加 -c 参数来解析注释mysql -c -e "/*slave*/sql",即可自动将读请求分配到从机,示例如下:

//主机读//
select * from emp order by sal,deptno desc;
//从机读//
/*slave*/ select * from emp order by sal,deptno desc
注意:

  • 该功能仅支持从机读(select),不支持其他操作,非 select 语句将失败。
  • mysql 客户端需要增加 -c 参数来解析注释
  • /*slave*/必须为小写,语句前后无空格。
  • 从机出现异常而影响到MAR(强同步)机制时,从机读操作将自动切换回主机。

5. 支持只读实例(异地只读实例)

如果上述读写分离方案仍无法满足您的需求,云数据库 MariaDB 提供只读实例供您使用。只读实例是独立的数据库实例,不参与原主实例高可用切换,仅用于读性能扩展。现在对部分客户开启该能力,如有需要,请联系您的专职商务、架构师、售后。