標籤:openstack Object Storage Servicering memcached swift python
在順利的安裝部署了KeyStone之後,原以為swift的安裝調試也會如KeyStone一般,但過程卻充滿了坎坷,在結合原始碼中的一些函數之後,終於成功的完成了swift的安裝,並實驗了上傳下載檔案等功能,下面整理了swift的安裝過程,並對遇到的問題進行了總結,希望對遇到同樣問題的人有些啟示或協助。安裝過程依然參考的是OpenStack的官方安裝手冊,但補充了一些細節。在安裝之前,先簡單的介紹一下Swift是什麼、主要功能是什麼。OpenStack的Object Storage Service(Swift)是一個多租戶的、高可擴充的Object Storage Service系統,通過RESTful HTTP API管理著大量的非結構化資料,在部署Object Storage Service之前必須至少安裝了身份服務(KeyStone)。Swift包含的組件包括:
- Proxy 伺服器(swift-proxy-server):接受Object Storage ServiceAPI和HTTP請求以上傳檔案、修改中繼資料和建立容器,也向瀏覽器提供檔案或容器的列表。為了改進效能,Proxy 伺服器可以使用可選的緩衝,通常選擇memcache與Proxy 伺服器一起部署。
- 賬戶服務(account-server):管理Object Storage Service中的賬戶。
- Container Service(container-server):管理Object Storage Service中容器或檔案夾的映射。
- 物件服務(object-server):管理儲存節點上的實際對象,比如檔案。
- WSGI中介層:處理認證,通常是身份服務(KeyStone)。
- 周期性進程:在叢集中執行各種維護任務,比如複製(replicator)服務確保叢集中資料的一致性和可用性,其它還包括:auditor, updater和reaper。
代理服務依賴於認證和授權機制,如果使用身份服務完成認證和授權的話,則在組態管理swift之前,首先要在keystone中建立swift的認證資訊和endpoint。Object Storage Service在控制節點上不適用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 = 8080user = swiftswift_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 = trueaccount_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.0identity_uri = http://localhost:35357admin_tenant_name = serviceadmin_user = swiftadmin_password = SWIFT_PASS #指定為使用keystone建立swift使用者時設定的密碼,比如123456delay_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 = swiftgid = swiftlog file = /var/log/rsyncd.logpid file = /var/run/rsyncd.pidaddress = MANAGEMENT_INTERFACE_IP_ADDRESS[account]max connections = 2path = /srv/read only = falselock file = /var/lock/account.lock[container]max connections = 2path = /srv/read only = falselock file = /var/lock/container.lock[object]max connections = 2path = /srv/read only = falselock 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-samplecurl -o /etc/swift/container-server.conf https://raw.githubusercontent.com/openstack/swift/stable/juno/etc/container-server.conf-samplecurl -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.1bind_port = 6002 #不同的服務使用不同的連接埠user = swiftswift_dir = /etc/swiftdevices = /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 1swift-ring-builder container.builder create 8 1 1swift-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 100swift-ring-builder container.builder add r1z1-127.0.0.1:6001/node 100swift-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 mountedproxy-server: ERROR Insufficient Storage 127.0.0.1:6002/node
還可以在python命令列下輸入下面的語句驗證設定是否掛載正常、配置是否正確,如果一切正確,返回True,否則返回False:
from swift.common.constraints import check_mountcheck_mount(‘/srv‘,‘node‘) #第一個參數為設定檔中devices的值,第二個參數為向ring增加裝置時/後面的值
然後運行下面的命令對ring進行rebalance:
swift-ring-builder account.builder rebalanceswift-ring-builder container.builder rebalanceswift-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_PREFIXswift_hash_path_prefix = HASH_PATH_SUFFIX
- 在[storage-policy:0]配置預設的儲存策略:
[storage-policy:0]...name = Policy-0default = 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/bashsystemctl stop openstack-swift-account.service openstack-swift-account-auditor.service openstack-swift-account-reaper.service openstack-swift-account-replicator.servicesystemctl stop openstack-swift-container.service openstack-swift-container-auditor.service openstack-swift-container-replicator.service openstack-swift-container-updater.servicesystemctl 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: 0X-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 stopstop[[email protected] ~]$ swift listdemo[[email protected] ~]$ swift list demostop
至此就完成了swift的單節點部署工作,並且從測試結果來看,一切動作正常。成功部署swift並不意味者對swift的所有功能、流程都已經熟悉了,相反還有很多需要學習的,比如swift用戶端命令的詳細使用方法,上傳下載檔案的具體流程,ring檔案的具體含義,如何調整partition的數量等,還需要進一步的學習。
OpenStack之swift安裝筆記