solr单机和集群的部署、以及注意事项
最近因项目需要,安装部署solr,这里我记录下学习solr中遇到的问题
solr教程,网上很多,很泛滥;但是值得参考的不多,下面就整理一下我在学习solr过程中的资料,一些能直接搜索到的文档,我会列出文章名字和链接。
- 单节点solr部署
solr下载地址:http://archive.apache.org/dist/lucene/solr/
Solr部署详解:http://blog.csdn.net/xiaoyu411502/article/details/44835119
这篇文章所述的场景是部署在tomcat上的,但是说的是linux上的,
你还可以看这一篇,看下windows端的:http://blog.csdn.net/caicongyang/article/details/50084273,
如果想用solr自带的jetty部署的话需要另外注意。
下边是用自带的jetty部署solr:
1,复制solr压缩包到/usr/local下,解压、
2,进到 solr-5.3.1/bin目录下
3,执行脚本,./install_solr_service.sh /usr/local/solr-5.3.1.zip
[root@localhost bin]# ./install_solr_service.sh /usr/local/solr-5.3.1.zip id: solr: no such user Creating new user: solr Extracting /usr/local/solr-5.3.1.zip to /opt Creating /etc/init.d/solr script ... Waiting up to 30 seconds to see Solr running on port 8983 [/] Started Solr server on port 8983 (pid=4765). Happy searching! Found 1 Solr nodes: Solr process 4765 running on port 8983 { "solr_home":"/var/solr/data/", "version":"5.3.1 1703449 - noble - 2015-09-17 01:48:15", "startTime":"2017-02-22T09:17:15.37Z", "uptime":"0 days, 0 hours, 0 minutes, 11 seconds", "memory":"69.3 MB (%14.1) of 490.7 MB"} Service solr installed. [root@localhost bin]#
使用脚本【install_solr_service.sh 】注册solr为服务,如果不加参数,solr会默认把solr_home注册到 /var/solr/data ;而且默认用自带的jetty启动服务
install_solr_service.sh参数说明:
Supported OPTIONS include:
-d Directory for live / writable Solr files, such as logs, pid files, and index data; defaults to /var/solr
-i Directory to extract the Solr installation archive; defaults to /opt/
The specified path must exist prior to using this script.
-p Port Solr should bind to; default is 8983
-s Service name; defaults to solr
-u User to own the Solr files and run the Solr process as; defaults to solr
This script will create the specified user account if it does not exist.
注册成功之后,就可以用service的方式维护solr了,如果么有权限,记得sudo
service solr start/stop/restart/status
部署成功之后,打开控制台:http://localhost:8983/solr
- 控制台
常关注的地方
Dashboard:solr、lucene相关的版本,以及启动solr实例的jvm的相关参数
Logging:就是solr的日志输出控制台,其输出格式按照各自实例对应的solr_home下的log4j.properties配置文件的配置、如果是Tomcat部署的,log4j.properties在solr-tomcat\webapps\solr\WEB-INF\classes目录下
Core Admin:需要索引的复本实例
Java Properties:该solr实例的环境属性
Thread Dump:该solr实例的线程内存转储快照
Dataimport:此页签是配置数据源,导入数据更新数据相关
Full-import:全量更新导入数据,执行配置文件中的“query”,根据唯一id比对索引,原来有的删除,全部更新
Delta-import:增量更新导入,执行配置文件的“deltaImportQuery”、“deltaQuery”,只更新符合条件的数据
Clean:是否清理原来索引,执行full-import的时候,默认选中
Commit:提交,执行结果是否提交
Optimize:是否执行优化
Entity:默认主实体,dataConfig配置文件中的主实体
Documents:此页签是用于提交和跟新数据,一般不用
Files:列举了对应core的配置文件
查询页面
q – 查询字符串,必须的。
fl – 指定返回那些字段内容,用逗号或空格分隔多个。
start – 返回第一条记录在完整找到结果中的偏移位置,0开始,一般分页用。
rows – 指定返回结果最多有多少条记录,配合start来实现分页。
sort – 排序,格式:sort=<field name>+<desc|asc>[,<field
name>+<desc|asc>]… 。示例:(inStock desc, price
asc)表示先 “inStock” 降序, 再 “price” 升序,默认是相关性降序。
wt – (writer type)指定输出格式,可以有 xml, json, php, phps, 后面 solr 1.3增加的,要用通知我们,因为默认没有打开。
fq – (filter query)过虑查询,作用:在q查询符合结果中同时是fq查询符合的,例如:q=mm&fq=date_time:[20081001
TO 20091031],找关键字mm,并且date_time是20081001到20091031之间的。官方文档:http://wiki.apache.org/solr/CommonQueryParameters
q.op – 覆盖schema.xml的defaultOperator(有空格时用”AND”还是用”OR”操作逻辑),一般默认指定
df – 默认的查询字段,一般默认指定
qt – (query type)指定那个类型来处理查询请求,一般不用指定,默认是standard。
其它
indent – 返回的结果是否缩进,默认关闭,用 indent=true|on 开启,一般调试json,php,phps,ruby输出才有必要用这个参数。
version – 查询语法的版本,建议不使用它,由服务器指定默认值。
- Solr集群
数据量小的时候,一台Solr服务器能完全胜任这份工作,随着我们应用慢慢长大,访问也越来越多,一台Solr服务器的弊病也逐渐显现如查询变慢了,机器宕机就无法继续提供服务,于是乎我们引入了Solr集群,通过前端负载均衡和索引Replication来分担一台机器的压力,这样既能提高查询速度,也能避免单机故障问题而且是可伸缩的解决方案,一切看起来很OK,问题也暂时解决了,但是好景不长,随着应用的发展,数据也在与日俱增,需要索引的数据也越来越多,索引文件变得越来越庞大,Replication索引变得越来越低效高成本,每个Solr实例都保存全量大索引数据的方式显然又成了系统性能和可伸缩性的瓶颈,如果能将大索引文件切分,分布在集群中不同机器中且查询的准确性和可用性又不会受到影响该是件多么美好的事情啊,于是SolrCloud出现了...
SolrCloud是基于ZooKeeper和Solr的分布式解决方案,为Solr添加分布式功能,用于建立高可用,高伸缩,自动容错,分布式索引,分布式查询的Solr服务器集群;SolrCloud并非一个新的软件发布包,而是Solr4.0版本新增组件用于跟ZooKeeper配合提供分布式功能,部署时只是修改启动配置;
安装过程
1. 准备zookeeper环境,这里不再讲zookeeper的安装、部署
2.到Apache官网下载Solr-5.2.1安装包
3. 进入到Solr文件的目录,执行以下命令从压缩包中抽出安装脚本:
tar -xvzf solr-5.2.1.tgz solr-5.2.1/bin/install_solr_service.sh --strip-components=2
4. 运行安装脚本
执行以下命令安装Solr:
./install_solr_service.sh solr-5.2.1.tgz -i /usr/solr/solr5 -d /usr/solr/solr5 -u solr -s solr -p 8983
或者执行以下命令按照默认值安装:
./install_solr_service.sh solr-5.2.1.tgz
其实也可以直接解压安装包,然后自定义配置即可。
5.修改配置
执行以下命令编辑solr.in.sh文件:
vim /usr/solr5/solr.in.sh
参照如下进行修改:
SOLR_JAVA_MEM="-Xms1G -Xmx1G",内存限制可以按照需要设定。
ZK_HOST=" 127.0.0.1:2181, 127.0.0.1:2182, 127.0.0.1:2183"
6.按照上述步骤在其他节点执行安装
启动Solr服务并验证
1. 在Solr集群中各节点执行以下命令启动Solr服务:
service solr start
这里解释一下涉及到的一些概念
collection:solrcloud集群中逻辑意义上的完整索引,通常被划分为一个或多个shard(片),这些分片使用相同的config set。如果shard数超过一个,它就是分布式索引,solrcloud让你通过collection名称引用它,而不需要关心分布式检索时使用shard相关的参数。
Core:solr core,一个solr实例中可以包含多个core,每个core可以独立完成索引和查询功能。collection和core的对应关系有点复杂,下边有张图,能很好的解释他们之间的关系,core可以理解为物理层面的分类;collection可以理解为逻辑层面的分类。在solrcloud的世界里,core被映射/抽象/关联成replicas(复本),多个复本之间通过zookeeper来管理,并且,会自动选举出一个leader结点,这都是zookeeper的内容了。
Leader:赢得选举的Shard replicas。每个Shard有多个Replicas,这几个Replicas需要选举来确定一个Leader。选举可以发生在任何时间,但是通常他们仅在某个Solr实例发生故障时才会触发。当索引documents时,SolrCloud会传递它们到此Shard对应的leader,leader再分发它们到全部Shard的replicas。
Replicas: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。
创建分片和复本
创建collection并设置分片、和设置复本数目
bash /opt/solr/bin/solr create_collection -c farmer -n farmer -d /opt/solr-5.3.1/server/solr/configsets/sample_techproducts_configs/conf -shards 1 -replicationFactor 3
参数说明可以用以下命令查看:
bash /opt/solr/bin/solr create_collection -help
参数解释:
-c:创建collection的名字
-n:配置文件的文件夹名称
-d:需要上传到zookeeper上的配置文件目录
-shards:分片的数目
-replicationFactor:创建的collection的复本的数目
就是这种方式创建出来的集群core名字和collection不同,是zookeeper默认拼接的,如下图:
而且,core的名字为:collection名字_shardX_replicaX,X为数字。看上去很怪。
第二种种方式创建collection
先上传配置文件到zookeeper
bash /opt/solr-5.3.1/server/scripts/cloud-scripts/zkcli.sh -zkhost 127.0.0.1:2181 -cmd upconfig -n worker -d /opt/solr-5.3.1/server/solr/configsets/sample_techproducts_configs/conf
参数解释:
-zkhost:zookeeper的地址
-cmd:bootstrap, upconfig(更新配置文件,zookeeper上没有就上传;有就跟新,以-n的值为collection辨别), downconfig(下载配置文件), linkconfig, makepath, put, putfile,get,getfile, list, clear,其余的命令没用过,等用过了再更新
-n:配置文件的名字,最终被用作collection的名字
-d:配置文件所在的目录,这里我用的“/opt/solr-5.3.1/server/solr/configsets/sample_techproducts_configs/conf ”solr默认的配置文件;可以使用自己的配置文件目录,一般此配置文件的目录结构如下:
conf
├── currency.xml
├── lang
│ └── stopwords_en.txt
├── protwords.txt
├── _rest_managed.json
├── schema.xml
├── solrconfig.xml
├── stopwords.txt
└── synonyms.txt
这里需要注意的是,-zkhost,可以只写一个结点。
然后,逐个增加复本,我这里把:name、instanceDir、collection、shard、collection.configName都命名成一样了,
http://192.168.226.128:8985/solr/admin/cores?action=CREATE&name=worker&instanceDir=worker&dataDir=data&collection=worker&shard=worker&collection.configName=worker http://192.168.226.128:8984/solr/admin/cores?action=CREATE&name=worker&instanceDir=worker&dataDir=data&collection=worker&shard=worker&collection.configName=worker http://192.168.226.128:8983/solr/admin/cores?action=CREATE&name=worker&instanceDir=worker&dataDir=data&collection=worker&shard=worker&collection.configName=worker
参数含义:
name:新建core的名称
创建的core的命名规则:
coreName_shardName_replicaN
例如:创建pscp的集合,2个分片,每个分片上面有两个备份
则命名如下:
pscp_shard1_replica1
pscp_shard1_replica2
pscp_shard2_replica1
pscp_shard2_replica2
shard:指定一个分配id,这个core将挂在那个分片上(随便写,如果还没有这个id,第一次会帮你创建)
collection.configName:从zookeeper中指定一份配置文件
instanceDir和dataDir:从下图看出他的含义
命名规则:instanceDir与name的名称相同,dataDir:统一建议命名为data
效果如下图:
更新solrcloud配置的方法
更新集群配置文件就是更新zookeeper上的配置文件,
bash /opt/solr-5.3.1/server/scripts/cloud-scripts/zkcli.sh -zkhost 127.0.0.1:2181 -cmd upconfig -n worker -d /opt/solr-5.3.1/server/solr/configsets/sample_techproducts_configs/conf
更新完配置文件之后,需要重新加载配置文件才能生效
http://192.168.226.128:8985/solr/admin/collections?action=RELOAD&name=worker
- 使用solrj
1,在maven工程环境下,pom.xml增加引用
<dependency>
<groupId>org.apache.solr</groupId>
<artifactId>solr-solrj</artifactId>
<version>5.3.1</version>
</dependency>
2,根据业务逻辑如果简单,可以直接使用SolrQuery,如果复杂可以实现自己的SolrQuery;同时还要实现自己的QueryResponse,处理相应的筛选项、分页、返回字段等。
3,如果使用的是单点的solr实例,需要直连指定的solr实例,需要指定ip、端口、core
HttpSolrClient solrClient = new HttpSolrClient(“http://localhost:8983/solr/core_name”);
4,如果使用的集群形式的solr,需要指定zookeeper
CloudSolrClient cloudSolrClient = new CloudSolrClient(“127.0.0.1:2181,127.0.0.1:2182,127.0.0.1:2183/solr”);
如果需要额外的验证和参数用cloudSolrClient = new CloudSolrClient(zkHost, closeableHttpClient);
closeableHttpClient = HttpClientUtil.createClient(params);
同时,查询到时候,需要指定collection
QueryResponse response = solrClient.query("collection", solrQuery);
- 注意
写在这里呢,主要是提示读者注意,也许你根本不会犯此类错误,就是在部署完solr之后,一般我们都是默认root账户去安装和部署,完事之后呢创建core或collection的时候总是提示找不到文件夹,或无法读取某文件,这是因为,solr服务默认创建solr用户,启动solr的用户也是solr。solr用户看不到root账户创建的core或collection文件包括目录。所以,在部署完之后,切到solr用户启动solr和创建新的core或colletion。