SlorCloud关于关于ClusterState says we are the leader 问题

这几天检查solrCloud集群发现有些集群有问题,索引没有在建,我的集群有些core中leader选举错了,主要集中问题描述的的三个问题上。

问题描述

集群环境介绍:
4个core,每个core4个shard,每个shard有三个节点,其中一个是leader,两外两个是备份节点。

1、org.apache.solr.common.SolrException: ClusterState says we are the leader (http://59.77.244.196:8983/solr/weibo),​ but locally we  don't think so. Request came from http://59.77.244.192:8985/solr/weibo/
2、Error registering SolrCore:org.apache.solr.common.SolrException: Error getting leader from zk for shard shard1
3、There was a problem finding the leader in zk:org.apache.solr.common.SolrException: Could not get leader props

这个问题很棘手啊,我开始根据关键词去百度谷歌找些资料来查看什么原因,不过答案还是太杂了,不太懂,后来在一个讨论群里群主告诉我要修改集群的配置文件,我就尝试一下,后来发现两个办法可以解决,于是做个笔记,下次碰到了也好解决。

问题解决(一)

环境:solr4.4 + jetty + zookeeper(外搭) + ubantu 系统

简单粗暴的做法就是重启所有zookeeper服务和solr服务,但是我有3个zookeeper服务,12个solr节点,全部重启真是太蛋疼了,建议还是用第二种办法,不过第二种办法要求你最好是懂一些zookeeper编程的操作,否则也是很蛋疼,我会贴出代码,不过一些jar包就靠你们摸索了。

问题解决(二)

环境:solr4.4 + jetty + zookeeper(外搭) + ubantu 系统

步骤一:拷贝自己solr集群中的clusterstate.json文件内容

你可以通过zookeeper的zkCli.sh来得到,需要你懂一些相关命令,或者你直接在如图下的路径就可以找到该文件,还可以在界面看到配置信息,将配置信息拷贝出来放进本机的一个文件中。
集群配置信息

步骤二:修改配置信息

这里修改配置信息是因为leader的节点弄错了,所以要修改步骤一得到的clusterstate.json信息,接下来我会贴出部分信息给大家看:
假设core1是正常没有出现leader选举出错的core信息,core2是有问题的。

core1中的配置信息:
"shard1":{
    "range":"80000000-bfffffff",
    "state":"active",
    "replicas":{
      "core_node1":{
        "state":"active",
        "core":"forum",
        "node_name":"59.77.244.196:8983_solr",
        "base_url":"http://59.77.244.196:8983/solr"},
      "core_node5":{
        "state":"active",
        "core":"forum",
        "node_name":"59.77.244.196:8984_solr",
        "base_url":"http://59.77.244.196:8984/solr",
        "leader":"true"},      #------------------------------注意看这里-----------------#
      "core_node9":{
        "state":"active",
        "core":"forum",
        "node_name":"59.77.244.199:8984_solr",
        "base_url":"http://59.77.244.199:8984/solr"}}},
        信息中我们看到  shard1的leader节点是59.77.244.196:8984,因为他有一个字段是  "leader":"true"。

        core2中的配置信息:
        "shard1":{
    "range":"80000000-bfffffff",
    "state":"active",
    "replicas":{
      "core_node1":{
        "state":"active",
        "core":"forum",
        "node_name":"59.77.244.196:8983_solr",
        "base_url":"http://59.77.244.196:8983/solr",
        "leader":"true"},     #------------------------------注意看这里-----------------#
      "core_node5":{
        "state":"active",
        "core":"forum",
        "node_name":"59.77.244.196:8984_solr",
        "base_url":"http://59.77.244.196:8984/solr"},
      "core_node9":{
        "state":"active",
        "core":"forum",
        "node_name":"59.77.244.199:8984_solr",
        "base_url":"http://59.77.244.199:8984/solr"}}},
        core2信息中leader是59.77.244.196:8983,所以要修改成core1中信息,把字段修改到59.77.244.196:8984中。

 假设你已经修改好了,已经把错误的信息修改过来了,那么接下来你应该是把配置信息上传到zookeeper集群中,代码如下:

    private static final int TIMEOUT = 3000;
    static final String urlport = "59.77.244.199:2181";
    public static void main(String[] args) throws KeeperException, InterruptedException{
    ZooKeeper zkp;
    try {
        zkp = new ZooKeeper(urlport, TIMEOUT, null);
        Stat stat = zkp.exists("/clusterstate.json",true);
        zkp.setData("/clusterstate.json",readfile("D:\\ceshi\\clusterstate.json").getBytes(),-1);
        byte[] bytes=zkp.getData("/clusterstate.json",null,stat);
        System.out.println("得到的节点信息:"+new String(bytes));
    } catch (IOException e) {
        System.out.println( "连接创建失败,发生 IOException" );   
        e.printStackTrace();            
    }
}
readfile("D:\\ceshi\\clusterstate.json") 就是读取本地的一个文件内容,这个不难,自己写一个函数就行
当然各位根据自己的集群环境作进一步的修改。

经过上述两步,你的集群leader节点已经转移到你修改的ip:端口上去了,过几秒钟,你会看到solrcloud集群界面。

这个时候你出问题的shard上的其他两个节点可能还是有问题的,节点状态是:Down,当然没有问题最好,如果有问题,你这个时候去Linux服务器里kill掉这两个节点服务,然后重启这两个服务,过几秒种,节点状态就是:Active,这样你就可以开始建索引。

结束语

solr服务总是会出现各种各样的问题,后来我想了一下,可能是服务器资源被占用了,然后solr服务被挤掉了,一直没有连接上去,导致solr集群选举机制的通讯出现了延迟,结果就是不知道谁是leader,哎,java一个程序启动就要吃掉2、3G的内存,真是蛋疼,没办法,服务器不够,一个服务器上最好不要有太多的程序在跑,不然那你会发现各种各样的问题的。

文章目录
  1. 1. 问题描述
  2. 2. 问题解决(一)
  3. 3. 问题解决(二)
    1. 3.1. 步骤一:拷贝自己solr集群中的clusterstate.json文件内容
    2. 3.2. 步骤二:修改配置信息
  4. 4. 结束语
文章目录
  1. 1. 问题描述
  2. 2. 问题解决(一)
  3. 3. 问题解决(二)
    1. 3.1. 步骤一:拷贝自己solr集群中的clusterstate.json文件内容
    2. 3.2. 步骤二:修改配置信息
  4. 4. 结束语
,