前言:兩個月前的16年11月份完成的配置,使用的solr6.1和zookeeper3.4,剛剛寫成blog,目前版本可能有小版本的變化。
本例完成結果為:在docker環境下部署solrcloud集群,同時使用zookeeper集群做配置管理。
一、部署zookeeper集群
1、加載images,(兩種方式:A下載offical版本zookeeper,B加載導出的tar包。A方式為新部署的情況,B方式為從測試環境部署到正式環境的情況)
A下載
#下載
docker pull zookeeper
#重命名
docker tag 31z4/zookeeper zookeeper
B加載tar包
#源服務器上導出tar包
#docker save zookeeper:latest > /home/qdadmin/docker/zookeeper.tar
#目標服務器上拷貝並且導入
scp qdadmin@10.77.9.215:/home/qdadmin/docker/zookeeper.tar /home/qdadmin/docker/
docker load < /home/qdadmin/docker/zookeeper.tar
#檢查,見到zookeeper
docker images
2、啟動zookeeper集群
(步驟說明:
首先設置網絡,由於zk需要配置ZOO_SERVERS讓各zk之間相互知道ip,需要明確的配置ip地址,但是docker宿主機重啟或者docker升級重啟后,會自動重啟container,此時會重新動態分配ip,導致zk集群失效,因此需要對zk設置固定ip。在此我想到的辦法是給zk設置ip段為172.18.0.x,這樣重啟后ip肯定是從172.18.0.2開始的.2.3.4,相當於變相的固定了ip
)
(參數解釋:
--env ZOO_MY_ID=1設置環境變量ZOO_MY_ID,用於配置集群內編號;
--env "ZOO_SERVERS=server.1=172.18.0.2:2888:3888 server.2=172.18.0.3:2888:3888 server.3=172.18.0.4:2888:3888"設置環境變量ZOO_SERVERS,用於配置集群內服務器ip及選舉leader所用端口;
--net zknet 設置網絡模式,設置固定ip
-v 設置掛載數據目錄,否則會自動生成本地目錄,路徑在/var/lib/docker下)
docker network create --subnet=172.18.0.0/16 zknet
docker network ls
docker run --name qd-zookeeper1 --restart=always --net zknet --ip 172.18.0.2 -d -p 2191:2181 -m 4096m --env ZOO_MY_ID=1 --env "ZOO_SERVERS=server.1=172.18.0.2:2888:3888 server.2=172.18.0.3:2888:3888 server.3=172.18.0.4:2888:3888" -v /home/docker/zookeeper/data1:/data -v /home/docker/zookeeper/datalog1:/datalog zookeeper:latest
docker run --name qd-zookeeper2 --restart=always --net zknet --ip 172.18.0.3 -d -p 2192:2181 -m 4096m --env ZOO_MY_ID=2 --env "ZOO_SERVERS=server.1=172.18.0.2:2888:3888 server.2=172.18.0.3:2888:3888 server.3=172.18.0.4:2888:3888" -v /home/docker/zookeeper/data2:/data -v /home/docker/zookeeper/datalog2:/datalog zookeeper:latest
docker run --name qd-zookeeper3 --restart=always --net zknet --ip 172.18.0.4 -d -p 2193:2181 -m 4096m --env ZOO_MY_ID=3 --env "ZOO_SERVERS=server.1=172.18.0.2:2888:3888 server.2=172.18.0.3:2888:3888 server.3=172.18.0.4:2888:3888" -v /home/docker/zookeeper/data3:/data -v /home/docker/zookeeper/datalog3:/datalog zookeeper:latest
#檢查
docker ps
4、安裝后驗證,查看zookeeper狀態
#進入服務器命令行
docker exec -it qd-zookeeper2 /bin/bash
#查看zkServer運行狀態,Mode為follower或leader
bin/zkServer.sh status
#測試端口是否開通
echo stat|nc localhost 2181
#查看環境變量是否正確配置,(與啟動命令中env ZOO_SERVERS參數配置相同)
cat /conf/zoo.cfg
#退出
exit
二、部署solr集群
solr設計:將dockersolr實例的數據存儲目錄映射到宿主機上,以/home/docker/solr/zksolrdata文件夾為根目錄,每個dockersolr實例使用一個node[x]文件夾作為數據存儲目錄。
1、准備外部配置文件(以zksolrdata文件夾為根目錄,拷貝solr實例的conf文件夾,創建每個node所需文件夾)
#將solr實例的conf文件夾拷貝到zksolrdata文件夾下(solr實例的conf文件用原有的即可,無需改動)
mkdir -p /home/docker/solr/zksolrdata
cp -r /home/docker/solr/qdfs/conf /home/docker/solr/zksolrdata/qdfsconf
#創建每個node所需文件夾,每個文件夾下必須有solr.xml文件(solr.xml可從solr安裝包solr/server/solr/solr.xml路徑獲取,我是單獨提出來放在了本地的一個服務器上)
scp qdadmin@10.77.9.215:/home/qdadmin/solr.xml /home/qdadmin/
#創建node文件夾並拷貝solr.xml
mkdir -p /home/docker/solr/zksolrdata/nodex && cp /home/qdadmin/solr.xml "$_"
mkdir -p /home/docker/solr/zksolrdata/node1 && cp /home/docker/solr/zksolrdata/nodex/* "$_"
mkdir -p /home/docker/solr/zksolrdata/node2 && cp /home/docker/solr/zksolrdata/nodex/* "$_"
mkdir -p /home/docker/solr/zksolrdata/node3 && cp /home/docker/solr/zksolrdata/nodex/* "$_"
#驗證solr.xml文件存在
ls /home/docker/solr/zksolrdata/node3
2、使用導出的tar包,啟動solr:chinese。(此處為load一個images,或者可以pull下載一個,或者已存在此image則跳過此步)
docker load < /home/qdadmin/docker/solr.tar
若從新下載offical版本solr,需要進行一系列配置,包括修改並發訪問數(solrConfig.xml)、配置中文分詞器jar包。
3、啟動solr集群
(參數解釋:
-v /home/docker/solr/zksolrdata:/opt/solrdata設置文件夾映射,指向根目錄;
-c為solr內部命令,使用solrcloud模式啟動
-z $currentIp:2191,$currentIp:2192,$currentIp:2193/solr 為solr內部命令,設置zookeeper服務器,1-n個地址為zookeeper集群中每一個服務器的地址,“/solr”為zk的后綴分類
-s /opt/solrdata/node3 為solr內部命令,設置solrhome地址,分別指向每個含solr.xml的node的文件夾
)
#臨時變量,當前服務器ip,注意修改!
export currentIp="10.77.10.13"
#執行命令,啟動container
docker rm -f qd-solrcloud1
docker rm -f qd-solrcloud2
docker rm -f qd-solrcloud3
docker run --name qd-solrcloud1 --restart=always -d -p 8991:8983 -m 4096m -v /home/docker/solr/zksolrdata:/opt/solrdata solr:chinese -c -z $currentIp:2191,$currentIp:2192,$currentIp:2193/solr -s /opt/solrdata/node1
docker run --name qd-solrcloud2 --restart=always -d -p 8992:8983 -m 4096m -v /home/docker/solr/zksolrdata:/opt/solrdata solr:chinese -c -z $currentIp:2191,$currentIp:2192,$currentIp:2193/solr -s /opt/solrdata/node2
docker run --name qd-solrcloud3 --restart=always -d -p 8993:8983 -m 4096m -v /home/docker/solr/zksolrdata:/opt/solrdata solr:chinese -c -z $currentIp:2191,$currentIp:2192,$currentIp:2193/solr -s /opt/solrdata/node3
4、上傳conf到zookeeper
docker exec -it qd-solrcloud1 /opt/solr/server/scripts/cloud-scripts/zkcli.sh -zkhost $currentIp:2191,$currentIp:2192,$currentIp:2193/solr -cmd upconfig -confdir /opt/solrdata/qdfsconf -confname qdfsconf
#需要重啟生效
docker restart qd-solrcloud1
docker restart qd-solrcloud2
docker restart qd-solrcloud3
#檢查配置
curl 'http://'$currentIp':8993/solr/admin/configs?action=LIST'
5、新建collection
(參數解釋:
name=qdfs 創建collection名為qdfs;
collection.configName=qdfsconf 使用configName為qdfsconf;
maxShardsPerNode=10 每個服務器可擁有分片的數量;
numShards=3 此collection的分片數量,router.name=implicit情況下無效;
replicationFactor=2 每個分片的復制數;
router.name=implicit 設置路由方式為implicit,此方式可動態添加分片,但存入數據時需要手動指定想存入的分片名,另一個為CompositeID不可添加分片,只能使用分裂分片方式增加分片,存入數據時根據id值平均分配到每個分片;
shards=shard_default,shard_H2000,shard_LOCALIZEDMANAGE 設置每個分片的名字,router.name=implicit情況下有效
)
curl 'http://'$currentIp':8991/solr/admin/collections?action=CREATE&name=qdfs&collection.configName=qdfsconf&maxShardsPerNode=10&numShards=3&replicationFactor=2&router.name=implicit&routerName=implicit&shards=shard_default,shard_H2000,shard_LOCALIZEDMANAGE'
6、配置完成
#執行此命令獲取頁面地址
echo 'http://'$currentIp':8992/solr/#/~cloud'
打開瀏覽器訪問地址進行測試
可看到一個collection:qdfs,3個分片:shard_default,shard_H2000,shard_LOCALIZEDMANAGE,每個分片2個復制
三、solrcloud運維常用命令
1、新增shard
curl 'http://'$currentIp':8993/solr/admin/collections?action=CREATESHARD&collection=qdfs&shard=newShardName'
2、添加replica,可通過界面操作,但是非常強烈建議用命令行方式(上次界面方式卡住了,無限重試,生成70多個replica,把整個collection刪掉才解決的)
curl 'http://'$currentIp':8993/solr/admin/collections?action=ADDREPLICA&collection=qdfs&shard=shard_H2000&node=172.17.0.9:8983_solr'
3、增加node,即增加一個dockersolr虛機
cp -r /home/docker/solr/zksolrdata/nodex /home/docker/solr/zksolrdata/node4
docker run --name qd-solrcloud4 --restart=always -d -p 8994:8983 -m 4096m -v /home/docker/solr/zksolrdata:/opt/solrdata solr:chinese -c -z $currentIp:2191,$currentIp:2192,$currentIp:2193/solr -s /opt/solrdata/node4
4、collection、shard、replica其他相關命令
curl 'http://'$currentIp':8991/solr/admin/collections?action=CLUSTERSTATUS'
##collection
#列出collection
curl 'http://'$currentIp':8993/solr/admin/collections?action=LIST'
#刪除collection
curl 'http://'$currentIp':8993/solr/admin/collections?action=DELETE&name=qdfs'
#重啟collection
curl 'http://'$currentIp':8993/solr/admin/collection?action=RELOAD&name=qdfs'
##shard
#分裂shard
curl 'http://'$currentIp':8993/solr/admin/collections?action=SPLITSHARD&collection=qdfs&shard=shard1'
#新增shard
curl 'http://'$currentIp':8993/solr/admin/collections?action=CREATESHARD&collection=qdfs&shard=sharde'
#刪除shard
curl 'http://'$currentIp':8993/solr/admin/collections?action=DELETESHARD&collection=qdfs&shard=sharde'
#replica
#添加replica
curl 'http://'$currentIp':8993/solr/admin/collections?action=ADDREPLICA&collection=qdfs&shard=shard_H2000&node=172.17.0.9:8983_solr'
#刪除replica
curl 'http://'$currentIp':8993/solr/admin/collections?action=DELETEREPLICA&collection=qdfs&shard=shard_H2000&replica=core_node14'
##configset
#列出configset
curl 'http://'$currentIp':8993/solr/admin/configs?action=LIST'
#刪除configset
curl 'http://'$currentIp':8993/solr/admin/configs?action=delete&name=qdfsconf'
5、其他
#查看文件夾大小
du -s /home/docker/solr/zksolrdata/node*/qdfs_shard_H2000_replica*