这几天检查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的内存,真是蛋疼,没办法,服务器不够,一个服务器上最好不要有太多的程序在跑,不然那你会发现各种各样的问题的。