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.测试下吧,是不是分好了库?