当前位置: 首页 > elasticsearch, 搜索 > 正文

elasticsearch源码解读:shard分片规则

1 星2 星3 星4 星5 星 (暂无评分)
Loading ... Loading ...
baidu_share

elasticsearch在建立索引时,根据id或id,类型进行hash,得到hash值与该索引的文档数量取余,取余的值即为存入的分片。具体源码为:PlainOperationRouting类的shardId方法进行分片。

private int shardId(ClusterState clusterState, String index, String type, @Nullable String id, @Nullable String routing) {
        if (routing == null) {
            if (!useType) {
                return Math.abs(hash(id) % indexMetaData(clusterState, index).numberOfShards());
            } else {
                return Math.abs(hash(type, id) % indexMetaData(clusterState, index).numberOfShards());
            }
        }
        return Math.abs(hash(routing) % indexMetaData(clusterState, index).numberOfShards());
    }

elasticsearch实现hash的类有DjbHashFunction类和SimpleHashFunction类。

SimpleHashFunction类的hash基于java的hashcode方法进行生成。

public class SimpleHashFunction implements HashFunction {
 
    @Override
    public int hash(String routing) {
        return routing.hashCode();
    }
 
    @Override
    public int hash(String type, String id) {
        return type.hashCode() + 31 * id.hashCode();
    }
}

DjbHashFunction是由Daniel J. Bernstein实现的一个hash类,为elasticsearch选用的hash实现类。

public class DjbHashFunction implements HashFunction {
 
    public static int DJB_HASH(String value) {
        long hash = 5381;
 
        for (int i = 0; i < value.length(); i++) {
            hash = ((hash << 5) + hash) + value.charAt(i);
        }
 
        return (int) hash;
    }
 
    public static int DJB_HASH(byte[] value, int offset, int length) {
        long hash = 5381;
 
        final int end = offset + length;
        for (int i = offset; i < end; i++) {
            hash = ((hash << 5) + hash) + value[i];
        }
 
        return (int) hash;
    }
 
    @Override
    public int hash(String routing) {
        return DJB_HASH(routing);
    }
 
    @Override
    public int hash(String type, String id) {
        long hash = 5381;
 
        for (int i = 0; i < type.length(); i++) {
            hash = ((hash << 5) + hash) + type.charAt(i);
        }
 
        for (int i = 0; i < id.length(); i++) {
            hash = ((hash << 5) + hash) + id.charAt(i);
        }
 
        return (int) hash;
    }
}

本文固定链接: http://www.chepoo.com/elasticsearch-source-interpretation-shard-slicing-rules.html | IT技术精华网

elasticsearch源码解读:shard分片规则:等您坐沙发呢!

发表评论