一、安装librados和librbd

Ceph存储集群提供了基本的存储服务,允许Ceph在一个统一的系统中唯一地传送对象,块和文件存储。 但是,不限于使用RESTful,块或POSIX接口。 基于RADOS,Librados API使您能够创建自己的Ceph存储群集接口。Librados API使您能够与Ceph存储集群中的两种守护程序进行交互:

1)Ceph监视器,其维护集群映射的主副本。
 2)Ceph OSD守护程序(OSD),它将数据作为对象存储在存储节点上。

要安装librados-dev和librbd-dev,因为java的Rados类需要用到librados-dev,而Rbd类需要用到librbd-dev

,需要执行以下步骤:

1)安装librados和librbd。

对于Debian / Ubuntu,执行:

apt-get install librados-dev
apt-get install librbd-dev

对于 CentOS/RHEL,执行:

yum install librados2-devel
yum install librbd1-devel

为开发人员安装库后,可以在/usr/include/rados下找到C / C ++所需的头文件

也可以下载下面的4个rmp包:

wget http://vault.centos.org/7.2.1511/storage/x86_64/ceph-hammer/librados2-0.94.5-1.el7.x86_64.rpm

wget http://vault.centos.org/7.2.1511/storage/x86_64/ceph-hammer/librados2-devel-0.94.5-1.el7.x86_64.rpm

wget http://vault.centos.org/7.2.1511/storage/x86_64/ceph-hammer/librbd1-0.94.5-1.el7.x86_64.rpm

wget http://vault.centos.org/7.2.1511/storage/x86_64/ceph-hammer/librbd1-devel-0.94.5-1.el7.x86_64.rpm

然后执行:

yum install librados2-0.94.-.el7.x86_64.rpm librados2-devel-0.94.-.el7.x86_64.rpm -y
yum install librbd1-0.94.-.el7.x86_64.rpm librbd1-devel-0.94.-.el7.x86_64.rpm -y

2)克隆rados-java工程:

git clone https://github.com/ceph/rados-java.git

3)构建rados-java工程:

cd rados-java-master
mvn install -Dmaven.test.skip=true

JAR文件位于rados-java-master/target下

4)新建一个maven工程cephDemo,用来调用ceph

工程目录如下所示:

下面引用的rados-0.4.0-SNAPSHOT.jar是由上面的mvn install后生成的jar包,实情情况版本可能有变

pom.xml配置如下:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.ceph.test</groupId>
<artifactId>cephDemo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>cephDemo</name>
<dependencies>
<dependency>
<groupId>com.ceph</groupId>
<artifactId>rados</artifactId>
<version>0.4.0-SNAPSHOT</version>
</dependency>
</dependencies>
</project>

二、应用程序调用ceph原理

下图提供了初始连接的高级流程。

以下是java对ceph中image的基本操作示例:

package com.ceph.rbd;

import java.io.File;
import java.util.Arrays;
import java.util.List; import com.ceph.rados.IoCTX;
import com.ceph.rados.Rados;
import com.ceph.rados.exceptions.RadosException;
import com.ceph.rbd.jna.RbdImageInfo;
import com.ceph.rbd.jna.RbdSnapInfo; public class RbdDao { private static Rados rados;
private static IoCTX ioctx;
private static Rbd rbd;
/**
* 连接上ceph环境
*/
public static void connectCeph(){
try {
rados = new Rados("admin");
//rados.confSet("mon_host", "10.111.131.125");
//rados.confSet("key", "AQBngfhYpHvLKhAAtmVZTyR3NJxx1WOVeLo5pQ==");
rados.confSet("mon_host", "172.16.60.41");
rados.confSet("key", "AQCdP9pYGI4jBBAAc96J8/OconCkVKWPBNU2vg==");
rados.connect();
ioctx = rados.ioCtxCreate("rbd");
rbd = new Rbd(ioctx);
System.out.println("successs connetc");
} catch (Exception e) {
e.printStackTrace();
// TODO: handle exception
}
} /**
* 返回所有的image,并展示其详细信息
* @return
*/
public static List<String> imageList(){
List<String> imageList=null;
try {
imageList = Arrays.asList(rbd.list());
for(String s:imageList){
showDetailOfImage(s);
}
} catch (RbdException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return imageList;
} /**
* 显示image的详细信息
* @param imageName
*/
public static void showDetailOfImage(String imageName){
RbdImage image;
try {
image = rbd.open(imageName);
RbdImageInfo info = image.stat();
System.out.println("=================================================================");
System.out.println("imageName: "+imageName);
System.out.println("imageSize: "+info.size);
System.out.println("order: "+info.order);
rbd.close(image);
} catch (RbdException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} } /**
* 以格式1创建image
* @param imageName 名称
* @param imageSize 大小
*/
public static void createRbd_format1(String imageName, long imageSize){
try {
rbd.create(imageName, imageSize);
RbdImage image = rbd.open(imageName);
boolean oldFormat = image.isOldFormat();
System.out.println("imageFormat:==========================="+oldFormat); rbd.close(image);
} catch (RbdException e) {
System.out.println(e.getMessage() + ": " + e.getReturnValue());
}
} /**
* 以格式2创建image,ceph 仅支持克隆 format 2 映像(即用 rbd create –format 2 创建的),而且内核 rbd 模块还不支持。
  所以现在你 只能用 QEMU/KVM 或 librbd直接访问克隆品
* @param imageName 名称
* @param imageSize 大小
*/
public static void createRbd_format2(String imageName, long imageSize){
try {
int features = (1<<0);
System.out.println("features=============="+features);
rbd.create(imageName, imageSize,features, 0);
RbdImage image = rbd.open(imageName);
boolean oldFormat = image.isOldFormat();
System.out.println("imageFormat:==========================="+oldFormat);
rbd.close(image);
image.flatten();
} catch (RbdException e) {
System.out.println(e.getMessage() + ": " + e.getReturnValue());
}
} /**
* 方法创建一个image并对重设置大小为初始化大小的2倍
* @param imageName
*/
public static void resizeImage(String imageName){
long initialSize = 10485760;
long newSize = initialSize * 2;
try {
int features = (1<<0);
System.out.println("features=============="+features);
rbd.create(imageName, initialSize,features, 0);
RbdImage image = rbd.open(imageName);
image.resize(newSize);
rbd.close(image);
} catch (RbdException e) {
System.out.println(e.getMessage() + ": " + e.getReturnValue());
}
} /**
* 创建映像的快照
* @param imageName 映像名称
* @param snapName 快照名称
*/
public static void createSnap(String imageName,String snapName){
try {
RbdImage image = rbd.open(imageName);
//创建快照
image.snapCreate(snapName);
//保护快照可以防止快照被删除
image.snapProtect(snapName);
//返回一个image的所有快照
List<RbdSnapInfo> snaps = image.snapList();
for(RbdSnapInfo rbds:snaps){
System.out.println("快照名称:"+rbds.name);
System.out.println("快照大小:"+rbds.size);
}
} catch (RbdException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} /**
* 通过快照克隆出新的image
* @param parentImageName 快照对应的image名称
* @param snapName 快照的名称
* @param newImageName 生成的新的image的名称
*/
public static void copySnapToNewImage(String parentImageName,String snapName,String newImageName){
int features = (1<<0);
try {
rbd.clone(parentImageName, snapName, ioctx, newImageName, features, 0);
} catch (RbdException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} /**
* 删除某个image的名叫 snapName的快照,需要注意的是要删除快照,必须保证快照没有copy的子image,否则会删除失败。
* @param imageName
* @param snapName
*/
public static void deleteSnap(String imageName,String snapName){
try {
RbdImage image = rbd.open(imageName);
image.snapUnprotect(snapName);
image.snapRemove(snapName);
} catch (RbdException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} /**
* 删除某一个image
* @param r
* @param io
* @param imageName
* @throws RadosException
* @throws RbdException
*/
public static void cleanupImage(Rados r, IoCTX io, String imageName) {
try {
if (r != null) {
if (io != null) {
Rbd rbd = new Rbd(ioctx);
RbdImage image = rbd.open(imageName);
rbd.close(image);
rbd.remove(imageName);
}
}
} catch (Exception e) {
// TODO: handle exception
}
} public static void main(String[] args){
connectCeph();
//createRbd_format1("mysql-hzb-2",10737418240l);
//createRbd_format2("imageformat2",10485760);
//cleanupImage(rados,ioctx,"mysql-hzb");
//resizeImage("mysql-hzb"); // createSnap("imageformat3","imageformat3-snap");
//copySnapToNewImage("imageformat3","imageformat3-snap","imageformat3-copy");
//deleteSnap("imageformat3","imageformat3-snap");
imageList();
}
}

java操作ceph之rbd基本操作的更多相关文章

  1. java操作elasticsearch实现基本的增删改查操作

    一.在进行java操作elasticsearch之前,请确认好集群的名称及对应的ES节点ip和端口 1.查看ES的集群名称 #进入elasticsearch.yml配置文件/opt/elasticse ...

  2. java操作redis学习(一):安装及连接

    文章参考自:http://www.cnblogs.com/edisonfeng/p/3571870.html,在此基础上进行了修改. 一.下载安装Redis redis官网显示暂时不支持Windows ...

  3. java操作Excel、PDF文件

    java操作Excel.PDF文件 分享者:Vashon 分享来源:CSDN博客 下面这些是在开发中用到的一些东西,有的代码贴的不是完整的,只是贴出了关于操作EXCEL的代码: jxl是一个*国人写的 ...

  4. ceph中rbd的增量备份和恢复

    ceph中rbd的增量备份和恢复 ceph的文档地址:Ceph Documentation ​ 在调研OpenStack中虚机的备份和恢复时,发现OpenStack和ceph紧密结合,使用ceph做O ...

  5. 006 管理Ceph的RBD块设备

    一, Ceph RBD的特性 支持完整和增量的快照 自动精简配置 写时复制克隆 动态调整大小 二.RBD基本应用 2.1 创建RBD池 [root@ceph2 ceph]# ceph osd pool ...

  6. ceph的rbd备份软件ceph-backup

    teralytics是一家国外的大数据公司,这个是他们开源的ceph的备份的工具,在twitter上搜索相关信息的时候看到,觉得不错就拿来试用一番 这是个什么软件 一个用来备份 ceph 的 rbd ...

  7. 如何统计Ceph的RBD真实使用容量

    前言 ceph的rbd一直有个问题就是无法清楚的知道这个分配的空间里面到底使用了多少,这个在Jewel里面提供了一个新的接口去查询,对于老版本来说可能同样有这个需求,本篇将详细介绍如何解决这个问题 查 ...

  8. ceph查询rbd的使用容量(快速)

    ceph在Infernalis加入了一个功能是查询rbd的块设备的使用的大小,默认是可以查询的,但是无法快速查询,那么我们来看看这个功能是怎么开启的 ceph版本 root@lab8107:~/cep ...

  9. Kubernetes官方java客户端之六:OpenAPI基本操作

    欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...

随机推荐

  1. Go - 基础知识

    经历了五一小假期,前后差不多一周多没有坚持学习了,所以在归来的第一时间继续 Go 的学习之旅. Go 程序的基本结构 首先先贴出一段简单的代码:HelloGo.go // HelloGo packag ...

  2. Angular2 如何使用jquery

    网上找了很多版本尝试都不行,最后在stackoverflow上找到一个,尝试完美解决 具体操作步骤如下 1. 安装jquery npm install jquery 2.安装 type for jqu ...

  3. canvas绘制圆弧

    canvas绘制圆弧 方法 anticlockwise为true表示逆时针,默认为顺时针 角度都传的是弧度(弧度 = (Math.PI/180)*角度) arc(x, y, radius, start ...

  4. selenium+python+pycharm环境搭建

    1.安装python,配置path环境变量,验证python安装成功与否 2.安装Pycharm:Pycharm是Python的IDE,所以我们需要安装一下:下载安装Selenium 3.在官网(ht ...

  5. 关于网格比较工具metro使用的几点注意事项

    Metro作为一个非常好用的简化网格比较工具,在科研界几乎算是标准了.不过很多比较牛的作者会使用自己设计的一些比较算法,但是如果metro够用了也就不必那么麻烦了,毕竟Metro使用的方法还算是很成熟 ...

  6. C# WinForm ProgressBar垂直显示进度和从右向左显示进度

    1. 尝试将ProgressBar的RightToLeft属性设置为System.Windows.Forms.RightToLeft.Yes,同时将RightToLeftLayout属性设置为true ...

  7. Spring与Redis的实现

    前言 Redis作为缓存还是相当不错的,一定程度上缓解了数据库的IO操作,具体不多说,具体网上查找资料. 实战 不多说,直接上代码. 第一步:所需要的依赖 <!-- redis --> & ...

  8. mysql 挑选列导入

    insert into boleht_development.`htprojects`(id,pname,`general`,imgsrc,whatwedo,howwedo,bp) select ci ...

  9. 关于struts2.x中(警告: Could not find property [struts.valueStack])的解决方法

    出现“警告: Could not find property [struts.valueStack]”这样的问题,是由于少引用了log4j.jar包,不过,不引用也不影响使用.看个人的爱好了.

  10. Setup Apache2 in Debian 9 and enable two ports for two sites

    root@debian:~# apt-get install apache2 root@debian:~# cd /etc/apache2/ root@debian:/etc/apache2# ls ...