Swift 安裝與設定

本章節會說明與操作如何安裝物件儲存服務到 Controller 與 Storage 節點上,並修改相關設定檔。若對於 Swift 不瞭解的人,可以參考 Swift 物件儲存服務章節

部署前系統環境準備

當要加入 Swift 來提供物件儲存給雲端租戶時,必須額外新增節點來提供實際資料儲存。首先如教學最開始的步驟,要先設定基本主機環境與安裝基本套件。

硬體規格與網路分配

這邊會加入兩台 Storage 節點,規格如下所示:

  • Storage Node: 雙核處理器, 8 GB 記憶體, 250 GB 硬碟(/dev/sda)與 500 GB 硬碟(/dev/sdb)。

在節點上需要提供對映的多張網卡(NIC)來設定給不同網路使用:

  • Management(管理網路):10.0.0.0/24,需要一個 Gateway 並設定為 10.0.0.1。

    這邊需要提供一個 Gateway 來提供給所有節點使用內部的私有網路,該網路必須能夠連接網際網路來讓主機進行套件安裝與更新等。

  • Storage(儲存網路):10.0.2.0/24,不需要 Gateway。

    P.S. 該網路並非必要,若想使用如 NAS 或 SAN 的儲存來給 Swift 充當後端儲存的話,可以考慮加入一個獨立的網路給這些儲存系統使用。

這邊將第一張網卡介面設定為 Management(管理網路)

  • IP address:10.0.0.51
  • Network mask:255.255.255.0 (or /24)
  • Default gateway:10.0.0.1
  • DNS1="8.8.8.8"

另一台以尾數 IP 類推。

系統環境設定與安裝

這邊假設作業系統已經安裝完成,且已正常執行系統後,我們必須在每個節點準備以下設定。首先下面指令可以設定系統的 User 執行 root 權限時不需要密碼驗證,編輯/etc/sudoers加入以下內容:

cloud-user ALL=(ALL) NOPASSWD: ALL

安裝 NTP 來跟叢集時間作同步:

$ sudo yum install -y ntp

P.S NTP Server 也可以考慮使用 chrony,透過以下方式安裝:

$ sudo yum install chrony

安裝完成後,編輯/etc/ntp.conf設定檔,並註解掉所有 server,然後加入以下內容:

server 10.0.0.11 iburst

完成後重新啟動 NTP。

接著執行以下指令來改變主機名稱(Option):

$ sudo hostnamectl set-hostname object1

其他節點以此類推

並設定主機 IP 與名稱的對照,編輯/etc/hosts檔案加入以下內容:

10.0.0.11   controller
10.0.0.21   network
10.0.0.31   compute1

10.0.0.51   object1
10.0.0.52   object2

P.S. 若有127.0.1.1存在的話,請將之註解掉,避免解析問題。

最後要新增 OpenStack Repository,來取的要安裝套件:

$ sudo yum install centos-release-openstack-mitaka

若要安裝 pre-release 測試版本可以使用以下指令:

$ sudo yum install yum-plugin-priorities
$ cd /etc/yum.repos.d/
$ curl -O http://trunk.rdoproject.org/centos7/delorean-deps.repo
$ cur

若要安裝 liberty,修改為centos-release-openstack-liberty

更新 Repository 與系統核心套件:

$ sudo yum upgrade

如果 Upgrade 包含了新的核心套件的話,請重新開機。

由於 RHEL 與 CentOS 預設會使用 SELinux,故要安裝 openstack-selinux 來自動管理安全策略:

$ sudo yum install openstack-selinux

Controller Node

在 Controller 節點我們需要安裝 Swift 中的 Proxy 服務。

Controller 安裝前準備

Swift 與其他服務不同,Controller 節點不使用任何資料庫,取而代之是在每個 Storage 節點上安裝 SQLite 資料庫。

首先要建立 Service 與 API Endpoint,首先導入 admin 環境變數:

$ . admin-openrc

接著透過以下流程來建立 Swift 的使用者、Service 以及 API Endpoint:

# 建立 Swift user
$ openstack user create --domain default \
--password SWIFT_PASS --email [email protected] swift

# 新增 Swift 到 Admin Role
$ openstack role add --project service --user swift admin

# 建立 Swift service
$ openstack service create --name swift  --description "OpenStack Object Storage" object-store

# 建立 Swift v1 public endpoints
$ openstack endpoint create --region RegionOne \
object-store public http://10.0.0.11:8080/v1/AUTH_%\(tenant_id\)s

# 建立 Swift v1 internal endpoints
$ openstack endpoint create --region RegionOne \
object-store internal http://10.0.0.11:8080/v1/AUTH_%\(tenant_id\)s

# 建立 Swift v1 admin endpoints
$ openstack endpoint create --region RegionOne \
object-store admin http://10.0.0.11:8080/v1

Controller 套件安裝與設定

在開始設定之前,首先要安裝相關套件與 OpenStack 服務套件,可以透過以下指令進行安裝:

$ sudo yum install openstack-swift-proxy python-swiftclient \
python-keystoneclient python-keystonemiddleware \
memcached

安裝完成後,建立用於存放設定檔的目錄:

$ sudo mkdir -p /etc/swift

接著透過網路來下載proxy-server.conf範例檔案板模:

$ sudo curl -o /etc/swift/proxy-server.conf \
https://git.openstack.org/cgit/openstack/swift/plain/etc/proxy-server.conf-sample?h=stable/mitaka

然後編輯/etc/swift/proxy-server.conf設定檔,在[DEFAULT]部分加入以下內容:

[DEFAULT]
bind_port = 8080
user = swift
swift_dir = /etc/swift

[pipeline:main]部分加入以下內容:

[pipeline:main]
pipeline = catch_errors gatekeeper healthcheck proxy-logging cache container_sync bulk ratelimit authtoken keystoneauth container-quotas account-quotas slo dlo versioned_writes proxy-logging proxy-server

其他的模組資訊,可以參考 Deployment Guide

[app:proxy-server]部分加入以下內容:

[app:proxy-server]
...
use = egg:swift#proxy
account_autocreate = true

[filter:keystoneauth]部分加入以下內容:

[filter:keystoneauth]
...
use = egg:swift#keystoneauth
operator_roles = admin,user

[filter:authtoken]部分加入以下內容:

[filter:authtoken]
...
paste.filter_factory = keystonemiddleware.auth_token:filter_factory
auth_uri = http://10.0.0.11:5000
auth_url = http://10.0.0.11:35357
memcached_servers = 10.0.0.11:11211
auth_type = password
project_domain_name = default
user_domain_name = default
project_name = service
username = swift
password = SWIFT_PASS
delay_auth_decision = True

這邊SWIFT_PASS可以隨需求修改。

[filter:cache]部分加入以下內容:

[filter:cache]
...
use = egg:swift#memcache
memcache_servers = 10.0.0.11:11211

Storage Node

安裝與設定完成 Controller 上的 Swift 所有服務後,接著要來設定實際儲存資料的 Storage 節點,其中會提供 Account、Container 以及 Object 服務。

Storage 安裝前準備

在開始設定之前,首先要安裝 Swift 相依的相關軟體:

$ sudo yum install xfsprogs rsync

然後將非系統使用的硬碟進行格式化來當作 Swift 資料儲存用:

$ sudo mkfs.xfs -f /dev/sdb

若有多顆則以此方式重複進行。

接著建立一個目錄來提供給該硬碟進行掛載使用:

$ sudo mkdir -p /srv/node/sdb

若有多顆則以此方式重複進行。如以下方式:

$ sudo mkdir -p /srv/node/sdc

完成後,編輯/etc/fstab設定檔,來提供開機時自動掛載:

/dev/sdb /srv/node/sdb xfs noatime,nodiratime,nobarrier,logbufs=8 0 2

若有多顆則以此方式重複進行。

當上述都沒問題後,就可以將剛建立的所有硬碟進行掛載,使用以下指令:

$ sudo mount /srv/node/sdb

若有多顆則以此方式重複進行。

接著編輯/etc/rsyncd.conf設定檔加入以下內容:

uid = swift
gid = swift
log file = /var/log/rsyncd.log
pid file = /var/run/rsyncd.pid
address = MANAGEMENT_IP

[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

P.S. MANAGEMENT_IP取代為 Storage 節點的管理網路 IP。

編輯 /etc/default/rsync 設定檔,來進行 rsync 異地備援設定:

RSYNC_ENABLE=true

完成後設定開機時啟動服務:

$ sudo systemctl enable rsyncd.service

完成後啟動 rsyncd 所有服務:

$ sudo systemctl start rsyncd.service

Storage 套件安裝與設定

在開始設定之前,首先要安裝相關套件與 OpenStack 服務套件,可以透過以下指令進行安裝:

$ sudo yum install openstack-swift-account openstack-swift-container \
openstack-swift-object

安裝完成後,要從網際網路上下載 Swift 的 Account、Container 與 Object Server 的設定檔:

# Account server
$ sudo curl -o /etc/swift/account-server.conf \
https://git.openstack.org/cgit/openstack/swift/plain/etc/account-server.conf-sample?h=stable/mitaka

# Container server
$ sudo curl -o /etc/swift/container-server.conf \
https://git.openstack.org/cgit/openstack/swift/plain/etc/container-server.conf-sample?h=stable/mitaka

# Object server
$ sudo curl -o /etc/swift/object-server.conf \
https://git.openstack.org/cgit/openstack/swift/plain/etc/object-server.conf-sample?h=stable/mitaka

首先編輯/etc/swift/account-server.conf設定檔,在[DEFAULT]部分設定以下內容:

[DEFAULT]
...
bind_ip = MANAGEMENT_IP
bind_port = 6002
user = swift
swift_dir = /etc/swift
devices = /srv/node
mount_check = True

P.S. MANAGEMENT_IP取代為 Storage 節點的管理網路 IP。

[pipeline:main]部分加入以下內容:

[pipeline:main]
pipeline = healthcheck recon account-server

其他的模組資訊,可以參考 Deployment Guide

[filter:recon]部分加入以下內容:

[filter:recon]
...
use = egg:swift#recon
recon_cache_path = /var/cache/swift

編輯/etc/swift/container-server.conf設定檔,在[DEFAULT]部分設定以下內容:

[DEFAULT]
...
bind_ip = MANAGEMENT_IP
bind_port = 6001
user = swift
swift_dir = /etc/swift
devices = /srv/node
mount_check = true

P.S. MANAGEMENT_IP取代為 Storage 節點的管理網路 IP。

[pipeline:main]部分加入以下內容:

[pipeline:main]
pipeline = healthcheck recon container-server

其他的模組資訊,可以參考 Deployment Guide

[filter:recon]部分加入以下內容:

[filter:recon]
...
use = egg:swift#recon
recon_cache_path = /var/cache/swift

編輯/etc/swift/object-server.conf設定檔,在[DEFAULT]部分設定以下內容:

[DEFAULT]
...
bind_ip = MANAGEMENT_IP
bind_port = 6000
user = swift
swift_dir = /etc/swift
devices = /srv/node
mount_check = true

P.S. MANAGEMENT_IP取代為 Storage 節點的管理網路 IP。

[pipeline:main]部分加入以下內容:

[pipeline:main]
pipeline = healthcheck recon object-server

其他的模組資訊,可以參考 Deployment Guide

[filter:recon]部分加入以下內容:

[filter:recon]
use = egg:swift#recon
...
recon_cache_path = /var/cache/swift
recon_lock_path = /var/lock

完成上述所有設定後,要確保 Swift 能夠存取掛載目錄,這邊需要更改權限:

$ sudo chown -R swift:swift /srv/node

接著建立一個目錄讓 Swift 作為快取是使用:

sudo mkdir -p /var/cache/swift
sudo chown -R root:swift /var/cache/swift
sudo chmod -R 775 /var/cache/swift

建立與分散初始 Rings

在這個階段進行之前,要確保 Controller 與兩台 Storage 節點都確定設定與安裝完成 Swift。若沒問題的話,回到Controller節點,並進入 /etc/swift 目錄來完成以下步驟。

$ cd /etc/swift

建立 Account Ring

Account Server 使用 Account Ring 來維護容器的列表。首先透過以下指令建立一個 account.builder 檔案:

$ sudo swift-ring-builder account.builder create 10 2 1

然後新增每一個 Storage 節點的 Account Server 資訊到 Ring 中:

# Object1 sdb
$ sudo swift-ring-builder account.builder \
add --region 1 --zone 1 --ip 10.0.0.51 \
--port 6002 --device sdb --weight 100

# Object2 sdb
$ sudo swift-ring-builder account.builder \
add --region 1 --zone 2 --ip 10.0.0.52 \
--port 6002 --device sdb --weight 100

當完成後,即可透過以下指令來驗證是否正確:

$ sudo swift-ring-builder account.builder
account.builder, build version 4
1024 partitions, 3.000000 replicas, 1 regions, 4 zones, 4 devices, 100.00 balance, 0.00 dispersion
The minimum number of hours before a partition can be reassigned is 1
The overload factor is 0.00% (0.000000)
Devices:    id  region  zone      ip address  port  replication ip  replication port      name weight partitions balance meta
             1       1     1       10.0.0.51  6002       10.0.0.51              6002       sdb 100.00          0 -100.00
             2       1     2       10.0.0.52  6002       10.0.0.52              6002       sdb 100.00          0 -100.00

若沒有任何問題,即可將 Ring 進行重新平衡調整:

$ sudo swift-ring-builder account.builder rebalance
Reassigned 1024 (100.00%) partitions. Balance is now 0.00.  Dispersion is now 0.00

建立 Container Ring

Container Server 使用 Container Ring 來維護物件的列表。透過以下指令建立一個container.builder檔案:

$ sudo swift-ring-builder container.builder create 10 2 1

然後新增每一個 Storage 節點的 Container Server 資訊到 Ring 中:

# Object1 sdb
$ sudo swift-ring-builder container.builder \
add --region 1 --zone 1 --ip 10.0.0.51 \
--port 6001 --device sdb --weight 100

# Object2 sdb
$ sudo swift-ring-builder container.builder \
add --region 1 --zone 2 --ip 10.0.0.52 \
--port 6001 --device sdb --weight 100

當完成後,即可透過以下指令來驗證是否正確:

$ sudo swift-ring-builder container.builder
container.builder, build version 4
1024 partitions, 3.000000 replicas, 1 regions, 4 zones, 4 devices, 100.00 balance, 0.00 dispersion
The minimum number of hours before a partition can be reassigned is 1
The overload factor is 0.00% (0.000000)
Devices:    id  region  zone      ip address  port  replication ip  replication port      name weight partitions balance meta
             1       1     1       10.0.0.51  6001       10.0.0.51              6001       sdb 100.00          0 -100.00
             2       1     2       10.0.0.52  6001       10.0.0.52              6001       sdb 100.00          0 -100.00

若沒有任何問題,即可將 Ring 進行重新平衡調整:

$ sudo swift-ring-builder container.builder rebalance
Reassigned 1024 (100.00%) partitions. Balance is now 0.00.  Dispersion is now 0.00

建立 Object Ring

Object Server 使用 Object Ring 來維護本地裝置上物件位置的列表。。透過以下指令建立一個object.builder檔案:

$ sudo swift-ring-builder object.builder create 10 2 1

然後新增每一個 Storage 節點的 Object Server 資訊到 Ring 中:

# Object1 sdb
$ sudo swift-ring-builder object.builder \
add --region 1 --zone 1 --ip 10.0.0.51 \
--port 6000 --device sdb --weight 100

# Object2 sdb
$ sudo swift-ring-builder object.builder \
add --region 1 --zone 2 --ip 10.0.0.52 \
--port 6000 --device sdb --weight 100

當完成後,即可透過以下指令來驗證是否正確:

$ sudo swift-ring-builder object.builder
object.builder, build version 4
1024 partitions, 3.000000 replicas, 1 regions, 4 zones, 4 devices, 100.00 balance, 0.00 dispersion
The minimum number of hours before a partition can be reassigned is 1
The overload factor is 0.00% (0.000000)
Devices:    id  region  zone      ip address  port  replication ip  replication port      name weight partitions balance meta
             1       1     1       10.0.0.51  6000       10.0.0.51              6000       sdb 100.00          0 -100.00
             2       1     2       10.0.0.52  6000       10.0.0.52              6000       sdb 100.00          0 -100.00

若沒有任何問題,即可將 Ring 進行重新平衡調整:

$ sudo swift-ring-builder object.builder rebalance
Reassigned 1024 (100.00%) partitions. Balance is now 0.00.  Dispersion is now 0.00

將 Rings 分散到儲存節點

接著我們要將上述建立的所有 Ring 檔案分散到所有 Storage 節點上的/etc/swift目錄,這邊透過以下方式:

scp account.ring.gz container.ring.gz object.ring.gz object1:~/
scp account.ring.gz container.ring.gz object.ring.gz object2:~/

ssh object1 "sudo mv ~/*.ring.gz /etc/swift/"
ssh object2 "sudo mv ~/*.ring.gz /etc/swift/"

完成安裝

若上面步驟都進行順利的話,接下來要進入最後階段,首先回到 Controller 節點,透過網路下載/etc/swift/swift.conf設定檔:

$ sudo curl -o /etc/swift/swift.conf \
https://git.openstack.org/cgit/openstack/swift/plain/etc/swift.conf-sample?h=stable/mitaka

接著編輯/etc/swift/swift.conf設定檔,在[swift-hash]部分設定 Path 的 Hash 字首字尾:

[swift-hash]
...
swift_hash_path_suffix = 1505cb4249801981da86
swift_hash_path_prefix = 42da359c6af55b2e3f7d

可透過openssl rand -hex 10產生。

[storage-policy:0]部分加入以下內容:

[storage-policy:0]
...
name = Policy-0
default = yes

完成後,複製/etc/swift/swift.conf設定檔到所有 Storage 節點上的/etc/swift目錄:

scp /etc/swift/swift.conf object1:~/
scp /etc/swift/swift.conf object2:~/

ssh object1 "sudo mv ~/swift.conf /etc/swift/"
ssh object2 "sudo mv ~/swift.conf /etc/swift/"

在所有安裝 Swift 的節點上更換/etc/swift目錄的擁有者與權限:

sudo chown -R root:swift /etc/swift
ssh object1 "sudo chown -R root:swift /etc/swift"
ssh object2 "sudo chown -R root:swift /etc/swift"

完成後在 Controller 節點重新 memcached 與 Swift 服務:

sudo systemctl enable openstack-swift-proxy.service memcached.service
sudo systemctl start openstack-swift-proxy.service memcached.service

完成後在所有Storage節點設定開機時啟動所有 Swift 服務:

$ sudo systemctl enable openstack-swift-account.service openstack-swift-account-auditor.service \
  openstack-swift-account-reaper.service openstack-swift-account-replicator.service
$ sudo systemctl enable openstack-swift-container.service \
  openstack-swift-container-auditor.service openstack-swift-container-replicator.service \
  openstack-swift-container-updater.service
$ sudo systemctl enable openstack-swift-object.service openstack-swift-object-auditor.service \
  openstack-swift-object-replicator.service openstack-swift-object-updater.service

完成後啟動 Swift 所有服務:

$ sudo systemctl start openstack-swift-account.service openstack-swift-account-auditor.service \
  openstack-swift-account-reaper.service openstack-swift-account-replicator.service
$ sudo systemctl start openstack-swift-container.service \
  openstack-swift-container-auditor.service openstack-swift-container-replicator.service \
  openstack-swift-container-updater.service
$ sudo systemctl start openstack-swift-object.service openstack-swift-object-auditor.service \
  openstack-swift-object-replicator.service openstack-swift-object-updater.service

驗證服務

首先回到 Controller 節點並在admin-openrcdemo-openrc加入 Swift API 使用版本的環境變數:

$ echo "export OS_AUTH_VERSION=3" \
| sudo tee -a admin-openrc demo-openrc

由於 Swift 需要使用到 V3 的版本來進行存取,故這邊要記得修改正確。

接著導入 admin 帳號來驗證服務:

$ . admin-openrc

這邊可以透過 Swift client 來查看服務狀態,如以下方式:

$ swift -V 3 stat
Account: AUTH_aa2829b38026474ea4048d4adc807806
     Containers: 0
        Objects: 0
          Bytes: 0
X-Put-Timestamp: 1435852736.76235
     Connection: keep-alive
    X-Timestamp: 1435852736.76235
     X-Trans-Id: tx47d3a78a45fe491eafb27-0055955fc0
   Content-Type: text/plain; charset=utf-8

然後透過 Swift client 來查看上傳檔案,如以下方式:

$ swift -V 3 upload admin-container [FILE]

透過 Swift client 來查看所有容器,如以下方式:

$ swift -V 3 list

然後透過 Swift client 來查看下載檔案,如以下方式:

$ swift -V 3 download admin-container [FILE]
[FILE] [auth 0.235s, headers 0.400s, total 0.420s, 0.020 MB/