java - 如何在 Ceph 对象存储中存储对象
问题描述
msd
我已经在 3 个节点上部署了一个 Ceph 集群,并创建了rgw
. 我有 3 台机器,分别命名为 ceph1、ceph2 和 ceph3。
- ceph1 运行 osd、mon、mds 和 rwg
- ceph2 运行 osd
- ceph3运行osd
我用radosgw-admin user create
命令创建了一个用户。
现在我想使用 swift api 访问 ceph 集群并创建一个容器。为此,我编写了以下 java 代码:
import org.javaswift.joss.client.factory.AccountConfig;
import org.javaswift.joss.client.factory.AccountFactory;
import org.javaswift.joss.client.factory.AuthenticationMethod;
import org.javaswift.joss.model.Account;
import org.javaswift.joss.model.Container;
import org.javaswift.joss.model.StoredObject;
import java.io.File;
import java.io.IOException;
import java.util.*;
public class Example {
public static void main(String[] args) {
String username = "sahoo";
String password = "IM8K5GAQIXHFRAKYS761";
String authUrl = "http://ceph1:7480/";
AccountConfig config = new AccountConfig();
config.setUsername(username);
config.setPassword(password);
config.setAuthUrl(authUrl);
config.setAuthenticationMethod(AuthenticationMethod.BASIC);
Account account = new AccountFactory(config).createAccount();
Container container = account.getContainer("container-name");
container.create();
}
}
但是在运行代码时,我得到以下异常:
Exception in thread "main" java.lang.NullPointerException
at org.javaswift.joss.command.impl.identity.BasicAuthenticationCommandImpl.getReturnObject(BasicAuthenticationCommandImpl.java:35)
at org.javaswift.joss.command.impl.identity.BasicAuthenticationCommandImpl.getReturnObject(BasicAuthenticationCommandImpl.java:18)
at org.javaswift.joss.command.impl.core.AbstractCommand.call(AbstractCommand.java:51)
at org.javaswift.joss.client.impl.ClientImpl.createAccount(ClientImpl.java:97)
at org.javaswift.joss.client.impl.ClientImpl.createAccount(ClientImpl.java:27)
at org.javaswift.joss.client.core.AbstractClient.authenticate(AbstractClient.java:35)
at org.javaswift.joss.client.factory.AccountFactory.createAccount(AccountFactory.java:30)
at Example.main(Example.java:24)
任何人都可以帮助我了解为什么我会收到异常以及我们需要传递给config.setAuthUrl()
.
解决方案
首先,您需要创建子用户才能使用 swift API。
sudo radosgw-admin subuser create radosgw-admin subuser create --uid={uid} --subuser={uid} --access=[ read | write | readwrite | full ]
参考:http ://docs.ceph.com/docs/giant/radosgw/admin/
要为用户创建子用户(Swift 界面),您必须指定用户 ID (--uid={username})、子用户 ID 和子用户的访问级别。
然后,我们需要将 Ceph RGW 的 URL 传递给config.setAuthUrl()
. 最好用swift
命令快速测试。
例如,如果您可以通过以下命令确认创建容器:
# swift -V 1.0 -A http://ceph.example.com/auth/v1 -U foo:swift -K testsecret post test-container
然后,您可以指定以下变量:
- config.setUsername() ...
foo:swift
- config.setPassword() ...
testsecret
- config.setAuthUrl() ...
http://ceph.example.com/auth/v1
推荐阅读
- java - 如何在 react-native 本机模块中使用 Log.d?
- python - 从无标题的固定格式文件中读取数据
- javascript - ASPX 页面后面的代码没有执行 js 代码
- linux - 在 C++ 中使用 Unicode (UTF-8)
- ios - SKEmitterNode 从父节点移除后在屏幕上留下粒子
- python - 我的python很差,我在这段代码中找不到错误
- python - ValueError:在 Pandas 中检查值时,Series 的真值不明确
- python - 使用python为row和col动态创建html网格
- android - 想要使用谷歌分析而不是 firebase
- javascript - Laravel - 消息 Toastr,错误或无效输入字段