Ceph RGW對象存儲


對象存儲概述

對象是對象存儲系統中數據存儲的基本單位,每個Object是數據和數據屬性集的綜合體,數據屬性可以根據應用的需求進行設置,包括數據分布、服務質量等每個對象自我維護其屬性,從而簡化了存儲系統的管理任務對象的大小可以不同,甚至可以包含整個數據結構,如文件、數據庫表項等對象存儲系統一般是一類智能設備,它具有自己的存儲介質、處理器、內存以及網絡系統等,負責管理本地的對象,是對象存儲系統的核心

  • 對象存儲(Object Storage)是無層次結構的數據存儲方法,通常用於雲計算環境中
  • 不同於其他數據存儲方法,基於對象的存儲不使用目錄樹
    • 數據作為單獨的對象進行存儲
    • 數據並不放置在目錄層次結構中,而是存在於平面地址空間內的同一級別
    • 應用通過唯一地址來識別每個單獨的數據對象
    • 每個對象可包含有助於檢索的元數據
    • 專為使用API在應用級別(而非用戶級別)進行訪問而設計

基本概念

雖然在設計與實現上有所區別,但大多數對象存儲系統對外呈現的核心資源類型大同小異

  • Amazon S3:提供了user、bucket和object分別表示用戶、存儲桶和對象,其中bucket隸屬於user,因此user名稱即可做為bucket的名稱空間,不同用戶允許使用相同名稱的bucket
  • OpenStack Swift:提供了user、container和object分別對應於用戶、存儲桶和對象,不過它還額外為user提供了父級組件account,用於表示一個項目或租戶,因此一個account中可包含一到多個user,它們可共享使用同一組container,並為container提供名稱空間

  • RadosGW:提供了user、subuser、bucket和object,其中的user對應於S3的user,而subuser則對應於Swift的user,不過user和subuser都不支持為bucket提供名稱空間,因此,不同用戶的存儲桶也不允許同名;不過,自Jewel版本起,RadosGW引入了tenant(租戶)用於為user和bucket提供名稱空間,但它是個可選組件

  • Jewel版本之前,radosgw的所有user位於同一名稱空間,它要求所有user的ID必須惟一,並且即便是不同user的bucket也不允許使用相同的bucket ID

各pool的意義

  • 當創建RGW時候默認會創建對應的池信息,不需要人為創建
rgw.root default.rgw.control #控制器信息 default.rgw.meta #記錄元數據 default.rgw.log #日志信息 default.rgw.buckets.index #為rgw的bucket信息 default.rqw.buckets.data #是實際存儲的數據信息 
 

認證與授權方式

S3和Swift使用了不同的認證機制

  • 用戶賬號是認證(Authentication)、授權(Authorization)及存儲配額(Quota)功能的載體,RGW依賴它對RESTfulAPI進行請求認證、控制資源(存儲桶和對象等)的訪問權限並設定可用存儲空間上限
    • S3主要采用的是基於訪問密鑰(access key)和私有密鑰(secret key)進行認證,RGW兼容其V2和V4兩種認證機制,其中V2認證機制支持本地認證、LDAP認證和kerberos認證三種方式,所有未能通過認證的用戶統統被視為匿名用戶
    • Swift結合Swift私有密鑰(swift key)使用令牌(token)認證方式,它支持臨時URL認證、本地認證、OpenStack Keystone認證、第三方認證和匿名認證等方式

  • 通過身份認證后,RGW針對用戶的每次資源操作請求都會進行授權檢查,僅那些能夠滿足授權定義(ACL)的請求會被允許執行

    • S3使用bucket acl和object acl分別來控制bucket和object的訪問控制權限,一般用於向bucket或object屬主之外的其它用戶進行授權
    • Swift API中的權限控制則分為user訪問控制列表和bucket訪問控制列表兩種,前一種針對user進行設定,而后一定則專用於bucket及內部的object,且只有read和write兩種權限

RADOS網關

為了支持通用的雲存儲功能,Ceph在RADOS集群的基礎上提供了RGW(RADOS GateWay)數據抽象和管理層,它是原生兼容S3和SwiftAPI的對象存儲服務,支持數據壓縮和多站點(Multi-Site)多活機制,並支持NFS協議訪問接口等特性。RADOS網關也稱為Ceph對象網關、RADOSGW、RGW,是一種服務,使客戶端能夠利用標准對象存儲API來訪問Ceph集群。它支持S3和Swift API

  • radosgw的http/https服務由內建的Civeweb提供,它同時也能支持多種主流的Web服務程序以代理的形式接收用戶請求並轉發至ceph-radosgw進程,這些Web服務程序包括nginx和haproxy等
  • rgw客戶端通過s3或者swift api使用rgw用戶進行身份驗證,S3和Swift是RESTful風格的API,它們基於http/https協議完成通信和數據交換。然后rgw網關代表用戶利用cephx與ceph存儲進行身份驗證

功能概述

RGW的功能依賴於Ceph對象網關守護進程(ceph-radosgw)實現,它負責向客戶端提供RESTAPI接口,並將數據操作請求轉換為底層RADOS存儲集群的相關操作

  • 出於冗余及負載均衡的需要,一個Ceph集群上的ceph-radosgw守護進程通常不止一個,這些支撐同一對象存儲服務的守護進程聯合起來構成一個zone(區域)用於代表一個獨立的存儲服務和存儲空間
  • 在容災設計的架構中,管理員會基於兩個或以上的Ceph集群定義出多個zone,這些zone之間通過同步機制實現冗余功能,並組成一個新的父級邏輯組件zonegroup

企業級部署架構

  • 以下圖為生產環境常用架構方

rados網關部署步驟

  • 手工開啟方式
#1.生成用於網關驗證的cephx用戶 ceph auth get-or-create client.rgw.servera mon 'allow rwx' osd 'allow rwx' -o /etc/ceph/ceph.client.rgw.servera.keyring #2.修改ceph.conf配置文件 [client.rgw.servera] host = server keyring = /etc/ceph/ceph.client.rgw.servera.keyring rgw_frontends = civetweb port=80 #默認端口7480 #3.安裝ceph-radosgw yum install -y ceph-radosgw #4.啟動ceph-radosgw systemctl restart ceph-radosgw@rgw.servera 

配置Citeweb

  • 自0.80版本起,Ceph放棄了基於apache和fastcgi提供radosgw服務的傳統而代之以默認嵌入在ceph-radosgw進程中的Citeweb,這種新的實現方式更加輕便和簡潔,但直到Ceph 11.0.1版本,Citeweb才開始支持SSL協議
  • Citeweb默認監聽於TCP協議的7480端口提供http服務,修改配置需要編輯ceph.conf配置文件,以如下格式進行定義

  • 配置https

    • 額外添加參數ssl certificate=/PATH/TO/PEM FILE
    • 定義port=443s,或者port=80+443s
[client.rgw.<gateway-node>] rgw host=<hostname OR ipaddr> rgw frontends="civetweb port=80" #配置完成后需要重啟ceph-radosgw進程以生效新配置
systemctl restart ceph-radosgw@rgw.<gateway-node> 
 

常用的配置項

參數選項 信息描述
ssl_certificate 配置默認https的證書位置開啟加密訪問(生產基本不用,因為會在前加個負載均衡器)
access_log_ file 定義訪問日志的路徑
error_log_file 定義錯誤日志的路徑
num_threads Citeweb以線程模型處理客戶端請求,它為每個連接請求分配一個專用線程,因而此參數定義了其支持的最大並發連接數,默認值為50
request_timeout_ms 網絡發送與接收操作的超時時長,以ms為單位,默認值為30000,可以在必要時通過增大此值實現長連接的效果
  • 具體的配置示例
/etc/ceph/ceph.conf #也可以全部寫在rgw_frontends=""中空格分割開 [client.rgw.servera] rgw_frontends="civetweb port=80" #生產環境中指向負載均衡器的域名后綴 rgw_dns_name=servera log_file=/var/log/ceph/servera.rgw.log access_log_file=/var/log/ceph/civetweb.access.log error_log_file=/var/log/ceph/civetweb.error.log num_threads=100 
 

訪問測試

  • curl http://servera

什么是S3存儲

S3由Amazon於2006年推出,全稱為Simple Storage Service,S3定義了對象存儲,是對象存儲事實上的標准,從某種意義上說,S3就是對象存儲,對象存儲就是S3,它對象存儲市場的霸主,后續的對象存儲都是對S3的模仿


S3的特點

  • 跨區域復制
  • 事件通知
  • 版本控制
  • 安全加密
  • 訪問管理切可編程

rgw中s3的API支持

對象存儲在bucket中若要利用S3 API訪問對象,需要為RADOS網關配置用戶每個用戶具有一個access key和一個secret key。access key標識用戶,secret key驗證用戶身份

  • S3服務的RESTAPI使用用戶賬號(user)、存儲桶(bucket)和對象(object)三個組件來組織存儲的數據對象,對象保存於存儲桶中,而存儲桶則支持授權給特定賬號進行讀寫及創建/刪除等操作
  • Amazon S3 API授權和身份驗證模型具有單層設計。一個用戶可以有多個access key和secret key,用於在同一帳戶中提供不同類型的訪問

  • radosgw-admin是用於管理radowgw服務的命令行接口,它有着眾多的分別用於不同管理功能的命令,例如user、subuser、key、bucket和object等

#創建示例 radosgw-admin user create--uid=john --display-name="John Doe" --email=iohn@example.com --access-key=12345 --secret=67890 --id rgw.servername -uid 指定用戶名 --display-name 指定備注名 --email 指定郵箱 --access-key 指定access key,如果不指定,會自動生成 --secret 指定secret key如果不指定,會自動生成 --id 如果沒有權限則需要指定有權限的cephX用戶去執行命令 #當radosgw-admin自動生成密鑰時,有時會在access key和secretkey中包含josn轉義符"\”。在使用的時候,不能包含這個字符 

S3中的用戶管理

#修改用戶: radosgw-admin user modify --uid=uid --display-name="John E.Doe" --max-buckets=2000 #禁用用戶: radosgw-admin user suspend --uid=uid #啟用用戶: radosgw-admin user enable --uid=uid #刪除用戶: radosgw-admin user rm --uid=uid[--purge-data][--purge-keys] 
 

管理用戶密鑰

#創建一個用戶的key radosgw-admin key create --uid=uid--key-type=s3[--access-key=key][--secret=secret] #刪除一個用戶的key radosgw-admin key rm --uid=uid --access-key=key在創建密鑰時,可以通過--gen-access-key和--gen-secret來生成隨機的access key和secret key 
 

S3設置配額數

#基於用戶的配額 radosgw-admin quota set --quota-scope=user --uid=uid[--max-objects=number][--max- size=sizeinbytes] #基於bucket的配額 radosgw-admin quota set --quota-scope=bucket --uid=uid[--max-ob.jects=number][--max- size=sizeinbytes] #啟用配額 radosgw-admin quota enable --quota-scope=[user|bucket] --uid=uid #禁用配額 radosgw-admin quota disable --quota-scope=[userlbucket] --uid=uid 

檢索用戶信息

#查看某個用戶信息 radosgw-admin user info --uid=user #查看所有的用戶信息 radosgw-admin user list 
 

統計數據

#用戶在具體的時間段寫入了多少的數據 radosgw-admin usage show --uid=uid --start-date=start --end-date=end radosgw-admin usage trim --start-date=start --end-date=end radosgw-admin usage show --show-log-entries=false #時間的方式 data表示方式:YYYY-MM-DD hh:mm:ss 

配置DNS實現數據傳輸

配置泛域名解析

  • S3的存儲桶是用於存儲對象的容器,每個對象都必須儲存在一個特定的存儲桶中,且每個對象都要直接通過RESTfulAPI基於URL進行訪問,URL格式為http(s)://bucket-name.radowgw-host[:port]/key"
  • 例如,對於存儲在rgw01.test.io上的S3API對象存儲系統上eshop存儲桶中的名為images/test.ipg的對象,可通過http://eshop.rgw01.test.io/images/test.jpg對其進行尋址

  • 因此,radosgw的S3API接口的功能強依賴於DNS的泛域名解析服務,它必須能夠正常解析任何<bucket-name>.<radowgw-host>格式的名稱至radosgw主機

  • 另外,還需要配置每個radowgw守護進程的rgw dns name為其DNS名稱

#下面是一個在bind中用於泛域名解析的配置示例 IN NS ns ns IN A 172.29.1.199 rgw01 IN A 172.29.0.11 rgw02 IN A 172.29.0.12 *.rgW01 IN CNAME rgw01 *.rgW02 IN CNAME rgw02 
 

rados網關訪問S3對象

#修改網關服務的/etc/ceph/ceph.conf,添加如下內容: rgw_dns_name = lab.example.com 

啟用S3-api客戶端s3cmd

如果基於編程的方式過於復雜切大量重復操作所以S3為了簡化操作退出了命令行版本的客戶端

  • 使用s3cmd命令之前需要事先配置其工作環境,包括指定Access Key和Secret Key,以及S3服務的訪問端點和默認的Region(Ceph的新版本中稱作zonegroup)等
  • s3cmd –configure,配置的結果將保存於~/.s3cmd.cfg配置文件中,用戶隨后可通過編輯此文件修改配置參數,或者再次運行此配置命令為其指定新的配置信息
#安裝客戶端 yum install -y s3cmd #配置客戶端信息 s3cmd --configure 1.配置密鑰 2.配置cloudfront_host 3.配置host_base 4.配置host_bucket 5.配置website_endpoint 
 

命令測試

#創建bucket s3cmd mb s3://demobucket #上傳文件至bucket s3cmd put --acl-public /tmp/demoobject s3://demobucket/demoobject #獲取文件 s3cmd get s3://demobucket/demoobject ./demoobject curl http://demobucket.lab.test.io/demoobject curl http://lab.test.io/test/demoobject 

Bucket常用操作

#列出bucket radosgw-admin bucket list #刪除bucket radosgw-admin bucket rm --bucket=bucket #查看bucket信息 radosgw-admin bucket stats --bucket=bucket #檢查bucket radosgw-admin bucket check --bucket=bucket 

什么是Swift

openstack swift是openstack開源雲計算項目開源的對象存儲,提供了強大的擴展性、冗余和持久性

Swift特性

  • 極高的數據持久性
  • 完全對稱的系統架構

  • 無限的可擴展性

  • 無單點故障

Swift-API操作

Swift-API的上下文中,存儲桶以container表示,而非S3中的bucket,但二者在功用上類同,都是對象數據的容器,且對象存儲在容器中。Openstack Swift API的用戶模型與Amazon S3 API稍有不同。若要使用swift api通過rados網關的身份驗證,需要為rados網關用戶帳戶配置子用戶。swift有租戶概念,rados網關用戶對應swift的租戶,而子帳號則對應swift的api用戶

  • Swift的用戶賬號對應於radosgw中的subuser(子用戶),它隸屬於某個事先存在的user(用戶賬號)
#創建主賬戶 radosgw-admin user create--uid="swiftuser"--display-name="Swift Testing User" #創建swift子用戶 radosgw-admin subuser create --uid 主帳戶名 --subuser 主帳戶名:swift子賬戶 --access=指定權限 --uid 指定現有的rgw網關用戶 --subuser 指定子用戶 --access 指定用戶權限 - r 讀取 - w 寫入 - rw 讀寫 - full 完全 
  • 例如:Python Swiftclient是一個用於與Swift API交互的Python客戶端程序,它包含了Python API(swift 模塊)和一個命令行工具swift
#安裝pythonswift的工具方式 pip instal--upgrade python-swiftclient swift命令可以通過Swift API完成容器和對象數據的管理操作,其基礎語法格式為 ccswift [-A Auth URL][-U username][-K password]subcommand 
 

Swift用戶管理

#修改子用戶 rados-admin subuser modify --subuser=uid:subuserid --access=full #刪除子用戶 radosgw-admin subuser rm --subuser=uid:subuserid [--purge-data] [--purge-keys] #修改子用戶密鑰 radosgw-admin key create --subuser=uid:subuserid --key-type=swift [--access-key=key] [--secret=secret] #刪除子用戶密鑰 radosgw-admin key rm --subuser=uid:subuserid 

Swift客戶端

  • swift客戶端不像s3客戶端一樣有本地的配置信息文件,所以沒有次操作都要帶上賬號的認證信息
  • RADOS網關支持Swift v1.0以及OpenStack keystone v2.0身份驗證

#3安裝swift客戶端 yum install -y python-swiftclient #創建一個容器 swift -V 1.0 -A http://servera/auth -U john:swift -K secret post container #向容器中上傳一個文件 swift -A http://servera/auth/v1.0 -U john:swift -K secret upload container filepath #列出容器中的文件 swift -A http://servera/auth/v1.0 -U john:swift -K secret list [container] #查看容器狀態 swift -A http://servera/auth/v1.0 -U john:swift -K secret stat 

swift讀寫練習

使用openstack swift提供對象存儲

  • 使用openstack swift接口創建一個可訪問ceph集群的用戶
  • 使用openstack swift接口管理對象的存儲

# servera上操作 ssh servera systemtl status ceph-radosgw@* su - ceph # 創建swift子用戶 radosgw-admin subuser create --uid="operator" --subuser="operator:swift" --access="full" --secret="opswift" # 安裝swift客戶端 sudo yum install -y python-swiftclient # 查看swift狀態 swift -V 1.0 -A http://servera/auth/v1 -U operator:swift -K opswift stat # 列出containers swift -V 1.0 -A http://servera/auth/v1 -U operator:swift -K opswift list # 創建container swift -V 1.0 -A http://servera/auth/v1 -U operator:swift -K opswift post my-container swift -V 1.0 -A http://servera/auth/v1 -U operator:swift -K opswift list # 創建一個10M的文件並上傳 dd if=/dev/zero of=/tmp/swift.dat bs=1024k count=10 swift -V 1.0 -A http://servera/auth/v1 -U operator:swift -K opswift upload my-container /tmp/swift.dat # 查看my-container狀態 swift -V 1.0 -A http://servera/auth/v1 -U operator:swift -K opswift stat my-container # 查看operator:swift用戶狀態 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM