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的时间长度,总的时间长度就是 22000=4秒
dataDir:顾名思义就是 Zookeeper保存数据的目录,默认情况下,Zookeeper将写数据的日志文件也保存在这个目录里。
dataLogDir: Zookeeper的日志文件位置。
server.A=B:C:D:其中 A是一个数字,表示这个是第几号服务器;B是这个服务器的 ip地址;C 表示的是这个服务器与集群中的 Leader服务器交换信息的端口;D表示的是万一集群中的 Leader服务器挂了,需要一个端口来重新进行选举,选出一个新的 Leader,而这个端口就是用来执行选举时服务器相互通信的端口。如果是伪集群的配置方式,由于 B都是一样,所以不同的 Zookeeper实例通信端口号不能一样,所以要给它们分配不同的端口号。
clientPort:这个端口就是客户端连接 Zookeeper服务器的端口,Zookeeper会监听这个端口,接受客户端的访问请求。
1. 同步 zookeeper的配置以及相关目录到其他两台服务中
scp -r /usr/local/zookeeper-3.4.5 [email protected]:/usr/local scp -r /usr/local/data/zookeeper-data [email protected]:/usr/local/data scp -r /usr/local/zookeeper-3.4.5 [email protected]:/usr/local scp -r /usr/local/data/zookeeper-data [email protected]:/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 [email protected]:/usr/local scp -r /usr/local/solrcloud [email protected]:/usr/local scp -r /usr/local/solr-cores [email protected]:/usr/local scp -r /usr/local/apache-tomcat-7.0.54 [email protected]:/usr/local scp -r /usr/local/solrcloud [email protected]:/usr/local scp -r /usr/local/solr-cores [email protected]:/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