Docker 로 Elasticsearch 클러스터 구성하기
각각 VM을 직접 만드는 형태 (예전 방식)
기존에 제가 하던 방식은, 아래와 같이 elasticsearch 게스트 OS를 각각 VM으로 만들어 띄우는 것이었습니다. 단점은 하드웨어 VM이라 무겁다는 점입니다.
Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
config.vm.define :main, primary: true do |main|
main.vm.box = "precise64"
main.vm.hostname = "main"
main.vm.box_url = "http://files.vagrantup.com/precise64.box"
end
config.vm.define :es1, primary: false do |main|
main.vm.box = "precise64"
main.vm.box_url = "http://files.vagrantup.com/precise64.box"
main.vm.hostname = "es1"
main.vm.provision :shell, :path => "vagrant-provision-elasticsearch.sh"
end
config.vm.define :es2, primary: false do |main|
main.vm.box = "precise64"
main.vm.box_url = "http://files.vagrantup.com/precise64.box"
main.vm.hostname = "es2"
main.vm.provision :shell, :path => "vagrant-provision-elasticsearch.sh"
end
end
Docker 컨테이너를 올리는 방식으로 전환
우선 docker 이미지 중에 elasticsearch 이미지가 있는지 찾습니다.
vagrant@main:~$ docker search elasticsearch
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
dockerfile/elasticsearch Trusted ElasticSearch (http://www.elastics... 37 [OK]
pblittle/docker-logstash Logstash (1.3.3) flat jar image. Configure... 5 [OK]
barnybug/elasticsearch Latest Elasticsearch 1.2.1 and all previou... 2 [OK]
...
docker 로 elasticsearch 클러스터를 구성하는 것을 한번 테스트해 봅니다. 사실 dockerfile/elasticsearch 가 해 주는 것은 별로 없습니다. 자바를 설치하고 elasticsearch 를 설치할 뿐입니다.
vagrant@main:~$ docker run -d --name es1 -v /work/dotfiles/docker-data-es1:/data -p 9201:9200 -p 9301:9300 dockerfile/elasticsearch
758232a67d81c32067baa010c6a29a4ac77fa9167bf326712114ab962f414bcf
vagrant@main:~$ docker run -d --name es2 -v /work/dotfiles/docker-data-es2:/data -p 9202:9200 -p 9302:9300 dockerfile/elasticsearch
16ca988a94a3cbbd8c306302f1ad134e16dcb7fb4633732df08462dc1436741d
vagrant@main:~$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
16ca988a94a3 dockerfile/elasticsearch:latest /elasticsearch/bin/e 3 seconds ago Up 3 seconds 0.0.0.0:9202->9200/tcp, 0.0.0.0:9302->9300/tcp es2
758232a67d81 dockerfile/elasticsearch:latest /elasticsearch/bin/e 6 seconds ago Up 5 seconds 0.0.0.0:9201->9200/tcp, 0.0.0.0:9301->9300/tcp es1
vagrant@main:~$ curl localhost:9201
{
"status" : 200,
"name" : "Orbit",
"version" : {
"number" : "1.2.1",
"build_hash" : "6c95b759f9e7ef0f8e17f77d850da43ce8a4b364",
"build_timestamp" : "2014-06-03T15:02:52Z",
"build_snapshot" : false,
"lucene_version" : "4.8"
},
"tagline" : "You Know, for Search"
}
vagrant@main:~$ curl localhost:9202
{
"status" : 200,
"name" : "Taskmaster",
"version" : {
"number" : "1.2.1",
"build_hash" : "6c95b759f9e7ef0f8e17f77d850da43ce8a4b364",
"build_timestamp" : "2014-06-03T15:02:52Z",
"build_snapshot" : false,
"lucene_version" : "4.8"
},
"tagline" : "You Know, for Search"
}
docker provision을 이용해서 추가하도록 Vagrantfile을 수정합니다.
main.vm.provision "docker" do |d|
data_dir = "/work/dotfiles/docker-data-es1"
d.run "es1",
image: "dockerfile/elasticsearch",
args: "--name es1 -v #{data_dir}:/data -p 9201:9200 -p 9301:9300"
data_dir = "/work/dotfiles/docker-data-es2"
d.run "es2",
image: "dockerfile/elasticsearch",
args: "--name es2 -v #{data_dir}:/data -p 9202:9200 -p 9302:9300"
end
잘 작동하는지 확인합니다.
vagrant@main:~$ curl localhost:9201/_cat/health?v
epoch timestamp cluster status node.total node.data shards pri relo init unassign
1402390226 08:50:26 sangwookescluster green 2 2 0 0 0 0 0
덧붙입니다. 점심을 먹고 같은 팀의 안건님께 Docker에 대한 설명을 들은 것이 큰 도움이 되었습니다. 위 방식이 올바른 건지는 아직 잘 모르겠습니다. 참고로 위 예제에서는 /work/dotfiles/docker-data-es1/elasticsearch.yml 의 위치에 설정 파일이 자리합니다.