特性
- 会话不开启事务,读语句直接发送到slave执行。
- 会话开启事务,读语句发送到master上执行。这样才能保证同个事务内的数据可见。
开启读写分离
DRDS使用以下两种方式开启读写分离功能:
- 配置DRDS balance参数。
- 在select语句前增加 /* !HINT({"balance":"?"})*/ 注解。
方式一:读写分离属性配置
操作步骤:选择目标实例的【管理 > 分组管理】,选择默认分组的【关联MySQL设置 > 设置属性】。部分资源池需要先点击【更多】,再点击【关联MySQL设置】。
页面上读写分离配置的“关闭”,“读语句发往读库”,“读语句随机发往读库和写库”选项:
- “关闭”:表示不开启读写分离,所有语句发往写节点。
- “读语句发往读库”:表示开启读写分离,所有事务外(autocommit=1)的select语句发往读节点;所有事务内(autocommit=0)的语句发往写节点。
- “读语句随机发往读库和写库”:表示开启读写分离,所有事务外(autocommit=1)的select语句随机发往读节点或写节点;所有事务内 (autocommit=0)的语句发往写节点。
方式二:HINT语句
使用 /* !HINT({"balance":"?"})*/ 注解可以强制指定 select 语句按照指定规则进行读写分离, balance 有三种取值方式,与DRDS的 balance 属性类似:
- /* !HINT({"balance":"0"})*/ 强制 select 语句发往写节点 。
- /* !HINT({"balance":"1"})*/ 强制 select 语句发往读节点 。
- /* !HINT({"balance":"2"})*/ 强制 select 语句随机发往数据库读节点或写节点。
注意
insert, update, delete语句在任何情况下都将发往写节点,所以读写分离实际只针对select语句。
/* !HINT({"balance":"?"})*/ 的读写分离规则优先级高于配置 balance 属性。
配置 balance 属性进行读写分离需结合 autocommit=1 使用,而 /* !HINT({"balance":"?"})*/ 方式不需要。