要实现读写分离必须满足如下条件:
- 必须在schema.xml中配置readHost(参见1.2 schemal.xml) 而且balance配置不为0。
- SQL语句为select 或者show。
- 在非事务中。
当然,也可以通过注释/*#dble:db_type=slave, ... / 或者/!dble:db_type=slave, ... */ 强制发从(参见2.4 Hint).
dble通过在writeHost下配置多个readHost为读操作提供负载均衡(参见1.2 schemal.xml)。负载均衡通过如下的链接获取来实现。链接获取有如下两个步骤:
1.选择候选主机集合(候选主机选择算法) 2.在候选主机集中随机选择(随机选择算法)
该算法在每次连接获取时提供可用的mysql实例集.
- 写节点正常(heartbeat状态正常)
- 写节点参与均衡
- 写节点为当前写节点且当前写节点参与均衡, 加入候选集合.
- 非当前写节点且需要同步状态检测,是否加入候选集合依同步状态而定. 需要同步状态的条件为: 配置了slavethreshold和心跳语句为show slave status.
- 非当前写节点且不需要同步状态检测,加入候选集合.
- 读节点
- 节点正常且需要同步状态检测,是否加入候选集合依同步状态而定.
- 节点正常且不需要同步状态检测,加入候选集合.
- 写节点参与均衡
- 写节点异常
- 如果配置读节点临时可用(参数tempreadhostavailable),是否加入候选集合同上读 节点 情况相同.
该算法在候选主机集中选择一个mysql实例以便获取连接.
- 候选主机集为空,选择当前写主机.
- 候选主机集为非空
- 有权重设置(weight参数), 但不是所有权重等值, 依权重随机选择.
- 无权重设置或所有权重等值, 等权随机选择。此种情况指示上面情况的特例。