关于solr+zookeeper 集群,配置文档可参考:(转)https://blog.csdn.net/XiaHeShun/article/details/82026813
其中需要注意的是
1.修改solr配置文件:
<solrcloud>
<str name="host">solr_IP</str>
<int name="hostPort">8983</int>
<str name="hostContext">${hostContext:solr}</str>
<int name="zkClientTimeout">${zkClientTimeout:30000}</int>
<bool name="genericCoreNodeNames">${genericCoreNodeNames:true}</bool>
</solrcloud>
2.
为了 zookeeper 统一管理配置文件。需要把 solrhome下collection1/conf 目录上传到 zookeeper。
/scripts/cloud-scripts目录 ,执行下列命令
./zkcli.sh -zkhost ZK_IP:2181 -cmd upconfig -confdir /collection/conf -confname myconf
其中:zk_ip为ZK的ip,2181为ZK端口。
启动solr
集群
./bin/solr start -c -z ZK_IP_1:PORT_1,ZK_IP_2:PORT_2,ZK_IP_3:PORT_3
单机
./bin/solr start -c -z ZK_IP:PORT
3.cloudSolr + spring
配置文件spring-solr
<bean id="cloudSolrClient" class="org.apache.solr.client.solrj.impl.CloudSolrClient">
<constructor-arg index="0" value="127.0.0.1:2181"/>
<property name="defaultCollection" value="core"/>
</bean>
index=0 对应的是ZK的 ip:port
4.获取solr连接对象
public class ExtractorContextLoaderHelper implements ApplicationContextAware{
private static ApplicationContext applicationContext;
public static ApplicationContext getApplicationContext() {
return applicationContext;
}
@Override
public void setApplicationContext(ApplicationContext applicationContext)
throws BeansException {
ExtractorContextLoaderHelper.applicationContext=applicationContext;
}
/**
* 获取定义在Spring配置文件里的bean实例
* @param beanName Spring配置文件里的bean注册名
* @return bean实例(没有找到返回null)
*/
public static Object getBean(String beanName) {
return applicationContext.getBean(beanName);
}
}
public class SolrConn {
private static CloudSolrClient solr;
public static CloudSolrClient getConnet(){
try {
ApplicationContext aContext = ExtractorContextLoaderHelper.getApplicationContext();
solr=aContext.getBean(CloudSolrClient.class);
if(null == solr){
throw new Exception("连接失败");
}
String zkHost=solr.getZkHost();// 获取zk地址
Set<String> liveNodes = solr.getZkStateReader().getClusterState().getLiveNodes();//获取solr连接地址
} catch (BeansException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
return solr;
}
}