天天看点

在集群上搭建speedy

前一段时间看了glusterfs分布式文件系统,从14年开始一直关注docker,现在导师让结合分布式文件系统和docker的镜像存储做些工作,并且推荐了京东的speedy,这两天一直在实验室集群上安装speedy,因为网上关于这方面的资料特别少,所以将安装过程记下来与大家分析。

首先,介绍一下环境,我用了三台服务器,分别为node01、node02、node03,并且是在root用户下操作的,在上篇文章搭建好的go语言开发环境的基础上,以下操作均是在此条件下进行的,即用户已经设定好了GOPATH和GOROOT变量,此文GOPATH为/home/go/goprojects,GOROOT为/usr/local/go,请参考者换成自己相对应的目录。

第一步,下载安装需要的包并且放入正确目录。

用的ubuntu14.04,首先安装docker_registry的依赖包python-pip,python-dev,liblzma-dev

从https://github.com/jcloudpub/speedy下载speedy解压到/home/go/goprojects/src/github.com/jcloudpub

从https://github.com/gorilla/context下载context、从https://github.com/gorilla/mux下载mux解压到/home/go/goprojects/src/github.com/gorilla

从https://github.com/garyburd/redigo下载redigo解压到/home/go/goprojects/src/github.com/garyburd

从https://github.com/go-sql-driver/mysql下载mysql解压到/home/go/goprojects/src/github.com/go-sql-driver

第二步,进入speedy目录,执行make命令,编译程序

第三步,如果机器上没有安装mysql,安装上

第四步,假设mysql的用户名和密码都是root,建立speedy和metadb数据库,具体命令为 mysql -uroot -proot < docs/speedy.sql

第五步,我是用的node01当作chunkmaster宿主机,ip地址为10.107.18.31,node01、node02、node03上各安装一组chunkserver。在node01上启动chunkmaster,这一步要注意,因为speedy原程序假设mysql的root用户没有密码,所以我们要先改源代码将root用户的密码也改为root。具体方法如下所示:

打开cmd/chunkmaster/main.go,找到第23行,将flag.string()第二个参数的空字符串加上root,保存后退出。之后重新编译该文件,生成chunkmaster替换bin文件中原来的chunkmaster。到此,更改完毕,运行chunkmaster,命令为bin/chunkmaster

第六步,建立描述chunkserver信息的文件serverlist.json,文件的内容为

node01:

[

      {"GroupId":1,"Ip":"127.0.0.1","Port":7654},

      {"GroupId":1,"Ip":"127.0.0.1","Port":7655},

     {"GroupId":1,"Ip":"127.0.0.1","Port":7656}

]

node02:

[

      {"GroupId":2,"Ip":"10.107.18.31","Port":7664},

      {"GroupId":2,"Ip":"10.107.18.31","Port":7665},

     {"GroupId":2,"Ip":"10.107.18.31","Port":7666}

]

node03:

[

      {"GroupId":3,"Ip":"10.107.18.31","Port":7674},

      {"GroupId":3,"Ip":"10.107.18.31","Port":7675},

     {"GroupId":3,"Ip":"10.107.18.31","Port":7676}

]

文件建好后,在三台机器上分别运行命令curl -i -X POST --data @serverlist.json "http://10.107.18.31:8099/v1/chunkserver/batchinitserver",将chunkserver信息传送给chunkmaster

第七步,基于以上的设置运行chunkserver,在三台机器上分别运行

node01:

./bin/spy_server --ip=10.107.18.31 --port=7654 --data_dir=~/spy_data --error_log=./err.log --group_id=1 --master_port=8099 --master_ip=10.107.18.31     

./bin/spy_server --ip=10.107.18.31 --port=7655 --data_dir=~/spy_data --error_log=./err.log --group_id=1 --master_port=8099 --master_ip=10.107.18.31  

./bin/spy_server --ip=10.107.18.31 --port=7656 --data_dir=~/spy_data --error_log=./err.log --group_id=1 --master_port=8099 --master_ip=10.107.18.31     

node02:

./bin/spy_server --ip=10.107.18.32 --port=7664 --data_dir=~/spy_data --error_log=./err.log --group_id=2 --master_port=8099 --master_ip=10.107.18.31     

./bin/spy_server --ip=10.107.18.32 --port=7665 --data_dir=~/spy_data --error_log=./err.log --group_id=2 --master_port=8099 --master_ip=10.107.18.31  

./bin/spy_server --ip=10.107.18.32 --port=7666 --data_dir=~/spy_data --error_log=./err.log --group_id=2 --master_port=8099 --master_ip=10.107.18.31      

node03:

./bin/spy_server --ip=10.107.18.33 --port=7674 --data_dir=~/spy_data --error_log=./err.log --group_id=3 --master_port=8099 --master_ip=10.107.18.31     

./bin/spy_server --ip=10.107.18.33 --port=7675 --data_dir=~/spy_data --error_log=./err.log --group_id=3 --master_port=8099 --master_ip=10.107.18.31  

./bin/spy_server --ip=10.107.18.33 --port=7676 --data_dir=~/spy_data --error_log=./err.log --group_id=3 --master_port=8099 --master_ip=10.107.18.31

     第八步,同第五步原因,打开cmd/imageserver/main.go,找到第23行,将flag.string()第二个参数的空字符串加上root,保存后退出。之后重新编译该文件,生成 imageserver替换bin文件中原来的imageserver。运行imageserver,bin/imagerserver

至此,speedy已经搭建成功。

再向下就是在该speedy的基础上安装docker_registry

第一步,安装docker_registry相关包

首先,mkdir /home/docker/registry建立放文件的目录

然后,执行tar -xzvf ./docker_registry/docker-registry-core-2.0.3.tar.gz和tar -xzvf ./docker_registry/docker-registry-0.9.0.tar.gz分别解压docker-registry-core-2.0.3和docker-registry-0.9.0,将这两个解压好的包转移到/home/docker/registry,同时将docker_registry_speedy_driver转移到/home/docker/registry

第二步,安装docker-registry-core-2.0.3和docker-registry-0.9.0

cd /home/docker/registry/docker-registry-core-2.0.3

python setup.py install

cd /home/docker/registry/docker-registry-0.9.0

python setup.py install

第三步,安装speedy_docker_registry_driver

cd speedy_docker_registry_driver

python setup.py install

第四步,更改registry的设置文件 cd /home/docker/registry/docker_registry_speedy_driver/ cp config_sample.yml config.yml,将config.yml中的speedy选项中的storage_urls:改为_env:SPEEDY_STORAGE:http://127.0.0.1:6788 在该目录下建立dev.env文件,文件内容如下: export GUNICORN_WORKERS=16                                                                                                                                                      

export SETTINGS_FLAVOR=speedy                                                                                                                                                    

export SPEEDY_TMPDIR=/home/docker /registry/temp      

export DOCKER_REGISTRY_CONFIG=/home/docker/registry/docker_registry_speedy_driver/config .yml 执行命令 .  ./dev.env设置环境变量 第五步,启动docker_registry 执行/usr/local/bin/docker-registry,启动完成后,上传镜像时,如果报Error: Invalid Registry endpoint: This does not look like a Registry server ("X-Docker-Registry-Version" header not found in the response)错误,证明docker版本太低,要用1.0以上的稳定版本; 换成新版本后错误就变成了Error response from daemon: v1 ping attempt failed with error: Get https://node01:5000/v1/_ping: EOF. If this private registry supports only HTTP or HTTPS with an unknown CA certificate, please add `--insecure-registry node01:5000` to the daemon's arguments. In the case of HTTPS, if you have access to the registry's CA certificate, no need for the flag; simply place the CA certificate at /etc/docker/certs.d/node01:5000/ca.crt 。简单的解决方法是 1. 在要上传镜像的机器上执行 service docker stop先关掉docker daemon 2.在要上传镜像的机器上 /usr/bin/docker -d --insecure-registry node01:5000,node01为该机器主机名 可以执行push操作了,比如docker push node01:5000/ubuntu:latest