solr 集群,即 solrcloud 的创建
下面说说solr集群的安装使用,同样是使用前面例子使用的 solr6.5.0 版本,我在一台机器上安装,所以这是伪集群,当修改为真集群的时候,只要将IP地址修改下即可,下面会说明。
首先,你得搭建 zookeeper 集群,可以参考 zookeeper集群版安装方法
下面开始创建solr集群:
创建一个目录用于存放集群使用到的所有实例和配置信息1
2
3$ cd /home/hewentian/ProjectD
$ mkdir solrCloud # 存放集群的所有文件,包括:三个solr实例、和实例共享的配置文件solr-configs
$ mkdir solrCloud/solr-configs # 用于存放集群的core的配置信息,会被上传到zookeeper
将一个SOLR压缩包放到这个目录,我之前已在Downloads目录下载好了1
2
3
4
5
6$ cp /home/hewentian/Downloads/solr-6.5.0.tgz ./
$ tar xzvf solr-6.5.0.tgz
$ mv solr-6.5.0 solr1 # 为方便起见,这里将其重命名为solr1,先将solr1配置好,后面会将其复制为solr2, solr3
$ ls
solr1 solr-6.5.0.tgz solr-configs
我们仍然使用之前的例子,演示使用DIH方式将数据导入到SOLR,只不过,这次是集群的方式,所以需要将data_driven_schema_configs/conf的配置信息复制到solr-configs中,并将其命名为mysqlCore1
2
3
4$ pwd
/home/hewentian/ProjectD/solrCloud
$ cp -r solr1/server/solr/configsets/data_driven_schema_configs/conf/ solr-configs/mysqlCore/
将mysql-connector-java-5.1.25.jar放到solr1/server/lib/ext目录下面,并将上一个例子,solr的安装使用的那三个文件: solrconfig.xml、db-data-config.xml、managed-schema复制到solr-configs/mysqlCore/下,override存在的。
接下来还有2个文件需要修改:
修改文件一:solr.in.sh1
2
3
4
5
6$ vi solr1/bin/solr.in.sh
# 修改以下内容即可
ZK_HOST="127.0.0.1:2181,127.0.0.1:2182,127.0.0.1:2183"
ZK_CLIENT_TIMEOUT="15000"
SOLR_PORT=8983
修改文件二:solr.xml1
2
3
4
5$ vi solr1/server/solr/solr.xml
# 修改下面的内容即可
<str name="host">${host:127.0.0.1}</str> # 当修改为真集群的时候,只修改这个IP地址即可
<int name="hostPort">${jetty.port:8983}</int> # 这里端口为 8983
这样一个实例就配置好了,将其复制为solr2, solr31
2$ cp -r solr1 solr2
$ cp -r solr1 solr3
修改solr2, solr3的端口为8984, 89851
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21$ vi solr2/bin/solr.in.sh
# 修改以下内容即可
SOLR_PORT=8984
$ vi solr3/bin/solr.in.sh
# 修改以下内容即可
SOLR_PORT=8985
$ vi solr2/server/solr/solr.xml
# 修改下面的内容即可
<str name="host">${host:127.0.0.1}</str> # 当修改为真集群的时候,只修改这个IP地址即可
<int name="hostPort">${jetty.port:8984}</int> # 这里端口为 8984
$ vi solr3/server/solr/solr.xml
# 修改下面的内容即可
<str name="host">${host:127.0.0.1}</str> # 当修改为真集群的时候,只修改这个IP地址即可
<int name="hostPort">${jetty.port:8985}</int> # 这里端口为 8985
这样,三个solr实例就已经配置好了,下面将其都启动1
2
3
4
5
6
7
8
9
10
11
12
13
14$ pwd
/home/hewentian/ProjectD/solrCloud
$ solr1/bin/solr start
Waiting up to 180 seconds to see Solr running on port 8983 [\]
Started Solr server on port 8983 (pid=15292). Happy searching!
$ solr2/bin/solr start
Waiting up to 180 seconds to see Solr running on port 8984 [\]
Started Solr server on port 8984 (pid=15507). Happy searching!
$ solr3/bin/solr start
Waiting up to 180 seconds to see Solr running on port 8985 [\]
Started Solr server on port 8985 (pid=15706). Happy searching!
在浏览器中可以如下访问:
http://localhost:8983
http://localhost:8984
http://localhost:8985
下面,我们将solr-configs/mysqlCore的内容上传到zookeeper,以便让三台solr都使用这个配置1
$ /home/hewentian/ProjectD/solrCloud/solr1/server/scripts/cloud-scripts/zkcli.sh -zkhost 127.0.0.1:2181,127.0.0.1:2182,127.0.0.1:2183 -cmd upconfig -confdir /home/hewentian/ProjectD/solrCloud/solr-configs/mysqlCore -confname mysqlCore
说明:
- -confdir:这个指的是 本地上传的文件位置
- -confname:上传后在zookeeper中的节点名称
也可以上传单个文件,单个文件上传先要删除,不然会报错:1
$ /home/hewentian/ProjectD/solrCloud/solr1/server/scripts/cloud-scripts/zkcli.sh -zkhost 127.0.0.1:2181,127.0.0.1:2182,127.0.0.1:2183 -cmd putfile /configs/mysqlCore/solrconfig.xml /home/hewentian/ProjectD/solrCloud/solr-configs/mysqlCore/solrconfig.xml
说明:
putfile 后第一个/configs/mysqlCore/solrconfig.xml指的是zookeeper中的配置文件,第二个/home/hewentian/ProjectD/solrCloud/solr-configs/mysqlCore/solrconfig.xml指的是本地文件路径
下面我们在solr1中创建一个core,并命名为 mysqlCore,在浏览器中输入如下url即可,它有3个分片,每个分片有2个副本:
http://localhost:8983/solr/admin/collections?action=CREATE&name=mysqlCore&numShards=3&replicationFactor=2&maxShardsPerNode=3&collection.configName=mysqlCore
执行成功后,你可能会看到如下输出:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51This XML file does not appear to have any style information associated with it. The document tree is shown below.
<response>
<lst name="responseHeader">
<int name="status">0</int>
<int name="QTime">16020</int>
</lst>
<lst name="success">
<lst name="127.0.0.1:8983_solr">
<lst name="responseHeader">
<int name="status">0</int>
<int name="QTime">13930</int>
</lst>
<str name="core">mysqlCore_shard3_replica2</str>
</lst>
<lst name="127.0.0.1:8983_solr">
<lst name="responseHeader">
<int name="status">0</int>
<int name="QTime">14273</int>
</lst>
<str name="core">mysqlCore_shard2_replica1</str>
</lst>
<lst name="127.0.0.1:8984_solr">
<lst name="responseHeader">
<int name="status">0</int>
<int name="QTime">14479</int>
</lst>
<str name="core">mysqlCore_shard3_replica1</str>
</lst>
<lst name="127.0.0.1:8985_solr">
<lst name="responseHeader">
<int name="status">0</int>
<int name="QTime">14597</int>
</lst>
<str name="core">mysqlCore_shard2_replica2</str>
</lst>
<lst name="127.0.0.1:8985_solr">
<lst name="responseHeader">
<int name="status">0</int>
<int name="QTime">14748</int>
</lst>
<str name="core">mysqlCore_shard1_replica1</str>
</lst>
<lst name="127.0.0.1:8984_solr">
<lst name="responseHeader">
<int name="status">0</int>
<int name="QTime">14778</int>
</lst>
<str name="core">mysqlCore_shard1_replica2</str>
</lst>
</lst>
</response>
也可以使用下面的方式,指定在哪台机器中创建哪个分片的哪个副本。1
2
3
4
5
6
7
8
9
10
11
12
13$ curl "http://localhost:8983/solr/admin/cores?action=CREATE&name=mysqlCore_shard1_replica1&instanceDir=mysqlCore_shard1_replica1&collection=mysqlCore&shard=mysqlCore_shard1"
$ curl "http://localhost:8983/solr/admin/cores?action=CREATE&name=mysqlCore_shard3_replica2&instanceDir=mysqlCore_shard3_replica2&collection=mysqlCore&shard=mysqlCore_shard3"
$ curl "http://localhost:8984/solr/admin/cores?action=CREATE&name=mysqlCore_shard1_replica2&instanceDir=mysqlCore_shard1_replica2&collection=mysqlCore&shard=mysqlCore_shard1"
$ curl "http://localhost:8984/solr/admin/cores?action=CREATE&name=mysqlCore_shard2_replica1&instanceDir=mysqlCore_shard2_replica1&collection=mysqlCore&shard=mysqlCore_shard2"
$ curl "http://localhost:8985/solr/admin/cores?action=CREATE&name=mysqlCore_shard2_replica2&instanceDir=mysqlCore_shard2_replica2&collection=mysqlCore&shard=mysqlCore_shard2"
$ curl "http://localhost:8985/solr/admin/cores?action=CREATE&name=mysqlCore_shard3_replica1&instanceDir=mysqlCore_shard3_replica1&collection=mysqlCore&shard=mysqlCore_shard3"
你也可以查看分片是否创建成功:1
2
3
4
5
6
7
8$ ls solr1/server/solr
configsets mysqlCore_shard2_replica1 mysqlCore_shard3_replica2 README.txt solr.xml zoo.cfg
$ ls solr2/server/solr
configsets mysqlCore_shard1_replica2 mysqlCore_shard3_replica1 README.txt solr.xml zoo.cfg
$ ls solr3/server/solr
configsets mysqlCore_shard1_replica1 mysqlCore_shard2_replica2 README.txt solr.xml zoo.cfg
在http://localhost:8983上面执行DIH将user索引进solr,成功之后你就可以在http://localhost:8984, http://localhost:8985上面看到同样的结果。
当然,我们也可以在启动的时候,才指定zookeeper1
$ ./bin/solr start -c -z zk1:port,zk2:port,zk3:port
说明:
- -c:以solr_cloud的方式启动;
- -z:指定zookeeper集群的地址和端口,上面搭建zookeeper集群时的3台机器
solr备份
在进行solr备份的时候,一定要先将solr服务停了,然后再备份。否则在还原的时候有可能会产生write.lock,在产生write.lock的时候也不要怕,你可以按下面的方法解决:
将
write.lock删掉,然后再新建一个,然后修改权限;1
2
3$ rm write.lock
$ touch write.lock
$ chmod 666 write.lock重启solr服务;
- 在浏览器登录到那个solr的cord,reload一下,然后查询,如果没报错的话,可能要等5分钟左右,查询结果就出来了。
[solr界面]->[collections]->[点击你的那个 collection]->[Reload]
JAVA示例代码如下:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21CloudSolrClient cloudSolrClient = new CloudSolrClient.Builder()
.withZkHost("127.0.0.1:2181,127.0.0.1:2182,127.0.0.1:2183").build();
cloudSolrClient.setDefaultCollection("mysqlCore");
SolrQuery solrQuery = new SolrQuery();
solrQuery.setQuery("schools:\"北京第一中学\" AND id:[1 TO 3]");
// 分页
solrQuery.setStart(0);
solrQuery.setRows(10);
SolrDocumentList results = cloudSolrClient.query(solrQuery).getResults();
logger.info("numFound: " + results.getNumFound());
if (CollectionUtils.isEmpty(results)) {
return;
}
results.stream().forEach(logger::info);
}
未完,待续……