Zookeeper、Solr和Tomcat安裝配置實踐
三臺服務器:
192.168.19.210(myid=210) master
192.168.19.211(myid=211) slave1
192.168.19.212(myid=212) slave2
ZooKeeper集群配置
安裝ZooKeeper集群,在上面3分節點上分別安裝,使用的版本是zookeeper-3.4.5。首先在master上安裝配置:
cd /tmp wget -N http://mirrors.cnnic.cn/apache/zookeeper/zookeeper-3.4.5/zookeeper-3.4.5.tar.gz tar -zxf zookeeper-3.4.5.tar.gz mv ./zookeeper-3.4.5 /opt/zookeeper mkdir /opt/zookeeper/data mkdir /opt/zookeeper/logs echo 'tickTime=2000' > /opt/zookeeper/conf/zoo.cfg echo 'initLimit=10' >> /opt/zookeeper/conf/zoo.cfg echo 'syncLimit=5' >> /opt/zookeeper/conf/zoo.cfg echo 'dataDir=/opt/zookeeper/data' >> /opt/zookeeper/conf/zoo.cfg echo 'dataLogDir=/opt/zookeeper/logs' >> /opt/zookeeper/conf/zoo.cfg echo 'clientPort=2181' >> /opt/zookeeper/conf/zoo.cfg echo 'server.210=master:2888:3888' >> /opt/zookeeper/conf/zoo.cfg echo 'server.211=slave1:2888:3888' >> /opt/zookeeper/conf/zoo.cfg echo 'server.212=slave2:2888:3888' >> /opt/zookeeper/conf/zoo.cfg echo '210' > /opt/zookeeper/data/myid
然后將master上的zookeeper復制到其他兩個節點上:
scp -r /opt/zookeeper root@slave1:/opt/ scp -r /opt/zookeeper root@slave2:/opt/
修改slave1、slave2的myid文件:
vi /opt/zookeeper/data/myid
其他設置:
#開機啟動 echo '/opt/zookeeper/bin/zkServer.sh start' >> /etc/rc.d/rc.local #環境變量 echo 'export PATH=$PATH:/opt/zookeeper/bin' >> /etc/profile source /etc/profile #ZooKeeper服務命令 /opt/zookeeper/bin/zkServer.sh start /opt/zookeeper/bin/zkServer.sh status /opt/zookeeper/bin/zkServer.sh stop /opt/zookeeper/bin/zkServer.sh restart
SolrCloud配置
首先在一個節點上對SOLR進行配置,我們選擇master節點。
cd /tmp wget -N http://archive.apache.org/dist/lucene/solr/4.2.1/solr-4.2.1.tgz tar -zxf solr-4.2.1.tgz mkdir -p /opt/solr/webapps cd /opt/solr/webapps jar -xf /tmp/solr-4.2.1/example/webapps/solr.war mkdir -p /opt/solr/home vi /opt/solr/home/solr.xml <?xml version="1.0" encoding="UTF-8" ?> <solr persistent="true"> <cores defaultCoreName="Designer" adminPath="/admin/cores" host="${host:}" hostPort="${jetty.port:}" zkClientTimeout="${zkClientTimeout:15000}"> </cores> </solr> #master's lib ln -s /opt/solr/webapps/WEB-INF/lib /opt/solr/lib #master's conf mkdir -p /opt/solr/conf
注意:這里并沒有配置任何的core元素,等到整個配置安裝完成之后,通過SOLR提供的REST接口,來實現Collection以及Shard的創建,從而來更新這些配置文件。
ZooKeeper管理監控配置文件:
java -cp .:/opt/solr/lib/* org.apache.solr.cloud.ZkCLI -cmd upconfig -zkhost master:2181,slave1:2181,slave1:2181 -confdir /opt/solr/conf/Designer -confname Designer -solrhome /opt/solr/home
檢查一下ZooKeeper上的存儲情況:
cd /opt/zookeeper bin/zkCli.sh -server master:2181 ls / ls /configs
Tomcat配置與啟動:
mkdir -p /opt/tomcat/conf/Catalina/localhost vi /opt/tomcat/conf/Catalina/localhost/solr.xml <?xml version="1.0" encoding="UTF-8" ?> <Context docBase="/opt/solr/webapps" reloadable="true"> <Environment name="solr/home" type="java.lang.String" value="/opt/solr/home" override="true" /> </Context> #tomcat catelina.sh vi /opt/tomcat/bin/catalina.sh JAVA_OPTS=" -Xmx6G -Xms6G -Xss256K -Xmn2300M -XX:SurvivorRatio=5 -XX:+UseParNewGC -XX:PermSize=128M -XX:MaxPermSize=128M -XX:MaxDirectMemorySize=768m -XX:LargePageSizeInBytes=128m -XX:+DisableExplicitGC -XX:SoftRefLRUPolicyMSPerMB=0 -XX:+OptimizeStringConcat -XX:+UseFastAccessorMethods -XX:CompileThreshold=100 -XX:+AggressiveOpts -XX:+TieredCompilation -XX:+DoEscapeAnalysis -XX:+UseBiasedLocking -XX:+EliminateLocks -XX:BiasedLockingStartupDelay=0 -XX:+UseConcMarkSweepGC -XX:CMSInitiatingOccupancyFraction=70 -XX:+UseCMSCompactAtFullCollection -XX:CMSFullGCsBeforeCompaction=2 -XX:+CMSParallelRemarkEnabled -XX:+UseCMSInitiatingOccupancyOnly -XX:+CMSClassUnloadingEnabled -XX:+CMSPermGenPrecleaningEnabled -Dsun.net.inetaddr.ttl=0 -Dnetworkaddress.cache.ttl=30 -Djava.awt.headless=true -DAllowManagedFieldsInDefaultFetchGroup=true -DAllowMediatedWriteInDefaultFetchGroup=true -Djetty.port=8080 -DzkHost=master:2181,slave1:2181,slave2:2181 -DzkClientTimeout=15000 "
tomcat 常用命令:
#啟動 /opt/tomcat/bin/startup.sh #查看日志 tail -f /opt /tomcat/logs/catalina.out
查看一下ZooKeeper中的數據狀態:
cd /opt/zookeeper bin/zkCli.sh -server master:2181 ls / ls /live_nodes ls /collections
這時候,SolrCloud集群中只有一個活躍的節點,而且默認生成了一個Designer實例,這個實例實際上虛擬的,因為通過web界面無法訪問master:8080/solr,看不到任何有關SolrCloud的信息.
同步數據和配置信息,啟動其他節點
scp -r /opt/tomcat/ root@slave1:/opt/ scp -r /opt/tomcat/ root@slave2:/opt/ scp -r /opt/solr/ root@slave1:/opt/ scp -r /opt/solr/ root@slave2:/opt/
啟動其他Solr服務器節點:
/opt/tomcat/bin/startup.sh
查看ZooKeeper集群中數據狀態:
ls /live_nodes
這時已經存在3個活躍的節點了,但是SolrCloud集群并沒有更多信息.
創建Collection、Shard和Replication
創建Collection及初始Shard
直接通過REST接口來創建Collection:
[root@master]$ curl 'http://master:8080/solr/admin/collections?action=CREATE&name=Article&numShards=3&replicationFactor=1'
如果成功,會輸出如下響應內容:
<?xml version="1.0" encoding="UTF-8"?> <response> <lst name="responseHeader"> <int name="status">0</int> <int name="QTime">4103</int> </lst> <lst name="success"> <lst> <lst name="responseHeader"> <int name="status">0</int> <int name="QTime">3367</int> </lst> <str name="core">Article_shard2_replica1</str> <str name="saved">/opt/solr/home/solr.xml</str> </lst> <lst> <lst name="responseHeader"> <int name="status">0</int> <int name="QTime">3280</int> </lst> <str name="core">Article_shard1_replica1</str> <str name="saved">/opt/solr/home/solr.xml</str> </lst> <lst> <lst name="responseHeader"> <int name="status">0</int> <int name="QTime">3690</int> </lst> <str name="core">Article_shard3_replica1</str> <str name="saved">/opt/solr/home/solr.xml</str> </lst> </lst> </response>
上面鏈接中的幾個參數的含義,說明如下:
name 待創建Collection的名稱 numShards 分片的數量 replicationFactor 復制副本的數量
執行上述操作如果沒有異常,已經創建了一個Collection,名稱為Article,而且每個節點上存在一個分片。這時,也可以查看ZooKeeper中狀態:
ls /collections ls /collections/Article
可以通過Web管理頁面,訪問master:8080/solr/#/~cloud,查看SolrCloud集群的分片信息. 我們從master節點可以看到,SOLR的配置文件內容,已經發生了變化,如下所示:
cat /opt/solr/home/solr.xml <?xml version="1.0" encoding="UTF-8" ?> <solr persistent="true"> <cores defaultCoreName="Designer" host="${host:}" adminPath="/admin/cores" zkClientTimeout="${zkClientTimeout:15000}" hostPort="${jetty.port:}"> <core loadOnStartup="true" shard="shard3" instanceDir="Article_shard3_replica1/" transient="false" name="Article_shard3_replica1" collection="Article" /> </cores> </solr>
創建Replication
下面對已經創建的初始分片進行復制。 shard1已經在slave1上,我們復制分片到master和slave2上,執行如下命令:
curl 'http://master:8080/solr/admin/cores?action=CREATE&collection=Aritcle&name=Aritcle_shard1_replica_2&shard=shard1' <?xml version="1.0" encoding="UTF-8"?> <response> <lst name="responseHeader"> <int name="status">0</int> <int name="QTime">1485</int> </lst> <str name="core">Aritcle_shard1_replica_2</str> <str name="saved">/opt/solr/home/solr.xml</str> </response> curl 'http://master:8080/solr/admin/cores?action=CREATE&collection=Aritcle&name=Aritcle_shard1_replica_3&shard=shard1' <?xml version="1.0" encoding="UTF-8"?> <response> <lst name="responseHeader"> <int name="status">0</int> <int name="QTime">2543</int> </lst> <str name="core">Aritcle_shard1_replica_3</str> <str name="saved">/opt/solr/home/solr.xml</str> </response> curl 'http://master:8080/solr/admin/cores?action=CREATE&collection=Aritcle&name=Aritcle_shard1_replica_4&shard=shard1' <?xml version="1.0" encoding="UTF-8"?> <response> <lst name="responseHeader"> <int name="status">0</int> <int name="QTime">2405</int> </lst> <str name="core">Aritcle_shard1_replica_4</str> <str name="saved">/opt/solr/home/solr.xml</str> </response>
最后的結果是,slave1上的shard1,在master節點上有2個副本,名稱為Articleshard1replica2和Articleshard1replica3,在slave2節點上有一個副本,名稱為Articleshard1replica_4. 也可以通過查看master和slave2上的目錄變化,如下所示:
ll /opt/solr/conf/ 總用量 24 drwxrwxr-x. 4 root root 4096 6月 1 09:58 Designer drwxrwxr-x. 3 root root 4096 6月 1 15:41 Article_shard1_replica_2 drwxrwxr-x. 3 root root 4096 6月 1 15:42 Article_shard1_replica_3 drwxrwxr-x. 3 hadoop root 4096 6月 1 15:23 Article_shard3_replica1 ll /opt/solr/conf/ 總用量 20 drwxrwxr-x. 4 root root 4096 6月 1 14:53 Designer drwxrwxr-x. 3 root root 4096 6月 1 15:44 Article_shard1_replica_4 drwxrwxr-x. 3 root root 4096 6月 1 15:23 Article_shard2_replica1
其中,Articleshard3replica1和Articleshard2replica1都是創建Collection的時候自動生成的分片,也就是第一個副本。 通過Web界面,可以更加直觀地看到shard1的情況.
我們再次從master節點可以看到,SOLR的配置文件內容,又發生了變化,如下所示:
cat /opt/solr/home/solr.xml <?xml version="1.0" encoding="UTF-8" ?> <solr persistent="true"> <cores defaultCoreName="Designer" host="${host:}" adminPath="/admin/cores" zkClientTimeout="${zkClientTimeout:15000}" hostPort="${jetty.port:}"> <core loadOnStartup="true" shard="shard3" instanceDir="Article_shard3_replica1/" transient="false" name="Article_shard3_replica1" collection="Article" /> <core loadOnStartup="true" shard="shard1" instanceDir="Article_shard1_replica_2/" transient="false" name="Article_shard1_replica_2" collection="Article" /> <core loadOnStartup="true" shard="shard1" instanceDir="Article_shard1_replica_3/" transient="false" name="Article_shard1_replica_3" collection="Article" /> </cores> </solr>
到此為止,我們已經基于3個物理節點,配置完成了SolrCloud集群。