之前介紹了《OpenStack Swift All In One安裝部署流程與簡單使用》,那么接下來就說一說Swift集群部署吧。
1. 簡介
本文檔詳細描述了使用兩台PC部署一個小型Swift集群的過程,並給出一些簡單的使用實例。本文檔假定如下前提條件:
- 使用Ubuntu操作系統。
- 每台機器都運行Swift的所有服務,既是Proxy Server,又是Storage Server,用戶可以向任何一台機器發起存儲服務請求。
- 采用Swift自帶的TempAuth作為用戶的身份與權限認證。
- 所有機器構成memcached集群來提供Token緩存服務。
- 所有操作均在root用戶下進行,並使用root作為Swift的用戶和組。
- 所有機器都運行在局域網中。
- 使用回環設備和XFS文件系統作為Swift底層存儲。
閱讀本文檔前,可以先閱讀文檔《Swift All In One安裝部署流程》,學習Swift單機部署的相關知識。
2. 安裝部署
2.1 准備環境
|
PC 1 |
PC 2 |
機器類型: |
PC物理機 |
PC物理機 |
操作系統: |
Ubuntu-12.04-desktop-64位 |
Ubuntu-12.04-desktop-64位 |
用戶類型: |
root |
root |
數據庫: |
sqlite3 |
sqlite3 |
IP地址: |
192.168.3.52(局域網) |
192.168.3.53(局域網) |
Proxy Server: |
是 |
是 |
Storage Server: |
是 |
是 |
Auth: |
TempAuth |
TempAuth |
Token緩存: |
memcached |
memcached |
2.2 版本說明
本文檔基於:
- 官方文檔:Swift 1.7.7-dev documentation -> Instructions for a Multiple Server Swift Installation (Ubuntu)
- Swift版本:1.7.6
- python-swiftclient版本:1.2.0
請確保安裝的Swift版本與本文檔中的版本相同。如有問題,請參考官網的更新文檔。
2.3 安裝軟件環境
首先,在PC1和PC2上安裝Swift所需的軟件環境(確保你的機器可以訪問互聯網),例如,sqlite3作為本地數據庫,memcached作為Token緩存。Ubuntu-12.04已自帶rsync工具,因此不用另行安裝。
# apt-get install python-software-properties # add-apt-repository ppa:swift-core/release # apt-get update # apt-get install curl gcc git-core memcached python-coverage python-dev python-nose python-setuptools python-simplejson python-xattr sqlite3 xfsprogs python-eventlet python-greenlet python-pastedeploy python-netifaces python-pip # pip install mock |
2.4 安裝Swift
在PC1和PC2上執行以下操作,安裝Swift服務:
1. 在主目錄(root用戶)下創建swift目錄。然后在該下創建bin目錄,用於存放我們手動創建的Swift相關腳本文件。
# mkdir ~/swift # mkdir –p ~/swift/bin |
2. 進入~/swift目錄,然后從git上獲取Swift和python-swiftclient源代碼,下載到本地。當然也可以使用以前下載的1.7.6版本的Swift代碼和1.2.0版本的python-swiftclient代碼,將代碼目錄放至~/swift目錄下即可。
# cd ~/swift # git clone https://github.com/openstack/swift.git # git clone https://github.com/openstack/python-swiftclient.git |
3. 然后使用上述代碼以開發的方式安裝Swift和python-swiftclient(假設Swift的代碼目錄為~/swift/swift_1.7.6,python-swiftclient的代碼目錄為~/swift/python-swiftclient_1.2.0)。最終,兩者都會被安裝到python的dist-packages中。
# cd ~/swift/swift_1.7.6 # python setup.py develop # cd ~/swift/python-swiftclient_1.2.0 # python setup.py develop |
4. 安裝過程中,會自動檢查其所需的依賴項,並自動進行下載安裝。文件~/swift/swift_1.7.6/tools/pip-requires中(內容如下所示)記錄了Swift所需的依賴項,setup.py就是根據該文件來檢查依賴項的。
eventlet>=0.9.15 greenlet>=0.3.1 netifaces>=0.6 pastedeploy>=1.3.3 simplejson>=2.0.9 xattr>=0.4 python-swiftclient |
5. 類似的,文件~/swift/python-swiftclient_1.2.0/tools/pip-requires中(內容如下所示)記錄了python-swiftclient所需的依賴項。
simplejson |
6. 修改~/.bashrc文件,在文件尾部添加如下內容:(該文件包含當前用戶Bash Shell的環境變量信息,用以標明Swift測試配置文件路徑和啟動程序路徑)
export SWIFT_TEST_CONFIG_FILE=/etc/swift/test.conf export PATH=${PATH}:~/swift/bin |
7. 然后執行如下命令,以使修改生效。一旦生效,終生有效哦親!。
# . ~/.bashrc |
8. 創建/var/run/swift目錄,並修改其權限。該目錄是Swift運行時所需的,用於存放各個服務進程的pid文件等內容。
# mkdir -p /var/run/swift # chown root:root /var/run/swift |
9. /var/run/swift目錄在操作系統關閉后會消失,因此需要在操作系統再次啟動時進行創建。我們可以編輯/etc/rc.local文件,在exit 0 之前添加如下內容來實現該目錄的自動創建。
mkdir -p /var/run/swift chown root:root /var/run/swift |
2.5 配置Storage Server
2.5.1 配置存儲空間
Swift能夠運行在任何支持擴展屬性的現代文件系統之上,Swift官方推薦用戶使用XFS文件系統。經過官方的驗證,認為XFS文件系統能為Swift的用例提供最佳的性能,並且通過了完整的穩定性測試。
對於任何一台PC,我們可以選擇使用一個分區作為存儲(Using a partition for storage),也可以使用一個回環設備作為存儲(Using a loopback device for storage)。由於實驗環境所限,本文檔使用回環設備作為存儲。若希望使用獨立分區作為存儲,請參考官方文檔。我們需要在每一台PC上創建回環設備,作為每一個Swift節點的數據存儲空間。在PC1和PC2上執行以下操作:
1. 選擇一個位置創建存儲文件夾。
# mkdir /srv |
2. 在存儲文件夾中創建XFS格式的回環設備,即/srv/swift-disk文件。
- 第一條命令:if=/dev/zero表示空輸入,即自動填充0;of=/srv/swift-disk表示輸出到指定文件;bs=1024表示同時設置讀入/輸出的塊大小(字節),即每次讀入/輸出1024字節的數據塊;count=0表示拷貝0個塊,塊大小由bs指定;seek=50000000從輸出文件開頭跳過50000000個塊后再開始復制。第一條命令的結果是創建了一個50000000*1024字節大小的文件(約50GB,未自動填充0),為創建回環設備做准備。
- 第二條命令:.xfs表示創建的是XFS格式的回環設備;-i size=1024,當數據小於1024KB時,寫入inode中,當數據大於1024KB時,寫入block中,默認值為256KB;還可以考慮設置-l size=128m,可顯著提升XFS文件系統刪除文件、拷貝文件等操作的速度,但需要大內存的支持,默認值的是10m。第二條命令的結果是在上述文件的基礎上創建了XFS回環設備。
# dd if=/dev/zero of=/srv/swift-disk bs=1024 count=0 seek=50000000 # mkfs.xfs -f -i size=1024 /srv/swift-disk |
3. 編輯/etc/fstab文件,在文件末尾添加如下內容:
/srv/swift-disk /srv/node/sdb1 xfs loop,noatime,nodiratime,nobarrier,logbufs=8 0 0 |
4. 創建回環設備掛載點文件夾,並執行掛載。
# mkdir -p /srv/node/sdb1 # mount /srv/node/sdb1 |
5. 改變掛載點文件夾的權限。
# chown -R root:root /srv/node |
2.5.2 配置Swift
在PC1和PC2上創建Swift的配置文件目錄。
# mkdir -p /etc/swift # chown -R root:root /etc/swift/ |
在PC1中創建配置文件/etc/swift/swift.conf,編輯其內容(如下所示),然后復制到PC2中的/etc/swift目錄下。該文件記錄了Swift使用的哈希后綴,用於一致性哈希計算。集群中的每個節點都必須保存該文件,並且完全相同。
[swift-hash] # random unique string that can never change (DO NOT LOSE) swift_hash_path_suffix = jtangfs |
2.5.3 配置rsync
rsync是類Unix系統下的數據鏡像備份工具。Swift對象副本的復制更新是基於推送模式的。對象的復制更新使用rsync將文件同步到對等節點,Account和Container的復制更新則通過HTTP或rsync來推送數據庫文件上丟失的記錄。在PC1和PC2上創建rsync的配置文件/etc/rsyncd.conf,添加如下內容:(下面以PC1為例,其中的address是PC1上rsync服務端監聽的IP地址,等待客戶端推送復制更新,這里同樣推薦設置為內網地址)
uid = root gid = root log file = /var/log/rsyncd.log pid file = /var/run/rsyncd.pid address = 192.168.3.52
[account] max connections = 2 path = /srv/node/ read only = false lock file = /var/lock/account.lock
[container] max connections = 2 path = /srv/node/ read only = false lock file = /var/lock/container.lock
[object] max connections = 2 path = /srv/node/ read only = false lock file = /var/lock/object.lock |
為了使rsync能夠開機啟動,需要在PC1和PC2上編輯配置文件/etc/default/rsync,將參數RSYNC_ENABLE設置為true,然后啟動rsync服務。
# perl -pi -e 's/RSYNC_ENABLE=false/RSYNC_ENABLE=true/' /etc/default/rsync # service rsync restart |
2.5.4 配置存儲服務(account, container, object)
在PC1和PC2上執行以下操作,以完成每個節點上的account、container和object存儲服務的配置。下面以PC1上的操作為例。
1. 配置account存儲服務,創建配置文件/etc/swift/account-server.conf,並添加以下內容:(其中,devices參數表示Parent directory of where devices are mounted,默認值為/srv/node;log_facility表示日志標簽,與獨立日志的配置有關)
[DEFAULT] devices = /srv/node mount_check = false bind_ip = 192.168.3.52 bind_port = 6002 workers = 4 user = root log_facility = LOG_LOCAL4
[pipeline:main] pipeline = account-server
[app:account-server] use = egg:swift#account
[account-replicator]
[account-auditor]
[account-reaper] |
2. 配置container存儲服務,創建配置文件/etc/swift/container-server.conf,並添加以下內容:
[DEFAULT] devices = /srv/node mount_check = false bind_ip = 192.168.3.52 bind_port = 6001 workers = 4 user = root log_facility = LOG_LOCAL3
[pipeline:main] pipeline = container-server
[app:container-server] use = egg:swift#container
[container-replicator]
[container-updater]
[container-auditor]
[container-sync] |
3. 配置object存儲服務,創建配置文件/etc/swift/object-server.conf,並添加以下內容:
[DEFAULT] devices = /srv/node mount_check = false bind_ip = 192.168.3.52 bind_port = 6000 workers = 4 user = root log_facility = LOG_LOCAL2
[pipeline:main] pipeline = object-server
[app:object-server] use = egg:swift#object
[object-replicator]
[object-updater]
[object-auditor] |
2.5.5 配置獨立日志(可選)
Swift默認將日志信息輸出到文件/var/log/syslog中。如果要按照個人需求設置rsyslog,生成特有的Swift日志文件,則需要在PC1和PC2上執行以下操作,完成獨立日志的配置。
1. 創建日志配置文件/etc/rsyslog.d/10-swift.conf,編輯內容如下:(增加account、container、object的日志配置信息)
# Uncomment the following to have a log containing all logs together #local1,local2,local3,local4,local5.* /var/log/swift/all.log
# Uncomment the following to have hourly proxy logs for stats processing $template HourlyProxyLog,"/var/log/swift/hourly/%$YEAR%%$MONTH%%$DAY%%$HOUR%" #local1.*;local1.!notice ?HourlyProxyLog
local2.*;local2.!notice /var/log/swift/object.log local2.notice /var/log/swift/ object.error local2.* ~
local3.*;local3.!notice /var/log/swift/container.log local3.notice /var/log/swift/ container.error local3.* ~
local4.*;local4.!notice /var/log/swift/account.log local4.notice /var/log/swift/ account.error local4.* ~ |
2. 編輯文件/etc/rsyslog.conf,更改參數$PrivDropToGroup為adm。
$PrivDropToGroup adm |
3. 創建/var/log/swift目錄,用於存放獨立日志。此外,上面的10-swift.conf 文件中設置了輸出Swift Proxy Server每小時的stats日志信息,於是也要創建/var/log/swift/hourly目錄。
# mkdir -p /var/log/swift/hourly |
4. 更改Swift獨立日志目錄的權限。
# chown -R syslog.adm /var/log/swift # chmod -R g+w /var/log/swift |
5. 重啟rsyslog服務
# service rsyslog restart |
2.6 配置Proxy Server
2.6.1 配置memcached
Proxy Server使用memcached來緩存用戶的Token。我們可根據具體需求修改memcached配置文件/etc/memcached.conf。例如,考慮到安全因素,只允許memcached在局域網內被訪問,則應將其監聽的IP地址修改為局域網IP地址(默認為127.0.0.1,內外網通吃)。推薦配置為內部的、非公網的IP地址。將PC1上的修改為192.168.3.52,PC2上的修改為192.168.3.53,並在完成后重啟memcached服務。下面以PC1上執行的命令為例:
# perl -pi -e "s/-l 127.0.0.1/-l 192.168.3.52/" /etc/memcached.conf # service memcached restart |
2.6.2 配置Swift
由於每一台PC都運行Swift的所有服務,既作為Proxy Server,又作為Storage Server,上面在配置Storage Server時已經完成了Swift的配置,此處可省略。但是,如果Proxy Server和Storage Server是分離的,那么就需要將上面的swift.conf文件復制到Proxy Server中的/etc/swift目錄下。
2.6.3 配置proxy-server
在PC1和PC2上創建proxy-server配置文件/etc/swift/proxy-server.conf,添加以下內容:
[DEFAULT] bind_port = 8080 user = root workers = 8 log_facility = LOG_LOCAL1
[pipeline:main] pipeline = healthcheck cache tempauth proxy-logging proxy-server
[app:proxy-server] use = egg:swift#proxy allow_account_management = true account_autocreate = true
[filter:tempauth] use = egg:swift#tempauth user_admin_admin = admin .admin .reseller_admin user_test_tester = testing .admin user_test2_tester2 = testing2 .admin user_test_tester3 = testing3 reseller_prefix = AUTH # account和token的命名前綴,注意此處不可以加“_”。 # 例如X-Storage-Url為http://192.168.3.52:8080/v1/AUTH_test # 例如X-Auth-Token為AUTH_tk440e9bd9a9cb46d6be07a5b6a585f7d1 token_life = 86400 # token的有效期,單位:秒。
[filter:healthcheck] use = egg:swift#healthcheck
[filter:cache] use = egg:swift#memcache memcache_servers = 192.168.3.52:11211,192.168.3.53:11211
[filter:proxy-logging] use = egg:swift#proxy_logging |
配置參數中:memcache_servers指定memcached地址,可配置為集群,以“,”分隔;workers為工作線程數,推薦配置為CPU核心數的2-4倍;“user_admin_admin = admin .admin .reseller_admin”中,user_為前綴,第一個“admin”為賬戶名,第二個“admin”為用戶名,第三個“admin為”密碼,“.admin”為角色信息,“.reseller_admin”表示超級管理員角色(可操作任何賬戶)。
“user_admin_admin = admin .admin .reseller_admin”后面還可以增加一項<storage-url>,顯示地指定Swift為該用戶提供的存儲服務入口(PC1為admin用戶提供的默認值是http://192.168.3.52:8080/v1/AUTH_admin)。admin用戶通過認證后,Swift會把Token和該<storage-url>返回給用戶,此后admin用戶可以使用該<storage-url>訪問Swift來請求存儲服務。特別值得說明的是,如果在Proxy Server前面增加了負載均衡器(如nginx),那么該<storage-url>應該指向負載均衡器,使得用戶在通過認證后,向負載均衡器發起存儲請求,再由負載均衡器將請求均衡地分發給Proxy Server集群。此時的<storage-url>形如http://<LOAD_BALANCER_HOSTNAME>:<PORT>/v1/AUTH_admin。
Swift同時支持http和https協議,本文檔中我們使用http協議,若想使用https協議,則需要進行ssl的配置,具體操作請查看參考鏈接中的內容。
2.6.4 配置獨立日志(可選)
上文中已經做了說明,此處可用於設置Proxy Server的獨立日志,需要在PC1和PC2上執行以下操作,完成其配置。
1. 編輯日志配置文件/etc/rsyslog.d/10-swift.conf,增加proxy的日志配置信息:
# Uncomment the following to have a log containing all logs together #local1,local2,local3,local4,local5.* /var/log/swift/all.log
# Uncomment the following to have hourly proxy logs for stats processing $template HourlyProxyLog,"/var/log/swift/hourly/%$YEAR%%$MONTH%%$DAY%%$HOUR%" #local1.*;local1.!notice ?HourlyProxyLog
local1.*;local1.!notice /var/log/swift/proxy.log local1.notice /var/log/swift/ proxy.error local1.* ~
local2.*;local2.!notice /var/log/swift/object.log local2.notice /var/log/swift/ object.error local2.* ~
local3.*;local3.!notice /var/log/swift/container.log local3.notice /var/log/swift/ container.error local3.* ~
local4.*;local4.!notice /var/log/swift/account.log local4.notice /var/log/swift/ account.error local4.* ~ |
2. 重啟rsyslog服務
# service rsyslog restart |
2.6.5 創建Ring
Ring共有三種,分別為Account Ring、Container Ring、Object Ring。Ring需要在整個集群中保持完全相同,因此需要在某一台PC上創建Ring文件,然后復制到其他PC上。我們將在PC1上進行Ring的創建,然后復制到PC2上。
首先,使用如下命令創建三個Ring。其中,18表示Ring的分區數為218;2表示對象副本數為2;1表示分區數據的遷移時間為1小時(這個解釋有待證實)。
# cd /etc/swift # swift-ring-builder account.builder create 18 2 1 # swift-ring-builder container.builder create 18 2 1 # swift-ring-builder object.builder create 18 2 1 |
然后向三個Ring中添加存儲設備。其中z1和z2表示zone1和zone2;sdb1為Swift使用的存儲空間,即上文掛在的回環設備;100代表設備的權重。
# cd /etc/swift # swift-ring-builder account.builder add z1-192.168.3.52:6002/sdb1 100 # swift-ring-builder container.builder add z1-192.168.3.52:6001/sdb1 100 # swift-ring-builder object.builder add z1-192.168.3.52:6000/sdb1 100
# swift-ring-builder account.builder add z2-192.168.3.53:6002/sdb1 100 # swift-ring-builder container.builder add z2-192.168.3.53:6001/sdb1 100 # swift-ring-builder object.builder add z2-192.168.3.53:6000/sdb1 100 |
Ring文件創建完畢后,可以通過以下命令來查看剛才添加的信息,以驗證是否輸入正確。若發現錯誤,以Account Ring為例,可以使用swift-ring-builder account.builder的刪除方法刪除已添加的設備,然后重新添加。
# cd /etc/swift # swift-ring-builder account.builder # swift-ring-builder container.builder # swift-ring-builder object.builder |
完成設備的添加后,我們還需要創建Ring的最后一步,即平衡環。這個過程需要消耗一些時間。成功之后,會在當前目錄生成account.ring.gz、container.ring.gz和object.ring.gz三個文件,這三個文件就是所有節點(包括Proxy Server和Storage Server)要用到的Ring文件。我們需要將這三個文件拷貝到PC2中的/etc/swift目錄下。
# cd /etc/swift # swift-ring-builder account.builder rebalance # swift-ring-builder container.builder rebalance # swift-ring-builder object.builder rebalance |
由於我們統一采用root用戶部署,所以要確保所有節點上的/etc/swift目錄都屬於root用戶。
# chown -R root:root /etc/swift |
2.7 創建Swift執行腳本
為便於操作,我們可以在PC1和PC2上創建以下Swift腳本。
1. 創建~/swift/bin/remakerings腳本文件,添加以下內容,即可一鍵完成Ring的重新創建,當然具體內容需要根據實際環境進行修改。
#!/bin/bash
cd /etc/swift
rm -f *.builder *.ring.gz backups/*.builder backups/*.ring.gz
swift-ring-builder account.builder create 18 2 1 swift-ring-builder container.builder create 18 2 1 swift-ring-builder object.builder create 18 2 1
swift-ring-builder account.builder add z1-192.168.3.52:6002/sdb1 100 swift-ring-builder container.builder add z1-192.168.3.52:6001/sdb1 100 swift-ring-builder object.builder add z1-192.168.3.52:6000/sdb1 100
swift-ring-builder account.builder add z2-192.168.3.53:6002/sdb1 100 swift-ring-builder container.builder add z2-192.168.3.53:6001/sdb1 100 swift-ring-builder object.builder add z2-192.168.3.53:6000/sdb1 100
swift-ring-builder account.builder rebalance swift-ring-builder container.builder rebalance swift-ring-builder object.builder rebalance |
2. 創建~/swift/bin/resetswift腳本文件,添加以下內容,即可一鍵清空Swift的對象數據和日志,完成重置。注意:如果使用的是獨立分區存儲,則需要另行處理,例如將/srv/swift-disk替換為/dev/sdb1等;如果沒有使用rsyslog作為獨立日志,則需要去掉“find /var/log/swift... ”和“sudo service rsyslog restart”這兩行。
#!/bin/bash
swift-init all stop find /var/log/swift -type f -exec rm -f {} \; sudo umount /srv/node/sdb1 sudo mkfs.xfs -f -i size=1024 /srv/swift-disk sudo mount /srv/node/sdb1 sudo chown root:root /srv/node/sdb1 sudo rm -f /var/log/debug /var/log/messages /var/log/rsyncd.log /var/log/syslog sudo service rsyslog restart sudo service rsync restart sudo service memcached restart |
3. 創建~/swift/bin/startmain腳本文件,添加以下內容,即可一鍵啟動Swift的基本服務,包括proxy-server、account-server、container-server和object-server。
#!/bin/bash
swift-init main start |
4. 創建~/swift/bin/stopmain腳本文件,添加以下內容,即可一鍵關閉Swift的基本服務,包括proxy-server、account-server、container-server和object-server。
#!/bin/bash
swift-init main stop |
5. 創建~/swift/bin/startall腳本文件,添加以下內容,即可一鍵啟動Swift的所有服務,包括proxy-server、account-server、account-replicator 、account-auditor、container-server、container-replicator、container-updater、container-auditor、object-server、object-replicator、object-updater、object-auditor。
#!/bin/bash
swift-init proxy start swift-init account-server start swift-init account-replicator start swift-init account-auditor start swift-init container-server start swift-init container-replicator start swift-init container-updater start swift-init container-auditor start swift-init object-server start swift-init object-replicator start swift-init object-updater start swift-init object-auditor start |
6. 創建~/swift/bin/stopall腳本文件,添加以下內容,即可一鍵關閉Swift的所有服務,包括proxy-server、account-server、account-replicator 、account-auditor、container-server、container-replicator、container-updater、container-auditor、object-server、object-replicator、object-updater、object-auditor。
#!/bin/bash
swift-init proxy stop swift-init account-server stop swift-init account-replicator stop swift-init account-auditor stop swift-init container-server stop swift-init container-replicator stop swift-init container-updater stop swift-init container-auditor stop swift-init object-server stop swift-init object-replicator stop swift-init object-updater stop swift-init object-auditor stop |
7. 完成腳本創建后,需要更改腳本權限,使之能夠執行。
# chmod +x ~/swift/bin/* |
2.8 啟動與關閉Swift服務
由於我們是以開發的方式安裝Swift的,所以能夠執行功能單元測試。若提示“Unable to read test config /etc/swift/test.conf – file not found”,可不必理會,或手動將配置文件~/swift/swift_1.7.6/test/sample.conf復制過去。
# cd ~/swift/swift_1.7.6 # ./.unittests |
我們需要在PC1和PC2上啟動Proxy Server和Storage Server的服務。為了便於操作,我們直接使用上文中創建的腳本文件(在~/swift/bin目錄下)運行Swift。可以使用~/swift/bin/startmain腳本文件啟動Swift的基本服務;或使用~/swift/bin/startall腳本文件鍵啟動Swift的所有服務。若提示“Unable to increase file descriptor limit. Running as non-root?”警告為正常現象,不必理會。
# startmain 或 # startall |
同樣的,我們可以使用~/swift/bin/stopmain腳本文件關閉Swift的基本服務;使用~/swift/bin/stopall腳本文件鍵關閉Swift的所有服務。
# stopmain 或 # stopall |
2.9 查看Swift幫助信息
完成安裝部署后,可以使用swift --help命令查看Swift幫助信息。
# swift --help Usage: swift <command> [options] [args]
Commands: stat [container] [object] Displays information for the account, container, or object depending on the args given (if any). list [options] [container] Lists the containers for the account or the objects for a container. -p or --prefix is an option that will only list items beginning with that prefix. -d or --delimiter is option (for container listings only) that will roll up items with the given delimiter (see Cloud Files general documentation for what this means). upload [options] container file_or_directory [file_or_directory] [...] Uploads to the given container the files and directories specified by the remaining args. -c or --changed is an option that will only upload files that have changed since the last upload. -S <size> or --segment-size <size> and --leave-segments are options as well (see --help for more). post [options] [container] [object] Updates meta information for the account, container, or object depending on the args given. If the container is not found, it will be created automatically; but this is not true for accounts and objects. Containers also allow the -r (or --read-acl) and -w (or --write-acl) options. The -m or --meta option is allowed on all and used to define the user meta data items to set in the form Name:Value. This option can be repeated. Example: post -m Color:Blue -m Size:Large download --all OR download container [options] [object] [object] ... Downloads everything in the account (with --all), or everything in a container, or a list of objects depending on the args given. For a single object download, you may use the -o [--output] <filename> option to redirect the output to a specific file or if "-" then just redirect to stdout. delete [options] --all OR delete container [options] [object] [object] ... Deletes everything in the account (with --all), or everything in a container, or a list of objects depending on the args given. Segments of manifest objects will be deleted as well, unless you specify the --leave-segments option.
Example: swift -A https://auth.api.rackspacecloud.com/v1.0 -U user -K key stat
Options: --version show program's version number and exit -h, --help show this help message and exit -s, --snet Use SERVICENET internal network -v, --verbose Print more info -q, --quiet Suppress status output -A AUTH, --auth=AUTH URL for obtaining an auth token -V AUTH_VERSION, --auth-version=AUTH_VERSION Specify a version for authentication. Defaults to 1.0. -U USER, --user=USER User name for obtaining an auth token. -K KEY, --key=KEY Key for obtaining an auth token. --os-username=<auth-user-name> Openstack username. Defaults to env[OS_USERNAME]. --os-password=<auth-password> Openstack password. Defaults to env[OS_PASSWORD]. --os-tenant-id=<auth-tenant-id> OpenStack tenant ID. Defaults to env[OS_TENANT_ID] --os-tenant-name=<auth-tenant-name> Openstack tenant name. Defaults to env[OS_TENANT_NAME]. --os-auth-url=<auth-url> Openstack auth URL. Defaults to env[OS_AUTH_URL]. --os-auth-token=<auth-token> Openstack token. Defaults to env[OS_AUTH_TOKEN] --os-storage-url=<storage-url> Openstack storage URL. Defaults to env[OS_STORAGE_URL] --os-region-name=<region-name> Openstack region name. Defaults to env[OS_REGION_NAME] --os-service-type=<service-type> Openstack Service type. Defaults to env[OS_SERVICE_TYPE] --os-endpoint-type=<endpoint-type> Openstack Endpoint type. Defaults to env[OS_ENDPOINT_TYPE] --insecure Allow swiftclient to access insecure keystone server. The keystone's certificate will not be verified. |
3. 使用實例
啟動PC1和PC2上的Swift服務后,我們交替地在PC1和PC2上執行操作,並隨機使用兩者提供的storage-url,如果用戶驗證和存儲服務全部正確,則表明Swift集群部署成功。
3.1 用curl測試
我們先使用curl測試幾個簡單的命令。
1. 在PC1上訪問192.168.3.52,進行tester用戶驗證,獲取Token和storage-url。
# curl -k -v -H 'X-Storage-User: test:tester' -H 'X-Storage-Pass: testing' http://192.168.3.52:8080/auth/v1.0 |
* About to connect() to 192.168.3.52 port 8080 (#0) * Trying 192.168.3.52... connected > GET /auth/v1.0 HTTP/1.1 > User-Agent: curl/7.22.0 (x86_64-pc-linux-gnu) libcurl/7.22.0 OpenSSL/1.0.1 zlib/1.2.3.4 libidn/1.23 librtmp/2.3 > Host: 192.168.3.52:8080 > Accept: */* > X-Storage-User: test:tester > X-Storage-Pass: testing > < HTTP/1.1 200 OK < X-Storage-Url: http://192.168.3.52:8080/v1/AUTH_test < X-Auth-Token: AUTH_tk440e9bd9a9cb46d6be07a5b6a585f7d1 < Content-Type: text/html; charset=UTF-8 < X-Storage-Token: AUTH_tk440e9bd9a9cb46d6be07a5b6a585f7d1 < Content-Length: 0 < Date: Wed, 20 Mar 2013 06:13:15 GMT < * Connection #0 to host 192.168.3.52 left intact * Closing connection #0 |
2. 在PC1上訪問192.168.3.52,查看test賬戶的狀態信息。
# curl -k -v -H 'X-Auth-Token: AUTH_tk440e9bd9a9cb46d6be07a5b6a585f7d1' http://192.168.3.52:8080/v1/AUTH_test |
* About to connect() to 192.168.3.52 port 8080 (#0) * Trying 192.168.3.52... connected > GET /v1/AUTH_test HTTP/1.1 > User-Agent: curl/7.22.0 (x86_64-pc-linux-gnu) libcurl/7.22.0 OpenSSL/1.0.1 zlib/1.2.3.4 libidn/1.23 librtmp/2.3 > Host: 192.168.3.52:8080 > Accept: */* > X-Auth-Token: AUTH_tk440e9bd9a9cb46d6be07a5b6a585f7d1 > < HTTP/1.1 204 No Content < Content-Length: 0 < Accept-Ranges: bytes < X-Timestamp: 1363760036.52552 < X-Account-Bytes-Used: 0 < X-Account-Container-Count: 0 < Content-Type: text/html; charset=UTF-8 < X-Account-Object-Count: 0 < Date: Wed, 20 Mar 2013 06:13:56 GMT < * Connection #0 to host 192.168.3.52 left intact * Closing connection #0 |
3. 在PC1上訪問192.168.3.53,查看test賬戶的狀態信息。
# curl -k -v -H 'X-Auth-Token: AUTH_tk440e9bd9a9cb46d6be07a5b6a585f7d1' http://192.168.3.53:8080/v1/AUTH_test |
* About to connect() to 192.168.3.53 port 8080 (#0) * Trying 192.168.3.53... connected > GET /v1/AUTH_test HTTP/1.1 > User-Agent: curl/7.22.0 (x86_64-pc-linux-gnu) libcurl/7.22.0 OpenSSL/1.0.1 zlib/1.2.3.4 libidn/1.23 librtmp/2.3 > Host: 192.168.3.53:8080 > Accept: */* > X-Auth-Token: AUTH_tk440e9bd9a9cb46d6be07a5b6a585f7d1 > < HTTP/1.1 204 No Content < Content-Length: 0 < Accept-Ranges: bytes < X-Timestamp: 1363760036.52552 < X-Account-Bytes-Used: 0 < X-Account-Container-Count: 0 < Content-Type: text/html; charset=UTF-8 < X-Account-Object-Count: 0 < Date: Wed, 20 Mar 2013 06:15:19 GMT < * Connection #0 to host 192.168.3.53 left intact * Closing connection #0 |
4. 在PC2上訪問192.168.3.52,查看test賬戶的狀態信息。
# curl -k -v -H 'X-Auth-Token: AUTH_tk440e9bd9a9cb46d6be07a5b6a585f7d1' http://192.168.3.52:8080/v1/AUTH_test |
* About to connect() to 192.168.3.52 port 8080 (#0) * Trying 192.168.3.52... connected > GET /v1/AUTH_test HTTP/1.1 > User-Agent: curl/7.22.0 (x86_64-pc-linux-gnu) libcurl/7.22.0 OpenSSL/1.0.1 zlib/1.2.3.4 libidn/1.23 librtmp/2.3 > Host: 192.168.3.52:8080 > Accept: */* > X-Auth-Token: AUTH_tk440e9bd9a9cb46d6be07a5b6a585f7d1 > < HTTP/1.1 204 No Content < Content-Length: 0 < Accept-Ranges: bytes < X-Timestamp: 1363760036.52552 < X-Account-Bytes-Used: 0 < X-Account-Container-Count: 0 < Content-Type: text/html; charset=UTF-8 < X-Account-Object-Count: 0 < Date: Wed, 20 Mar 2013 06:17:01 GMT < * Connection #0 to host 192.168.3.52 left intact * Closing connection #0 |
上述測試一切正常,表明curl測試通過。
3.2 用Swift客戶端測試
接着,我們使用Swift客戶端進行測試。
1. 在PC1上訪問192.168.3.53,查看test賬戶的狀態信息。
# swift -A http://192.168.3.53:8080/auth/v1.0 -U test:tester -K testing stat |
Account: AUTH_test Containers: 0 Objects: 0 Bytes: 0 Accept-Ranges: bytes X-Timestamp: 1363760036.52552 Content-Type: text/plain; charset=utf-8 |
2. 在PC1上訪問192.168.3.52,在test賬戶下創建名為myfiles的container。
# swift -A http://192.168.3.52:8080/auth/v1.0 -U test:tester -K testing post myfiles |
|
3. 在PC1上訪問192.168.3.53,顯示test賬戶下的container列表。
# swift -A http://192.168.3.53:8080/auth/v1.0 -U test:tester -K testing list |
myfiles |
4. 在PC2上訪問192.168.3.52,顯示test賬戶下的container列表。
# swift -A http://192.168.3.52:8080/auth/v1.0 -U test:tester -K testing list |
myfiles |
5. 在PC2上訪問192.168.3.53,在剛才創建的container下上傳文件。上傳完成后,Swift服務端會以完整路徑作為文件名。
# swift -A http://192.168.3.53:8080/auth/v1.0 -U test:tester -K testing upload myfiles ~/file |
root/file |
6. 在PC1上訪問192.168.3.52,顯示剛才創建的container下的文件列表。
# swift -A http://192.168.3.52:8080/auth/v1.0 -U test:tester -K testing list myfiles |
root/file |
7. 在PC1上訪問192.168.3.52,下載剛才上傳的文件。給定的文件名必須是其完整路徑,例如上傳的文件為~/file,服務端記錄的文件名為root/file,於是下載時也要給文件名root/file,而不能是file。最終,文件會被下載到~/root目錄下,成為~/root/file。可以使用額外的命令參數來決定下載位置,詳情參考swift --help。
# swift -A http://192.168.3.52:8080/auth/v1.0 -U test:tester -K testing download myfiles root/file |
root/file [headers 0.041s, total 0.065s, 0.000s MB/s] |
上述測試一切正常,表明Swift客戶端測試通過。
4. 參考鏈接
4.1 官方連接
- Instructions for a Multiple Server Swift Installation (Ubuntu)
http://docs.openstack.org/developer/swift/howto_installmultinode.html
- SAIO - Swift All In One
http://docs.openstack.org/developer/swift/development_saio.html
- Swift 1.8.0-dev documentation -> Deployment Guide
http://docs.openstack.org/developer/swift/deployment_guide.html
4.2 非官方鏈接
- OpenStack Hands on lab 2: Swift安裝並使用Keystone做身份驗證
http://liangbo.me/index.php/2012/03/29/openstack-hands-on-lab-2-swift-installation-with-keystone/
- OpenStack Swift Install Multi Node
http://blog.csdn.net/zzcase/article/details/6578520
- Swift部署和動態擴展
http://www.kissthink.com/archive/4175.html
- Swift簡介(實為深入講解)
http://www.cnblogs.com/Bob-FD/archive/2012/07/25/2608413.html
- 在Ubuntu上安裝OpenStack Swift組件
http://blog.csdn.net/zoushidexing/article/details/7860226