博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
java操作ceph之rbd基本操作
阅读量:5073 次
发布时间:2019-06-12

本文共 9159 字,大约阅读时间需要 30 分钟。

一、安装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.5-1.el7.x86_64.rpm librados2-devel-0.94.5-1.el7.x86_64.rpm -yyum install librbd1-0.94.5-1.el7.x86_64.rpm librbd1-devel-0.94.5-1.el7.x86_64.rpm -y

 

 2)克隆rados-java工程:

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

 3)构建rados-java工程:

cd rados-java-mastermvn 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配置如下:

4.0.0
com.ceph.test
cephDemo
0.0.1-SNAPSHOT
cephDemo
com.ceph
rados
0.4.0-SNAPSHOT

 

二、应用程序调用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
imageList(){ List
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
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(); }}

 

转载于:https://www.cnblogs.com/boshen-hzb/p/6679030.html

你可能感兴趣的文章
动态规划
查看>>
poj 2524
查看>>
使用webgl(three.js)创建3D机房(升级版)-普通机房
查看>>
Lucene HelloWorld实现
查看>>
linux查找keyword在php出现的次数
查看>>
程序猿必须知道FTP命令
查看>>
使用Lucene对预处理后的文档进行创建索引(可执行)
查看>>
【笔记】jquery hover的用法
查看>>
JavaScript escape encodeURI
查看>>
使用javascript模拟常见数据结构(一)
查看>>
hdu 5514 容斥原理
查看>>
golang 报错信息及解决方法--采坑之路,学习使我快乐
查看>>
go for-range中的循环变量
查看>>
键值的转换
查看>>
Android环境开发搭建
查看>>
POJ 1664 放苹果
查看>>
用户交互程序
查看>>
github pages & 在线预览
查看>>
Jenkins+Jmeter持续集成笔记(五:问题优化)
查看>>
摘录:Jetty 的工作原理以及与 Tomcat 的比较
查看>>