日萌社
人工智能AI:Keras PyTorch MXNet TensorFlow PaddlePaddle 深度学习实战(不定时更新)
搜索引擎:Elasticsearch、Solr、Lucene
- ELK中的ES:Elasticsearch
- SolrCloud 的搭建、使用
- Solr 高亮显示
- Spring Data Solr 使用
- Solr的安装与配置
- Solr 原理、API 使用
- Lucene 原理、API使用
- Lucene 得分算法
1.SolrCloud(solr 云)是 Solr 提供的分布式搜索方案,当你需要大规模、容错、分布式索引和检索能力时使用 SolrCloud。
当一个系统的索引数据量少的时候是不需要使用 SolrCloud的,当索引量很大,搜索请求并发很高,这时需要使用 SolrCloud 来满足这些需求。
SolrCloud 是基于 Solr 和Zookeeper的分布式搜索方案,它的主要思想是使用 Zookeeper作为集群的配置信息中心。
它有几个特色功能:
1.集中式的配置信息
2.自动容错
3.近实时搜索
4.查询时自动负载均衡
2.SolrCloud系统架构
1.物理结构:三个 Solr 实例( 每个实例包括两个 Core),组成一个 SolrCloud。
2.逻辑结构
索引集合包括两个 Shard(shard1 和 shard2),shard1 和 shard2 分别由三个 Core 组成,
其中一个 Leader 两个 Replication,Leader 是由 zookeeper 选举产生,zookeeper 控制每个shard上三个 Core 的索引数据一致,解决高可用问题。
用户发起索引请求分别从 shard1 和 shard2 上获取,解决高并发问题。
1.Collection
Collection 在 SolrCloud 集群中是一个逻辑意义上的完整的索引结构。
它常常被划分为一个或多个 Shard(分片),它们使用相同的配置信息。
比如:针对商品信息搜索可以创建一个 collection。
collection=shard1+shard2+....+shardX
2.Core
每个 Core 是 Solr 中一个独立运行单位,提供 索引和搜索服务。
一个 shard 需要由一个Core 或多个 Core 组成。由于 collection 由多个 shard 组成所以 collection 一般由多个 core 组成。
3.Master 或 Slave
Master 是 master-slave 结构中的主结点(通常说主服务器),Slave 是 master-slave 结构中的从结点(通常说从服务器或备服务器)。
同一个 Shard 下 master 和 slave 存储的数据是一致的,这是为了达到高可用目的。
4.Shard
Collection 的逻辑分片。每个 Shard 被化成一个或者多个 replication,通过选举确定哪个是 Leader。
1.分片的目的:可以进行拓容。比如一个分片对应一个2个G的core,那么增加一个分片,可以对应多的一个2个G的core
2.core:一个core代表Solr中的一个数据库“collection1”
3.Master 是 master-slave 结构中的主节点(主服务器),Slave 是 master-slave 结构中的从节点(从服务器)。
在同一个 分片(Shard) 下 master主节点 和 slave从节点 存储的数据是相同的,这是为了达到高可用性。
搭建SolrCloud
1.搭建要求:
Zookeeper 作为集群的管理工具
1.集群管理:容错、负载均衡。
2.配置文件的集中管理
3.集群的入口:
需要实现 zookeeper 高可用,需要搭建zookeeper集群。建议是奇数节点。需要三个 zookeeper 服务器。
搭建 solr 集群需要 7 台服务器(搭建伪分布式,建议虚拟机的内存 1G 以上):
需要三个 zookeeper 节点
需要四个 tomcat 节点
2.环境准备
CentOS-6.5-i386-bin-DVD1.iso
jdk-7u72-linux-i586.tar.gz
apache-tomcat-7.0.47.tar.gz
zookeeper-3.4.6.tar.gz
solr-4.10.3.tgz
3.步骤:
1.搭建Zookeeper集群(我们在上一小节已经完成)
2.将已经部署完solr 的tomcat的上传到linux
3.在linux中创建文件夹 /usr/local/solr-cloud 创建4个tomcat实例
启动集群
1.启动每个 tomcat 实例。要保证 zookeeper 集群是启动状态。
如果你想让某个文件夹下都可以执行,使用以下命令实现:chmod -R 777 solr-cloud
2.访问集群:地址栏输入 192.168.25.140:8180/solr 或 192.168.25.140:8280/solr
都可以看到Solr集群版的界面,下图表示的是,一个主节点 ,三个从节点。
SpringDataSolr连接SolrCloud
在SolrJ中提供一个叫做CloudSolrServer的类,它是SolrServer的子类,用于连接solrCloud。
它的构造参数就是zookeeper的地址列表,另外它要求要指定defaultCollection属性(默认的 collection名称)。
我们现在修改springDataSolrDemo工程的配置文件 ,把原来的solr-server注销,替换为CloudSolrServer。
指定构造参数为地址列表,设置默认 collection名称。
<!-- solr服务器地址
<solr:solr-server id="solrServer" url="http://192.168.25.129:8080/solr" />
-->
<bean id="solrServer" class="org.apache.solr.client.solrj.impl.CloudSolrServer">
<constructor-arg value="192.168.25.140:2181,192.168.25.140:2182,192.168.25.140:2183" />
<property name="defaultCollection" value="collection1"></property>
</bean>
集群分片设置
创建新的 Collection 进行分片处理。
在浏览器输入以下地址,可以按照我们的要求 创建新的Collection:
http://192.168.25.140:8180/solr/admin/collections?action=CREATE&name=collection2&numShards=2&replicationFactor=2
参数:
action=CREATE:表示创建新的 Collection集合
name=collection2:表示创建新的 Collection集合的名字是collection2
numShards=2:代表的是SolrCloud的逻辑结构。表示创建的shard逻辑分片数为2。
replicationFactor=2:代表的是SolrCloud的物理结构。表示创建的shard逻辑分片数的备份数为2,那么其中一个为主,另外一个为备。
搭建Solr集群:SolrCloud
1.搭建 zookeeper 集群:建议是奇数节点,则至少需要三个 zookeeper 服务器。
2.搭建 solr 集群:此处搭建伪集群,都在同一台虚拟机上,首先开启四个 tomcat。
环境准备:apache-tomcat-7.0.47.tar.gz 和 solr-4.10.3.tgz
3.mkdir /usr/local/solr-cloud
4./root/apache-tomcat-7.0.52/webapps/ 目录下 已部署好 solr-4.10.3工程,那么把tomcat拷贝4份:
cp -r apache-tomcat-7.0.52 /usr/local/solr-cloud/tomcat-1
cp -r apache-tomcat-7.0.52 /usr/local/solr-cloud/tomcat-2
cp -r apache-tomcat-7.0.52 /usr/local/solr-cloud/tomcat-3
cp -r apache-tomcat-7.0.52 /usr/local/solr-cloud/tomcat-4
5.mkdir /usr/local/solrhomes
6./root 目录下 配置好 solrhome,然后把 solrhome文件夹 拷贝4份:
cp -r solrhome /usr/local/solrhomes/solrhome-1
cp -r solrhome /usr/local/solrhomes/solrhome-2
cp -r solrhome /usr/local/solrhomes/solrhome-3
cp -r solrhome /usr/local/solrhomes/solrhome-4
7.修改solrhome的绝对路径:
1./usr/local/solr-cloud/tomcat-1/webapps/solr-4.10.3/WEB-INF/web.xml:
修改 <env-entry-value>/usr/local/solrhomes/solrhome-1</env-entry-value>
2./usr/local/solr-cloud/tomcat-2/webapps/solr-4.10.3/WEB-INF/web.xml:
修改 <env-entry-value>/usr/local/solrhomes/solrhome-2</env-entry-value>
3./usr/local/solr-cloud/tomcat-3/webapps/solr-4.10.3/WEB-INF/web.xml:
修改 <env-entry-value>/usr/local/solrhomes/solrhome-3</env-entry-value>
4./usr/local/solr-cloud/tomcat-4/webapps/solr-4.10.3/WEB-INF/web.xml:
修改 <env-entry-value>/usr/local/solrhomes/solrhome-4</env-entry-value>
8.修改每个tomcat/conf/server.xml下的三个端口:
1.<Server port="xxxx" shutdown="SHUTDOWN">:用来关闭TOMCAT服务的端口。
2.<Connector port="xxxx" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" />:
负责建立HTTP连接。在通过浏览器访问Tomcat服务器的Web应用时,使用的就是这个连接器。
3.<Connector port="xxxx" protocol="AJP/1.3" redirectPort="8443" />:
负责和其他的HTTP服务器建立连接。在把Tomcat与其他HTTP服务器集成时,就需要用到这个连接器。
4./usr/local/solr-cloud/tomcat-1/conf/server.xml:
<Server port="8105" shutdown="SHUTDOWN">
<Connector port="8180" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" />
<Connector port="8109" protocol="AJP/1.3" redirectPort="8443" />
5./usr/local/solr-cloud/tomcat-2/conf/server.xml:
<Server port="8205" shutdown="SHUTDOWN">
<Connector port="8280" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" />
<Connector port="8209" protocol="AJP/1.3" redirectPort="8443" />
6./usr/local/solr-cloud/tomcat-3/conf/server.xml:
<Server port="8305" shutdown="SHUTDOWN">
<Connector port="8380" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" />
<Connector port="8309" protocol="AJP/1.3" redirectPort="8443" />
7./usr/local/solr-cloud/tomcat-4/conf/server.xml:
<Server port="8405" shutdown="SHUTDOWN">
<Connector port="8480" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" />
<Connector port="8409" protocol="AJP/1.3" redirectPort="8443" />
9.修改每个tomcat/bin/catalina.sh:
1.目的:让每个Tomcat找到zookeeper集群中的每个zookeeper
2.catalina.sh中配置位置:把此配置修改到第234行
3.catalina.sh中修改的配置内容的格式:JAVA_OPTS="-DzkHost=zookeeperIP:端口"
4.catalina.sh中修改的配置内容:JAVA_OPTS="-DzkHost=192.168.25.128:2181,192.168.25.128:2182,192.168.25.128:2183"
5.JAVA_OPTS:用来设置JVM相关运行参数的变量,此配置用于在tomcat启动时找到 zookeeper集群中的任意一个zookeeper
6.此处zookeeper集群所在的虚拟机:192.168.25.128
7.此处每个Tomcat所在的虚拟机:192.168.25.133
8./usr/local/solr-cloud/tomcat-1/bin/catalina.sh:
JAVA_OPTS="-DzkHost=192.168.25.128:2181,192.168.25.128:2182,192.168.25.128:2183"
9./usr/local/solr-cloud/tomcat-2/bin/catalina.sh:
JAVA_OPTS="-DzkHost=192.168.25.128:2181,192.168.25.128:2182,192.168.25.128:2183"
10./usr/local/solr-cloud/tomcat-3/bin/catalina.sh:
JAVA_OPTS="-DzkHost=192.168.25.128:2181,192.168.25.128:2182,192.168.25.128:2183"
44./usr/local/solr-cloud/tomcat-4/bin/catalina.sh:
JAVA_OPTS="-DzkHost=192.168.25.128:2181,192.168.25.128:2182,192.168.25.128:2183"
10.每个solrhome目录下的solr.xml文件中配置tomcat的IP和端口,用于solr和tomcat连接:
目的:solr集群中的每个solr关联一个tomcat。
1./usr/local/solrhomes/solrhome-1/solr.xml
<str name="host">192.168.25.133</str>
<int name="hostPort">8180</int>
2./usr/local/solrhomes/solrhome-2/solr.xml
<str name="host">192.168.25.133</str>
<int name="hostPort">8280</int>
3./usr/local/solrhomes/solrhome-3/solr.xml
<str name="host">192.168.25.133</str>
<int name="hostPort">8380</int>
4./usr/local/solrhomes/solrhome-4/solr.xml
<str name="host">192.168.25.133</str>
<int name="hostPort">8480</int>
注意:每个solrhome目录下的solr.xml文件中还配置有<str name="hostContext">${hostContext:solr}</str>,
表示访问的主机上下文的名称是solr,那么便要求tomcat/webapps目录下的solr项目名(文件夹名)必须是solr。
那么项目访问的solr服务器的地址便实际是192.168.25.133:8180/solr/collection1,默认访问的是collection1数据库。
11.使用 solr 中的 zkcli.sh工具 把 solrhome/collection1/conf配置目录 上传到 zookeeper集群中的每个zookeeper:
目的:让 zookeeper 统一管理配置文件。
1.tar -zxvf solr-4.10.3.tgz.tgz
2.cd solr-4.10.3/example/scripts/cloud-scripts
3.所执行命令的格式:./zkcli.sh -zkhost zookeeper的IP:端口 -cmd upconfig -confdir 任意某个solrhome下的collection1/conf配置目录 -confname myconf
参数解释:
-zkhost:指定zookeeper地址列表(IP:端口)
-cmd:指定命令。upconfig 为上传配置的命令
-confdir:solrhome下的collection1/conf配置目录
-confname:配置名称
4.执行命令之前保证zookeeper启动了
5.所执行的命令:./zkcli.sh -zkhost 192.168.25.128:2181,192.168.25.128:2182,192.168.25.128:2183 -cmd upconfig -confdir /usr/local/solrhomes/solrhome-1/collection1/conf -confname myconf
12.启动solr集群:
1.首先启动每个 tomcat,要保证 zookeeper 集群是启动状态。
2.启动每个tomcat,每个tomcat下的webapps都带有solr工程。
3.cd /usr/local/solr-cloud/tomcat-1/bin
./startup.sh
4.cd /usr/local/solr-cloud/tomcat-2/bin
./startup.sh
5.cd /usr/local/solr-cloud/tomcat-3/bin
./startup.sh
6.cd /usr/local/solr-cloud/tomcat-4/bin
./startup.sh
7.必须重启zookeeper集群中的每个zookeeper
13.输入格式 192.168.25.133:8180/solr工程名
测试是否搭建成功:
1.成功访问4个solr:192.168.25.133:8180/solr、192.168.25.133:8280/solr、192.168.25.133:8380/solr、192.168.25.133:8480/solr 查看是否打开成功
2.查看4个solr中的“Cloud”,注意全部solr显示绿色:
3.对4个solr中的 collection1数据库进行查询solr数据
Spring Data Solr 连接 SolrCloud
在SolrJ中提供一个叫做CloudSolrServer的类,它是SolrServer的子类,用于连接solrCloud。
它的构造参数就是zookeeper的地址列表,另外它要求要指定defaultCollection属性(默认的 collection名称)。
我们现在修改springDataSolrDemo工程的配置文件 ,把原来的solr-server注销,替换为CloudSolrServer。
指定构造参数为地址列表,设置默认 collection名称。
<!-- solr服务器地址:192.168.25.133:8080/solr
<solr:solr-server id="solrServer" url="http://192.168.25.133:8080/solr" />
-->
<bean id="solrServer" class="org.apache.solr.client.solrj.impl.CloudSolrServer">
<!-- zookeeper集群中的每个zookeeper的IP地址:端口 -->
<constructor-arg value="192.168.25.128:2181,192.168.25.128:2182,192.168.25.128:2183" />
<property name="defaultCollection" value="collection1"></property>
</bean>
1.只有当前war工程自身的pom.xml中配置有<profiles>的话,那么针对war工程不仅需要install -P“id标签值”,
同样也需要使用tomcat7:run -P“id标签值”。
2.如果当前war工程自身的pom.xml中没有配置<profiles>的话,而war工程所依赖的jar工程中的pom.xml中配置有<profiles>的话,
那么针对war工程只需要install 和 tomcat7:run 即可,无需加上 -P“id标签值”。
solr集群分片设置
1.创建新的 Collection 进行 新的分片处理:
在浏览器输入以下地址,可以按照我们的要求创建新的Collection:
执行语句:http://192.168.25.133:8180/solr/admin/collections?action=CREATE&name=collection1&numShards=2&replicationFactor=2
参数:
action=CREATE:表示创建新的 Collection集合
name=collection1:表示创建新的 Collection集合的名字是collection1
numShards=2:代表的是SolrCloud的逻辑结构。表示创建的shard逻辑分片数为2。
replicationFactor=2:代表的是SolrCloud的物理结构。表示创建的shard逻辑分片数的备份数为2,那么其中一个为主,另外一个为备。
2.删除不用的 Collection:
浏览器执行语句:http://192.168.25.133:8180/solr/admin/collections?action=DELETE&name=collection1
参数:
action=CREATE:表示删除 Collection集合
name=collection2:表示删除的 Collection集合的名字是collection1
3.此处我们先删除原来的collection1数据库,然后重新创建一个新的collection1数据库,并且同时进行新的分片设置。
1.删除原来的collection1数据库:浏览器执行http://192.168.25.133:8180/solr/admin/collections?action=DELETE&name=collection1
2.重新创建一个新的collection1数据库,并且同时进行新的分片设置:
浏览器执行http://192.168.25.133:8180/solr/admin/collections?action=CREATE&name=collection1&numShards=2&replicationFactor=2
3.给新的collection数据库重新存入solr数据,需要执行pinyougou-solr-util项目中的SolrUtil.java才能把mysql数据存入到solr中,
同时还需要修改applicationContext-solr.xml中的连接solr服务器的配置:
1.给第一个solr的collection数据库重新存入solr数据:
applicationContext-solr.xml:url="http://192.168.25.133:8180/solr/collection1_shard1_replica1"
2.给第二个solr的collection数据库重新存入solr数据:
applicationContext-solr.xml:url="http://192.168.25.133:8180/solr/collection1_shard1_replica2"
3.给第三个solr的collection数据库重新存入solr数据:
applicationContext-solr.xml:url="http://192.168.25.133:8180/solr/collection1_shard2_replica1"
4.给第四个solr的collection数据库重新存入solr数据:
applicationContext-solr.xml:url="http://192.168.25.133:8180/solr/collection1_shard2_replica2"