java操作ceph之rbd基本操作
一、安装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基本操作的更多相关文章
- java操作elasticsearch实现基本的增删改查操作
一.在进行java操作elasticsearch之前,请确认好集群的名称及对应的ES节点ip和端口 1.查看ES的集群名称 #进入elasticsearch.yml配置文件/opt/elasticse ...
- java操作redis学习(一):安装及连接
文章参考自:http://www.cnblogs.com/edisonfeng/p/3571870.html,在此基础上进行了修改. 一.下载安装Redis redis官网显示暂时不支持Windows ...
- java操作Excel、PDF文件
java操作Excel.PDF文件 分享者:Vashon 分享来源:CSDN博客 下面这些是在开发中用到的一些东西,有的代码贴的不是完整的,只是贴出了关于操作EXCEL的代码: jxl是一个*国人写的 ...
- ceph中rbd的增量备份和恢复
ceph中rbd的增量备份和恢复 ceph的文档地址:Ceph Documentation 在调研OpenStack中虚机的备份和恢复时,发现OpenStack和ceph紧密结合,使用ceph做O ...
- 006 管理Ceph的RBD块设备
一, Ceph RBD的特性 支持完整和增量的快照 自动精简配置 写时复制克隆 动态调整大小 二.RBD基本应用 2.1 创建RBD池 [root@ceph2 ceph]# ceph osd pool ...
- ceph的rbd备份软件ceph-backup
teralytics是一家国外的大数据公司,这个是他们开源的ceph的备份的工具,在twitter上搜索相关信息的时候看到,觉得不错就拿来试用一番 这是个什么软件 一个用来备份 ceph 的 rbd ...
- 如何统计Ceph的RBD真实使用容量
前言 ceph的rbd一直有个问题就是无法清楚的知道这个分配的空间里面到底使用了多少,这个在Jewel里面提供了一个新的接口去查询,对于老版本来说可能同样有这个需求,本篇将详细介绍如何解决这个问题 查 ...
- ceph查询rbd的使用容量(快速)
ceph在Infernalis加入了一个功能是查询rbd的块设备的使用的大小,默认是可以查询的,但是无法快速查询,那么我们来看看这个功能是怎么开启的 ceph版本 root@lab8107:~/cep ...
- Kubernetes官方java客户端之六:OpenAPI基本操作
欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...
随机推荐
- SQL判断NULL的几种常见方式
第一种 where XX ='NULL' ,XX字段存的值就是NULL这四个字符, 第二种 where XX is null ,XX字段什么也没存,这是数据库的判断语法, 第三种 where isnu ...
- oozie工作流相关入门整理
Oozie支持工作流,其定义通过将多个Hadoop Job的定义按照一定的顺序组织起来,然后作为一个整体按照既定的路径运行.一个工作流已经定义了,通过启动该工作流Job,就会执行该工作流中包含 ...
- web页面取用户控件页面中服务器控件的值
用户控件页面后台: public string P_Name { get { return txt_P_name.Value; } set { txt_P_name.Value = value; } ...
- OD 实验(二十) - 对反调试程序的逆向分析(一)
程序: Keyfile.dat 里的内容 该文件中要至少有 9 个 ReverseMe.A: 运行程序 用 OD 打开该程序,运行 弹出的是错误的对话框 该程序发现 OD 对它的调试,所以该程序对 O ...
- Julia - 算术基本函数
符号函数和绝对值函数 abs(x) 函数求 x 的绝对值(幅值) julia> abs(3) 3 julia> abs(-3) 3 abs2(x) 函数求 x 的绝对值(幅值)的平方 ju ...
- java面向对象基础复习
对java基础的一个复习总结吧. 1.继承:通过使用关键字extends,子类可以继承父类所有的方法和属性,但是无法使用 private(私有) 的方法和属性,一次只能继承一个父类. 2.重写:重写( ...
- leetcode503
public class Solution { public int[] NextGreaterElements(int[] nums) { int n = nums.Length; int[] ne ...
- CentOS设置服务开机自动启动【转】
CentOS设置服务开机自动启动[转]Posted on 2012-06-28 16:00 eastson 阅读(4999) 评论(0) 编辑 收藏 CentOS安装好apache.mysql等服务器 ...
- Scrum由来
历史故事 在越南战争期间(1955年-1975年),对于美国战机飞行员而言,要执行100次飞行任务,飞到敌国领空被击落的概率是50%. 1967年,萨瑟兰还是一个没有经验的年轻飞行员,当时却是做最危险 ...
- zt <Windows Image Acquisition (WIA)> from msdn
Windows Image Acquisition (WIA) Windows Image Acquisition (WIA) is the still image acquisition pla ...