Swift(OpenStack Object Storage)是Rackspace开发的高可用分布式对象存储,贡献给了OpenStack。上次在《通过RADOSGW提供ceph的S3和Swift接口》一文里介绍了ceph RADOSGW的Swift接口,这次让我们直接来试试原生的swift吧!
准备工作
我们需要先安装virtualBox和vagrant。通过vagrant来驱动virtualBox搭建一个虚拟测试环境。首先在本地任意路径新建一个空文件夹比如test
,运行以下命令:
virtual box host1 2 3 4
| mkdir test cd test vagrant init minimum/ubuntu-trusty64-docker vi Vagrantfile
|
里面应该有一句config.vm.box = "minimum/ubuntu-trusty64-docker"
,在它的下面添加如下几行代码,相当于给它分配一台IP为192.168.33.17,内存为1G的虚拟机。
Vagrantfile1 2 3 4
| config.vm.network "private_network", ip: "192.168.33.17" config.vm.provider "virtualbox" do |v| v.memory = 1024 end
|
这个vagrant镜像已经在ubuntu的基础上帮我们安装了docker,用起来很方便。然后终端运行以下命令启动并连接虚拟机。
搭建环境
这里参考了Swift的官方文档Swift All In One来搭建一个swift测试环境。首先需要安装各种依赖包:
1 2 3 4 5 6 7 8 9 10
| sudo apt-get update sudo apt-get -y install curl gcc memcached rsync sqlite3 xfsprogs \ git-core libffi-dev python-setuptools \ liberasurecode-dev sudo apt-get -y install python-coverage python-dev python-nose \ python-xattr python-eventlet \ python-greenlet python-pastedeploy \ python-netifaces python-pip python-dnspython \ python-mock sudo pip install --upgrade pip
|
这里就不用fdisk
而使用较简单的环回设备来当做我们的存储:
1 2 3 4
| sudo mkdir /srv sudo truncate -s 1GB /srv/swift-disk sudo mkfs.xfs /srv/swift-disk sudo sh -c 'echo "/srv/swift-disk /mnt/sdb1 xfs loop,noatime,nodiratime,nobarrier,logbufs=8 0 0" >> /etc/fstab'
|
生成挂载点和link:
1 2 3 4 5 6 7 8 9 10 11 12
| sudo mkdir /mnt/sdb1 sudo mount /mnt/sdb1 sudo mkdir /mnt/sdb1/1 /mnt/sdb1/2 /mnt/sdb1/3 /mnt/sdb1/4 sudo chown vagrant:vagrant /mnt/sdb1/* for x in {1..4}; do sudo ln -s /mnt/sdb1/$x /srv/$x; done sudo mkdir -p /srv/1/node/sdb1 /srv/1/node/sdb5 \ /srv/2/node/sdb2 /srv/2/node/sdb6 \ /srv/3/node/sdb3 /srv/3/node/sdb7 \ /srv/4/node/sdb4 /srv/4/node/sdb8 \ /var/run/swift sudo chown -R vagrant:vagrant /var/run/swift for x in {1..4}; do sudo chown -R vagrant:vagrant /srv/$x/; done
|
在rc.local
里增加几条创建文件夹和授权的命令,使之能够被开机执行:
1 2 3 4
| sudo sed -i '$i mkdir -p /var/cache/swift /var/cache/swift2 /var/cache/swift3 /var/cache/swift4' /etc/rc.local sudo sed -i '$i chown vagrant:vagrant /var/cache/swift*' /etc/rc.local sudo sed -i '$i mkdir -p /var/run/swift' /etc/rc.local sudo sed -i '$i chown vagrant:vagrant /var/run/swift' /etc/rc.local
|
接下来需要安装swift和它的客户端:
1 2 3 4 5 6 7
| cd $HOME; git clone https://github.com/openstack/python-swiftclient.git cd $HOME/python-swiftclient; git checkout 2.7.0; sudo python setup.py develop; cd - git clone https://github.com/openstack/swift.git cd $HOME/swift; git checkout 2.7.0 sed -i "s/;python_version<'3.0'//" requirements.txt sed -i "/dnspython3>=1.12.0;python_version>='3.0'/d" requirements.txt sudo pip install -r requirements.txt; sudo python setup.py develop; sudo pip install -r test-requirements.txt
|
然后需要配置rsync:
1 2 3 4
| sudo cp $HOME/swift/doc/saio/rsyncd.conf /etc/ sudo sed -i "s/<your-user-name>/vagrant/" /etc/rsyncd.conf sudo sed -i "s/RSYNC_ENABLE=false/RSYNC_ENABLE=true/" /etc/default/rsync sudo service rsync restart
|
使用以下命令来验证rsync,应该能看到一堆的account、container和object:
1
| rsync rsync://pub@localhost/
|
我们前面已经安装了memcached,验证一下服务是可用的:
1
| sudo service memcached status
|
接下来需要配置各个节点:
1 2 3
| cd $HOME/swift/doc; sudo cp -r saio/swift /etc/swift; cd - sudo chown -R ${USER}:${USER} /etc/swift find /etc/swift/ -name \*.conf | xargs sudo sed -i "s/<your-user-name>/${USER}/"
|
然后配置swift脚本,/etc/swift/test.conf
为我们添加了三个测试账户:
1 2 3 4 5 6 7 8 9
| mkdir -p $HOME/bin cd $HOME/swift/doc; cp saio/bin/* $HOME/bin; cd - chmod +x $HOME/bin/* echo "export SAIO_BLOCK_DEVICE=/srv/swift-disk" >> $HOME/.bashrc sed -i "/^find/d" $HOME/bin/resetswift cp $HOME/swift/test/sample.conf /etc/swift/test.conf echo "export SWIFT_TEST_CONFIG_FILE=/etc/swift/test.conf" >> $HOME/.bashrc echo "export PATH=${PATH}:$HOME/bin" >> $HOME/.bashrc . $HOME/.bashrc
|
Swift里有一个非常重要的概念,ring。通过它可以找到数据的物理位置。它的存储模型是这样的:一个账号(account)里可以有多个容器(container),容器里可以有许多个键值对,字典里的值称为对象(object)。账号和容器被存储在SQLite数据库里,而对象是以文件方式存储的。账号数据库、容器数据库和每个单独对象都有自己的ring。下面我们来构建一些ring:
启动环境
现在我们就可以用startmain
启动swift啦:
1 2
| sudo sed -i 's/bind_ip = 127.0.0.1/bind_ip = 192.168.33.17/' /etc/swift/proxy-server.conf startmain
|
然后用test:tester/testing
这个预先创建好的测试账户登录:
1 2 3 4 5 6
| curl -i -H 'X-Storage-User: test:tester' -H 'X-Storage-Pass: testing' http://192.168.33.17:8080/auth/v1.0 | tee auth.txt sudo apt-get -y install dos2unix dos2unix auth.txt export X_AUTH_TOKEN=`cat auth.txt | sed -n 's/X-Auth-Token: \(.*\)/\1/p'` export X_STORAGE_URL=`cat auth.txt | sed -n 's/X-Storage-Url: \(.*\)/\1/p'` curl -v -H "X-Auth-Token: $X_AUTH_TOKEN" $X_STORAGE_URL
|
上面用到dos2unix
是因为取到的X-Storage-Url
最后面带着^M$
的特殊字符。直接管道的话,下一个curl
会报错:Illegal characters found in URL
。可以保存成文件之后使用cat -A
来查看这些特殊字符。
登录完成后,就能看到swift的状态和所有容器啦:
1 2
| swift -A http://192.168.33.17:8080/auth/v1.0 -U test:tester -K testing stat swift -A http://192.168.33.17:8080/auth/v1.0 -U test:tester -K testing list
|
测试环境
Swift测试
有兴趣的话,还可以运行下面的单元测试、功能测试和探索性测试:
1 2 3
| $HOME/swift/.unittests $HOME/swift/.functests $HOME/swift/.probetests
|
Docker Registry测试
在Docker Registry的config.yml
里使用以下配置:
1 2 3 4 5 6
| storage: swift: username: test:tester password: testing authurl: http://192.168.33.17:8080/auth/v1.0 container: swift
|
可以测试docker push
啦。不过记得需要先登录用户哦。