Centos strema 9 环境部署Glusterfs9

本文档只是创建复制卷,分布式卷,分布式复制卷,纠删卷

操作系统

内核

角色

Ip地址

说明

CentOS Stream 9 x86_64

5.14.0-427.el9.x86_64

客户端 client

192.168.80.119

挂载存储业务机器

CentOS Stream 9 x86_64

5.14.0-427.el9.x86_64

客户端 client

192.168.80.93

brick端(manager/node)

CentOS Stream 9 x86_64

5.14.0-427.el9.x86_64

存储节点

192.168.80.183

brick端(manager/node)

CentOS Stream 9 x86_64

5.14.0-427.el9.x86_64

存储节点

192.168.80.158

brick端(manager/node)

CentOS Stream 9 x86_64

5.14.0-427.el9.x86_64

存储节点

192.168.80.159

brick端(manager/node)

CentOS Stream 9 x86_64

5.14.0-427.el9.x86_64

存储节点

192.168.80.160

brick端(manager/node)

环境准备

存储节点全部创建新的目录

mkdir -pv  /gfs/vdb1/gv0

将新的虚拟机磁盘(20G)全部划分为一个区,如果磁盘较大的话,也是分为一个区,给它20G的大小,保证挂载磁盘内存的一致性。

mkfs.ext4 /dev/vdb1

磁盘挂载完成之后需要查看磁盘的uuid,能够确保永久挂载。

blkid

如图,可以看到分区的uuid

在/etc/fstab文件中添加一行

UUID=9e4c220f-4825-4896-9eb4-573f8f045d49  /gfs/vdb1/gv0  ext4    defaults   0 0

UUID                                                                      挂载的目录  磁盘的文件系统

修改主机名称

hostnamectl set-hostname --static gfs-client119

hostnamectl set-hostname --static gfs-client93

hostnamectl set-hostname --static gfs-node183

hostnamectl set-hostname --static gfs-node158

hostnamectl set-hostname --static gfs-node159

hostnamectl set-hostname --static gfs-node160

修改hosts文件

cat >>/etc/hosts<<ldp

192.168.80.93  clant-93

192.168.80.119 clant-119

192.168.80.158 gfs-node158

192.168.80.159 gfs-node159

192.168.80.160 gfs-node160

192.168.80.183 gfs-node183

ldp

所有服务器配置时间

yum -y install chrony

cat /etc/chrony.conf

pool ntp1.aliyun.com iburst

pool ntp2.aliyun.com iburst

sourcedir /run/chrony-dhcp

driftfile /var/lib/chrony/drift

makestep 1.0 3

rtcsync

keyfile /etc/chrony.keys

ntsdumpdir /var/lib/chrony

leapsectz right/UTC

logdir /var/log/chrony

所有服务器下载源

[root@gfs-manager183 gv0]# yum list 'centos-release-gluster*'

Repository centos-gluster9 is listed more than once in the configuration

上次元数据过期检查:0:04:10 前,执行于 2024年03月06日 星期三 14时32分03秒。

已安装的软件包

centos-release-gluster9.noarch                     1.0-2.el9s                    @extras-common

可安装的软件包

centos-release-gluster10.noarch                    1.0-2.el9s                    extras-common

centos-release-gluster11.noarch                    1.0-1.el9s                    extras-common

下载源

yum -y install centos-release-gluster9.noarch

集群节点安装glusterfs-server9

yum clean all

yum makecache

所有节点安装

yum -y install centos-release-gluster9.noarch

183 158 159 160主机安装

yum -y install  glusterfs-server

删除

yum remove glusterfs-server

设置开启自启和启动

systemctl enable glusterd

systemctl start glusterd

出现的问题

启动失败

删除/var/lib/glusterd/里面的所有文件

再次启动

systemctl start glusterd

将node节点加入集群

在任意一台机器上输入

gluster peer probe gfs-node158

gluster peer probe gfs-node159

gluster peer probe gfs-node160 

gluster peer probe gfs-node183

这里使用ip,主机名,主机名别名都可以

出现的错误

这里提示的错误,可以查看当前主机的的hosts文件,里面的ip地址对应的别名或者主机名称是否和当前输入的gluster peer probe gfs-manager183  里面的 gfs-manager183是否一致。如果不一致,则修改。

查看集群节点状态

gluster peer status

这里只显示本机以外的节点信息

然后在所有存储上都可以使用该命令来验证检查

158主机

159主机

160主机

183主机

可以看到所有的集群节点都可以看到其他节点的信息。

查看所有节点的信息

在这里为了较少篇幅,不显示所有节点的显示的信息

gluster pool list

158主机

删除节点(按需删除)

gluster peer detach 节点名称

设置GlusterFS卷

在所有服务器上执行以下命令创建一个GlusterFS卷:

mkdir -pv /data/brick1/gv0

创建卷显示错误

如图所示

[root@gfs-node158 ~]# gluster volume create gfsfbs  gfs-node158:/dev/vdb1  gfs-node159:/dev/sdb1 force

volume create: gfsfbs: failed: The provided path /dev/vdb1 which is already present, is not a directory

这里就是,本人使用的是gluster volume create gfsfbs  gfs-node158:/dev/vdb1  gfs-node159:/dev/sdb1 force该命令,直接指向的主机的磁盘分区名称,但是在此之前本人将该分区进行了挂载,导致此情况的发生。

解决:将该分区和挂载的目录umount(取消挂载)

创建分布式卷

没有对文件进行分块处理;

通过扩展文件属性保存 HASH值;

支持的底层文件系统有 ext3 、ext4 、ZFS 、XFS等

特点:

文件分布在不同的服务器,不具备冗余性;

更容易和廉价地扩展卷的大小;

单点故障会造成数据丢失;

依赖底层的数据保护。

然后在任意一台服务器 上执行创建卷命令:

 gluster volume create gfsfbs  gfs-node158:/gfs/vdb1/gv0 gfs-node159:/gfs/vdb1/gv0

出现

volume create: gfsfbs: failed: The brick gfs-node158:/gfs/vdb1/gv0 is a mount point. Please create a sub-directory under the mount point and use that as the brick directory. Or use 'force' at the end of the command if you want to override this behavior.

这个错误提示表示:创建卷失败,因为brick gfs-node158:/gfs/vdb1/gv0是一个挂载点。请在挂载点下创建一个子目录,并将其用作brick目录。或者,如果您想覆盖此行为,请在命令末尾使用'force'。

我们输入强制:

gluster volume create gfsfbs  gfs-node158:/gfs/vdb1/gv0  gfs-node159:/gfs/vdb1/gv0 force

显示创建成功

启动

gluster volume start gfsfbs

gfsfbs为创建卷的名称

查看状态

gluster volume info  gfsfbs

使用客户端进行挂载

mount.glusterfs gfs-node158:/gfs/vdb1/gv0 /data/gv0

显示挂载失败

出现的错误就是,挂载的是该主机的目录,但是本次我们是创建的分布式卷,所以需要输入分布式卷名称,而不是单独的主机名和目录名称

mount -t glusterfs gfs-node158:gfsfbs /data/gv0

如果显示

这个错误提示是因为在创建 GlusterFS 卷时,brick 被创建在了系统的根分区。建议不要使用系统的根分区作为存储后端。如果你想覆盖这个行为,可以在命令末尾添加 'force'。

93主机上创建10个文件

for i in `seq 10`; do dd if=/dev/zero of=$i.txt bs=1M count=10;done

158主机显示

159主机显示

创建复制卷

gluster volume create gv0 replica 3 \

   gfs-node160:/gfs/vdb1/gv0/

   gfs-node183:/gfs/vdb1/gv0/

创建详细过程

[root@gfs-node160 ~]# gluster volume create gv0 replica 2 \

gfs-node160:/gfs/vdb1/gv0/ \

gfs-node183:/gfs/vdb1/gv0/

Replica 2 volumes are prone to split-brain. Use Arbiter or Replica 3 to avoid this. See: http://docs.gluster.org/en/latest/Administrator%20Guide/Split%20brain%20and%20ways%20to%20deal%20with%20it/.

Do you still want to continue?

 (y/n) y

volume create: gv0: failed: The brick gfs-node160:/gfs/vdb1/gv0 is a mount point. Please create a sub-directory under the mount point and use that as the brick directory. Or use 'force' at the end of the command if you want to override this behavior.

[root@gfs-node160 ~]# echo $?

1

[root@gfs-node160 ~]# gluster volume create gv0 replica 2    gfs-node160:/gfs/vdb1/gv0/    gfs-node183:/gfs/vdb1/gv0/ force

volume create: gv0: success: please start the volume to access data

gluster volume create rep-volume replica 2 transport tcp server1:/dir1 server2:/dir2

gluster volume create gv0 replica 2    gfs-node160:/gfs/vdb1/gv0/    gfs-node183:/gfs/vdb1/gv0/ force

查看卷状态

gluster volume info gv0

[root@gfs-node160 ~]# gluster volume info gv0

Volume Name: gv0

Type: Replicate

Volume ID: 203fe180-91f6-44f1-afb7-b5a6d8bcfa11

Status: Created

Snapshot Count: 0

Number of Bricks: 1 x 2 = 2

Transport-type: tcp

Bricks:

Brick1: gfs-node160:/gfs/vdb1/gv0

Brick2: gfs-node183:/gfs/vdb1/gv0

Options Reconfigured:

cluster.granular-entry-heal: on

storage.fips-mode-rchecksum: on

transport.address-family: inet

nfs.disable: on

performance.client-io-threads: off

启动

[root@gfs-node160 ~]# gluster volume start gv0

volume start: gv0: success

再次查看状态

[root@gfs-node160 ~]# gluster volume info  gv0

Volume Name: gv0

Type: Replicate

Volume ID: 203fe180-91f6-44f1-afb7-b5a6d8bcfa11

Status: Started

Snapshot Count: 0

Number of Bricks: 1 x 2 = 2

Transport-type: tcp

Bricks:

Brick1: gfs-node160:/gfs/vdb1/gv0

Brick2: gfs-node183:/gfs/vdb1/gv0

Options Reconfigured:

cluster.granular-entry-heal: on

storage.fips-mode-rchecksum: on

transport.address-family: inet

nfs.disable: on

performance.client-io-threads: off

查看创建的卷

gluster volume  list

出现的问题

mount 挂载失败

提示信息如下

[root@gfs-node93 ~]# mount -t glusterfs gv0:/gfs/vdb1/gv0  /data/gv0

Mounting glusterfs on /data/gv0 failed.

[root@gfs-node93 ~]# mount -t glusterfs gfs-node160:/gfs/vdb1/gv0  /data/gv0

Mounting glusterfs on /data/gv0 failed.

排查思路

排查思路:首先查看gfs服务端日志详细信息,日志默认在/var/log/glusterfs下面。查看glusterd.log日志详细信息

[2024-03-11 01:56:30.028377 +0000] I [MSGID: 106496] [glusterd-handshake.c:968:__server_getspec] 0-management: Received mount request for volume /gfs

[2024-03-11 01:56:30.028462 +0000] E [MSGID: 106048] [glusterd-handshake.c:475:build_volfile_path] 0-management: Failed to get volinfo []

[2024-03-11 01:56:30.028490 +0000] E [MSGID: 106128] [glusterd-handshake.c:1101:__server_getspec] 0-management: Failed to find peer info []

[2024-03-11 01:56:30.028497 +0000] E [MSGID: 106176] [glusterd-handshake.c:1137:__server_getspec] 0-management: Failed to mount the volume

[2024-03-11 02:04:26.355896 +0000] I [MSGID: 106496] [glusterd-handshake.c:968:__server_getspec] 0-management: Received mount request for volume gv0                                

查看日志之后发现服务端没有找到gv0,第二次是找不到卷。之后想了以下gfs-node160:/gfs/vdb1/gv0  gfs-node160主机和183主机创建的是gv0的卷

之后输入以下的命令

mount  -t  glusterfs gfs-node160:gv0   /data/gv0

命令说明:

-t  glusterfs :指定挂载的文件系统类型

gfs-node160:gv0:指定挂载的主机的node节点和卷名称,二者使用冒号分隔

/data/gv0:指定本机的挂载目录

测试

在客户端创建完成20个100MB的文件,创建完成之后。客户端发起同步数据,到两个node节点,到同步完成之后,基本达到了实时传输数据的效果。

结合以下的三个

磁盘IO

网络IO

硬件上的软件工作

创建分布式复制卷

命令

gluster volume create dis-rep replica 4  transport tcp  gfs-node183:/gfs/vdb1/gv0 \

gfs-node158:/gfs/vdb1/gv0 \

gfs-node159:/gfs/vdb1/gv0 \

gfs-node160:/gfs/vdb1/gv0  force

出现的问题

[root@gfs-node158 ~]# gluster volume create dis-rep replica 4  transport tcp  gfs-node183:/gfs/vdb1/gv0 \

gfs-node158:/gfs/vdb1/gv0 \

gfs-node159:/gfs/vdb1/gv0 \

gfs-node160:/gfs/vdb1/gv0

volume create: dis-rep: failed: The brick gfs-node158:/gfs/vdb1/gv0 is a mount point. Please create a sub-directory under the mount point and use that as the brick directory. Or use 'force' at the end of the command if you want to override this behavior.

创建卷失败:dis-rep错误:brick gfs-node158:/gfs/vdb1/gv0 是一个挂载点。请在挂载点下创建一个子目录,并将其用作brick目录。或者,如果你想覆盖这种行为,可以在命令末尾使用 'force'。

查看状态

启动卷组

gluster volume start dis-rep

查看卷组的状态信息

[root@gfs-node158 ~]# gluster volume info

Volume Name: dis-rep

Type: Replicate

Volume ID: 5c75db30-e5a2-4b7f-9364-afc5e036307c

Status: Started

Snapshot Count: 0

Number of Bricks: 1 x 4 = 4

Transport-type: tcp

Bricks:

Brick1: gfs-node183:/gfs/vdb1/gv0

Brick2: gfs-node158:/gfs/vdb1/gv0

Brick3: gfs-node159:/gfs/vdb1/gv0

Brick4: gfs-node160:/gfs/vdb1/gv0

Options Reconfigured:

cluster.granular-entry-heal: on

storage.fips-mode-rchecksum: on

transport.address-family: inet

nfs.disable: on

performance.client-io-threads: off

客户端进行挂载

mount -t glusterfs gfs-node159:dis-rep /mnt

基本性能测试

for i in `seq 300`; do dd if=/dev/zero of=$i-$RANDOM.txt bs=1M count=100;done

创建纠删卷

创建命令

gluster volume create disperse-volume disperse 4 transport tcp \

gfs-node158:/gfs/vdb1/gv0 \

gfs-node159:/gfs/vdb1/gv0 \

gfs-node160:/gfs/vdb1/gv0 \

gfs-node183:/gfs/vdb1/gv0

disperse-volume为卷名称

出现问题

[root@gfs-node158 gv0]# gluster volume create disperse-volume disperse 4 transport tcp gfs-node158:/gfs/vdb1/gv0 gfs-node159:/gfs/vdb1/gv0 gfs-node160:/gfs/vdb1/gv0 gfs-node183:/gfs/vdb1/gv0

There isn't an optimal redundancy value for this configuration. Do you want to create the volume with redundancy 1 ? (y/n) y

volume create: disperse-volume: failed: The brick gfs-node158:/gfs/vdb1/gv0 is a mount point. Please create a sub-directory under the mount point and use that as the brick directory. Or use 'force' at the end of the command if you want to override this behavior.

创建卷失败:分散卷错误:brick gfs-node158:/gfs/vdb1/gv0 是一个挂载点。请在挂载点下创建一个子目录,并将其用作brick目录。或者,如果你想覆盖这种行为,可以在命令末尾使用 'force'。

修改创建命令

gluster volume create disperse-volume disperse 4 transport tcp \

gfs-node158:/gfs/vdb1/gv0 \

gfs-node159:/gfs/vdb1/gv0 \

gfs-node160:/gfs/vdb1/gv0 \

gfs-node183:/gfs/vdb1/gv0  force

查看状态

启动disperse-volume卷

[root@gfs-node158 gv0]# gluster volume start disperse-volume

volume start: disperse-volume: success

查看状态

[root@gfs-node158 gv0]# gluster volume info

Volume Name: disperse-volume

Type: Disperse

Volume ID: 404b9906-21cf-4d2c-aa99-f8bb8b24b4c4

Status: Started

Snapshot Count: 0

Number of Bricks: 1 x (3 + 1) = 4

Transport-type: tcp

Bricks:

Brick1: gfs-node158:/gfs/vdb1/gv0

Brick2: gfs-node159:/gfs/vdb1/gv0

Brick3: gfs-node160:/gfs/vdb1/gv0

Brick4: gfs-node183:/gfs/vdb1/gv0

Options Reconfigured:

storage.fips-mode-rchecksum: on

transport.address-family: inet

nfs.disable: on

在客户端进行挂载

mount -t glusterfs gfs-node159:disperse-volume /mnt

删除文件之后,df -h 查看磁盘占用未释放

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/467226.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Fiddler不仅可以抓包,还可以做接口测试喔

前言 Fiddler最大的优势在于抓包&#xff0c;我们大部分使用的功能也在抓包的功能上&#xff0c;Fiddler做接口测试也是非常方便的。对应没有接口测试文档的时候&#xff0c;可以直接抓完包后&#xff0c;copy请求参数&#xff0c;修改下就可以了。 Composer简介 点开右侧Co…

【推荐系统】NCF神经协同过滤

NCF框架 NCF框架是本文要实现的3个模型的主体结构。 首先是输入层&#xff0c;分别包含两个特征向量 v u v_u vu​和 v i v_i vi​&#xff0c;描述了用户u和物品i。输入仅由一个用户向量和一个物品向量构成&#xff0c;它们分别是以one-hot编码的二值化稀疏向量。 接着是Em…

章节2:单词本该这样记

为什么我们记不住单词&#xff1f; 单词不是被胡编乱造出来的&#xff0c;单词是有规律的&#xff0c;单词是符合人类的逻辑的。 单词实际意思结构意义历史文化 我们要怎么记单词&#xff1f; 掌握单词的结构规律了解与单词有关的历史文化灵活巧计&#xff0c;不要太拘泥于…

MySQL的insert-on-duplicate语句详解

一、insert-on-duplicate语句语法 注意&#xff1a;ON DUPLICATE KEY UPDATE只是 MySQL的特有语法&#xff0c;并不是SQL标准语法&#xff01; INSERT INTO … ON DUPLICATE KEY UPDATE 是 MySQL 中一种用于插入数据并处理重复键冲突的语法。 这个语法适用于在 insert的时候…

MindGraph:文字生成知识图

欢迎来到MindGraph&#xff0c;这是一个概念验证、开源的、以API为先的基于图形的项目&#xff0c;旨在通过自然语言的交互&#xff08;输入和输出&#xff09;来构建和定制CRM解决方案。该原型旨在便于集成和扩展。以下是关于X的公告&#xff0c;提供更多背景信息。开始之前&a…

iOS报错-Command PhaseScriptExecution failed with a nonzero exit code

问题&#xff1a;iOS debug没问题&#xff0c;一打包就报错&#xff1a; Command PhaseScriptExecution failed with a nonzero exit code 解决方法如下&#xff1a; 在项目的Pods目录下&#xff0c;找到Targets Support Files->Pods-xxxx-frameworks.sh 如下&#xff1a…

C语言数组—二维数组

二维数组的创建 //数组创建 int arr[3][4]; //三行四列&#xff0c;存放整型变量 double arr[2][4];二维数组的初始化 我们如果这样初始化&#xff0c;效果是什么样的呢 int arr[3][4] { 1,2,3,4,5,6,7,8,9,10,11,12 };那如果我们不写满十二个呢 int arr[3][4] { 1,2,3,4…

数据可信流通:从运维信任到技术信任

1.数据可信流通概念 "数据可信流通"通常指的是确保数据在不同系统、应用程序或者组织之间的传输和交换过程中的可信性、完整性和安全性。在数据流通的过程中&#xff0c;确保数据的真实性、完整性和保密性是非常重要的&#xff0c;尤其是涉及到敏感信息或者重要数据…

Day21:实现退出功能、开发账号设置、检查登录状态

实现退出功能 将登录凭证修改为失效状态。跳转至网站首页。 数据访问层 不用写了&#xff0c;已经有了updateStatus方法&#xff1b; 业务层 UserService public void logout(String ticket) {loginTicketMapper.updateStatus(ticket, 1);}Controller层 RequestMapping(p…

glib交叉编译

Glib交叉编译 逸一时&#xff0c;误一世。 —— 田所浩二「夏夜银梦」 交叉编译 GLib 涉及到在一个平台上生成能够在另一个平台上运行的目标文件。在这种情况下&#xff0c;我们将会在一台主机&#xff08;通常是开发机器&#xff09;上使用交叉编译工具链来构建 GLib 库&#…

Linux:git的基础操作

git的下载 版本控制系统一般分为两种&#xff0c;集中式版本控制系统&#xff0c;分布式版本控制系统 什么是集中式版本控制系统&#xff1a;版本库集中存放在中央服务器&#xff0c;工作时候使用自己的电脑&#xff0c;当工作时候在中央服务器上拉取最新版本的代码&#xff0c…

微服务:高并发带来的问题的容错方案

1.相关脚本&#xff08;陈天狼&#xff09; 启动nacos客户端&#xff1a; startup.cmd -m standalone 启动sentinel控制台&#xff1a; # 直接使⽤jar命令启动项⽬(控制台本身是⼀个SpringBoot项⽬) java -Dserver.port8080 -Dcsp.sentinel.dashboard.serverlocalhost:808…

【渗透测试实战】用渗透实例sqllibs第46关来讲解SQL报错注入的操作顺序

1、查出库名&#xff08;database()&#xff09; http://127.0.0.1/sqli7/Less-46/?sortupdatexml(1,if(12,1,concat(0x7e,database(),0x7e)),1) 2、通过库名&#xff0c;查表名&#xff08;table_name&#xff09; http://127.0.0.1/sqli7/Less-46/?sortupdatexml(1,if(12…

VMware虚拟机和主机之间无法复制粘贴,移动文件,重新安装vmware-tools变灰,VMware Tools继续运行脚本未能在虚拟机中成功运行。

起初&#xff0c;虚拟机只是无法和主机之间进行复制粘贴&#xff0c;移动文件。查询了很多资料,反反复复地安装卸载vmware-tools&#xff0c;但是都没有成功。通过这篇文章&#xff1a;虚拟机安装VMware Tools的两种方法_vmware tools有3种安装方式-CSDN博客 安装了vmware_too…

中国巨型地下中微子实验室准备探究宇宙奥秘

JUNO设施将于今年上线&#xff0c;将有助于确定哪种类型的中微子质量最高 - 这是物理学中最大的谜团之一。 中国江门地下中微子天文台&#xff08;JUNO&#xff09;的建设工作。朱诺号希望在2024年底之前探测到中微子。图片来源&#xff1a;Qiu Xinsheng/VCG via Getty 开平区…

JAVA八股day1

遇到的问题 相比于包装类型&#xff08;对象类型&#xff09;&#xff0c; 基本数据类型占用的空间往往非常小为什么说是几乎所有对象实例都存在于堆中呢&#xff1f;静态变量和成员变量、成员变量和局部变量的区别为什么浮点数运算的时候会有精度丢失的风险&#xff1f;如何解…

PHP姓名快速匿名化工具(重组脱敏)

PHP姓名重组工具(脱敏/匿名化工具) 将excel数据姓名列粘贴提交&#xff0c;得到随机姓随机中间字随机尾字的重组姓名 那些年自用瞎搞的代码&#xff0c;今日整理成网页交提交得到结果的交互功能分享。 <?php //PHP姓名重组工具(脱敏/匿名化工具) //将excel数据姓名列粘贴…

Linux TCP参数——tcp_adv_win_scale

文章目录 tcp_adv_win_scaleip-sysctl.txt解释buffering overhead内核缓存和应用缓存示例计算深入理解从2到1(tcp_adv_win_scale的值)总结 tcp_adv_win_scale adv-advise&#xff1b;win-window; 用于指示TCP中接收缓存比例的值。 static inline int tcp_win_from_space(int …

蓝桥杯-Python组(一)

1. 冒泡排序 算法步骤&#xff1a; 比较相邻元素&#xff0c;如果第一个大于第二个则交换从左往右遍历一遍&#xff0c;重复第一步&#xff0c;可以保证最大的元素在最后面重复上述操作&#xff0c;可以得到第二大、第三大、… n int(input()) a list(map(int, input()…

java实现kml文件下载接口

根据业务需求&#xff0c;需提供一个下载kml格式航线文件的HTTP GET接口 示例代码 RequestMapping(value "/getFlyingPathFile/{uavTypeId}/{flyingPathId}.kml", method RequestMethod.GET, produces "application/vnd.google-earth.kmlxml") Respons…