« 逻辑连接层与物理连接层 »
Tools » http://www.anysql.net/tools/webchart-logical-dbaccess.html 2010-01-20为了更好地利用MySQL的廉价复制(Slave)功能, 在DataReport的数据库连接层中增加了逻辑连接层, 原来是直接指定物理边接层. 当然数据库连接池还是在物理连接层实现的, 逻辑连接层则可以指定一种关系, 然后根据关系来获得指定的数据库物理连接, 当应用使用逻辑连接层来访问时, 其实是自动根据关系挑选一个物理连接.
还是举一个例子来说明一下, 比如你有一台主MySQL库(master)后面挂了三台从MySQL库(Slave), 然后用DataReport去搭建一个以读为主的应用, 希望DataReport能首先随机挑选三个Slave库中的一台进行读取, 如果三台Slave都不行, 则从Master进行读取.
首先定义四台MySQL数据库的连接, 称为物理层的配置.
PHYSICAL.DBLIST=MASTER|SLAVE1|SLAVE2|SLAVE3
然后定义逻辑连接层, 以实现上面的要求.
LOGICAL.DBLIST=writedb|slavedb|readdb
LOGICAL.WRITEDB=FIRST|MASTER
LOGICAL.SLAVEDB=RANDOM|SLAVE1,SLAVE2,SLAVE3
LOGICAL.READDB=FAILOVER|SLAVEDB,WRITEDB
其中FIRST表示读取第一个连接池, RANDOM表示从后面的连接中随机选一个, FAILOVER表示第一个失败的话,取下一个. 通过这三种关系, 就实现了我们的要求. 然后给物理连接池及每个逻辑连接都加上状态判断, 当遇到连接关闭的错误时, 就将相应的连接池标记为不可用(Markdown), 逻辑库层可以主动跳过已经被Markdown的下一级节点, 按照规则查找到一个可用的物理数据库连接.
在DataReport中还设置了一个守护进程, 会每分钟检查各个Markdown的物理连接池, 偿试去Markup, 一当出现意外的物理库回到正常状态, 就可以提供服务, 使应用保持高可用状态.


这个功能对应用来说透明么?是不是只要改配置文件即可?
对于读操作, 应用上感觉是透明的, 但前提是应用并不在意复制的时延.
[...] 上一次只想到了逻辑逻辑层和物理连接层之间的三种关系, 等价(FIRST), 随机(RANDOM), [...]
[...] 从应用架构角度出发, 为DataReport增加了逻库连接层后, 为了与物理连接层清晰地分开, [...]