###搭建在Ubuntu 13.10 Docker上的SolrCloud集群
基于上一篇在Ubuntu 13.10上搭建Docker环境,已经在Ubuntu 13.10上搭建了一个Docker环境,现在可以再Docker上继续来玩SolrCloud,这样的话,就省去在多台机器上配置Solr环境,配置zookeeper,十分轻松地使用Docker的container在一台ubuntu上搭建一个具有单个zookeeper3.4.5节点的SolrCloud集群。
先看一下完成后的SlorCloud,具有三个节点,两个shard。
####Zookeeper
首先来看zookeeper的搭建。当前使用的zookeeper版本是3.4.5,本次是直接使用docker-zookeeper项目,这是一个具有单节点zookeeper的Dockerfile。对于如何build dockerfile,可以参考官方文档(http://docs.docker.io/en/latest/use/builder/)
下边直接开始,打开terminal,执行以下语句
# 在任意目录下创建新的zookeeper-docker目录
mkdir zookeeper-docker
cd zookeeper-docker
wget https://raw.github.com/jplock/docker-zookeeper/master/Dockerfile
# 开始build container,kiah/zookeeper:3.4.5代表container的名字;另外注意最后的点,代表当前目录。
docker build -t kiah/zookeeper:3.4.5 .
# 终端输出,此处省略5000字
...
Successfully built 281a1d9f0d34
# 运行刚刚build好的container
docker run -name zookeeper -p 2181 -p 2888 -p 3888 kiah/zookeeper:3.4.5
你会看到在终止中输出了zookeeper的运行日志,如果你键入CTRL+C就会终止container的运行。为了接下来继续,不要终止container。后续的操作请开启新的terminal窗口执行 以上语句中用到的 -p 2181 -p 2888 -p 3888 是指运行时,将container的2181,2888,3888三个端口随机映射到宿主机的三个端口上
测试一下zookeeper的运行状态,是否已经成功启动
echo ruok | nc -q 2 localhost `docker port zookeeper 2181|sed 's/.*://'`; echo
# 输出imok就说明已经成功运行zookeeper
imok
插播内容
如果你键入了CTRL+C而终止了kiah/zookeeper:3.4.5
container的运行,当你再次执行docker run -name zookeeper -p 2181 -p 2888 -p 3888 kiah/zookeeper:3.4.5
的时候,你会发现无法启动这个container了,终端的输出如下:
docker run -name zookeeper -p 2181 -p 2888 -p 3888 kiah/zookeeper:3.4.5
# 终端输出的错误信息,导致无法再次启动container
2014/01/24 09:17:00 Error: create: Conflict, The name zookeeper is already assigned to 281a1d9f0d34. You have to delete (or rename) that container to be able to assign zookeeper to a container again.
我查了一些资料,有人提出这是一个bug,新的版本中会解决这个问题。但是现在怎么解决呢
这个container已经关闭,而且通过docker ps
也看不到这个container正在运行了。根本就没有这个container了,要怎么删除这个container,或者是重命名呢?
根据以下的操作执行就好
docker ps -a|grep zookeeper
# 终端输出,可以看到有一个状态为Exit255的zookeeper container
281a1d9f0d34 kiah/zookeeper:3.4.5 /opt/zookeeper-3.4.5 40 hours ago Exit 255 boring_fermat/ZK,drunk_darwin/ZK,silly_poincare/ZK,trusting_fermat/ZK,zookeeper
168f90bca620 300fbe5f4d05 /opt/zookeeper-3.4.5 42 hours ago Exit 0 furious_mclean
1e842fe7a787 14acd776089b /opt/zookeeper-3.4.5 42 hours ago Exit 0 hungry_poincare
docker rm 281a
# 终端输出
281a
# 再次查看没有CONTAINER ID是281a1d9f0d34的container了
docker ps -a|grep zookeeper
168f90bca620 300fbe5f4d05 /opt/zookeeper-3.4.5 42 hours ago Exit 0 furious_mclean
1e842fe7a787 14acd776089b /opt/zookeeper-3.4.5 42 hours ago Exit 0
# 再次run起来container,是不是可以了呢
docker run -name zookeeper -p 2181 -p 2888 -p 3888 kiah/zookeeper:3.4.5
####SolrCloud
zookeeper已经成功配置好了,现在就是要配置三个SolrCloud的节点,每个节点启动一个container。 目前最新的Solr版本是4.6.0。下载最新版的solr用来创建docker container。
# 在任意目录下创建新的solr-docker目录
mkdir solr-docker
cd solr-docker
# 下载solr的最新版压缩包
wget http://apache.mirrors.pair.com/lucene/solr/4.6.0/solr-4.6.0.tgz
下载好的solr压缩包将会用于构建container
######创建Docker file文件:
cat > Dockerfile <<'EOM'
#
# VERSION 0.2
FROM ubuntu
MAINTAINER Kiah "kiahhan@outlook.com"
ENV SOLR solr-4.6.0
RUN mkdir -p /opt
ADD $SOLR.tgz /opt/$SOLR.tgz
RUN tar -C /opt --extract --file /opt/$SOLR.tgz
RUN ln -s /opt/$SOLR /opt/solr
RUN apt-get update
RUN apt-get --yes install openjdk-6-jdk
EXPOSE 8983
CMD ["/bin/bash", "-c", "cd /opt/solr/example; java -jar start.jar"]
EOM
# 开始build docker container
docker build -rm=true -t kiah/solr4:4.6.0 .
如果你不想build 以上的container,也可以使用docker pull makuk66/docker-solr
,然后用makuk66/docker-solr来替换一下的kiah/solr4:4.6.0
接下来就是要开始在container中启动solr的service,开启一个新的terminal窗口执行以下:
docker run -link zookeeper:ZK -i -p 8983 -t kiah/solr4:4.6.0 \
/bin/bash -c 'cd /opt/solr/example; java -Dbootstrap_confdir=./solr/collection1/conf -Dcollection.configName=myconf -DzkHost=$ZK_PORT_2181_TCP_ADDR:$ZK_PORT_2181_TCP_PORT -DnumShards=2 -jar start.jar'
以上使用到的**-link zookeeper:ZK参数,只是指将之前的“zookeeper” container的网络信息映射为环境参数ZK,那么在使用中就可以通过ZK_**作为前缀。 关于container link,可以参考(http://docs.docker.io/en/latest/use/working_with_links_names/)
开启两个新的terminal窗口,来启动另外两个solrCloud节点
docker run -link zookeeper:ZK -i -p 8983 -t kiah/solr4:4.6.0 \
/bin/bash -c 'cd /opt/solr/example; java -DzkHost=$ZK_PORT_2181_TCP_ADDR:$ZK_PORT_2181_TCP_PORT -jar start.jar'
好了,现在所有的zookeeper节点和三个solrCloud节点都已经运行起来了。
可以通过docker ps
来查看所有运行的container
docker ps
# 输出的正在运行的container信息
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ce599f68dff7 kiah/solr4:4.6.0 /bin/bash -c cd /opt 19 hours ago Up 19 hours 0.0.0.0:49158->8983/tcp drunk_darwin
e9d8182d9fe5 kiah/solr4:4.6.0 /bin/bash -c cd /opt 19 hours ago Up 19 hours 0.0.0.0:49157->8983/tcp silly_poincare
f82a434d7f5a kiah/solr4:4.6.0 /bin/bash -c cd /opt 19 hours ago Up 19 hours 0.0.0.0:49156->8983/tcp trusting_fermat
281a1d9f0d34 kiah/zookeeper:3.4.5 /opt/zookeeper-3.4.5 19 hours ago Up 19 hours 0.0.0.0:49153->2181/tcp, 0.0.0.0:49154->2888/tcp, 0.0.0.0:49155->3888/tcp boring_fermat/ZK,drunk_darwin/ZK,silly_poincare/ZK,trusting_fermat/ZK,zookeeper
从以上的输出中PORTS列可以看到端口映射情况。例如第一行的CONTAINER ID 为ce599f68dff7
的container,它所对应的PORTS信息是0.0.0.0:49158->8983/tcp
,这代表了宿主机的端口49158映射为container的内部端口8983。由于每个container都是独立运行的,所有三个Solr节点都可以用8983端口来启动,只是他们映射到宿主机的端口不用而已。
现在就可以用其中一个kiah/solr4:4.6.0 container暴露出来的端口来访问SolrCloud集群http://127.0.0.1:49158/solr/#/~cloud
,至此就可以看到具有2 shards、3个solr节点的集群。从集群图中看到的节点IP地址就是每个container的内部IP地址。
插播内容
######如何查看container的IP地址 使用docker inspect可以查看container的一些简单信息
# container ID的前四位用来定位一个container。
docker inspect ce59
# 输出的container信息,其中包括container的内部IP地址
[{
"ID": "ce599f68dff7eca68a872f98f659a0422cf0b99092a5b088f81843aad5d553eb",
"Created": "2014-01-23T00:41:40.467010625Z",
"Path": "/bin/bash",
"Args": [
"-c",
"cd /opt/solr/example; java -DzkHost=$ZK_PORT_2181_TCP_ADDR:$ZK_PORT_2181_TCP_PORT -jar start.jar"
],
"Config": {
"Hostname": "ce599f68dff7",
"Domainname": "",
"User": "",
"Memory": 0,
"MemorySwap": 0,
"CpuShares": 0,
"AttachStdin": true,
"AttachStdout": true,
"AttachStderr": true,
"PortSpecs": null,
"ExposedPorts": {
"8983/tcp": {}
},
"Tty": true,
"OpenStdin": true,
"StdinOnce": true,
"Env": [
"HOME=/",
"PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
"SOLR=solr-4.6.0"
],
"Cmd": [
"/bin/bash",
"-c",
"cd /opt/solr/example; java -DzkHost=$ZK_PORT_2181_TCP_ADDR:$ZK_PORT_2181_TCP_PORT -jar start.jar"
],
"Dns": null,
"Image": "kiah/solr4:4.6.0",
"Volumes": null,
"VolumesFrom": "",
"WorkingDir": "",
"Entrypoint": null,
"NetworkDisabled": false
},
"State": {
"Running": true,
"Pid": 17788,
"ExitCode": 0,
"StartedAt": "2014-01-23T00:41:40.631708053Z",
"FinishedAt": "0001-01-01T00:00:00Z",
"Ghost": false
},
"Image": "286fec2246203482a84f04706a123bdee01ca73a212d1f2caea703f5a5927490",
"NetworkSettings": {
"IPAddress": "172.17.0.5",
"IPPrefixLen": 16,
"Gateway": "172.17.42.1",
"Bridge": "docker0",
"PortMapping": null,
"Ports": {
"8983/tcp": [
{
"HostIp": "0.0.0.0",
"HostPort": "49158"
}
]
}
},
"ResolvConfPath": "/var/lib/docker/containers/ce599f68dff7eca68a872f98f659a0422cf0b99092a5b088f81843aad5d553eb/resolv.conf",
"HostnamePath": "/var/lib/docker/containers/ce599f68dff7eca68a872f98f659a0422cf0b99092a5b088f81843aad5d553eb/hostname",
"HostsPath": "/var/lib/docker/containers/ce599f68dff7eca68a872f98f659a0422cf0b99092a5b088f81843aad5d553eb/hosts",
"Name": "/drunk_darwin",
"Driver": "aufs",
"Volumes": {},
"VolumesRW": {},
"HostConfig": {
"Binds": null,
"ContainerIDFile": "",
"LxcConf": [],
"Privileged": false,
"PortBindings": {
"8983/tcp": [
{
"HostIp": "0.0.0.0",
"HostPort": "49158"
}
]
},
"Links": null,
"PublishAllPorts": false
}
}]%
# 当然也可以使用更简单的命令
docker inspect -format='{{.NetworkSettings.IPAddress}}' ce59
# 输出的IP地址就是该container的IP地址
172.17.0.5
插播结束
当然了,折腾了这么半天,总得搞点Solr能干的事情才能证明这玩意是能跑的吧。 以下的内容都可以直接通过宿主机的IP和端口来执行,但是为了证明docker很强大,所以以下都使用docker的一个container来执行
打开一个新的终端,开始提交document到solr的index
docker run -link zookeeper:ZK -i -t kiah/solr4:4.6.0 /bin/bash
# 进入到container的终端中
cd /opt/solr/example/exampledocs
# 这边的IP和端口可以换成127.0.0.1:49158
java -Durl=http://172.17.0.5:8983/solr/update -jar post.jar *.xml
开始搜索,继续要刚才的container终端中
# 先安装个wget,container里可是独立的,什么也没有,所以得安装
apt-get install wget
wget -O - 'http://172.17.0.5:8983/solr/collection1/select?q=solr&wt=xml'
# 接着来看看各个solr的shard里的document数量
wget -O - 'http://192.168.0.221:49158/solr/collection1/select?q=*:*&wt=xml' | sed 's/.*numFound="//' | sed 's/".*//'
# 总的document数据是32个
32
wget -O - 'http://192.168.0.221:49158/solr/collection1/select?q=*:*&wt=xml&shards=shard1' | sed 's/.*numFound="//' | sed 's/".*//'
# shard1中的document是14个
14
wget -O - 'http://192.168.0.221:49158/solr/collection1/select?q=*:*&wt=xml&shards=shard2' | sed 's/.*numFound="//' | sed 's/".*//'
# shard1中的document是18个
18
如果你感兴趣,也可以通过docker diff
来看看container里都有那些文件文件变化。可以看到多了很多index文件吧。好了集群已经搭建好了,可以开始使用。
####参考:
以上内容是根据参考资料,结合自己亲测后分享出来的。可能有些内容不够完善或者是不正确,请大家斧正。谢谢