1)首先垂直切分,按业务模块把一些紧密联系的表分在一起(按表切分),形成一个抽象的vertical partition
2)水平切分。垂直切分之后的单个vertical partition(甚至其中单个表)仍然可能太大,一个server放不下,进一步按行切分,这时候需要选择一个聚合根作为记录的horizontal partiotion的标志,一般是userId,对于Forum模块,forumId是聚合根,模块所有表都有这个聚合根字段,userId % number of horizontal partitions (这是map的一种方式)就映射到一个horizontal partition
3) Group(集群),一个水平partition不是对应一个Server而是一个Group,一个Group由一个master和多个slave组成,进行读写分离和负载均衡,因为数据已经经过了水平和垂直切分,量已经大大减小,所以group一般一个master就可以了
4)一个Group 对应一个Load balancer, 对于写请求和实时性要求高的读请求,分配给master,否则分配一个slave
总结一下主要的role:
RR: route rule, 其实还可以进一步分为vertical RR 和 horizontal RR
vertical partition
horizontal partition
Group,LoadBalancer,Fault Detector
伪代码:
DAL dal = getDAL();
String tableName = getTableName(sql);
VerticalPartition vp = dal.getVerticalPartition(tableName);
String horizontalPartionKey = getHorizontalPartionKey(sql)//聚合根
//something like horizontalPartionKey.hashCode() % num of Horizontal Partions
HorizontalPartition hp = vp.getHorizontalPartition(horizontalPartionKey)
Group group = hp.getGroup();//cluster
if (isWriteOrCriticalRead (sql))
return group.getMaster().execute(sql);
else
return group.loadBalancer().getASlave().execute(sql);