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都是一样的。
from internet
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值