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 ...
随机推荐
- Linux编译前提前丰富库资源
Linux在软件编译的时候,时常提示一些依赖,无谓浪费时间.我们可以事先将常用的依赖包,一起安装一下,防止后续编译过程被打断. 之前,有个很重要的前提,就是epel源的安装. # ls /etc/yu ...
- asterisk配置SIP服务器
服务器asterisk我们安装完以后,需要在windows(就是自己的本机)上在安装一个客户端xlite,直接下载安装就行,安装完以后,我们就需要自己手动配置一下sip服务器了. 下面给大家讲一下怎么 ...
- python 之 functools模块
functools模块用于高阶函数:作用于或返回其他函数的函数.一般而言,任何可调用对象都可以作为本模块用途的函数来处理. 官方文档已经有了详尽的介绍,这里就不在复述,详情请见:官方文档 .这里主要介 ...
- FreeRADIUS 、DaloRADIUS 搭建记录
一. 安装环境 系统环境:centos6.5 IP:192.168.30.242 hostname:vpn.org 软件:PPTP.LAMP均已安装.(请确保这些正常安装,并能使用). 二. 软件 ...
- django之上传图片
上传图片 当Django在处理文件上传的时候,文件数据被保存在request.FILES FILES中的每个键为<input type="file" name="& ...
- thinkphp5的程序部署到虚拟主机的配置
thinkphp5的程序部署到虚拟主机的配置 建议不要,因为这些目录文件会全部保留,那么没办法的时候咋整 1 htdocs 虚拟主机上的 把public/index.php修改 改动后的放到 ht ...
- github上的版本发布
当前的版本号 发布版本 比如 git tag -a v1. 把这个版本发布到线上 git push --tags
- Matplotlib 库 : 绘图和可视化
一.Matplotlib基础知识 1.1Matplotlib中的基本图表包括的元素 x轴和y轴 axis水平和垂直的轴线 x轴和y轴刻度 tick刻度标示坐标轴的分隔,包括最小刻度和最大刻度 x轴和y ...
- leetcode575
public class Solution { public int DistributeCandies(int[] candies) { var dic = new Dictionary<in ...
- rtmp一些状态信息详解-as连接FMS服务器报错状态汇总~~
原地址:http://help.adobe.com/zh_CN/AIR/1.5/jslr/flash/events/NetStatusEvent.html 下表说明了 code 和 level 属性可 ...