elasticsearch更改node id生成方法

集群中节点的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
     protected void doStart() throws ElasticSearchException {
         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
         int port = address.address().getPort(); //获得端口
         String nodeId = host + port;
         
         localNode = new DiscoveryNode(settings.get( "name" ), nodeId, transportService.boundAddress().publishAddress(), nodeAttributes);
         latestDiscoNodes = new DiscoveryNodes.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

你可能感兴趣的:(elasticsearch更改node id生成方法)