跨nat网段的ceph rbd块存储单一端口访问方法和系统
技术领域
1.本发明涉及计算机通信技术领域,具体为一种跨nat网段的ceph rbd块存储单一端口访问方法、系统和存储介质。
背景技术:
2.多终端分布各地,通过公网访问服务器内部端口,需要服务器所在的局域网做nat端口映射。服务端ceph的多个osd进程占用多个端口号,若没有统一的端口访问,需要多个公网映射端口,映射规则复杂,且造成端口的滥用。
技术实现要素:
3.本发明的目的在于提供一种跨nat网段的ceph rbd块存储单一端口访问方法和系统,以解决上述背景技术中提出的问题。
4.为实现上述目的,本发明提供如下技术方案:
5.一种跨nat网段的ceph rbd块存储单一端口访问方法,包括:
6.根据命令请求通过互联网访问内部局域网;
7.互联网与内部局域网的网络地址转换,匹配后接入ceph服务;
8.通过一个端口与多个osd进程端口号映射访问vdisk。
9.优选的,所述互联网通过nat与内部局域网完成网络地址转换。
10.优选的,所述ceph服务存在多个osd进程。
11.优选的,一个端口与多个osd进程端口号以及局域网利用rbdproxy协议通信,而一个端口与多个osd进程端口号建立映射关系包括步骤如下:
12.创建rbdproxy连接;
13.关闭rbdproxy连接;
14.创建rbd;
15.打开rbd;
16.获取rbd信息;
17.读取rbd;
18.强制写入硬盘。
19.为实现上述目的,本发明还提供如下技术方案:
20.一种跨nat网段的ceph rbd块存储单一端口访问系统,包括:
21.客户端,用于根据命令请求通过互联网访问内部局域网;
22.nat模块,用于互联网与内部局域网的网络地址转换,匹配后接入ceph服务;以及
23.rbd代理模块,用于通过一个端口与多个osd进程端口号映射访问vdisk。
24.为实现上述目的,本发明还提供如下技术方案:
25.一种计算机设备,包括存储器和处理器,所述存储器存储有计算机程序,其特征在于,所述处理器执行所述计算机程序时实现如上述中任一项所述方法的步骤。
26.为实现上述目的,本发明还提供如下技术方案:
27.一种计算机可读存储介质,其上存储有计算机程序,所述计算机程序被处理器执行时实现如上述中任一项所述的方法的步骤。
28.与现有技术相比,本发明的有益效果是:
29.本发明,利用rbd代理,实现跨nat网段的ceph rbd块存储单一端口访问。实现跨nat网段的ceph rbd块存储单一端口只需要配置rbd代理,从而减少公网端口的滥用,避免资源浪费,降低访问存储的应用软件设计与实现的复杂度,减少存储读写的故障率。
附图说明
30.图1为本发明的方法框图;
31.图2为本发明的案整体架构图;
32.图3为本发明的装置框图;
33.图4为本发明的计算机设备的内部结构图;
34.图5为本发明的rbd代理具体结构图。
具体实施方式
35.下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
36.实施例:
37.请参阅图1至图5,本发明提供一种技术方案:
38.一种跨nat网段的ceph rbd块存储单一端口访问方法,包括:
39.s101、根据命令请求通过互联网访问内部局域网;
40.s102、互联网与内部局域网的网络地址转换,匹配后接入ceph服务;
41.s103、通过一个端口与多个osd进程端口号映射访问vdisk。
42.具体的,所述互联网通过nat与内部局域网完成网络地址转换。
43.具体的,所述ceph服务存在多个osd进程。
44.本发明,一种跨nat网段的ceph rbd块存储单一端口访问系统,包括:
45.客户端,用于根据命令请求通过互联网访问内部局域网;
46.nat模块,用于互联网与内部局域网的网络地址转换,匹配后接入ceph服务;以及
47.rbd代理模块,用于通过一个端口与多个osd进程端口号映射访问vdisk。
48.本发明,一种计算机设备,包括存储器和处理器,所述存储器存储有计算机程序,所述处理器执行所述计算机程序时实现如上述中任一项所述方法的步骤。
49.本发明,一种计算机可读存储介质,其上存储有计算机程序,所述计算机程序被处理器执行时实现如上述中任一项所述的方法的步骤。
50.本发明基于ceph的rbd代理技术实现跨nat网段的ceph rbd块存储单一端口访问,部署完成后即可对各个osd端口进行单一的端口映射访问,节省公网端口资源,降低访问存储的应用软件设计与实现的复杂度,减少存储读写的故障率。
51.rbd代理技术:
52.由于ceph可存在多个osd进程,且每个osd进程占用的端口号不一样,各地的终端只能经过内网端口映射至公网端口来访问某一个osd进程端口号,多个osd进程,则需要访问多个端口;使用rbd代理技术,客户端可以通过访问单一的rbd端口号,由rbd代理与相应的osd进程端口通信完成服务。
53.多终端分布各地,通过公网访问服务器内部端口,需要服务器所在的局域网做nat端口映射。服务端ceph的多个osd进程占用多个端口号,若没有统一的端口访问,需要多个公网映射端口,映射规则复杂,且造成端口的滥用。
54.本发明基于ceph的rbd代理技术实现跨nat网段的ceph rbd块存储单一端口访问,部署完成后即可对各个osd端口进行单一的端口映射访问,节省公网端口资源,降低访问存储的应用软件设计与实现的复杂度,减少存储读写的故障率。
55.一、各模块详细说明如下:
56.1、vdisk
57.虚拟机磁盘。
58.2、osd
59.数据存储设备,服务端ceph服务一般存在多个osd进程,而且每个osd进程占用系统的一个端口号,多个进程则占用多个。
60.3、rbd代理
61.系统的多个端口被osd进程占用,通过互联网访问这些端口,需要映射多个端口。使用rbd代理,只需映射一个端口,与各个osd的端口通信工作由rbd代理完成即可。
62.4、nat(网络地址转换)
63.内部局域网端口映射至公网端口,分部各地的客户端可访问服务端的服务。
64.5、客户端
65.为客户提供本地服务的程序,需要与服务端互相配合运行。
66.6、服务端
67.为客户端服务的,服务的内容诸如向客户端提供资源,保存客户端数据。
68.二、在本发明,rbd代理具体结构如图5所示,
69.包括rbdproxy sdk和rbdproxy协议用于通信:
70.1、rbdproxy sdk
71.rbdproxy sdk是在ceph官方提供的rbd sdk的基础上,为方便对外单端口访问而研发出的新的sdk;
72.rbdproxy sdk文件定义多个访问rbd以及操作rbd的接口,具体如下:
73.int rbdproxy_connect(const char*host,unsigned short port,rbdproxy_ioctx_t*ioctx);//创建rbdproxy连接
74.int rbdproxy_shutdown(rbdproxy_ioctx_t ioctx);//关闭rbdproxy连接
75.int rbdproxy_rbd_create(rbdproxy_ioctx_t ioctx,const char*pool,const char*image,unsigned long int size);//创建rbd
76.int rbdproxy_rbd_open(rbdproxy_ioctx_t ioctx,const char*pool,const char*image);//打开rbd
77.int rbdproxy_rbd_close(rbdproxy_ioctx_t ioctx);//关闭rbd
78.int rbdproxy_rbd_info(rbdproxy_ioctx_t ioctx,rbdproxy_image_info_t*info);//获取rbd信息
79.int rbdproxy_rbd_trucate(rbdproxy_ioctx_t ioctx,unsigned long int offset);//
80.int rodproxy_rbd_aio_read(rbdproxy_ioctx_t icctx,unsigned long int offset,unsigned long int size,char*buf,rbdproxy_completion_t c);//读取rbd
81.int rbdproxy_rbd_aio_write(rbdproxy_ioctx_t ioctx,unsigned long int offset,unsigned long int size,const char*buf,rbdproxy_completion_t c);//写入rbd
82.int rbdproxy_rbd_aio_flush(rbdproxy_ioctx_t ioctx,rbdproxy_completion_tc);//强制写入硬盘
83.int rbdproxy_rhd_aio_discard(rbdproxy_ioctx_t ioctx,unsigned long int offset,unsigned long int size,rbdproxy_completion_t c);//
84.int rbdproxy_rbd_invalidate_cache(rbdproxy_ioctx_t ioctx);//。
85.2、rbdproxy协议
86.rbdproxy协议是一种pdu协议,为实现rbdproxy通信,自主研发的协议;
87.rbdproxy pdu协议构造了多个与rbdproxy sdk相对应的结构体,具体如下:
88.定义pdu协议的基本类型
89.typedef enum_proxypdutype{
90.rbd_create=1,
91.rbd_open,
92.rbd_close,
93.rbd_info,
94.rbd_trucate,
95.rbd_aio_read,
96.rbd_aio_write,
97.rbd_aio_flush,
98.rbd_aio_discard,
99.rbd_invalidate_cache,
100.//response pdu
101.rbd_resp_ec,
102.rbd_resp_data
103.}proxypdutype;
104.具体实现的基本步骤如下:
105.(1)创建rbd代理连接:调用rbdproxy sdk中的函数rbdproxy_connect(),指定主机和单一端口,创建rbdproxy连接;
106.(2)创建rbd连接:调用rbdproxy sdk中的函数rbdproxy_rbd_create(),传入pool_name、image_name,结合rbdproxy pdu协议,指定pool_name_size、image_name_size,
创建rbd连接;
107.rbdproxy pdu协议该模块的具体结构体定义如下:
108.typedef struct_proxyrbdcreatepduheader{
109.proxypduheader header;
110.unsigned int pool_name_size;
111.unsigned int image_name_size;
112.char padding[4];
[0113]
unsigned long int size;
[0114]
proxyrbdcreatepduheader;
[0115]
typedef struct_proxyrbdcreatepdu{
[0116]
proxyrbdcreatepduheader header;
[0117]
unsigned long int payload_tail_index;
[0118]
char*payload;
[0119]
}proxyrbdcreatepdu;
[0120]
(3)打开rbd连接:调用rbdproxy sdk中的函数rbdproxy_rbd_open(),传入pool_name、image_name,结合rbdproxy pdu协议,指定pool_name_size、image_name_size,打开rbd连接;
[0121]
rbdproxy pdu协议该模块的具体结构体定义如下:
[0122]
typedef struct_proxyrbdopenpduheader{
[0123]
proxypduheader header;
[0124]
unsigned int pool_name_size;
[0125]
unsigned int image_name_size;
[0126]
}proxyrbdopenpduheader;
[0127]
typedef struct_proxyrbdopenpdu{
[0128]
proxyrbdopenpduheader header;
[0129]
unsigned long int payload_tail_index;
[0130]
char*payload;
[0131]
}proxyrbdopenpdu;
[0132]
(4)读取rbd数据:调用rbdproxy sdk中的函数rbdproxy_rbd_aio_read(),结合rbdproxy pdu协议的结构体proxyrbdaioreadpdu,完成rbd的数据异步读取;
[0133]
rbdproxy pdu协议该模块的具体结构体定义如下:
[0134]
typedef struct_proxyrbdaioreadpduheader{
[0135]
proxypduheader header;
[0136]
char padding[4];
[0137]
aioreqid req_id;
[0138]
unsigned long int offset;
[0139]
unsigned long int size;
[0140]
}proxyrbdaioreadpduheader;
[0141]
typedef struct_proxyrbdaioreadpdu{
[0142]
proxyrbdaioreadpduheader header;
[0143]
}proxyrbdaioreadpdu;
[0144]
(5)写入rbd数据:调用rbdproxy sdk中的函数rbdproxy_rbd_aio_write,结合rbdproxy pdu协议的结构体proxyrbdaiowritepdu,完成rbd的数据异步写入;
[0145]
rbdproxy pdu协议该模块的具体结构体定义如下:
[0146]
typedef struct_proxyrbdaiowritepduheader{
[0147]
proxypduheader header;
[0148]
char padding[4];
[0149]
aioreqid req_id;
[0150]
unsigned long int offset;
[0151]
unsigned long int size;
[0152]
}proxyrbdaiowritepduheader;
[0153]
typedef struct_proxyrbdaiowritepdu{
[0154]
proxyrbdaiowritepduheader header;
[0155]
unsigned long int payload_tail_index;
[0156]
char*payload;
[0157]
}proxyrbdaiowritepdu;
[0158]
(6)关闭rbd连接:调用rbdproxy sdk中的函数rbdproxy_rbd_close(),,结合rbdproxy pdu协议的结构体proxyrbdclosepdu,关闭rbd连接;
[0159]
rbdproxy pdu协议该模块的具体结构体定义如下:
[0160]
typedef struct_proxyrbdclosepdu{
[0161]
proxypduheader header;
[0162]
}proxyrbdclosepdu;
[0163]
typedef struct_proxyrbdinfopdu{
[0164]
proxypduheader header;
[0165]
}proxyrbdinfopdu;
[0166]
(7)关闭rbd代理连接:调用rbdproxy sdk中的函数rbdproxy_shutdown(),关闭rbdproxy连接。
[0167]
本发明,利用rbd代理,实现跨nat网段的ceph rbd块存储单一端口访问。实现跨nat网段的ceph rbd块存储单一端口只需要配置rbd代理,从而减少公网端口的滥用,避免资源浪费,降低访问存储的应用软件设计与实现的复杂度,减少存储读写的故障率。
[0168]
本发明,其余未叙述部分均可与现有技术相同、或为公知技术或可采用现有技术加以实现,此处不再详述。
[0169]
尽管已经示出和描述了本发明的实施例,对于本领域的普通技术人员而言,可以理解在不脱离本发明的原理和精神的情况下可以对这些实施例进行多种变化、修改、替换和变型,本发明的范围由所附权利要求及其等同物限定。
技术特征:
1.一种跨nat网段的ceph rbd块存储单一端口访问方法,其特征在于,包括:根据命令请求通过互联网访问内部局域网;互联网与内部局域网的网络地址转换,匹配后接入ceph服务;通过一个端口与多个osd进程端口号映射访问vdisk。2.根据权利要求1所述的一种跨nat网段的ceph rbd块存储单一端口访问方法,其特征在于,所述互联网通过nat与内部局域网完成网络地址转换。3.根据权利要求1所述的一种跨nat网段的ceph rbd块存储单一端口访问方法,其特征在于,所述ceph服务存在多个osd进程。4.一种跨nat网段的ceph rbd块存储单一端口访问系统,其特征在于,包括:客户端,用于根据命令请求通过互联网访问内部局域网;nat模块,用于互联网与内部局域网的网络地址转换,匹配后接入ceph服务;以及rbd代理模块,用于通过一个端口与多个osd进程端口号映射访问vdisk。5.一种计算机设备,包括存储器和处理器,所述存储器存储有计算机程序,其特征在于,所述处理器执行所述计算机程序时实现如权利要求1至3中任一项所述方法的步骤。6.一种计算机可读存储介质,其上存储有计算机程序,其特征在于,所述计算机程序被处理器执行时实现如权利要求1至3中任一项所述的方法的步骤。
技术总结
本发明提供一种跨NAT网段的ceph rbd块存储单一端口访问方法和系统,包括一种跨NAT网段的ceph rbd块存储单一端口访问方法,包括:根据命令请求通过互联网访问内部局域网;互联网与内部局域网的网络地址转换,匹配后接入ceph服务;通过一个端口与多个osd进程端口号映射访问vdisk。本发明,利用rbd代理,实现跨NAT网段的ceph rbd块存储单一端口访问。实现跨NAT网段的ceph rbd块存储单一端口只需要配置rbd代理,从而减少公网端口的滥用,避免资源浪费,降低访问存储的应用软件设计与实现的复杂度,减少存储读写的故障率。减少存储读写的故障率。减少存储读写的故障率。
技术研发人员:卫平青 李宣 徐昕 史日辉 李春成
受保护的技术使用者:上海金途信息科技有限公司
技术研发日:2021.11.04
技术公布日:2022/5/25
转载请注明原文地址:https://tc.8miu.com/read-8323.html