通过独立的zookeeper集群管理solrcloud集群。
Solrcloud集群负责索引的创建、查询、更新和删除操作。Solrcloud集群做sharding,每个sharding内做主从备份。
Search服务通过zookeeper集群获取solrcloud信息,向solrcloud提交用户信息索引请求,并向solrcloud提交用户信息搜索请求以完成用户信息的搜索。
Service服务对客户端提供搜索接口,给Search服务提供用户信息获取接口,同时从Search服务中查询获取用户信息。
下载最新发布版本zookeeper-3.4.6,并解压。
建议3台以上奇数,参考:zookeeper过半则选举机制。
需要配置zookeeper集群的服务器列表,同时指定本zookeeper服务器的ID。
在conf/zoo.cfg文件中配置zookeeper集群的服务器列表。
心跳时间默认2s
tickTime=2000 initLimit=10 syncLimit=5 dataDir=/home/work/bin/zookeeper-3.4.6/data dataLogDir=/home/work/bin/zookeeper-3.4.6/logs clientPort=2181 server.1=host1:2888:3888 server.2=host2:2888:3888 server.3=host3:2888:3888
在conf/log4j.properties文件中配置日志文信息,指定日志文件路径。
log4j.rootLogger=info,console,file log4j.appender.console=org.apache.log4j.ConsoleAppender log4j.appender.console.layout=org.apache.log4j.PatternLayout log4j.appender.console.layout.ConversionPattern=%-d{yyyy-MM-ddHH:mm:ss} [%c]-[%p] %m%n log4j.appender.file=org.apache.log4j.DailyRollingFileAppender log4j.appender.file.File=/data/logs/zookeeper/stdout.log log4j.appender.file.layout=org.apache.log4j.PatternLayout log4j.appender.file.layout.ConversionPattern=%-d{yyyy-MM-ddHH:mm:ss}[%c]-[%p] %m%n log4j.appender.file.Threshold=DEBUG log4j.appender.file.DatePattern='.'yyyyMMdd log4j.appender.file.encoding=UTF-8
zookeeper服务器标识需要和zoo.cfg文件中定义的一致。
在data目录下创建myid文件,myid文件内容为服务器id,例如1。三个zookeeper服务器的id分别对应为1,2和3。
如果在zookeeper安装目录下没有data目录,则手动创建。
使用bin目录下的脚本来管理zookeeper服务。
启动zookeeper服务命令:./zkServer.sh start
下载最新发布版本solr-4.10.3,并解压。
从dist/solr-4.10.3.war拷贝到web主目录下并解压。假定web主目录为/data/work/solr/。
将example/lib/ext/*.jar拷贝到/data/work/solr1/WEB-INF/lib目录下。
或者
在git上面拉取鲁班solr项目,3台部署。
在WEB-INF目录下创建classes目录,在classes目中中修改log4j.properties文件。
log4j.properties日志文件内容:
log4j.rootLogger=info,console,file log4j.appender.console=org.apache.log4j.ConsoleAppender log4j.appender.console.layout=org.apache.log4j.PatternLayout log4j.appender.console.layout.ConversionPattern=%-d{yyyy-MM-ddHH:mm:ss}[%c]-[%p] %m%n log4j.appender.file=org.apache.log4j.DailyRollingFileAppender log4j.appender.file.File= log4j.appender.file.layout=org.apache.log4j.PatternLayout log4j.appender.file.layout.ConversionPattern=%-d{yyyy-MM-ddHH:mm:ss}[%c]-[%p] %m%n log4j.appender.file.Threshold=DEBUG log4j.appender.file.DatePattern='.'yyyyMMdd log4j.appender.file.encoding=UTF-8 log4j.logger.org.apache.zookeeper=WARN log4j.logger.org.apache.hadoop=WARN # set to INFO to enable infostream logmessages log4j.logger.org.apache.solr.update.LoggingInfoStream=OFF
分别在三台机器上创建home目录/home/work/services/solrcloud/solrhome,用于放置跟solr有关的配置文件。
端口8080,保持和resin容器监听端口一致
<?xml version="1.0"encoding="UTF-8" ?> <solr persistent="true"sharedLib="lib"> <coresadminPath="/admin/cores" zkClientTimeout="20000"hostPort="8080" hostContext="solr"></cores> </solr>
随机选中一台机器。
在其/home/work/services/solrcloud 下面新建solr-config solr-lib 目录
在solr-lib中
将solr WEB-INF/lib中的jar文件Copy到solrcloud/solr-lib文件目录中:
cp/home/work/services/solrcloud/solr/WEB-INF/lib/ /home/work/services/solrcloud/solr-lib/
在solr_config 中
新建collection(商品), goods/conf,在conf中配置对应的schema.xml ,solrconfig.xml
新建collection(搜索热词),hotword/conf,在conf中配置对应的schema.xml , solrconfig.xml
通过bootstrap设置solrhome:
java -classpath.:/home/work/services/solrcloud/solr-lib/* org.apache.solr.cloud.ZkCLI -zkhosthost1:2181,host2:2181,host3:2181 -cmd bootstrap -solrhome/home/work/services/solrcloud/solrhome/
SolrCloud是通过ZooKeeper集群来保证配置文件的变更及时同步到各个节点上,所以,需要将配置文件上传到ZooKeeper集群中-对应zk的config目录的子目录:
java -classpath.:/home/work/services/solrcloud/solr-lib/* org.apache.solr.cloud.ZkCLI -zkhosthost1:2181,host2:2181,host3:2181 -cmd upconfig -confdir/home/work/services/solrcloud/solr-config/goods/conf -confname goods
java -classpath.:/home/work/services/solrcloud/solr-lib/* org.apache.solr.cloud.ZkCLI -zkhosthost1:2181,host2:2181,host3:2181 -cmd upconfig -confdir/home/work/services/solrcloud/solr-config/hotword/conf -confname hotword
把配置文件和目标collection联系起来
java -classpath.:/home/work/services/solrcloud/solr-lib/* org.apache.solr.cloud.ZkCLI -zkhosthost1:2181,host2:2181,host3:2181 -cmd linkconfig -collection goods -confnamegoods java -classpath.:/home/work/services/solrcloud/solr-lib/* org.apache.solr.cloud.ZkCLI -zkhosthost1:2181,host2:2181,host3:2181 -cmd linkconfig -collection hotword -confnamehotword
resin中需要指定web主目录,并且指定日志文件路径。
在resin/conf/resin.xml文件中配置resin启动参数。参考
<cluster id="solr"> <root-directory>.</root-directory> <server-default> <http address="*" port="8080" /> <jvm-arg>-DzkHost=host1:2181,host2:2181,host3:2181</jvm-arg> <jvm-arg>-Xmx1g</jvm-arg> <jvm-arg>-Xms1g</jvm-arg> <jvm-arg>-Xss256k</jvm-arg> <jvm-arg>-Xmn256m</jvm-arg> <jvm-arg>-XX:-UseParallelGC</jvm-arg> <jvm-arg>-XX:ParallelGCThreads=4</jvm-arg> <jvm-arg>-XX:PermSize=256m</jvm-arg> </server-default> <server id="solr" address="127.0.0.1" port="6083"/> <host id="" root-directory="."> <web-app id="/solr" root-directory="/home/work/services/solrcloud/solr" > <env-entry> <env-entry-name>solr/home</env-entry-name> <env-entry-type>java.lang.String</env-entry-type> <env-entry-value>/home/work/services/solrcloud/solrhome</env-entry-value> </env-entry> </web-app> <stdout-log path='/home/work/log/solr/solr.stdout.log' rollover-period='1D' rollover-size='50mb' /> <stderr-log path='/home/work/log/solr/solr.stderr.log' rollover-period='1D' rollover-size='50mb' /> </host> </cluster>
其中特别要注意到有一段solr特有的配置,用来指定solr配置文件主目录。这里指定的solr配置文件主目录必须与之前配置的solr目录保持一致,否则会因为找不到solr配置导致solr服务启动失败。
<env-entry> <env-entry-name>solr/home</env-entry-name> <env-entry-value>*</env-entry-value> </env-entry>
在resin/conf/resin.xml文件中配置resin启动脚本,增加启动参数。
JAVA_OPTS="-Dbootstrap_confdir=/data/work/solr1/home/usercore/conf-Dcollection.configName=usercoreConf-DzkHost=10.221.144.87:2181,10.221.144.87:2182,10.221.144.87:2183-DnumShards=2"
这个启动参数中,需要指定zookeeper集群的地址,solr集群分片数量,solr配置文件主目录,以及在zookeeper集群中标记的配置名称。
修改后的启动脚本:
exec $JAVA_EXE $JAVA_OPTS -jar${RESIN_HOME}/lib/resin.jar $*
注意必须保证solr集群中的第一个solr服务器首先启动,然后其他solr集群中的其他服务器才能启动。否则整个solr集群可能启动失败。
在resin/conf/resin.xml文件中配置resin启动脚本,增加启动参数。
JAVA_OPTS="-DzkHost=10.221.144.87:2181,10.221.144.87:2182,10.221.144.87:2183"
或者在resin.xml中添加
这个启动参数中,只需要指定zookeeper集群的地址,其它信息将在solr服务器连接到zookeeper集群后自动获取。
修改后的启动脚本:
exec $JAVA_EXE $JAVA_OPTS -jar ${RESIN_HOME}/lib/resin.jar$*
solr服务器创建的索引默认保存在文档集合目录下的data目录/home/work/services/solrcloud/solrhome中。
复制或者删除索引仅需要删除这个data目录即可。
如果索引模式文件改变,例如增加或者删除字段后需要重建索引,重建之前必须删除data目录。
登录solr服务器集群管理控制台http://host1:8080/solr。通过这个管理控制台可以对solr集群进行管理。
solr管理控制台建议不要对外网开放。
创建数据集(Collection)
curl 'http://host1:8080/solr/admin/collections?action=CREATE&name=goods&numShards=3&replicationFactor=2&maxShardsPerNode=3'<span style="font-size: 12px; font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);"></span>
name:数据集名称
numShards:分片数
replicationFactor:每个分片的复本数
maxShardsPerNode:每个Solr服务器节点上最大分片数(Solr 4.2新增)
删除数据集:
curl 'http://host1:8080/solr/admin/collections?action=DELETE&name=goods'