本文的原文连接是:
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