数据库代理最佳实践
使用Hint语法实现RDS for MySQL读写分离
在读写分离权重分配体系之外,Hint可以作为另外一种SQL补充语法来指定相关SQL到主节点或只读节点执行。
- Hint注释仅作为路由建议,非只读SQL、事务中的场景不能强制路由到只读节点。
- 使用MySQL命令行进行连接并使用Hint语句时,需要在命令中增加-c选项,否则Hint会被MySQL命令行工具过滤。
可以在SQL开头添加hint注释进行强制路由。
/*FORCE_MASTER*/强制路由到主节点;
/*FORCE_SLAVE*/强制路由到只读节点;
例如:select * from table1默认会路由到只读节点,如果改为/*FORCE_MASTER*/ select * from table1就会路由到主节点。
/*FORCE_MASTER*/只能在可读可写的地址上生效,对于只读地址即使使用//*FORCE_MASTER*/也不会路由到主节点。
连接池设置
使用连接池时,需要设置连接探活机制(如jdbc连接池和Druid连接池设置testOnBorrow=true,HikariCP连接池设置connectionTestQuery="SELECT 1"),确保部分连接超时断开时不会被继续使用。
读请求路由到主实例的场景
- 如果查询语句被放在事务中,事务请求都会路由到主实例,若在查询语句前设置set autocommit=0也会被当做事务处理路由到主实例。
- 如果无只读实例或所有只读节点均异常、只读节点权重为0时,则查询会路由到主实例。对于成功开启读写分离功能的实例,您可以设置其主实例和只读实例的权重。具体操作请参见设置延时阈值和路由模式。
- 如果执行了Multi-Statements(如“insert ***;select ***”),当前连接的后续请求会全部路由到主节点,需断开当前连接并重新连接才能恢复读写分离。
- 带锁的读操作(如SELECT for UPDATE)会被路由到主节点。
- 当使用/*FORCE_MASTER*/这个Hint语句时,会被路由到主实例。