彻底解决数据库去中心化问题

来源:互联网 发布:ios更新系统 数据丢失 编辑:程序博客网 时间:2024/04/18 11:36

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 PartionsHorizontalPartition hp = vp.getHorizontalPartition(horizontalPartionKey)Group group = hp.getGroup();//clusterif (isWriteOrCriticalRead (sql))return group.getMaster().execute(sql);elsereturn group.loadBalancer().getASlave().execute(sql);





0 0
原创粉丝点击