SolrCloud 分布式集群安装部署

安装软件包准备

·        apache-tomcat-7.0.54
·        jdk1.7
·        solr-4.8.1
·        zookeeper-3.4.5


注:以上软件都是基于 Linux环境的 64软件,以上软件请到各自的官网下载。

服务器准备

为搭建这个集群,准备三台服务器,分别为
192.168.0.112 --master 角色
192.168.0.113 -- slave 角色
192.168.0.114 -- slave 角色


搭建基础环境

1.      安装 jdk1.7 -这个大家都会安装,就不费键盘了。(记得配置环境变量)
2.     配置主机 /etc/hosts 文件 - 当然,如果内部有内部DNS解析,就不需要配置 hosts文件了。在 3 台服务器的 /etc/hosts 中添加以下记录
192.168.0.112 SOLR-CLOUD-001
192.168.0.113 SOLR-CLOUD-002
192.168.0.114 SOLR-CLOUD-003


zookeeper 部署

Zookeeper 分布式服务框架是 Apache Hadoop的一个子项目,它主要是用来解决分布式应用中经常遇到的一些数据管理问题,如:统一命名服务、状态同步服务、集群管理、分布式应用配置项的管理等。

注:Zookeeper集群的机器个数推荐是奇数台,半数机器挂掉,服务是可以正常提供的

首先以 192.168.0.112为例来搭建 zookeeper

1.      在软件部署目录下面部署 zookeeper,把下载的 zookeeper-3.4.5解压到软件部署目录 /usr/local

注:为了统一部署,以及以后自动化方便,必须统一软件部署目录,目前我这边是以 ``/usr/local```为软件部署主目录

2.     建立 zookeeper的数据、日志以及配置文件目录

mkdir -p /usr/local/data/zookeeper-data/
 
mkdir -p /usr/local/data/zookeeper-data/logs/

 

注: /usr/local/data 是定义的统一存放数据的目录

1.       zookeeper  conf 目录下面的 zoo_sample.cfg 修改成 zoo.cfg,并且对其内容做修改

cp -av /usr/local/zookeeper-3.4.5/conf/zoo_sample.cfg /usr/local/zookeeper-3.4.5/conf/zoo.cfg

 

修改 zoo.cfg 的内容,主要是修改 dataDir dataLogDir server.1-3

# The number of millisecondsof each tick
tickTime=2000
# The number of ticks that the initial
# synchronization phase can take
initLimit=10
# The number of ticks that can pass between
# sending a request and getting an acknowledgement
syncLimit=5
# the directory where the snapshot is stored.
# do not use /tmp for storage, /tmp here isjust
# example sakes.
dataDir=/usr/local/data/zookeeper-data
dataLogDir=/usr/local/data/zookeeper-data/logs
 
server.1=SOLR-CLOUD-001:2888:3888
server.2=SOLR-CLOUD-002:2888:3888
server.3=SOLR-CLOUD-003:2888:3888
# the port at which the clients will connect
clientPort=2181
#
# Be sure to read the maintenance sectionof the
# administrator guide before turning on autopurge.
#
#http://zookeeper.apache.org/doc/current/zookeeperAdmin.html#sc_maintenance
#
# The number of snapshots to retainindataDir
#autopurge.snapRetainCount=3
# Purge task interval in hours
# Set to "0" todisable auto purge feature
#autopurge.purgeInterval=1


注:
tickTime
:这个时间是作为 Zookeeper服务器之间或客户端与服务器之间维持心跳的时间间隔,也就是每个 tickTime时间就会发送一个心跳。
initLimit
:这个配置项是用来配置 Zookeeper接受客户端(这里所说的客户端不是用户连接 Zookeeper服务器的客户端,而是 Zookeeper服务器集群中连接到 Leader Follower服务器)初始化连接时最长能忍受多少个心跳时间间隔数。当已经超过 10个心跳的时间(也就是tickTime)长度后 Zookeeper服务器还没有收到客户端的返回信息,那么表明这个客户端连接失败。总的时间长度就是52000=10秒。
syncLimit
:这个配置项标识 Leader Follower之间发送消息,请求和应答时间长度,最长不能超过多少个 tickTime的时间长度,总的时间长度就是 2
2000=4
dataDir
:顾名思义就是 Zookeeper保存数据的目录,默认情况下,Zookeeper将写数据的日志文件也保存在这个目录里。
dataLogDir
Zookeeper的日志文件位置。
server.A=B
CD:其中 A是一个数字,表示这个是第几号服务器;B是这个服务器的 ip地址;C 表示的是这个服务器与集群中的 Leader服务器交换信息的端口;D表示的是万一集群中的 Leader服务器挂了,需要一个端口来重新进行选举,选出一个新的 Leader,而这个端口就是用来执行选举时服务器相互通信的端口。如果是伪集群的配置方式,由于 B都是一样,所以不同的 Zookeeper实例通信端口号不能一样,所以要给它们分配不同的端口号。
clientPort
:这个端口就是客户端连接 Zookeeper服务器的端口,Zookeeper会监听这个端口,接受客户端的访问请求。

1.      同步 zookeeper的配置以及相关目录到其他两台服务中

scp -r /usr/local/zookeeper-3.4.5 solr@192.168.0.113:/usr/local
scp -r /usr/local/data/zookeeper-data solr@192.168.0.113:/usr/local/data
 
 
scp -r /usr/local/zookeeper-3.4.5 solr@192.168.0.114:/usr/local
scp -r /usr/local/data/zookeeper-data solr@192.168.0.114:/usr/local/data
 
注:也可以采用命令 scp -r /usr/local/zookeeper-3.4.5  192.168.0.114:/usr/local
来同步(输入密码即可)


1.      创建 myid文件存储该机器的标识码,比如 server.1的标识码就是 “1”myid文件的内容就一行: 1

192.168.0.112
echo"1" >> /usr/local/data/zookeeper-data/myid
192.168.0.113
echo"2" >> /usr/local/data/zookeeper-data/myid
192.168.3
echo"3" >> /usr/local/data/zookeeper-data/myid


1.      分别启动三台服务器的 zookeeper

cd /usr/local/zookeeper-3.4.5/bin

 

./zkServer.sh start

查看 zookeeper的状态

[solr@SOLR-CLOUD-001 bin]$ ./zkServer.sh status
JMX enabled by default
Using config: /usr/local/zookeeper-3.4.5/bin/../conf/zoo.cfg
Mode: leader
[solr@SOLR-CLOUD-002 bin]$ ./zkServer.sh status
JMX enabled by default
Using config: /usr/local/zookeeper-3.4.5/bin/../conf/zoo.cfg
Mode: follower
[solr@SOLR-CLOUD-003 bin]$ ./zkServer.sh status
JMX enabled by default
Using config: /usr/local/zookeeper-3.4.5/bin/../conf/zoo.cfg
Mode: follower


Solrcloud分布式集群搭建

1.      解压部署 tomcat -解压部署后的目录为 /usr/local/apache-tomcat-7.0.54

2.     解压 solr-4.8.1的压缩包,并且把solr-4.8.1/example/webapps/solr.war解压至 /usr/local/solr目录下

3.      solr-4.8.1\example\lib\ext下的 jar包放到solr\WEB-INF\lib

4.      192.168.0.112为例,创建以下目录

mkdir -p /usr/local/solrcloud/config-files
mkdir -p /usr/local/solrcloud/solr-lib


1.       solr/WEB-INF/lib下的所有 jar包拷贝到 /usr/local/solrcloud/solr-lib目录

cp -av /usr/local/solr/WEB-INF/lib/*.jar /usr/local/solrcloud/solr-lib

1.      solr/example/solr/collection1/conf下的所有文件拷贝到 /usr/local/solrcloud/config-files目录

cp -av /usr/local/solr/example/solr/collection1/conf/*/usr/local/solrcloud/config-files/

1.       /usr/local/solr目录拷贝到 /usr/local/apache-tomcat-7.0.54/webapps目录下面

cp -av /usr/local/solr /usr/local/apache-tomcat-7.0.54/webapps

1.      创建 solr的数据目录 /usr/local/solr-cores 并在该目录下生成 solr.xml这是 solr 的核心配置文件

原始的配置文件如下

<?xml version="1.0"encoding="UTF-8" ?> 
<solr persistent="true"> 
<logging enabled="true"> 
<watcher size="100"threshold="INFO" /> 
</logging> 
<cores defaultCoreName="collection1"adminPath="/admin/cores"host="${host:}"hostPort="8080"hostContext="${hostContext:solr}"zkClientTimeout="${zkClientTimeout:15000}"> 
</cores> 
</solr> 


1.      创建/usr/local/apache-tomcat-7.0.54/conf/Catalina目录 /usr/local/apache-tomcat-7.0.54/conf/Catalina/localhost目录

mkdir -p /usr/local/apache-tomcat-7.0.54/conf/Catalina
mkdir -p /usr/local/apache-tomcat-7.0.54/conf/Catalina/localhost


1.       /usr/local/apache-tomcat-7.0.54/conf/Catalina/localhost下创建 solr.xml文件,此文件为 Solr/home的配置文件

<?xml version="1.0"encoding="UTF-8"?> 
<Context docBase="/usr/local/tomcat7/webapps/solr"debug="0"crossContext="true"> 
<Environment name="solr/home"type="java.lang.String"value="/usr/local/solr-cores"override="true"/> 
</Context>


1.      修改 tomcat/bin/cataina.sh ,加入以下内容

CATALINA_OPTS="$CATALINA_OPTS-Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=9060-Djava.rmi.server.hostname=`/sbin/ifconfig bond0 |grep -a "inet addr:" |awk -F":" '{print$2}' |egrep -o '([0-9]{1,3}\.?){4}'`"
CATALINA_OPTS="$CATALINA_OPTS-Dcom.sun.management.jmxremote.ssl=false-Dcom.sun.management.jmxremote.authenticate=false"
JAVA_OPTS="$JAVA_OPTS-DzkHost=GD6-SOLR-CLOUD-001:2181,GD6-SOLR-CLOUD-002:2181,GD6-SOLR-CLOUD-003:2181"
JAVA_OPTS="$JAVA_OPTS -Xmx8192m -Xms8192m -Xmn4g -Xss256k-XX:ParallelGCThreads=24 -XX:+UseConcMarkSweepGC -XX:PermSize=256m-XX:MaxPermSize=256m -XX:+PrintGCDetails -XX:+PrintGCTimeStamps-XX:+PrintGCApplicationStoppedTime -XX:+PrintGCApplicationConcurrentTime-XX:+PrintHeapAtGC -Xloggc:/usr/local/logs/tomcat/gc`date +%Y%m%d%H%M%S`.log -XX:ErrorFile=\"/usr/local/logs/tomcat/java_error.log\""


1.      将以上配置同步到其他两台服务器

scp -r /usr/local/apache-tomcat-7.0.54 solr@192.168.0.113:/usr/local
scp -r /usr/local/solrcloud solr@192.168.0.113:/usr/local
scp -r /usr/local/solr-cores solr@192.168.0.113:/usr/local
 
scp -r /usr/local/apache-tomcat-7.0.54 solr@192.168.0.114:/usr/local
scp -r /usr/local/solrcloud solr@192.168.0.114:/usr/local
scp -r /usr/local/solr-cores solr@192.168.0.114:/usr/local


 

1.      SolrCloud是通过 ZooKeeper集群来保证配置文件的变更及时同步到各个节点上,所以,需要将配置文件上传到 ZooKeeper集群中:执行如下操作(以下ip均可使用域名进行操作)

java -classpath .:/usr/local/solrcloud/solr-lib/* org.apache.solr.cloud.ZkCLI -cmdupconfig -zkhost192.168.0.112:2181,192.168.0.113:2181,192.168.0.114:2181 -confdir /usr/local/solrcloud/config-files/  -confname myconf


1.      校验 zookeeper的配置文件

cd /usr/local/zookeeper-3.4.5/bin
./zkCli.sh -server 192.168.0.112:2181
[zk: 192.168.01.2:2181(CONNECTED)0] ls / 
[configs, collections, zookeeper] 
[zk: 192.168.01.2:2181(CONNECTED)1] ls /configs 
[myconf] 
[zk: 192.168.01.2:2181(CONNECTED)2] ls /configs/myconf 
[admin-extra.menu-top.html, currency.xml, protwords.txt,mapping-FoldToASCII.txt, solrconfig.xml, lang, stopwords.txt, spellings.txt, mapping-ISOLatin1Accent.txt, admin-extra.html, xslt, scripts.conf, synonyms.txt, update-script.js, velocity, elevate.xml, admin-extra.menu-bottom.html, schema.xml] 
[zk: 192.168.01.2:2181(CONNECTED)3] 


1.      启动 tomcat,首先启动 master 192.168.0.112上面的 tomcat

cd /usr/local/apache-tomcat-7.0.54/bin

./startup.sh

1.      启动 192.168.0.113 192.168.0.114 tomcat

2.     访问 http://192.168.0.112:8080/solr 可以看到下图


  

创建 Collection及初始 Shard

 

curl 'http://192.168.0.112:8080/solr/admin/collections?action=CREATE&name=mycollection&numShards=1&replicationFactor=1'
 
curl 'http://192.168.0.113:8080/solr/admin/collections?action=CREATE&name=mycollection&numShards=1&replicationFactor=1'
 
curl 'http://192.168.0.114:8080/solr/admin/collections?action=CREATE&name=mycollection&numShards=1&replicationFactor=1'

 

 

 

 

配置IK分词

1.        进入目录:cd /usr/local/solr-cores

创建lib目录:mkdir lib 在lib中加入文件IKAnalyzer.cfg.xml、stopword.dic

 

2.        进入目录:cd /usr/local/tomcat7/webapps/solr/WEB-INF/lib

加入jar包:IKAnalyzer2012FF_u1.jar

 

3.  Cd /usr/local/solrcloud/config-files

打开schema.xml文件在最后添加如下内容:

 <!--ik分词-->

<fieldType name="text_ik"class="solr.TextField"> 
<analyzertype="index" isMaxWordLength="false"class="org.wltea.analyzer.lucene.IKAnalyzer"/> 
<analyzertype="query" isMaxWordLength="true"class="org.wltea.analyzer.lucene.IKAnalyzer"/> 
</fieldType>


 

同样可以加入数据库定义字段:

例如:

<field name="title" type="text_ik"indexed="true" stored="true"/>
   <fieldname="path" type="string" indexed="false"stored="true"/>

 

 

4.  将以上配置同步到另外两台机器上


5.  最后将配置文件同步到zookeeper上

执行命令:

java-classpath .:/usr/local/solrcloud/solr-lib/* org.apache.solr.cloud.ZkCLI -cmdupconfig -zkhost 192.168.0.112:2181,192.168.0.113:2181,192.168.0.114:2181-confdir /usr/local/solrcloud/config-files/ -confname myconf

 

6.  重新启动即可

 

 

 

注:

也可以完全自定义schema.xml文件,配置自己所需要的内容(初学者最好不要这样做)

<?xml version="1.0" encoding="UTF-8"?>
 
 
<schema name="zwx_solr" version="1.5">
 
 
<fields>
   <fieldname="_version_" type="long" indexed="true"stored="true"/>
 
    <!--数据库中的字段-->
   <fieldname="id" type="string" indexed="true"stored="true" multiValued="false"required="true"/>
 
   <fieldname="title" type="text_ik" indexed="true" stored="true"/>
   <fieldname="path" type="string" indexed="false"stored="true"/>
   <fieldname="content" type="text_ik" indexed="true"stored="true"/>
   <fieldname="time" type="tdate" indexed="true"stored="true"/>
   <fieldname="author" type="text_ik" indexed="true"stored="true"/>
   <fieldname="fromsite" type="text_ik" indexed="true"stored="true"/>
   <fieldname="url" type="string" indexed="true"stored="true"/>
  
 </fields>
 
 <uniqueKey>id</uniqueKey>
 

  <types>
   
    <fieldTypename="string" class="solr.StrField"sortMissingLast="true" />
 
    <fieldTypename="boolean" class="solr.BoolField"sortMissingLast="true"/>
 
    <fieldTypename="int" class="solr.TrieIntField"precisionStep="0" positionIncrementGap="0"/>
    <fieldTypename="float" class="solr.TrieFloatField"precisionStep="0" positionIncrementGap="0"/>
    <fieldTypename="long" class="solr.TrieLongField"precisionStep="0" positionIncrementGap="0"/>
    <fieldTypename="double" class="solr.TrieDoubleField"precisionStep="0" positionIncrementGap="0"/>
 
    <fieldTypename="tint" class="solr.TrieIntField" precisionStep="8"positionIncrementGap="0"/>
    <fieldTypename="tfloat" class="solr.TrieFloatField"precisionStep="8" positionIncrementGap="0"/>
    <fieldTypename="tlong" class="solr.TrieLongField"precisionStep="8" positionIncrementGap="0"/>
    <fieldTypename="tdouble" class="solr.TrieDoubleField"precisionStep="8" positionIncrementGap="0"/>
 
    <fieldTypename="date" class="solr.TrieDateField"precisionStep="0" positionIncrementGap="0"/>
 
    <fieldTypename="tdate" class="solr.TrieDateField" precisionStep="6"positionIncrementGap="0"/>
 
    <fieldtypename="binary" class="solr.BinaryField"/>
 
   
 
    <fieldTypename="random" class="solr.RandomSortField"indexed="true" />
 
 
    <fieldTypename="text_general" class="solr.TextField" positionIncrementGap="100">
      <analyzertype="index">
        <tokenizerclass="solr.StandardTokenizerFactory"/>
        <filterclass="solr.StopFilterFactory" ignoreCase="true"words="stopwords.txt" />
 
        <filterclass="solr.LowerCaseFilterFactory"/>
      </analyzer>
      <analyzertype="query">
        <tokenizerclass="solr.StandardTokenizerFactory"/>
        <filterclass="solr.StopFilterFactory" ignoreCase="true"words="stopwords.txt" />
        <filterclass="solr.SynonymFilterFactory" synonyms="synonyms.txt"ignoreCase="true" expand="true"/>
        <filterclass="solr.LowerCaseFilterFactory"/>
      </analyzer>
    </fieldType>
 
    <!--ik分词-->
    <fieldTypename="text_ik" class="solr.TextField"> 
        <analyzertype="index" isMaxWordLength="false"class="org.wltea.analyzer.lucene.IKAnalyzer"/> 
        <analyzertype="query" isMaxWordLength="true"class="org.wltea.analyzer.lucene.IKAnalyzer"/> 
    </fieldType>
   
    <!--#号分词 自定义分词-->
    <fieldTypename="text_xx" class="solr.TextField"> 
       
    </fieldType>
 </types>
 
</schema>



原文出自:http://blog.segmentfault.com/yexiaobai/1190000000595712

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐