Solr&Zookeeper(솔라&주키퍼) cloud 환경 구성

2018. 9. 13. 23:34Search-Engine/Elasticsearch&Solr

Solr&Zookeeper(솔라&주키퍼) cloud 환경 구성



Mac OS 환경에서 작성되었습니다.


solr와 zookeeper를 연동하여 cloud 환경구성하기 입니다.


우선 진행하기 전에 수정 혹은 생성 되어야할 설정 목록입니다.


1)solr.xml : solr cloud를 이루는 solr instance에 관한 설정파일입니다.

2)zoo.cfg : zookeeper 관련 설정파일입니다.

3)collection config file : solr collection들이 가지게 될 schema.xml,solrConfig.xml 등의 파일이 들어가는 config file입니다. 이 파일은 zookeeper에 upconfig하여 모든 solr                                         instance들이 공유하게 됩니다.

4)zooServer Dir : zookeeper들은 파일로써 data snapshot을 저장합니다. 그러한 snapshot파일과 zookeeper 식별 파일들이 들어가는 디렉토리입니다.




<solr.xml>

solr의 폴더의 위치를 편하게 $SOLR_HOME이라고 표현합니다.


$SOLR_HOME/server/solr

$SOLR_HOME/server/solr2

$SOLR_HOME/server/solr3


이렇게 3개의 폴더를 생성해줍니다.(solr는 원래 존재하는 폴더) 그리고 solr folder 밑에 solr.xml파일을 복사하여 solr2/solr3 folder 밑에 복사해줍니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<?xml version="1.0" encoding="UTF-8" ?>
<solr>
  <solrcloud>
    <str name="host">localhost</str>
    <int name="hostPort">${jetty.port:8983}</int>
    <str name="hostContext">${hostContext:solr}</str>
    <bool name="genericCoreNodeNames">${genericCoreNodeNames:true}</bool>
    <int name="zkClientTimeout">${zkClientTimeout:30000}</int>
    <int name="distribUpdateSoTimeout">${distribUpdateSoTimeout:600000}</int>
    <int name="distribUpdateConnTimeout">${distribUpdateConnTimeout:60000}</int>
    <str name="zkCredentialsProvider">${zkCredentialsProvider:org.apache.solr.common.cloud.DefaultZkCredentialsProvider}</str>
    <str name="zkACLProvider">${zkACLProvider:org.apache.solr.common.cloud.DefaultZkACLProvider}</str>
  </solrcloud>
  <shardHandlerFactory name="shardHandlerFactory"
    class="HttpShardHandlerFactory">
    <int name="socketTimeout">${socketTimeout:600000}</int>
    <int name="connTimeout">${connTimeout:60000}</int>
  </shardHandlerFactory>
</solr>
 
cs

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<?xml version="1.0" encoding="UTF-8" ?>
<solr>
  <solrcloud>
    <str name="host">localhost</str>
    <int name="hostPort">${jetty.port:8984}</int>
    <str name="hostContext">${hostContext:solr}</str>
    <bool name="genericCoreNodeNames">${genericCoreNodeNames:true}</bool>
    <int name="zkClientTimeout">${zkClientTimeout:30000}</int>
    <int name="distribUpdateSoTimeout">${distribUpdateSoTimeout:600000}</int>
    <int name="distribUpdateConnTimeout">${distribUpdateConnTimeout:60000}</int>
    <str name="zkCredentialsProvider">${zkCredentialsProvider:org.apache.solr.common.cloud.DefaultZkCredentialsProvider}</str>
    <str name="zkACLProvider">${zkACLProvider:org.apache.solr.common.cloud.DefaultZkACLProvider}</str>
  </solrcloud>
  <shardHandlerFactory name="shardHandlerFactory"
    class="HttpShardHandlerFactory">
    <int name="socketTimeout">${socketTimeout:600000}</int>
    <int name="connTimeout">${connTimeout:60000}</int>
  </shardHandlerFactory>
</solr>
 
cs


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<?xml version="1.0" encoding="UTF-8" ?>
<solr>
  <solrcloud>
    <str name="host">localhost</str>
    <int name="hostPort">${jetty.port:8985}</int>
    <str name="hostContext">${hostContext:solr}</str>
    <bool name="genericCoreNodeNames">${genericCoreNodeNames:true}</bool>
    <int name="zkClientTimeout">${zkClientTimeout:30000}</int>
    <int name="distribUpdateSoTimeout">${distribUpdateSoTimeout:600000}</int>
    <int name="distribUpdateConnTimeout">${distribUpdateConnTimeout:60000}</int>
    <str name="zkCredentialsProvider">${zkCredentialsProvider:org.apache.solr.common.cloud.DefaultZkCredentialsProvider}</str>
    <str name="zkACLProvider">${zkACLProvider:org.apache.solr.common.cloud.DefaultZkACLProvider}</str>
  </solrcloud>
  <shardHandlerFactory name="shardHandlerFactory"
    class="HttpShardHandlerFactory">
    <int name="socketTimeout">${socketTimeout:600000}</int>
    <int name="connTimeout">${connTimeout:60000}</int>
  </shardHandlerFactory>
</solr>
 
cs


총 3개의 solr.xml이 각각의 solr,solr2,solr3 폴더에 위치하게 됩니다. 보시는 것과 같이 service port 만 달라지게 됩니다. 이렇게 solr instance가 3개가 뜨게 되며, 각각 8983,8984,8985 port로 요청을 받게 됩니다. 여기서 인스턴스를 홀수개로 띄우는 이유는 리더선출에 관련되어 있습니다. 반드시 클라우드 환경에서는 홀수개의 인스턴스를 띄워줘야 합니다.


그리고 $SOLR_HOME에 적절한 위치에 zookeeper에 upconfig할 config file folder를 위치시켜줍니다. 본인은 server folder와 같은 위치에 solr-config 라는 folder로 만듬. 그리고 이 solr-config 밑에는 conf라는 폴더가 위치해야하고 conf라는 폴더 밑에 upconfig를 위한 설정파일들이 위치해야함.







<zoo.cfg>

zookeeper가 위치한 폴더경로를 편하게 $ZK_HOME이라고 표현하겠습니다.


1
2
3
4
5
6
7
8
9
#tickTime=2000
initLimit=10
syncLimit=5
dataDir=/Users/yun-yeoseong/zooServer/zookeeper/1
clientPort=2181
 
server.1=127.0.0.1:2888:3888
server.2=127.0.0.1:2889:3889
server.3=127.0.0.1:2890:3890
cs


1
2
3
4
5
6
7
8
9
#tickTime=2000
initLimit=10
syncLimit=5
dataDir=/Users/yun-yeoseong/zooServer/zookeeper/2
clientPort=2182
 
server.1=127.0.0.1:2888:3888
server.2=127.0.0.1:2889:3889
server.3=127.0.0.1:2890:3890
cs

1
2
3
4
5
6
7
8
9
#tickTime=2000
initLimit=10
syncLimit=5
dataDir=/Users/yun-yeoseong/zooServer/zookeeper/3
clientPort=2183
 
server.1=127.0.0.1:2888:3888
server.2=127.0.0.1:2889:3889
server.3=127.0.0.1:2890:3890
cs


$ZK_HOME/conf 밑에 총 3개의 zoo.cfg,zoo2.cfg,zoo3.cfg 파일들을 생성해줍니다. 여기서 dataDir는 zookeeper의 식별자파일 및 data snapshot들이 저장되는 경로입니다. 3개의 zookeeper 인스턴스는 각각의 zoo.cfg를 갖습니다.(zookeeper도 동일한 이유로 홀수개의 인스턴스를 띄움). clientPort는 말그대로 zookeeper가 사용할 포트입니다. 그 밑에 server.1=~는 총개의 zookeeper의 인스턴스를 뜻하며 2개의 포트는 zookeeper들끼리 통신할 포트와 리더선출을 위한 포트로 사용됩니다.



<dataDir>



zoo.cfg에 작성한 dataDir와 동일한 위치에 디렉토리 구조를 잡아줍니다. 그리고 그 디렉토리 밑에 확장자가 없는 myid파일들을 각각 만들어줍니다.(~$vi myid) 그리고 각 내용은 상위 폴더와 같이 1/myid는 1이라는 숫자하나 2/myid는 2라는 숫자하나 3/myid는 3이라는 숫자하나만 넣어줍니다.(version-2 폴더는 필자가 cloud환경을 운영하다 생긴 폴더입니다. zookeeper의 data snapshot 파일등이 들어가있습니다. 별도로 생성할 필요 x)


여기까지 모두 세팅이 완료되었습니다.


zookeeper 실행

bin/zkServer.sh start conf/zoo.cfg

bin/zkServer.sh start conf/zoo2.cfg

bin/zkServer.sh start conf/zoo3.cfg 


zookeeper 종료

bin/zkServer.sh stop conf/zoo.cfg

bin/zkServer.sh stop conf/zoo2.cfg

bin/zkServer.sh stop conf/zoo3.cfg


solr 실행

bin/solr start -c -s server/solr -p 8983 -z localhost:2181,localhost:2182,localhost:2183 -noprompt

bin/solr start -c -s server/solr2 -p 8984 -z localhost:2181,localhost:2182,localhost:2183 -noprompt

bin/solr start -c -s server/solr3 -p 8985 -z localhost:2181,localhost:2182,localhost:2183 -noprompt


solr 종료
bin/solr stop -c -s server/solr -p 8983 -z localhost:2181,localhost:2182,localhost:2183 -noprompt
bin/solr stop -c -s server/solr2 -p 8984 -z localhost:2181,localhost:2182,localhost:2183 -noprompt
bin/solr stop -c -s server/solr3 -p 8985 -z localhost:2181,localhost:2182,localhost:2183 -noprompt

이렇게 하면 zookeeper 3개 solr 3개가 올라가는 cloud환경을 구성할 수 있습니다. 지금은 로컬환경이라 한 서버에 3개를 모두 올렸지만 나중에 서버환경에서는 각각 다른 서버에 올리시면 됩니다. 여기서 중요한 것은 만약 다른 서비스 프로젝트에서 solr와 연동되어 사용될때, solr 요청 ip가 localhost가 아니라 server_ip로 요청(즉, 로컬환경이 아니라 서버배포환경)이 간다면 처음에 solr.xml에 설정된 <str name="host">server_ip</str>로 변경해주셔야합니다. 다른 서비스프로젝트에서는 server_ip로 요청을 보내고 cloud환경의 solr는 localhost로 띄운다면 정상적으로 동작하지 않을 것입니다.

여기까지입니다.

여기서 생략된 부분이 몇가지 있다면 solr의 zk upconfig 명령어를 이용하여 solr-config에 있는 config file을 zookeeper에 업로드하는 명령어와 기타 색인 및 쿼리 작업들은 생략되었습니다. 이 부분들은 대부분 구글링 하면 많은 것이라 생각하기에...생략하였습니다. 하지만 중요한 부분입니다. collection을 생성할때에는 반드시 config파일의 이름을 물고 생성이 되기때문에 해당 config파일이 upconfig되어있어야지만 collection이 생성됩니다.(default config파일도 있지만 사용자들이 커스터마이징한 config file을 사용한다는 전제하에) 혹시라도 이 부분에 대해 확실한 답을 찾지 못하셨거나 궁금하신 점이 있으면 댓글 달아주시면 개인적으로 메일드리겠습니다.