使用docker 搭建 ceph 开发环境,使用aws sdk 存储数据

本文的原文连接是:
http://blog.csdn.net/freewebsys/article/details/79553386

1,关于ceph


Ceph是加州大学Santa Cruz分校的Sage Weil(DreamHost的联合创始人)专为博士论文设计的新一代自由软件分布式文件系统。自2007年毕业之后,Sage开始全职投入到Ceph开 发之中,使其能适用于生产环境。Ceph的主要目标是设计成基于POSIX的没有单点故障的分布式文件系统,使数据能容错和无缝的复制。

官方网站:
https://ceph.com/

中文文档:
http://docs.ceph.org.cn/

demo镜像地址:
https://hub.docker.com/r/ceph/demo

github地址:
https://github.com/ceph/ceph

这里写图片描述

2,安装docker本地测试


参考文章:
https://ceph.com/geen-categorie/ceph-cluster-on-docker-for-testing/

首先说明下,这个不能在mac下使用docker 启动,在windows 直接用docker也不行。
直接报错:

2018-03-14 06:32:38.754330 7ff8961e1600 -1 unable to find any IP address in networks: 10.4.105.0/24

推测是因为这个是基于linux 进行开发,环境只支持centos debian ubuntu 等linux 操作系统。
可以使用的是virtualbox 安装一个 centos7 的操作系统。网络使用的默认的nat模式。
然后最终要的是关闭 centos7 的防火墙。否则不能访问还以为啥问题呢。

systemctl disable firewalld
systemctl stop firewalld

使用ceph必须也是一个centos7的镜像。使用虚拟机或者服务器都问题不大。

docker pull ceph/demo:tag-stable-3.0-jewel-centos-7

启动时候特别说明的是,–net=host 这个是:
host 模式
在这个模式下,docker 不会为容器创建单独的网络 namespace,而是共享主机的 network namespace,也就是说:容器可以直接访问主机上所有的网络信息。
让容器运行在 host 模式很简单:启动容器的命令行添加 –net=host 参数就搞定了!共享了网络之后就不用映射端口了。两个效果一样。

virtualbox 使用的nat 模式,最简单的。所以 ip 固定,我也喜欢这个模式。
启动了ssh 之后就可以直接连上,其他模式ip 老变。也比较懒。

docker run -d --net=host --name ceph \
 -e MON_IP=10.0.2.15 -e CEPH_PUBLIC_NETWORK=10.0.2.0/24 ceph/demo:tag-stable-3.0-jewel-centos-7

说明,如果是服务器,需要把ip 修改成服务器地址。
启动之后 –name ceph 给容器个名称。设置环境变量。

启动之后过5秒多后就启动了,在virtualbox 上面直接可以查看端口:

这里写图片描述

可以看到docker 启动之后就本地网络中就有了 5000 80 6800 6801 6802 6803 6804 6789
这些端口都可以看到。
在虚拟机上面可以访问。

然后使用端口转发,让笔记本访问:

然后就可以访问了:

端口 映射 80 到 8080 。本机可以访问了。

3,创建账号


服务启动之后需要 accessKey , secretKey 两。这个是创建的。
登录docker:

docker exec -it ceph bash
radosgw-admin user create --uid=ceph --display-name="ceph"

创建账号成功之后返回json:

{
    "user_id": "ceph",
    "display_name": "ceph",
    "email": "",
    "suspended": 0,
    "max_buckets": 1000,
    "auid": 0,
    "subusers": [],
    "keys": [
        {
            "user": "ceph",
            "access_key": "ENDMBKC6EJYVT0JANMQ7",
            "secret_key": "5tgyoKgoteh6RWuo6RxHgbBxk9gP2uC9kdioiAAB"
        }
    ],
    "swift_keys": [],
    "caps": [],
    "op_mask": "read, write, delete",
    "default_placement": "",
    "placement_tags": [],
    "bucket_quota": {
        "enabled": false,
        "max_size_kb": -1,
        "max_objects": -1
    },
    "user_quota": {
        "enabled": false,
        "max_size_kb": -1,
        "max_objects": -1
    },
    "temp_url_keys": []
}

4,使用javasdk访问


参考官方文档:
http://docs.ceph.org.cn/radosgw/s3/java/
全部代码:

使用pom:

<dependency>
            <groupId>com.amazonaws</groupId>
            <artifactId>aws-java-sdk-s3</artifactId>
            <version>1.11.124</version>
        </dependency>

说明,不能使用最新版本的 aws java sdk,因为取消了 AmazonS3Client 这个类。能用就行了。


import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.util.Date;
import java.util.List;
import com.amazonaws.auth.AWSCredentials;
import com.amazonaws.auth.BasicAWSCredentials;
import com.amazonaws.services.s3.model.*;
import com.amazonaws.services.s3.AmazonS3;
import com.amazonaws.services.s3.AmazonS3Client;
import com.amazonaws.ClientConfiguration;
import com.amazonaws.Protocol;
import com.amazonaws.util.IOUtils;
import com.amazonaws.util.StringUtils;

public class CephUtils {

    public static final String accessKey = "ENDMBKC6EJYVT0JANMQ7";
    public static final String secretKey = "5tgyoKgoteh6RWuo6RxHgbBxk9gP2uC9kdioiAAB";
    private final static String endpoint = "127.0.0.1:8080";

    private static final AmazonS3 amazonS3;

    static {
        AWSCredentials credentials = new BasicAWSCredentials(accessKey, secretKey);
        ClientConfiguration clientConfig = new ClientConfiguration();
        clientConfig.setProtocol(Protocol.HTTP);
        amazonS3 = new AmazonS3Client(credentials, clientConfig);
        amazonS3.setEndpoint(endpoint);
        System.out.println("init finish .");
    }


    public static void main(String[] args) {

        List<Bucket> buckets = amazonS3.listBuckets();
        String bucketName = "demo-bucket";
        String fileName = "hello.txt";
        //如果没有创建一个桶。
        if (buckets.size() == 0) {
            amazonS3.createBucket("demo-bucket");
            buckets = amazonS3.listBuckets();
        }
        for (Bucket bucket : buckets) {
            System.out.println(bucket.getName() + "\t" +
                    StringUtils.fromDate(bucket.getCreationDate()));
        }
        System.out.println("#########################");
        //写入文件。
        String content = "Hello World! " + new Date();
        ByteArrayInputStream input = new ByteArrayInputStream(content.getBytes());
        amazonS3.putObject(bucketName, "hello.txt", input, new ObjectMetadata());
        //读取文件。
        S3Object fileObj = amazonS3.getObject(new GetObjectRequest(bucketName, fileName));
        try {
            String str = IOUtils.toString(fileObj.getObjectContent());
            System.out.println(str);
        } catch (IOException e) {
            e.printStackTrace();
        }

    }
}

运行结果:可以创建桶,写入数据,读取数据。

init finish .
demo-bucket 2018-03-14T03:23:21.292Z
#########################
Hello World!Wed Mar 14 13:20:09 CST 2018

还有个 golang的 sdk:
https://docs.aws.amazon.com/sdk-for-go/api/service/s3/

4,总结


ceph 是非常好的开源项目,支持 aws s3 sdk。
安装文档比较烦,但是可以通过docker 跑一个demo 进行本地测试。
这两天折腾,终于跑通了ceph,很高兴。
ceph 是一个在linux 上面开发的,用c++ 写的。只能跑在linux上面。
依赖linux lib库,推测是这个原因吧。在linux 上跑的很顺利。

本文的原文连接是:
http://blog.csdn.net/freewebsys/article/details/79553386

猜你喜欢

转载自blog.csdn.net/freewebsys/article/details/79553386