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
- 덧1, 점심 먹고 같은 팀의 안건님께 Docker에 대한 설명을 들은게 큰 도움이 되었다.
- 덧2, 위 방식이 올바른 건지 모르겠다.
- 덧3, 참고로 위의 예제에서
/work/dotfiles/docker-data-es1/elasticsearch.yml
이렇게 설정파일이 위치한다.