MySQL sharding use maxScale

MaxScale采用filter方式进行分表,因此需要在每个执行的语句上加上/*server_id-1*/这种标识符,以实现大表拆分
1.在PHP层级封装分库计算方法

0 && $max_server>1) {
        return $merchant_id % $max_server;
    }
    else{
        return 1;
    }
}

/**
 * 水平拆分数据表,采用注释方式
 * @param $merchant_id  店铺ID
 */
function split_db($merchant_id){
    $algorithm = C('DB_SPLIT_ALGORITHM');
    $max_server = C('DB_SPLIT_MAXSERVER');
    $id = 1;
    switch ($algorithm) {
        case "AVERAGE":
            $id = split_average($merchant_id, $max_server);
        break;
    }
    return "server_id-".$id;
}
?>

2.在所有的逻辑层代码中,数据库的Model操作上加上comment方法,示例如下

        $result = $this->itemModel->where($where)
            ->order('outer_id desc' )
            ->comment(split_db($this->getApp()['id']))
            ->select();
        return $result;

3.在maxScale层加上过滤器

[NamedServerFilter]
type=filter
module=namedserverfilter
match=server_id-1
server=prod1

[NamedServerFilter]
type=filter
module=namedserverfilter
match=server_id-2
server=prod2

[MyService]
type=service
router=readwritesplit
servers=prod1,prod2
user=myuser
passwd=mypasswd
filters=NamedServerFilter

4.测试下吧,是不是分好了库?

关于Zeno Chen

本人涉及的领域较多,杂而不精 程序设计语言: Perl, Java, PHP, Python; 数据库系统: MySQL,Oracle; 偶尔做做电路板的开发,主攻STM32单片机
此条目发表在MySQL分类目录。将固定链接加入收藏夹。