客户端通过librados远程连接ceph集群

1.背景介绍

 ceph集群作为存储服务器,自然需要有客户端连接服务器,把客户端的数据上传到服务器。
 如果你选择用S3 API进行存储,那么客户端就是S3browser,与服务器连接的配置里,endpoint的格式是host:port,填好access_key和secret_key,下面选SSL,就可以连接服务器了。
 S3 API是基于HTTP协议的,它的底层是librados,有时我们需要用底层的librados进行开发或者实验,或者需要速度更快地存储,这时就需要librados远程连接ceph集群。

 写这篇博客的目的是帮助大家在用librados和rados.jar时候,遇到问题能根据报错对着这篇博客找到原因,我当时没少踩坑,由于记录的比较早,第三章可能不太连贯,有问题可以评论区讨论。

2.测试代码

代码流程是:

  • 通过Rados库里的ceph.conf或者confSe()方法连接集群
  • 创建IO上下午IoCTX io
  • 通过io的write()方法把一对key:value存储进去,IoCTX类的的各种方法参加源码,比较好懂
import com.ceph.rados.IoCTX;
import com.ceph.rados.Rados;
import com.ceph.rados.exceptions.RadosException;
import java.io.File;

public class CephClient {
    public static void main (String args[]){

        try {
            //创建集群句柄
            Rados cluster = new Rados("admin");
            System.out.println("Created cluster handle.");
            //读取配置文件
            File f = new File("/etc/ceph/ceph.conf");
            cluster.confReadFile(f);
             //上面两行等于下面两行,读ceph.conf实质就是获取mon_host和key
           // rados.confSet("mon_host", "172.16.60.41");
           // rados.confSet("key", "AQCdP9pYGI4jBBAAc96J8/OconCkVKWPBNU2vg==");
            System.out.println("Read the configuration file.");
            //连接集群
            cluster.connect();
            System.out.println("Connected to the cluster.");

            //创建上下文
            IoCTX io = cluster.ioCtxCreate("test");
            //存一个字符串对象
            String oidone = "kyle-say";
            String contentone = "Hello World!";
            io.write(oidone, contentone);
            //存一个字符串对象
            String oidtwo = "my-object";
            String contenttwo = "This is my object.";
            io.write(oidtwo, contenttwo);
            //打印之前存进去的对象名字
            String[] objects = io.listObjects();
            for (String object: objects)
                System.out.println("Put " + object);
          /* io.remove(oidone);
             io.remove(oidtwo); */
            cluster.ioCtxDestroy(io);
        } catch (RadosException e) {
            System.out.println(e.getMessage() + ": " + e.getReturnValue());
        }
    }
}

3.客户端远程连接ceph实验过程

  • 我测试的系统是windows,centos7.8 everything最大安装和Ubuntu16.04。
  • 要远程连接ceph需要下载安装librados(实际上就是客户端)
  • 要用librados的功能需要用rados.jar写代码,rados.jar由GitHub下载源码编译得到
  • rados.jar依赖jna.jar

rados-0.7.0.jar下载地址

3.1装了librados没装jna

我用centos7.8 everything.iso装的系统,不得不说最大安装里面包含的包确实多,它包含了librados2,所以不用我们再安装了。
在这里插入图片描述
 我是直接写了一个test.java文件,没用IDE和maven,所以用Javac编译成.class来运行,编译报错如下,这是需要把rados.jar建立软链接。
在这里插入图片描述

sudo cp target/rados-0.7.0.jar /usr/share/java/rados-0.7.0.jar
#后面根据你自己的jdk目录写
sudo ln -s /usr/share/java/rados-0.7.0.jar  /usr/lib/jvm/default-java/jre/lib/ext/rados-0.7.0.jar

 链接完rados.jar后可以编译代码,但是报关于jna的错
在这里插入图片描述
 同样我链接了jna.jar,报了一些关于so文件的错,实际上jna的作用是调用动态链接库,即so文件。
在这里插入图片描述

3.2安装jna和装librados

 经过上面的实验我发现的必须有rados.jar,但是光对jna.jar做软链接是不够的,于是我选择了下载jna
 sudo yum install jna -y
 安装完jna后发现可以进入代码里了,报错读不到这个配置文件,这是因为我目录里确实没这个
在这里插入图片描述
 创建ceph.conf,来自集群的ceph.conf,和ceph.client.admin.keyring

[global]
fsid = b1ebff5c-c07f-4c7a-a3b5-a4549bda272b
mon_initial_members = ceph1
mon_host = 192.168.244.110
auth_cluster_required = cephx
auth_service_required = cephx
auth_client_required = cephx
public network = 192.168.244.0/24
key = AQCyu/FeESKXIRAAwKwWeycKkQiSNQLr9hH1ug==

 然后就能链接ceph了

3.3 链接了jna.jar,rados.jar,没装jna和librados

 这次在Ubuntu16.04上,链接了这两个jar,但是没安装jna和librados(ubuntu16.04不自带),还是不行,调用不了rados,所以还是要安装jna
在这里插入图片描述

3.4、手动装jna

 下好rpm包,centos7.8直接就装了,不需要什么依赖
在这里插入图片描述

 Ubuntu用 sudo apt install libjna-java装jna版本是4.2.2
在这里插入图片描述

 但是现在网上下不到4.2.2,我下了4.5.2,安装报错缺依赖
在这里插入图片描述

 下载了依赖,安装两个包,没问题
在这里插入图片描述

现在运行代码报错和在Windows里一模一样,因为底层没有linrados支持
在这里插入图片描述

3.5、手动安装librados

 网上下载了librados2_14.2.4-0ubuntu0.19.10.2_amd64,安装报错缺依赖
在这里插入图片描述

 安装低版本的librados2_12.2.11+dfsg1-2.1+b1_amd64.deb,缺的依赖和上面稍不同,版本要求低
在这里插入图片描述

 还有版本号是10 的,和centos自带的一样,但是也需要依赖,依赖又套依赖,手动装问题比较大,依赖太多了。
 最终我放弃了在Ubuntu手动安装librados,直接用apt-get安装了,然后就没用问题了,Ubuntu也能往我的集群存文件。

4.总结

librados只有Linux才有,Windows没有,GitHub上曾经有人魔改过Windows版的,但是那个项目很老了,我也没跑成功。
所以如果想用Windows作为ceph客户端,那你得用S3。
在Linux上需要安装librados,开发的话需要rados.jar和安装jna,而且在你代码里调用的jna.jar的版本必须和你yum/apt-get install jna的一致,否则有时报错。

参考博客:
https://editor.csdn.net/md/?articleId=108932113
https://editor.csdn.net/md/?articleId=108932476
https://www.cnblogs.com/boshen-hzb/p/6679030.html
https://blog.csdn.net/xuleisdjn/article/details/79420530

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值