我們知道Ceph可以提供塊、文件和對象三種形態的存儲。而RGW就是提供對象存儲的網關,也即對象存儲網關。所謂對象存儲網關,也就是對象存儲的入口,本質上是一個HTTP伺服器,與Nginx和Apache無異。通過這個入口,用戶可以通過HTTP協議,以RESTful的方式訪問Ceph的對象存儲。 Ceph RGW的整體架構如圖1所示,對象存儲網關實際上是調用librados的API來實現數據的存儲和讀取。而該網關同時提供了兼容AWS S3和OpenStack Swift的對象存儲訪問介面(API)。
另外,有些同學可能不清楚對象存儲的特點。在介紹後續內容之前,我們大概瞭解一下對象存儲是如何存儲數據的。對象存儲的應用場景通常是互聯網場景,一個對象存儲通常會給多個用戶(租戶)使用。而在一個用戶下面可以創建多個桶(swift裡面稱為容器container)。在桶中可以存儲對象,對象就是我們存儲的數據,比如圖片或者是視頻等。如果將對象存儲與我們常規存儲做一個類比,桶就好比文件夾,而對象就好比文件,但不同之處在於桶裡面只能存儲對象,而不能嵌套桶。如圖2是對象存儲數據組織形式。
今天我們主要除了介紹Ceph對象存儲網關基本架構外,我們重點介紹一下如何在幾個Ceph集羣上部署一個RGW,並且通過Swift客戶端進行訪問。
為了簡化環境,本文使用的是2副本Ceph集羣,在實際生產中通常是3副本。另外,本文使用的是本地虛擬機,也就是通過VirtualBox或者其它虛擬化平臺安裝的虛擬操作系統。本文操作系統版本為CentOS 7.4。如圖3所示,我們的RGW安裝在ceph-s節點。
進入安裝Ceph集羣的時候創建的目錄中,本文之前的目錄為mycluster,因此進入該目錄。
$ cd my-cluster
RGW默認使用Civetweb作為其Web Sevice,而Civetweb默認使用埠7480提供服務,如果想修改埠(如80埠),就需要修改Ceph的配置文件。在配置文件中增加一個section。 [client.rgw.ceph-s] rgw_frontends = "civetweb port=80" 注意: 這一步並不是必須的,根據實際情況進行設定
我們可以通過ceph-deploy命令非常方便的安裝Ceph的對象存儲網關軟體(也就是RGW)。如下是命令格式:
$ ceph-deploy install --rgw <gateway-node1> [<gateway-node2> ...]
比如在我們的ceph-s節點安裝該軟體,則可以執行如下命令:
$ ceph-deploy install –-rgw ceph-s
上面步驟只是安裝了必要的軟體,但並沒有創建需要的存儲資源(存儲池)。之前版本的安裝需要用戶手動創建多個存儲池,安裝比較麻煩,且容易出錯。目前安裝非常方便,可以通過ceph-deploy命令直接創建需要的資源,具體執行如下命令即可:
$ ceph-deploy rgw create ceph-s
創建完成後我們可以看一下目前Ceph集羣的資源情況,在管理節點輸入如下命令查看存儲池的情況:
$ rados lspools
具體結果如下:
如果上述配置沒有出現任何問題的話,其實Ceph的對象存儲網關已經正常工作了。前面我們說了,對象存儲其實是基於HTTP協議的,因此我們可以通過瀏覽器進行訪問,比如在瀏覽器中輸入如下內容: http://192.168.142.133:7480 回車後,可以看到如下內容:
前面我們進行了安裝和連通性的基本驗證,對於對象存儲的功能來說還差得遠。下面我們通過swift的客戶端工具進行驗證。
注意:後續創建用戶的操作應該在RGW節點上運行。
我們前面介紹了對象存儲的數據結構,數據必須存儲在某個用戶下面。因此,想正常的訪問RGW,需要創建相應的RGW用戶,並賦予相應的許可權,radosgw-admin命令實現了這些功能。 執行下面命令,來創建一個名為testuser的用戶:
$ radosgw-admin user create --uid="testuser" --display-name="First User"
命令的輸出大致如下:
{ "user_id": "testuser", "display_name": "First User", "email": "", "suspended": 0, "max_buckets": 1000, "auid": 0, "subusers": [], "keys": [ { "user": "testuser", "access_key": "U0IJ8M27SRME1XMZSYPA", "secret_key": "YexQ1T1VVS8wIMgMp5KgAZsNjbF5OotTnDgavPdA" } ], "swift_keys": [], "caps": [], "op_mask": "read, write, delete", "default_placement": "", "placement_tags": [], "bucket_quota": { "enabled": false, "max_size_kb": -1, "max_objects": -1 }, "user_quota": { "enabled": false, "max_size_kb": -1, "max_objects": -1 }, "temp_url_keys": [] }
注意:需要記住返回結果中keys->access_key和keys->secret_key的值,用於S3介面訪問確認。
Swift用戶是作為子用戶subuser被創建的,執行以下命令:
$ radosgw-admin subuser create --uid=testuser --subuser=testuser:swift --access=full
輸出結果大致如下:
{ "user_id": "testuser", "display_name": "First User", "email": "", "suspended": 0, "max_buckets": 1000, "auid": 0, "subusers": [ { "id": "testuser:swift", "permissions": "full-control" } ], "keys": [ { "user": "testuser", "access_key": "U0IJ8M27SRME1XMZSYPA", "secret_key": "YexQ1T1VVS8wIMgMp5KgAZsNjbF5OotTnDgavPdA" } ], "swift_keys": [ { "user": "testuser:swift", "secret_key": "ozmuwVXWSeUg30TO8qkYggmbM7dXy2a4VlGid2Sp" } ], "caps": [], "op_mask": "read, write, delete", "default_placement": "", "placement_tags": [], "bucket_quota": { "enabled": false, "max_size_kb": -1, "max_objects": -1 }, "user_quota": { "enabled": false, "max_size_kb": -1, "max_objects": -1 }, "temp_url_keys": [] }
注意:需要記住返回結果中swift_keys->secret_key的值,用於Swift介面訪問確認。
我們前面說了Ceph對象存儲是兼容Swift的,因此我們可以直接用Swift的客戶端訪問Ceph對象存儲。當然,我們需要首先安裝該客戶端。 添加yum源 新建文件/etc/yum.repos.d/openstack.repo,然後寫入如下內容:
/etc/yum.repos.d/openstack.repo
[centos-openstack-liberty] name=CentOS-7 - OpenStack liberty baseurl=http://vault.centos.org/centos/7.3.1611/cloud/x86_64/openstack-liberty/ gpgcheck=0 enabled=1 gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-Centos-7
更新yum緩存後就可以安裝swift客戶端了。
$ yum update $ yum install python-swiftclient
命令樣式 Swift客戶端的命令格式如下所示:
$ swift -A http://{IP ADDRESS}:{port}/auth/1.0 -U testuser:swift -K {swift_secret_key} list
其中swift為主命令,而後面的list為子命令。在實際使用的時候,需要替換{IP ADDRESS}、{port}、{swift_secret_key}等相關參數,其中{swift_secret_key}為創建Swift用戶時radosgw-admin命令返回的swift_keys->secret_key的值。如果忘記了上述內容,可以通過radosgw-admin命令查看。 創建容器/桶 首先是需要一容器,Swift創建容器的命令為swift post contaner_name。具體命令如下:
swift -A http://192.168.142.133:7480/auth/1.0 -U testuser:swift -K ozmuwVXWSeUg30TO8qkYggmbM7dXy2a4VlGid2Sp post testbucket
可以通過list命令查看一下我們創建的容器:
swift -A http://192.168.142.133:7480/auth/1.0 -U testuser:swift -K ozmuwVXWSeUg30TO8qkYggmbM7dXy2a4VlGid2Sp list
上傳對象 有了容器後,我們就可以向容器上傳對象了。具體命令如下,為了清晰一些,這裡省略了認證相關的內容。
swift upload testbucket ./mysql.yaml
成功後可以看一下容器中的內容,具體命令如下:
swift list testbucket
至此,我們完成了本文要介紹的內容。這裡我們介紹了Ceph對象存儲的基本架構、安裝和基於Swift客戶端的使用。當然這裡僅僅是入門級的,如果各位童鞋想繼續深入學習,請關注本號,本號會持續更新Ceph相關的內容。
參考文獻:
1. https://www.jianshu.com/p/f6e336bd9999
2. https://blog.csdn.net/u011446736/article/details/81083078
3. https://blog.csdn.net/Poo_Chai/article/details/80856662?utm_source=blogxgwz1