本文介绍了读写分离类的Hint语法。

本文适用于DRDS 5.3及以上版本。

DRDS提供了一种针对应用层透明的读写分离实现。但是由于RDS主实例与只读实例之间数据的同步存在着毫秒级别的延迟,如果在主库中变更以后需要马上读取变更的数据,则需要保证将读取数据的SQL下发到主实例中。针对这种需求,DRDS提供了读写分离自定义HINT,指定将SQL下发到主实例或者只读实例。

语法

/*+TDDL:
    master()
    | slave()
*/          

在该自定义HINT中可以指定SQL是在主实例上执行还是在只读实例上执行。对于/*+TDDL:slave()*/,如果一个主RDS实例存在多个只读实例,那么DRDS会根据所分配的权重随机选择一个只读实例执行SQL语句。

注意事项

  • DRDS自定义HINT支持/*+TDDL:hint_command*//!+TDDL:hint_command*/两种格式。
  • 如果使用/*+TDDL:hint_command*/格式,在使用MySQL官方命令行客户端执行带有DRDS自定义HINT的SQL时,请在登录命令中加上-c 参数。否则,由于DRDS自定义HINT是以MySQL 注释形式使用的,该客户端会将注释语句删除后再发送到服务端执行,导致DRDS自定义HINT失效。具体请查看MySQL 官方客户端命令

示例

  • 指定SQL在主实例上执行:
    SELECT /*+TDDL:master()*/ * FROM table_name;               

    在SQL第一个关键字之后添加/*+TDDL:master()*/这个自定义HINT后,这条SQL将被下发到主实例上执行。

  • 指定SQL在只读实例上执行:

    SELECT /*+TDDL:slave()*/ * FROM table_name;               

    在SQL第一个关键字之后添加/*+TDDL:slave()*/这个自定义HINT后,这条SQL将会根据所分配的权重被随机下发到某个只读实例上执行。

    说明
    • 此读写分离自定义HINT仅仅针对非事务中的读SQL语句生效,如果SQL语句是写SQL或者SQL语句在事务中,那么还是会下发到RDS的主实例执行。
    • DRDS针对/*+TDDL:slave()*/自定义HINT,会从只读实例中按照权重随机选取一个下发SQL语句执行。若只读实例不存在时,不会报错,而是选取主实例执行。