Swift (OpenStack Object Storage)是Rackspace开发的高可用分布式对象存储,贡献给了OpenStack 。上次在《通过RADOSGW提供ceph的S3和Swift接口》 一文里介绍了ceph RADOSGW的Swift接口,这次让我们直接来试试原生的swift吧!
准备工作 我们需要先安装virtualBox 和vagrant 。通过vagrant来驱动virtualBox搭建一个虚拟测试环境。首先在本地任意路径新建一个空文件夹比如test,运行以下命令:
1 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的虚拟机。
1 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 updatesudo 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 /srvsudo truncate -s 1GB /srv/swift-disksudo mkfs.xfs /srv/swift-disksudo 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/sdb1sudo mount /mnt/sdb1sudo mkdir /mnt/sdb1/1 /mnt/sdb1/2 /mnt/sdb1/3 /mnt/sdb1/4sudo 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/swiftfor 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.localsudo sed -i '$i chown vagrant:vagrant /var/cache/swift*' /etc/rc.localsudo sed -i '$i mkdir -p /var/run/swift' /etc/rc.localsudo sed -i '$i chown vagrant:vagrant /var/run/swift' /etc/rc.local
接下来需要安装swift和它的客户端:
1 2 3 4 5 6 cd $HOME ; git clone https://github.com/openstack/python-swiftclient.gitcd $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.0sed -i "s/;python_version=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//vagrant/" /etc/rsyncd.confsudo sed -i "s/RSYNC_ENABLE=false/RSYNC_ENABLE=true/" /etc/default/rsyncsudo 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/swiftfind /etc/swift/ -name \*.conf | xargs sudo sed -i "s//${USER} /"
然后配置swift脚本,/etc/swift/test.conf为我们添加了三个测试账户:
1 2 3 4 5 6 7 8 9 mkdir -p $HOME /bincd $HOME /swift/doc; cp saio/bin/* $HOME /bin; cd -chmod +x $HOME /bin/*echo "export SAIO_BLOCK_DEVICE=/srv/swift-disk" >> $HOME /.bashrcsed -i "/^find/d" $HOME /bin/resetswift cp $HOME /swift/test/sample.conf /etc/swift/test.confecho "export SWIFT_TEST_CONFIG_FILE=/etc/swift/test.conf" >> $HOME /.bashrcecho "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.confstartmain
然后用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 dos2unixdos2unix 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啦。不过记得需要先登录用户哦。