一、安装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. 04——wepy框架搭建

    wepy官方文档:https://tencent.github.io/wepy/document.html#/ 1.项目下载 # .安装wepy-cli npm install wepy-cli -g ...

  2. 关于setTimeout的一个逻辑题

    function hh() { for (var i = 1; i <=5; i++) { setTimeout(function(){ console.log(i); },100) } con ...

  3. Python Tuples

    1. basic Tuples is a sequence of immutable object. It's a sequence, just like List. However, it cann ...

  4. Tkinter Menu(菜单)

      Tkinter Menu: 这个小工具的目标是,让我们来创建我们的应用程序,可以通过使用各种菜单.核心功能,提供的方式来创建三个菜单类型:弹出式,顶层,和下拉   这个小工具的目标是,让我们来创建 ...

  5. vector array and normal stanard array

    array 数组的长度固定 vector 自由存储区(栈),动态长度 普通标准数组相对较不安全,不方便; array,vector对象成员函数支持数组越界检测,同时代价是效率问题: array,普通标 ...

  6. html调用OCX

    <body> <p>hello</p> <p></p> <object id="iett" classid=&qu ...

  7. firefox 插件 取消认证签名

    Firebug Tab Mix plus :系统退出自动保存tab List.     tab mix options>Session>start/exit>when browse ...

  8. CentOS6上安装Flash Player

    Linux CentOS6服务器中的某个需要远程操作的项目需要使用到Adobe Flash Player组件,直接通过YUM方式安装不了,于是通过强大的搜索,还是可以解决到安装方法的,通过重新加载安装 ...

  9. 1.Hadoop集群搭建之Linux主机环境准备

    Hadoop集群搭建之Linux主机环境 创建虚拟机包含1个主节点master,2个从节点slave1,slave2 虚拟机网络连接模式为host-only(非虚拟机环境可跳过) 集群规划如下表: 主 ...

  10. C# 发送和接受Get请求

    1.发送Get请求 public static string HttpGet(string Url, string postDataStr) { HttpWebRequest request = (H ...