本文以solr-5.5.2讲述solr+tomcat的单机分布式的部署
准备工作:
1、JDK1.7
2、zookeeper-3.5.1-alpha.tar.gz
5、CentOS release 6.6
关键字说明:
Collection:在SolrCloud集群中逻辑意义上的完整的索引。它常常被划分为一个或多个Shard,它们使用相同的Config Set。如果Shard数超过一个,它就是分布式索引,SolrCloud让你通过Collection名称引用它,而不需要关心分布式检索时需要使用的和Shard相关参数。
Core:也就是Solr Core,一个Solr中包含一个或者多个Solr Core,每个Solr Core可以独立提供索引和查询功能,每个Solr Core对应一个索引或者Collection的Shard,Solr Core的提出是为了增加管理灵活性和共用资源。在SolrCloud中有个不同点是它使用的配置是在Zookeeper中的,传统的Solr core的配置文件是在磁盘上的配置目录中。
Leader:赢得选举的Shard replicas。每个Shard有多个Replicas,这几个Replicas需要选举来确定一个Leader。选举可以发生在任何时间,但是通常他们仅在某个Solr实例发生故障时才会触发。当索引documents时,SolrCloud会传递它们到此Shard对应的leader,leader再分发它们到全部Shard的replicas。
Replica:Shard的一个拷贝。每个Replica存在于Solr的一个Core中。一个命名为“test”的collection以numShards=1创建,并且指定replicationFactor设置为2,这会产生2个replicas,也就是对应会有2个Core,每个在不同的机器或者Solr实例。一个会被命名为test_shard1_replica1,另一个命名为test_shard1_replica2。它们中的一个会被选举为Leader。
Shard:Collection的逻辑分片。每个Shard被化成一个或者多个replicas,通过选举确定哪个是Leader。
附图:这是我的目录结构
基于个人虚拟机的原因,全是用root用户操作的,若在开发中遇到不可预测错误,不排除权限问题造成。
Hadoop为zookeeper伪集群目录 详细就参考http://coolxing.iteye.com/blog/1871009、
A. 设置tomcat 复制三份tomcat,分别为tomcat8082、tomcat8083、tomcat8084,修改tomcat/conf/server.xml的各端口
B. 设置solrhome 复制三份solrhome,进入/root/solr/solr-5.5.2/server/solr,将solr复制三份,为了方便区别,命名为solrhome8082,solrhome8083,solrhome8084,并修改各solrhome下的solr.xml
<solr> <solrcloud> <str name="host">192.168.187.129</str>//tomcat的IP地址 <int name="hostPort">8082</int> //对应的tomcat端口 <str name="hostContext">/solr</str> //solr的webapp名字 <bool name="genericCoreNodeNames">${genericCoreNodeNames:true}</bool> <int name="zkClientTimeout">${zkClientTimeout:30000}</int> <int name="distribUpdateSoTimeout">${distribUpdateSoTimeout:600000}</int> <int name="distribUpdateConnTimeout">${distribUpdateConnTimeout:60000}</int> <str name="zkCredentialsProvider">${zkCredentialsProvider:org.apache.solr.common.cloud.DefaultZkCredentialsProvider}</str> <str name="zkACLProvider">${zkACLProvider:org.apache.solr.common.cloud.DefaultZkACLProvider}</str> </solrcloud> <shardHandlerFactory name="shardHandlerFactory" class="HttpShardHandlerFactory"> <int name="socketTimeout">${socketTimeout:600000}</int> <int name="connTimeout">${connTimeout:60000}</int> </shardHandlerFactory> </solr>
C.设置solr webapp
a) 进入/root/solr/solr-5.5.2/server/solr-webapp,将webapp复制三份,分别为solr8082、solr8083、solr8084,修改solr8082/WEB-INF/web.xml
<env-entry> <env-entry-name>solr/home</env-entry-name> <env-entry-value> /root/solr/solr-5.5.2/server/solrhome8082</env-entry-value> <env-entry-type>java.lang.String</env-entry-type> </env-entry>
solr8083、solr8084的修改大同,注意:默认以上代码是注释的
b) Copy对应的jar包到webapp/WEB-INF/lib下
1. 路径/root/solr/solr-5.5.2/server/lib/ext下的所有包
2. 路径/root/solr/solr-5.5.2/dist下的solr-dataimporthandler-5.5.2.jar,solr-dataimporthandler-extras-5.5.2.jar包,用于数据库导入数据
3. 上传mysql连接包mysql-connector-java-5.1.35.jar
4. 路径/root/solr/solr-5.5.2/dist下的solr-dataimporthandler-5.5.2.jar,solr-dataimporthandler-extras-5.5.2.jar包,用于数据库导入数据
c) 修改tomcat/conf/server.xml 各docBase需修改对应路径
<Context docBase="/root/solr/solr-5.5.2/server/solr-webapp/solr8082" path="/solr" reloadable="false" source="org.eclipse.jst.j2ee.server:solr"/>
D. 设置 JAVA_OPTS 进入tomcat8082/bin下,修改catalina.sh 加下如下参数:
JAVA_OPTS="$JAVA_OPTS -Dsolr.solr.home=/root/solr/solr-5.5.2/server/solrhome8082 -DzkHost=192.168.187.129:12181,192.168.187.129:12182,192.168.187.129:12183"
solr8083、solr8084的修改大同.
E. 生成collection
a) 进入/root/solr/solr-5.5.2/server/solr/configsets 复制sample_techproducts_configs,命名为core1,修改core1/conf下的schema.xml文件,(默认此文件不存在,新建一个)
<fields> <field name="core1" type="string" indexed="true" stored="false"/> </fields>
这步有点玄乎,开始我建的时候,没有此文件报错,建立此文件后,发现新建的field.core1并没有生效
b) 创建数据导入文件data-config.xml
<dataConfig> <dataSource type="JdbcDataSource" driver="com.mysql.jdbc.Driver" url="jdbc:mysql://172.20.11.129:3306/zjpedometerdb" user="root" password="root" /> <document> <entity name="solr_test" transformer="DateFormatTransformer" query="select concat('menu.',MENU_ID) id,MENU_NAME subject,URL description from sys_menus where '${dataimporter.request.clean}' != 'false' "> </entity> <entity name="solr_user" query="select concat('user.',user_id) id,user_name subject,user_password description from sys_users where '${dataimporter.request.clean}' != 'false' "> </entity> </document> </dataConfig>
c) 修改core1/conf/solrconfig.xml 在config下加入
<requestHandler name="/dataimport" class="org.apache.solr.handler.dataimport.DataImportHandler"> <lst name="defaults"> <str name="config">data-config.xml</str> </lst> </requestHandler>
d) 上传配置至zookeeper
java -classpath .:/root/solr/solr-5.5.2/server/solr-webapp/solr8082/WEB-INF/lib/* org.apache.solr.cloud.ZkCLI -cmd upconfig -zkhost 192.168.187.129:12181,192.168.187.129:12182,192.168.187.129:12183 -confdir /root/solr/solr-5.5.2/server/core1/conf -confname core1
注:以上命令也可用于更新配置,如果更新单个文件,用
java -classpath .:/root/solr/solr-5.5.2/server/solr-webapp/solr8082/WEB-INF/lib/* org.apache.solr.cloud.ZkCLI -zkhost 192.168.187.129:12181,192.168.187.129:12182,192.168.187.129:12183 -cmd putfile /configs/core1/schema.xml /root/solr/solr-5.5.2/server/core1/conf/schema.xml
/configs/core1/schme.xml 是zookeeper文件路径,core1是配置文件路径名
/root/solr/solr-5.5.2/server/core1/conf/schema.xml 本地文件
启动各tomcat.打开任意tomcat.solr
e) 创建一个collection 切换到/root/solr/solr-5.5.2
./bin/solr create_collection -c core1 -d /root/solr/solr-5.5.2/server/core1/conf -shards 3 -replicationFactor 3 -p 8082
f) 关联配置
java -classpath .:/root/solr/solr-5.5.2/server/solr-webapp/solr8082/WEB-INF/lib/* org.apache.solr.cloud.ZkCLI -cmd linkconfig -collection core1 -confname core1 -zkhost 192.168.187.129:12181,192.168.187.129:12182,192.168.187.129:12183
g) 检测collection是否成功创建,在Solr UI中刷新页面,点击Cloud如果成功创建了Collection会显示出Solr的集群拓扑
选中一个core,
选中data-config.xml构建的dataimport
点击Execute
请求2次,分别是两个 entity,导入17条数据
点击左边的query,点击execute query,查询结果如下。
基本塔建已经完成,配上nginx负载均衡,第一次发表文档,有不足之处,请留言。