1. 程式人生 > >OpenStack之swift安裝筆記

OpenStack之swift安裝筆記

    在順利的安裝部署了KeyStone之後,原以為swift的安裝除錯也會如KeyStone一般,但過程卻充滿了坎坷,在結合原始碼中的一些函式之後,終於成功的完成了swift的安裝,並實驗了上傳下載檔案等功能,下面整理了swift的安裝過程,並對遇到的問題進行了總結,希望對遇到同樣問題的人有些啟示或幫助。安裝過程依然參考的是OpenStack的官方安裝手冊,但補充了一些細節。在安裝之前,先簡單的介紹一下Swift是什麼、主要功能是什麼。OpenStack的物件儲存(Swift)是一個多租戶的、高可擴充套件的物件儲存系統,通過RESTful HTTP API管理著大量的非結構化資料,在部署物件儲存之前必須至少安裝了身份服務(KeyStone)。Swift包含的元件包括:
  1. 代理伺服器(swift-proxy-server):接受物件儲存API和HTTP請求以上傳檔案、修改元資料和建立容器,也向瀏覽器提供檔案或容器的列表。為了改進效能,代理伺服器可以使用可選的快取,通常選擇memcache與代理伺服器一起部署。
  2.  賬戶服務(account-server):管理物件儲存中的賬戶。
  3. 容器服務(container-server):管理物件儲存中容器或資料夾的對映。
  4. 物件服務(object-server):管理儲存節點上的實際物件,比如檔案。
  5.  WSGI中間層:處理認證,通常是身份服務(KeyStone)。
  6. 週期性程序:在叢集中執行各種維護任務,比如複製(replicator)服務確保叢集中資料的一致性和可用性,其它還包括:auditor, updater和reaper。

    代理服務依賴於認證和授權機制,如果使用身份服務完成認證和授權的話,則在配置管理swift之前,首先要在keystone中建立swift的認證資訊和endpoint。物件儲存在控制節點上不適用SQL資料庫。由於之前已經成功部署了KeyStone,所以這裡就不在贅述KeyStone的安裝過程,直接進入Swift的安裝。本次安裝是在單節點的虛擬機器進行的,也就是控制節點和儲存節點部署在相同的主機中,作業系統為CentOS7.1。首先在KeyStone中建立Swift的使用者、服務及endpoint,具體命令及結果如下:

[[email protected] ~]$ keystone user-create --name swift --pass 123456
+----------+----------------------------------+
| Property |              Value               |
+----------+----------------------------------+
|  email   |                                  |
| enabled  |               True               |
|    id    | ed4f45ac3e8a4ac683d54b642e61ac04 |
|   name   |              swift               |
| username |              swift               |
+----------+----------------------------------+
keystone user-role-add --user swift --role admin --tenant service
[
[email protected]
~]$ keystone service-create --name swift --type object-store +-------------+----------------------------------+ | Property | Value | +-------------+----------------------------------+ | description | | | enabled | True | | id | 094cc0da43e348f8b792f77ef99f8e7e | | name | swift | | type | object-store | +-------------+----------------------------------+ [
[email protected]
~]$ keystone endpoint-create --region regionOne --service swift --publicurl 'http://localhost:8080/v1/AUTH_%(tenant_id)s' --internalurl 'http://localhost:8080/v1/AUTH_%(tenant_id)s' --adminurl 'http://localhost:8080/v1/AUTH_%(tenant_id)s' +-------------+-----------------------------------------------------------------+ | Property | Value | +-------------+-----------------------------------------------------------------+ | adminurl | http://locoalhost:8080/v1/ | | id | c0da7d196e204e038766740e405dbbce | | internalurl | http://locoalhost:8080/v1/AUTH_2835009c452b4d408f95ff5a920fc877 | | publicurl | http://locoalhost:8080/v1/AUTH_2835009c452b4d408f95ff5a920fc877 | | region | regionOne | | service_id | 094cc0da43e348f8b792f77ef99f8e7e | +-------------+-----------------------------------------------------------------+
    然後安裝proxy-server,swift客戶端、memcached等:yum install openstack-swift-proxy python-swiftclient python-keystone-auth-token python-keystonemiddleware memcached。上面命令中的python-keystone-auth-token是無法安裝的,當使用yum安裝時將會報如下的異常資訊:沒有可用軟體包 python-keystone-auth-token。經過在OpenStack的官網確認,該問題屬於文件中的錯誤,直接忽略該問題或者執行yum install openstack-swift-proxy python-swiftclient  python-keystonemiddleware memcached。安裝執行完畢後,執行下面的命令下載proxy-server.conf檔案:
curl -o /etc/swift/proxy-server.conf https://raw.githubusercontent.com/openstack/swift/stable/juno/etc/proxyserver.conf-sample
    下載完成後需要對檔案中的配置引數進行修改,修改的具體內容如下:
  • 在[DEFAULT]中指定埠號、使用者名稱和配置檔案目錄:
[DEFAULT]
...
bind_port = 8080
user = swift
swift_dir = /etc/swift
  • 在[pipeline:main]中,啟用合適的模組:
[pipeline:main]
pipeline = authtoken cache healthcheck keystoneauth proxy-logging proxy-server
  • 在[app:proxy-server]中,啟用使用者管理功能:
[app:proxy-server]
...
allow_account_management = true
account_autocreate = true
  • 在[filter:keystoneauth]中配置合適的操作角色;
[filter:keystoneauth]
use = egg:swift#keystoneauth
...
operator_roles = admin,_member_
  • 在[filter:authtoken]中配置認證服務的相關資訊:
[filter:authtoken]
paste.filter_factory = keystonemiddleware.auth_token:filter_factory
...
auth_uri = http://localhost:5000/v2.0
identity_uri = http://localhost:35357
admin_tenant_name = service
admin_user = swift
admin_password = SWIFT_PASS #指定為使用keystone建立swift使用者時設定的密碼,比如123456
delay_auth_decision = true
  • 在[filter:cache]中,配置memcached的位置:
[filter:cache]
...
memcache_servers = 127.0.0.1:11211
    這樣就完成了proxy-server的安裝和部署,可以使用systemctl啟動該服務了,但目前先不啟動該服務,直到部署配置儲存服務後。在安裝儲存服務之前,先為儲存服務指定儲存目錄,這需要將磁碟分割槽掛載到儲存目錄。根據官方的安裝手冊,掛載的磁碟必須具備分割槽表,也就是該磁碟已經分割槽完畢。經過測試,該磁碟具備幾個分割槽不重要,但必須執行了分割槽,可以使用fdisk命令進行磁碟分割槽操作。雖然Swift支援各種檔案系統,但根據測試XFS檔案系統具有最好的效能和穩定性,所以對磁碟分割槽後,比如/dev/sdb1,需要使用命令mkfs.xfs對/dev/sdb1進行格式化:mkfs.xfs /dev/sdb1。格式化完成後,建立掛載目錄:mkdir -p /srv/node/,然後編輯/etc/fstab,新增下面語句:
/dev/sdb1 /srv/node/ xfs noatime,nodiratime,nobarrier,logbufs=8 0 2
    最後掛載裝置的儲存目錄:mount /srv/node,並修改該目錄的所有者為執行swift的使用者:chown -R swift:swift /srv/。掛載目錄是swift一個潛在的容易出問題的地方,有可能是許可權問題,也有可能和後面介紹的配置檔案有關,具體的問題後面再詳細介紹。掛載裝置後,還需要修改/etc/rsyncd.conf檔案,具體內容如下:
uid = swift
gid = swift
log file = /var/log/rsyncd.log
pid file = /var/run/rsyncd.pid
address = MANAGEMENT_INTERFACE_IP_ADDRESS
[account]
max connections = 2
path = /srv/
read only = false
lock file = /var/lock/account.lock
[container]
max connections = 2
path = /srv/
read only = false
lock file = /var/lock/container.lock
[object]
max connections = 2
path = /srv/
read only = false
lock file = /var/lock/object.lock
    做完準備工作後,執行下面的命令進行儲存服務的安裝,包括account-server、container-server和object-server:yum install openstack-swift-account openstack-swift-container openstack-swift-object。安裝完成後,執行下面的命令下載account-server.conf、container-server.conf和object-server.conf檔案:
curl -o /etc/swift/account-server.conf https://raw.githubusercontent.com/openstack/swift/stable/juno/etc/account-server.conf-sample

curl -o /etc/swift/container-server.conf https://raw.githubusercontent.com/openstack/swift/stable/juno/etc/container-server.conf-sample

curl -o /etc/swift/object-server.conf https://raw.githubusercontent.com/openstack/swift/stable/juno/etc/object-server.conf-sample
    三個配置檔案所要修改的內容很相似,因此僅對account-server.conf進行說明,其它兩個檔案不同的地方將進行標記。
  • 在[DEFAULT]中,配置ip地址、埠號、使用者、配置檔案所在目錄和掛載目錄,需要注意的地方是掛載目錄,該目錄為掛載點的上級目錄,比如/dev/sdb1掛載到目錄/srv/node目錄,在該配置檔案的中的掛載目錄應該為/srv,而不是/srv/node。
[DEFAULT]
...
bind_ip = 127.0.0.1
bind_port = 6002 #不同的服務使用不同的埠
user = swift
swift_dir = /etc/swift
devices = /srv/ #裝置掛載目錄的上級目錄
  • 在[pipeline:main]中,設定合適的模組:
[pipeline:main]
pipeline = healthcheck recon account-server#account-server在其它配置檔案中應該改為container-server、object-server
  • 在[filter:recon]中,配置recon快取目錄:
[filter:recon]
...
recon_cache_path = /var/cache/swift
    container-server.conf和object-server.conf只需要修改上面註釋的地方即可,其它地方完全一致。修改完所有配置檔案後,將/var/cache/swift的擁有者改為執行swift的使用者,比如swift使用者:chown -R swift:swift /var/cache/swift。在執行完所有上述步驟後,接下來就是要生成ring檔案,命令的具體含義不會做深入解釋,可以在命令直接輸入swift-ring-builder檢視詳細說明。首先進入到/etc/swift目錄,該目錄在上述幾個配置檔案中進行設定,然後分別為account、container和object生成ring檔案,由於所有的儲存服務都部署在單節點上,所以副本的數量設定為1,具體命令為:
swift-ring-builder account.builder create 8 1 1
swift-ring-builder container.builder create 8 1 1
swift-ring-builder object.builder create 8 1 1
    其中第一個引數指定了要生成的partition的數量,比如2^8=256,第二個引數執行了副本的數量,此處為1,第三個引數的含義為至少移動分割槽一次間隔的小時數。建立了ring檔案後,需要將儲存節點或者目錄增加到ring中:
swift-ring-builder account.builder add r1z1-127.0.0.1:6002/node 100
swift-ring-builder container.builder add r1z1-127.0.0.1:6001/node 100
swift-ring-builder object.builder add r1z1-127.0.0.1:6000/node 100
    其中的埠號一定要匹配相應配置檔案中設定的埠號,而斜線/後面的內容要匹配掛載點的最後一級目錄,比如將/dev/sdb1掛載到/srv/node上,則/後面的內容為node,而配置檔案中的devices的值則為/srv/,如果設定錯位或者不匹配掛載目錄的話,會出現下面的錯誤:
object-replicator: node is not mounted
proxy-server: ERROR Insufficient Storage 127.0.0.1:6002/node
    還可以在python命令列下輸入下面的語句驗證設定是否掛載正常、配置是否正確,如果一切正確,返回True,否則返回False:
from swift.common.constraints import check_mount
check_mount('/srv','node') #第一個引數為配置檔案中devices的值,第二個引數為向ring增加裝置時/後面的值
    然後執行下面的命令對ring進行rebalance:
swift-ring-builder account.builder rebalance
swift-ring-builder container.builder rebalance
swift-ring-builder object.builder rebalance
    注意上述生成ring檔案,增加儲存節點到ring的步驟都是在控制節店中執行的。下載swift.conf檔案並對其進行修改:
curl -o /etc/swift/swift.conf https://raw.githubusercontent.com/openstack/swift/stable/juno/etc/swift.conf-sample
  • 在[swift-hash]中配置hash路徑的字首和字尾:
[swift-hash]
...
swift_hash_path_suffix = HASH_PATH_PREFIX
swift_hash_path_prefix = HASH_PATH_SUFFIX
  • 在[storage-policy:0]配置預設的儲存策略:
[storage-policy:0]
...
name = Policy-0
default = yes
    如果是多節點部署swift的話,還需要將上述步驟生成的ring檔案、swift.conf檔案複製到所有節點中,並修改/etc/swift的擁有者為swift使用者:chown -R swift:swift /etc/swift。部署配置完成後,就需要啟動所有服務。除了proxy-server、account-server、container-server和object-server外,swift還包括許多其它的週期性程序,如果每次都要逐一啟動、停止、重啟這些服務,將會是繁瑣且無聊的過程,因此建議將所有啟動、停止或重啟的命令編入相應的指令碼,這樣只需執行指令碼就可以了,比如:
[[email protected] ~]$ cat swift-stop.sh 
#! /bin/bash
systemctl stop openstack-swift-account.service openstack-swift-account-auditor.service openstack-swift-account-reaper.service openstack-swift-account-replicator.service
systemctl stop openstack-swift-container.service openstack-swift-container-auditor.service openstack-swift-container-replicator.service openstack-swift-container-updater.service
systemctl stop openstack-swift-object.service openstack-swift-object-auditor.service openstack-swift-object-replicator.service openstack-swift-object-updater.service
    所有服務啟動完畢後,就可以檢驗一下向swift上傳下載檔案的功能了:
[[email protected] ~]$ source demo-openrc.sh 
[[email protected] ~]$ swift stat
        Account: AUTH_1928446a6c364ace8a40043b5318bd9f
     Containers: 0
        Objects: 0
          Bytes: 0
X-Put-Timestamp: 1434681204.28622
     Connection: keep-alive
    X-Timestamp: 1434681204.28622
     X-Trans-Id: tx60e7648bf53f4365a2c84-0055837f72
   Content-Type: text/plain; charset=utf-8
[[email protected] ~]$ swift upload demo swift-stop.sh --object-name stop
stop
[[email protected] ~]$ swift list
demo
[[email protected] ~]$ swift list demo
stop
    至此就完成了swift的單節點部署工作,並且從測試結果來看,一切動作正常。成功部署swift並不意味者對swift的所有功能、流程都已經熟悉了,相反還有很多需要學習的,比如swift客戶端命令的詳細使用方法,上傳下載檔案的具體流程,ring檔案的具體含義,如何調整partition的數量等,還需要進一步的學習。