概述
在实际生产环境当中,应用服务要通过API接口来操作调用Ceph文件存储服务,Ceph的Rgw服务提供了Rest 风格的API, 支持Amazon S3和Openstack Swift两种接口。
Swift是由Rackspace开发的用来为云计算提供可扩展存储的项目。专注于对象存储, 并提供一套REST风格的Api来访问, 与Ceph强一致性不同, 它是最终一致性。两者都是优秀的开源项目, 并无明显优劣之分,在使用场景上有所不同, 如果是专注于对象存储, 那么可以选择swift即可满足需要, 如果还有块存储要求, 那么选择Ceph更为合适。Ceph通过Rgw网关可以适配兼容swift api, 同时在数据访问上具有较强的扩展性。
本教程讲解如何通过Java Swift接口来实现文件的上传与下载。
脉络
- Rgw网关介绍
- Rgw网关配置
- Swift Api接口封装测试
知行
1. Rgw 介绍
RGW就是提供对象存储的网关,也即对象存储网关。本质上是一个HTTP服务器,与Nginx和Apache无特殊差别。通过这个网关入口,用户可以采用HTTP协议,以RESTful的方式访问Ceph的对象存储。
Ceph 对象存储模型:
每个用户下面可以创建多个桶, 桶里面可以存储对象,对象就是各种数据文件, 包括文档, 图片等。
2. Rgw 网关配置
- 检查集群和rgw服务正常启动
[root@CENTOS7-1 ~]# docker exec mon ceph -s
cluster:
id: 646aa796-0240-4dd8-83b3-8781779a8feb
health: HEALTH_OK
services:
mon: 3 daemons, quorum CENTOS7-1,CENTOS7-2,CENTOS7-3 (age 7d)
mgr: CENTOS7-1(active, since 8d), standbys: CENTOS7-3, CENTOS7-2
mds: cephfs:1 {0=CENTOS7-1=up:active} 2 up:standby
osd: 3 osds: 3 up (since 8d), 3 in (since 8d)
rgw: 3 daemons active (CENTOS7-1, CENTOS7-2, CENTOS7-3)
data:
pools: 8 pools, 360 pgs
objects: 256 objects, 46 KiB
usage: 3.0 GiB used, 27 GiB / 30 GiB avail
pgs: 360 active+clean
Rgw服务没有启动或安装, 参考上篇或中篇教程。
- 访问验证网关服务
地址: http://{服务器IP}:7480
正常可以看到以下信息。
修改访问端口:
编辑ceph.conf文件, 增加:
[client.rgw.CENTOS7-1]
rgw_frontends = "civetweb port=20003"
CENTOS7-1代表的是主机名称。
- 创建API操作用户
docker exec rgw radosgw-admin user create --subuser="cephtester:subtester" --uid="cephtester" --display-name="cephtester" --key-type=swift --secret="654321" --access=full
创建了一个名为cephtester的用户, 密钥为654321。不指定secret参数, 密钥则随机生成。
命令执行成功后, 返回结果如下:
{
"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": []
}
- 创建管理用户
这里的管理用户是用于dashboard的管理。
docker exec rgw radosgw-admin user create --uid=mgruser --display-name=mgruser --system
执行成功后, 会生成对应的access_key与secret_key信息, 需要记住留存:
{
"user_id": "mgruser",
"display_name": "mgruser",
"email": "",
"suspended": 0,
"max_buckets": 1000,
"auid": 0,
"subusers": [],
"keys": [
{
"user": "mgruser",
"access_key": "L3SUWKU1GVHLZLJ7HGPG",
"secret_key": "XBBwbpXGhtNSIxNDShCtZPdFklLfJmCESgoWlncK"
}
],
"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": []
}
再将密钥信息加入dashboard中:
docker exec mgr ceph dashboard set-rgw-api-access-key L3SUWKU1GVHLZLJ7HGPG
docker exec mgr ceph dashboard set-rgw-api-secret-key XBBwbpXGhtNSIxNDShCtZ
PdFklLfJmCESgoWlncK
在dashboard管理后台,就能看到用户信息, 便于管理维护:
3. 封装Swift Api接口
- MAVEN依赖配置:
pom.xml文件增加以下内容:
<dependency>
<groupId>com.ceph</groupId>
<artifactId>rados</artifactId>
<version>0.6.0</version>
</dependency>
<dependency>
<groupId>org.javaswift</groupId>
<artifactId>joss</artifactId>
<version>0.10.2</version>
</dependency>
<dependency>
<groupId>com.ceph</groupId>
<artifactId>libcephfs</artifactId>
<version>0.80.5</version>
</dependency>
- 封装Swift接口
/**
* <p>Description: </p>
* @date 2019/12/11
* @name Mirson
* <p>Copyright:Copyright(c)2019</p>
*/
@Component
@Log4j2
public class SwiftOperator {
/**
* 用户名
*/
String username = "cephtester:subtester";
/**
* 用户密码
*/
String password = "Ceph@654321";
/**
* 接口认证地址
*/
String authUrl = "http://39.98.152.160:20003/auth/1.0";
/**
* 默认容器名称
*/
String defaultContainerName = "user_datainfo";
/**
* 账户信息
*/
private Account account;
/**
* 容器信息
*/
private Container container;
public SwiftOperator() {
// 账户配置
AccountConfig config = new AccountConfig();
config.setUsername(username);
config.setPassword(password);
config.setAuthUrl(authUrl);
config.setAuthenticationMethod(AuthenticationMethod.BASIC);
// 创建账户
Account account = new AccountFactory(config).createAccount();
// 获取容器
Container newContainer = account.getContainer(defaultContainerName);
if(!newContainer.exists()) {
// 如果容器不存在, 则创建
container = newContainer.create();
log.info("container create ==> " + defaultContainerName);
}else {
container = newContainer;
}
}
/**
* 上传文件对象
* @param remoteName
* @param filepath
*/
public void createObject(String remoteName, String filepath) {
StoredObject object = container.getObject(remoteName);
object.uploadObject(new File(filepath));
}
/**
* 获取下载指定文件对象
* @param containerName
* @param objectName
* @param outpath
*/
public void retrieveObject(String objectName,String outpath){
StoredObject object = container.getObject(objectName);
object.downloadObject(new File(outpath));
}
/**
* 获取所有容器信息
* @return
*/
public List listContainer() {
List list = new ArrayList();
Collection<Container> containers = account.list();
for (Container currentContainer : containers) {
list.add(currentContainer.getName());
System.out.println(currentContainer.getName());
}
return list;
}
}
- 通过构造方法, 创建Ceph的连接配置信息。
- 封装了文件上传和下载的接口。
- 创建启动测试类
CephDemoApplication启动类代码:
@SpringBootApplication
public class CephDemoApplication {
private static SwiftOperator swiftOperator;
public static void main(String[] args) {
ConfigurableApplicationContext appContext = SpringApplication.run(CephDemoApplication.class, args);
// 从容器中获取swiftOperator
swiftOperator = appContext.getBean(SwiftOperator.class);
// 获取所有容器信息
System.out.println("list containers: ");
swiftOperator.listContainer();
String objName = "test_ceph";
// 上传D盘的swift_test文件
swiftOperator.createObject(objName, "d:/swift_test.txt");
// 下载文件至E盘, 名称改为test_swift.txt
swiftOperator.retrieveObject(objName, "e:/test_swift.txt");
System.out.println("complete");
}
- 从容器中获取我们封装的swiftOperator对象
- 上传D盘名为swift_test.txt的测试文件, 在ceph中存储名称为test_ceph,注意Ceph中是按用户和对象进行存储, 不支持路径多层级的存储方式。
- 从ceph中下载名称为test_ceph的对象, 保存至E盘,重命名为test_swift.txt。
- 调用验证
在D盘根目录创建名为swift_test.txt的文件, 随便填入些内容, 待程序执行完成, 检查E盘是否能够成功下载该文件。
启动CephDemoApplication:
可以看到程序能够正常连接Ceph集群, 获取Container信息, 成功完成文件的上传与下载。
合一
- Ceph集群提供了多种API的调用方式, 这里采用兼容性较强的Ceph Swift Api, Ceph功能比较丰富, 更多用法大家可以再自行探索。
- 这里的Swift封装为单例化操作, 避免连接反复建立产生过多开销,当然, 在实际生产环境当中, 大家应该针对用户和容器再做进一步封装, 每个微服务可以采用一个用户, 服务内的不同业务功能再采用不同容器去做处理, 这样能够提升处理效率, 整个Ceph文件的管理也更为清晰。