Skip to content

Instantly share code, notes, and snippets.

@kiahhan
Last active August 20, 2017 15:37
Show Gist options
  • Save kiahhan/8586133 to your computer and use it in GitHub Desktop.
Save kiahhan/8586133 to your computer and use it in GitHub Desktop.
搭建在Ubuntu 13.10 Docker上的SolrCloud集群

###搭建在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。 Solrcloud

####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文件吧。好了集群已经搭建好了,可以开始使用。

####参考:

以上内容是根据参考资料,结合自己亲测后分享出来的。可能有些内容不够完善或者是不正确,请大家斧正。谢谢

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment