簇的选择

当你对应一个创建一个新的记录时,OrientDB自动选择一个来存储这条记录。有一些配置策略,你可以用来决定OrientDB选择合适的簇来存储新的记录。

  • default 选择类中的属性defaultClusterId对应的簇。 1.7以前, 这是默认的方法。

  • round-robin 按照配置的簇的列表,依次记录。

  • balanced 根据类配置的簇,校验每个簇的记录数,将新记录分配到最小的簇。 为了避免导致插入延迟的问题,OrientDB 每隔5s甚至更长计算一次。

  • local 当数据库分布式部署时,会选择当前节点的master簇。这样可以有助于避免冲突,减少节点间远程调用的网络延迟。

你可以通过ALTER CLASS...CLUSTERSELECTION命令来修改策略。例如:

orientdb> ALTER CLASS Account CLUSTERSELECTION round-robin

自定义簇选择策略

除了上面列出的策略,你可以通过JAVA API自己开发策略。

  1. 通过实现OClusterSelectionStrategy接口,来自定义策略,代码如下:

    package mypackage;
    public class RandomSelectionStrategy implements OClusterSelectionStrategy {
       public int getCluster(final OClass iClass, final ODocument doc) {
          final int[] clusters = iClass.getClusterIds();
    
          // RETURN A RANDOM CLUSTER ID IN THE LIST
          return new Random().nextInt(clusters.length);
       }
    
       public String getName(){ return "random"; }
    }
    

    牢记getCluster()方法也可以接受ODocument作为参数,这样就可以基于文档的内容决定存储的clusterId

  2. 把你的策略进行注册,在源代码的core模块的目录META-INF/service下,找到文件com.orientechnologies.orient.core.metadata.schema.clusterselection.OClusterSelectionStrategy(没有就创建),添加如下内容:

    mypackage.RandomSelectionStrategy
    

    默认就包含如下内容:

    com.orientechnologies.orient.core.metadata.schema.clusterselection.ORoundRobinClusterSelectionStrategy
    com.orientechnologies.orient.core.metadata.schema.clusterselection.ODefaultClusterSelectionStrategy
    com.orientechnologies.orient.core.metadata.schema.clusterselection.OBalancedClusterSelectionStrategy
    
  3. 在数据库的命令行,通过ALTER CLASS...CLUSTERSELECTION命令指定策略,random对应上面的getName()方法。

    orientdb> ALTER CLASS Employee CLUSTERSELECTION random