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
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