Ceph Swift Api 配置与使用(三)【与云原生的故事】

举报
Lansonli 发表于 2022/04/28 09:14:55 2022/04/28
【摘要】 ​Ceph Swift Api 配置与使用一、Ceph Swift Api 说明在ceph的使用上, 互联网大规模的文件场景下, fs并不能满足生产的使用要求,rados本地化操作也不便于服务的接入与使用, 这里我们就要采用Ceph Swift Api 来实现文件的存储管理。二、Ceph Swift Api 特点Swift是由Rackspace开发,用来为云计算提供可扩展存储的项目。专注于对...

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网关用兼容S3RESTful API访问,对AWS云环境下的其他内容也能很好的兼容, 比如OpenStack Swift的对象存储访问接口。
  • CephFS:是一个POSIX兼容的文件系统,可以在任何Linux发行版上运行,操作系统可直接访问Ceph存储。
  • RBDRBD是一个Linux内核级的块设备,允许用户像任何其他Linux块设备一样访问Ceph
  • ISCSI 网关: 这一增加的功能是SUSE加上去的,它允许管理员在Ceph之上运行iSCSI(互联网小型计算机系统接口)网关,从而将其转变为任何操作系统都可以访问的SANStorage Area Network,存储区域网络)文件管理器。


三、Ceph RGW 介绍

Ceph可以提供块、文件和对象三种形态的存储。RGW就是提供对象存储的网关,也即对象存储网关。 所谓对象存储网关,也就是对象存储的入口,本质上是一个HTTP服务器,与NginxApache无特殊差别。通过这个网关入口,用户可以采用HTTP协议,以RESTful的方式访问Ceph的对象存储。


四、Ceph 存储结构

在使用对象存储之前, 先要了解桶(container容器)概念及其存储结构:

Ceph Swift Api的调用, 需要先创建相应用户进行认证才能操作, 每个用户下面可以创建多个桶, 桶里面可以存储对象,对象就是各种数据文件, 包括文档, 图片等。传统上传文件的使用, 我们往往会指 定路径信息, 在这里, 桶和对象的关系好比文件夹与文件的概念, 不同之处是桶不能再嵌套桶, 也就是没有层级路径的概念。


Ceph存储结构:



五、Ceph Swift Api 服务端的配置

1、确保集群正常安装并启动:

如果rgw没有显示, 检查服务状态:

systemctl list-unit-files|grep enabled|grep ceph

重启RGW服务:

ceph-deploy --overwrite-conf --ceph-conf ceph.conf rgw create CENTOS7-1
systemctl restart ceph-radosgw@*.service

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拥有权限设定。
返回结果:
[root@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下面的usersecret_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_keysecret_key, 执行:

ceph dashboard set-rgw-api-access-key W462B8SE31NDCOQR4E6I 
ceph dashboard set-rgw-api-secret-key XPZcugMWRhYccFlEPIHKcyFVr73grVuiJgFD4rDR

 

打开管理界面,https://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");

    }
}

​【与云原生的故事】有奖征文火热进行中:https://bbs.huaweicloud.cn/blogs/345260

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。