elasticsearch更改node id生成方法

来源:互联网 发布:淘宝上淘口令怎么生成 编辑:程序博客网 时间:2024/05/02 04:19
集群中节点的id是由discovery定义的,默认es有两种实现方式,一种是
org.elasticsearch.discovery.local.LocalDiscovery
表示把es的节点启动在同一个jvm的环境下,这样就可以通过AtomicLong来进行数字递增的id生成。
另一种是
org.elasticsearch.discovery.zen.ZenDiscovery
它是分布式环境下的节点发现机制,由于是分布式环境,数字递增形式比较难行得通,于是在zenDiscovery里面是使用64位的uuid来作为节点id。每次节点重启其id都是会变的,重新生成一个uuid,这与我的期望不符合,所以只能通过修改源码来解决。我这的需求就是每个节点必须有唯一的一个id,并且这个id不能变,考虑了下决定通过ip+端口的方式来作为节点的id,比如127.0.0.1:9300的节点id就是1270019300。下面是修改的源码。在ZenDiscovery这个类下
@Override
    protectedvoid doStart() throwsElasticSearchException {
        Map<String, String> nodeAttributes = discoveryNodeService.buildAttributes();
        // note, we rely on the fact that its a new id each time we start, see FD and "kill -9" handling
        //String nodeId = UUID.randomBase64UUID();原来的方法,生成64位的uuid
        InetSocketTransportAddress address = (InetSocketTransportAddress)transportService.info().getAddress().publishAddress();
        String host = address.address().getAddress().getHostAddress().replace(".","");//获得ip
        intport = address.address().getPort();//获得端口
        String nodeId = host + port;
         
        localNode = newDiscoveryNode(settings.get("name"), nodeId, transportService.boundAddress().publishAddress(), nodeAttributes);
        latestDiscoNodes = newDiscoveryNodes.Builder().put(localNode).localNodeId(localNode.id()).build();
        nodesFD.updateNodes(latestDiscoNodes);
        pingService.start();
 
        // do the join on a different thread, the DiscoveryService waits for 30s anyhow till it is discovered
        asyncJoinCluster();
    }
这样的话每次节点启动生成的nodeid都是一样的。
 
参考地址:http://www.searchtech.pro/elasticsearch-unique-node-id
0 0
原创粉丝点击