文章目录
  1. 1. 准备工作
  2. 2. 搭建环境
  3. 3. 启动环境
  4. 4. 测试环境
    1. 4.1. Swift测试
    2. 4.2. Docker Registry测试

Swift(OpenStack Object Storage)是Rackspace开发的高可用分布式对象存储,贡献给了OpenStack。上次在《通过RADOSGW提供ceph的S3和Swift接口》一文里介绍了ceph RADOSGW的Swift接口,这次让我们直接来试试原生的swift吧!

准备工作

我们需要先安装virtualBoxvagrant。通过vagrant来驱动virtualBox搭建一个虚拟测试环境。首先在本地任意路径新建一个空文件夹比如test,运行以下命令:

virtual box host
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的虚拟机。

Vagrantfile
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,用起来很方便。然后终端运行以下命令启动并连接虚拟机。

virtual box host terminal
1
2
vagrant up
vagrant ssh

搭建环境

这里参考了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:

1
remakerings

启动环境

现在我们就可以用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啦。不过记得需要先登录用户哦。

文章目录
  1. 1. 准备工作
  2. 2. 搭建环境
  3. 3. 启动环境
  4. 4. 测试环境
    1. 4.1. Swift测试
    2. 4.2. Docker Registry测试