本文主要是介绍ceph java_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.5-1.el7.x86_64.rpm librados2-devel-0.94.5-1.el7.x86_64.rpm -y
yum 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-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配置如下:
4.0.0
com.ceph.test
cephDemo
0.0.1-SNAPSHOT
cephDemo
com.ceph
rados
0.4.0-SNAPSHOT
二、应用程序调用ceph原理
下图提供了初始连接的高级流程。
以下是java对ceph中image的基本操作示例:
packagecom.ceph.rbd;importjava.io.File;importjava.util.Arrays;importjava.util.List;importcom.ceph.rados.IoCTX;importcom.ceph.rados.Rados;importcom.ceph.rados.exceptions.RadosException;importcom.ceph.rbd.jna.RbdImageInfo;importcom.ceph.rbd.jna.RbdSnapInfo;public classRbdDao {private staticRados rados;private staticIoCTX ioctx;private staticRbd rbd;/*** 连接上ceph环境*/
public static voidconnectCeph(){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= newRbd(ioctx);
System.out.println("successs connetc");
}catch(Exception e) {
e.printStackTrace();//TODO: handle exception
}
}/*** 返回所有的image,并展示其详细信息
*@return
*/
public static ListimageList(){
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();
}returnimageList;
}/*** 显示image的详细信息
*@paramimageName*/
public static voidshowDetailOfImage(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
*@paramimageName 名称
*@paramimageSize 大小*/
public static void createRbd_format1(String imageName, longimageSize){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直接访问克隆品
*@paramimageName 名称
*@paramimageSize 大小*/
public static void createRbd_format2(String imageName, longimageSize){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倍
*@paramimageName*/
public static voidresizeImage(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());
}
}/*** 创建映像的快照
*@paramimageName 映像名称
*@paramsnapName 快照名称*/
public static voidcreateSnap(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
*@paramparentImageName 快照对应的image名称
*@paramsnapName 快照的名称
*@paramnewImageName 生成的新的image的名称*/
public static voidcopySnapToNewImage(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,否则会删除失败。
*@paramimageName
*@paramsnapName*/
public static voiddeleteSnap(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
*@paramr
*@paramio
*@paramimageName
*@throwsRadosException
*@throwsRbdException*/
public static voidcleanupImage(Rados r, IoCTX io, String imageName) {try{if (r != null) {if (io != null) {
Rbd rbd= newRbd(ioctx);
RbdImage image=rbd.open(imageName);
rbd.close(image);
rbd.remove(imageName);
}
}
}catch(Exception e) {//TODO: handle exception
}
}public static voidmain(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();
}
}
这篇关于ceph java_java操作ceph之rbd基本操作的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!