代理实例使用限制
更新时间:2023-08-24
概览
本文主要介绍代理实例使用要求。
需求场景
适用于有代理实例使用需求的用户,用于快速了解云数据库RDS的代理实例。
方案概述
读写分离原则
- 事务、写请求或同一个session写请求之后一段时间(默认200ms)内的读,会发往主库。
- 读写分离不保证非事务读的一致性,业务上有一致性需求的查询,请封装到事务。
对业务要求
- 业务有连接探活或超时机制。超时时间为:前端超时时间 < 代理超时时间 < MySQL超时时间。
- 业务端有重试机制。
暂不支持功能
- 不支持通过代理实例调用用户自定义函数。
- 不支持old_password=ON。
- 不要用select执行带有写操作的SQL,因为会被发往从库执行。
- set autocommit语句只支持set autocommit=1/0,不支持set autocommit=on/off。
不推荐使用的功能
- 如下命令的执行结果具有随机性,会根据执行时所连接的实例返回响应结果:show processlist、show master status、show slave status。
- 不推荐客户端使用连接池功能,因为代理实例已经提供了连接池。
- 不推荐长连接中使用prepare,因为cpu使用率偏高,会有性能下降。
- 不保证上下文相关函数的正确性,这些函数包括row_count、last_insert_id等。这些函数建议用编程语言的客户端API代替,如C和PHP的API中mysql_affect_rows函数可以代替row_count,mysql_insert_id函数可以代替last_insert_id。
其他
- 针对found_rows函数,目前dbproxy支持增加SQL_CALC_FOUND_ROWS标识的方式 SELECT SQL_CALC_FOUND_ROWS … from …,并且found_rows只有紧跟SELECT SQL_CALC_FOUND_ROWS … from …后发送有效。
- 字段名/字段值可能被识别为for update/lock in share mode关键词,而发往主库。
- 字段名/字段值含有分号会被作为multiquery发往主库处理。
- for update/lock in share mode,严格匹配关键词,多余空格可能会导致无效而发往从库。
相关产品
云数据库 SCS:兼容 Redis、Memcached 协议的分布式缓存服务。
云数据库 DocDB for MongoDB:兼容 MongoDB 协议的文档数据库服务。