Ceph Swift Api 配置與使用(三)
Ceph Swift Api 配置與使用
一、 Ceph Swift Api 說明
在 ceph 的使用上, 網際網路大規模的檔案場景下, fs 並不能滿足生產的使用要求,rados 本地化操作也不便於服務的接入與使用, 這裡我們就要採用 Ceph Swift Api 來實現檔案的儲存管理。
二、Ceph Swift Api 特點
Swift 是由 Rackspace 開發,用來為雲端計算提供可擴充套件儲存的專案。專注於物件儲存, 並提供一套 REST 風格的 Api 來訪問, 與 Ceph 強一致性不同, 它是最終一致性。兩者都是優秀的開源專案, 並無明顯優劣之分,在使用場景上有所不同, 如果是專注於物件儲存, 那麼可以選擇 swift 即可滿足需要, 如果還有塊儲存要求, 那麼選擇 Ceph 更為合適。這裡選擇 Ceph, 因為通過閘道器可以適配相容 swift api, 同時在資料訪問上具有較強的擴充套件性:
-
Ceph 可通過 Rados 閘道器用相容 S3 的 RESTful API 訪問,對 AWS 雲環境下的其他內容也能很好的相容, 比如 OpenStack Swift 的物件儲存訪問介面。
-
CephFS:是一個 POSIX 相容的檔案系統,可以在任何 Linux 發行版上執行,作業系統可直接訪問 Ceph 儲存。
-
RBD:RBD 是一個 Linux 核心級的塊裝置,允許使用者像任何其他 Linux 塊裝置一樣訪問 Ceph。
-
ISCSI 閘道器: 這一增加的功能是 SUSE 加上去的,它允許管理員在 Ceph 之上執行 iSCSI(網際網路小型計算機系統介面)閘道器,從而將其轉變為任何作業系統都可以訪問的 SAN(Storage Area Network,儲存區域網路)檔案管理器。
三、Ceph RGW 介紹
Ceph 可以提供塊、檔案和物件三種形態的儲存。RGW 就是提供物件儲存的閘道器,也即物件儲存閘道器。 所謂物件儲存閘道器,也就是物件儲存的入口,本質上是一個 HTTP 伺服器,與 Nginx 和 Apache 無特殊差別。通過這個閘道器入口,使用者可以採用 HTTP 協議,以 RESTful 的方式訪問 Ceph 的物件儲存。
四、Ceph 儲存結構
在使用物件儲存之前, 先要了解桶(container 容器)概念及其儲存結構:
Ceph Swift Api 的呼叫, 需要先建立相應使用者進行認證才能操作, 每個使用者下面可以建立多個桶, 桶裡面可以儲存物件,物件就是各種資料檔案, 包括文件, 圖片等。傳統上傳檔案的使用, 我們往往會指 定路徑資訊, 在這裡, 桶和物件的關係好比資料夾與檔案的概念, 不同之處是桶不能再巢狀桶, 也就是沒有層級路徑的概念。
Ceph 儲存結構:
五、 Ceph Swift Api 服務端的配置
1、 確保叢集正常安裝並啟動:
如果 rgw 沒有顯示, 檢查服務狀態:
systemctl list-unit-files|grep enabled|grep ceph
複製程式碼
重啟 RGW 服務:
<code data-type="codeline">ceph-deploy --overwrite-conf --ceph-conf ceph.conf rgw create CENTOS7-1</code><code data-type="codeline">systemctl restart [email protected]*.service</code>
複製程式碼
2、 驗證閘道器是否正常
訪問地址, http://192.168.88.161:7480
出現以下提示代表正常
3、 建立 Swift 使用者, 用於介面請求認證
sudo radosgw-admin user create --subuser="cephtester:subtester" --uid="cephtester" --display-name="cephtester" --key-type=swift --secret="654321" --access=full
複製程式碼
uid 為主使用者, subuser 為子使用者資訊, secret 指定金鑰, 不指定則隨機生成, access 擁有許可權設定。
返回結果:
[[email protected]CENTOS7-1 ceph-cluster]# sudo radosgw-admin user create --subuser="cephtester:subtester" --uid="cephtester" --display-name="cephtester" --key-type=swift --secret="654321" --access=full
{
"user_id": "cephtester",
"display_name": "cephtester",
"email": "",
"suspended": 0,
"max_buckets": 1000,
"auid": 0,
"subusers": [
{
"id": "cephtester:subtester",
"permissions": "full-control"
}
],
"keys": [],
"swift_keys": [
{
"user": "cephtester:subtester",
"secret_key": "654321"
}
],
"caps": [],
"op_mask": "read, write, delete",
"default_placement": "",
"placement_tags": [],
"bucket_quota": {
"enabled": false,
"check_on_raw": false,
"max_size": -1,
"max_size_kb": 0,
"max_objects": -1
},
"user_quota": {
"enabled": false,
"check_on_raw": false,
"max_size": -1,
"max_size_kb": 0,
"max_objects": -1
},
"temp_url_keys": [],
"type": "rgw",
"mfa_ids": []
}
複製程式碼
記住 swift_keys 下面的 user 和 secret_key 資訊, 程式碼中需使用。
4、啟用管理後臺的物件儲存模組:
5、 建立一個管理使用者:
radosgw-admin user create --uid=mgruser --display-name=mgruser --system
複製程式碼
返回結果:
[root@CENTOS7-1 ceph-cluster]# radosgw-admin user create --uid=mgruser --display-name=mgruser --system
{
"user_id": "mgruser",
"display_name": "mgruser",
"email": "",
"suspended": 0,
"max_buckets": 1000,
"auid": 0,
"subusers": [],
"keys": [
{
"user": "mgruser",
"access_key": "W462B8SE31NDCOQR4E6I",
"secret_key": "XPZcugMWRhYccFlEPIHKcyFVr73grVuiJgFD4rDR"
}
],
"swift_keys": [],
"caps": [],
"op_mask": "read, write, delete",
"system": "true",
"default_placement": "",
"placement_tags": [],
"bucket_quota": {
"enabled": false,
"check_on_raw": false,
"max_size": -1,
"max_size_kb": 0,
"max_objects": -1
},
"user_quota": {
"enabled": false,
"check_on_raw": false,
"max_size": -1,
"max_size_kb": 0,
"max_objects": -1
},
"temp_url_keys": [],
"type": "rgw",
"mfa_ids": []
}
複製程式碼
根據生成的 access_key 與 secret_key, 執行:
<code data-type="codeline">ceph dashboard set-rgw-api-access-key W462B8SE31NDCOQR4E6I </code><code data-type="codeline">ceph dashboard set-rgw-api-secret-key XPZcugMWRhYccFlEPIHKcyFVr73grVuiJgFD4rDR</code>
複製程式碼
開啟管理介面, http://192.168.88.161:18843 可以檢視到我們剛才建立的兩個使用者:
六、Ceph Swift Api 呼叫驗證
1、建立 ceph-demo 工程
增加 SwiftOperator 介面:
@Component
public class SwiftOperator {
/**
* 使用者名稱資訊, 格式: 主使用者名稱:子使用者名稱
*/
private String username ="cephtester:subtester";
/**
* 使用者密碼
*/
private String password = "654321";
/**
* 介面訪問地址
*/
private String authUrl = "http://192.168.88.161:7480/auth/1.0";
/**
* 預設儲存的容器名稱(bucket)
*/
private String defaultContainerName = "user_datainfo";
/**
* Ceph的賬戶資訊
*/
private Account account = null;
/**
* Ceph的容器資訊
*/
private Container container;
/**
* 進行Ceph的初始化配置
*/
public SwiftOperator() {
// 1. Ceph的賬戶資訊配置
AccountConfig config = new AccountConfig();
config.setUsername(username);
config.setPassword(password);
config.setAuthUrl(authUrl);
config.setAuthenticationMethod(AuthenticationMethod.BASIC);
account = new AccountFactory(config).createAccount();
// 2.獲取容器資訊
Container newContainer = account.getContainer(defaultContainerName);
if(!newContainer.exists()) {
container = newContainer.create();
System.out.println("container create ==> " + defaultContainerName);
}else {
container = newContainer;
}
}
/**
* 檔案上傳處理
* @param remoteName
* @param filePath
*/
public void createObject(String remoteName, String filePath) {
// 1. 從容器當中獲取遠端儲存物件資訊
StoredObject object = container.getObject(remoteName);
// 2. 執行檔案上傳處理
object.uploadObject(new File(filePath));
}
/**
* 檔案的下載處理
* @param objectName
* @param outPath
*/
public void retrieveObject(String objectName, String outPath) {
// 1. 從容器當中獲取遠端儲存物件資訊
StoredObject object = container.getObject(objectName);
// 2. 執行檔案的下載方法
object.downloadObject(new File(outPath));
}
/**
* 獲取使用者下面的所有容器資訊
* @return
*/
public List listContainer() {
List list = new ArrayList();
Collection<Container> containers = account.list();
for(Container container : containers) {
list.add(container.getName());
System.out.println("current container name : " + container.getName());
}
return list;
}
}
複製程式碼
這裡的使用者名稱和密碼填寫上面我們所生成的資訊。注意路徑地址字尾為: /auth/1.0
CephDemoApplication 啟動類,測試驗證:
@SpringBootApplication
@ComponentScan(basePackages = {"cn.it"})
public class CephDemoApplication {
public static void main(String[] args) throws Exception {
// Swift Api介面呼叫驗證
swiftApi();
}
/**
* 通過Swift介面操作ceph叢集
* @throws Exception
*/
public static void swiftApi() throws Exception {
ConfigurableApplicationContext appContext = SpringApplication.run(CephDemoApplication.class);
// 1. 先打印出使用者的容器資訊
SwiftOperator swiftOperator = appContext.getBean(SwiftOperator.class);
swiftOperator.listContainer();
String objName = "test_ceph";
// 2. 上傳指定的檔案
swiftOperator.createObject(objName, "E:\\test\\upload\\test_swift_ceph.txt");
// 3. 從ceph下載檔案到指定的路徑下面
swiftOperator.retrieveObject(objName, "E:\\test\\download\\test_swift_ceph.txt");
System.out.println("complete");
}
}
複製程式碼
- 那些 Go 語言發展歷史上的重大決策
- 從趨勢到挑戰,一站式解讀作業系統運維和可觀測性
- 百萬級 Topic,騰訊雲的 Apache Pulsar 穩定性實踐
- Apache Doris 在思必馳的應用優化實踐:海量語音通話資料下,實時、離線一體的數倉架構設計實踐
- 愛數正式開源認知智慧開發框架 KWeaver
- 運維智慧化的三大關鍵技術
- “抄我的還‘反捅’我一刀”,Gary Marcus 發文駁斥圖靈獎得主 Yann LeCun
- 當出海成為必選項,企業如何構建全場景全生態技術底座?
- 數智底座必備能力三:快速構建創新應用
- Docker 多階段構建實戰 (multi-stage builds)
- 工作筆記之 SELECT 語句在 SAP ABAP 中的用法總結(上)
- 經久不衰的設計定律是不要讓我思考的設計
- 不要指望下一個像 GPT 這樣的大型語言模型會民主化
- Java 近期新聞:Helidon Níma、Spring Framework、MicroProfile、MicroStream、Kotlin 和 Piranha
- 一文入門 jQuery
- C 學習 ---__libc_open 函式的原理
- 監控系統工作原理
- 甲骨文新微服務框架 Helidon Níma:使用虛擬執行緒實現高效能
- 【雲原生 | 從零開始學 Kubernetes】二、使用 kubeadm 搭建 K8S 叢集
- Elasticsearch 聚合學習之四:結果排序