1. 使用Java-rados库往进存数据
1.1 准备工作
如果使用RGW下层的librados操作ceph,Java代码必须要用到rados.jar这个库,并且要安装jna,sudo yum install jna -y。
在Linux里,复制该JAR文件到公共目录 (例如 /usr/share/java) ,设置这两个 JAR 链接 JVM Class path,连接操作如下:
#安装rados-java,或者直接把编译好的rados.jar拷贝过来
sudo yum install jna
git clone --recursive https://github.com/ceph/rados-java.git
cd rados-java-master
mvn install -Dmaven.test.skip=true
#复制该JAR文件到公共目录 (例如 /usr/share/java) ,并且确认该文件和JNA JAR在你的JVM’s classpath目录中.
sudo cp target/rados-0.6.0.jar /usr/share/java/rados-0.6.0.jar
sudo ln -s /usr/share/java/jna.jar /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.242.b08-0.el7_7.x86_64/jre/lib/ext/jna.jar
sudo ln -s /usr/share/java/rados-0.6.0.jar /usr/lib/jvm/default-java/jre/lib/ext/rados-0.6.0.jar
-
rados.jar不太好下载,我从GitHub上下载了源码,用maven编译出了jar,直接用就行
-
maven依赖如下,jna的依赖要和通过yum安装的版本(3.5.2)一致,否则会报错
<dependency>
<groupId>net.java.dev.jna</groupId>
<artifactId>jna</artifactId>
<version>3.5.2</version>
</dependency>
<dependency>
<groupId>com.ceph</groupId>
<artifactId>rados</artifactId>
<version>0.7.0</version>
</dependency>
1.2 测试代码
代码功能是显示创建集群句柄,读取配置文件,连接集群,打印之前存进去的对象名。
运行:java -jar java-rados.jar cug.CephClient
新存的对象之一是kyle-say:Hello World!,输入命令限制kyle-say的value结果如图,可见存储成功。
查看刚才存进去的对象kyle-say的内容:sudo rados -p data get kyle-say -
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);
System.out.println("Read the configuration file.");
//连接集群
cluster.connect();
System.out.println("Connected to the cluster.");
//创建上下文
IoCTX io = cluster.ioCtxCreate("data");
//存一个字符串对象
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());
}
}
}
2.使用python-rados库往进存数据和操作ceph
2.1 把当前目录下的test.mp4存到data pool
import sys,rados,rbd
cluster = rados.Rados(conffile='/etc/ceph/ceph.conf')
cluster.connect()
ioctx = cluster.open_ioctx('data')
path = {flie-name}
file_name = path
f = open(path, "r")
file_content = f.read()
f.close()
ioctx.write_full(file_name, file_content)
object_iterator = ioctx.list_objects()
while True :
try :
rados_object = object_iterator.next()
print ("Object contents = " + rados_object.key)
except StopIteration :
break
ioctx.close()
cluster.shutdown()
2.2 列举当前pool,创建data2 pool
import rados
cluster = rados.Rados(conffile='/etc/ceph/ceph.conf')
cluster.connect()
pools = cluster.list_pools()
for pool in pools:
print pool
cluster.create_pool('data2')
print '=============='
pools = cluster.list_pools()
for pool in pools:
print pool
3. 使用python S3API存数据
代码里的access_key,secret_key是你创建rgw子用户时候生成的,
import boto
import boto.s3.connection
from boto.s3.key import Key
access_key = 'S2WEB1BIYXW35EX1YANG'
secret_key = 'bgp5OvRJ640LJ46x5m6UANoEMQ5WSyImou8AFJPv'
conn = boto.connect_s3(
aws_access_key_id = access_key,
aws_secret_access_key = secret_key,
host = 'ceph', port = 7480,
is_secure=False, calling_format = boto.s3.connection.OrdinaryCallingFormat(),
)
bucket = conn.get_bucket('lt1_bucket')
k = Key(bucket)
k.key = 'test_file'
filename = '004.jpg'
k.set_contents_from_filename(filename)