CephX 认证机制:

Ceph 使用 cephx 协议对客户端进行身份认证 cephx 用于对 ceph 保存的数据进行认证访问和授权,用于对访问 ceph 的请求进行认证和授 权检测,与 mon 通信的请求都要经过 ceph 认证通过,但是也可以在 mon 节点关闭 cephx 认证,但是关闭认证之后任何访问都将被允许,因此无法保证数据的安全性。

5.1:授权流程:

每个 mon 节点都可以对客户端进行身份认证并分发秘钥,因此多个 mon 节点就不存在单点 故障和认证性能瓶颈 mon 节点会返回用于身份认证的数据结构,其中包含获取 ceph 服务时用到的 session key, session key 通 过 客 户 端 秘 钥 进 行 加 密 , 秘 钥 是 在 客 户 端 提 前 配 置 好 的 , /etc/ceph/ceph.client.admin.keyring 客户端使用 session key 向 mon 请求所需要的服务,mon 向客户端提供一个 tiket,用于向 实际处理数据的 OSD 等服务验证客户端身份,MON 和 OSD 共享同一个 secret,因此 OSD 会信任所有 MON 发放的 tiket tiket 存在有效期。

注意: CephX 身份验证功能仅限制在 Ceph 的各组件之间,不能扩展到其他非 ceph 组件 Ceph 只负责认证授权,不能解决数据传输的加密问题。

5.2:ceph 用户:

用户是指个人(ceph 管理者)或系统参与者(MON/OSD/MDS)。
通过创建用户,可以控制用户或哪个参与者能够访问 ceph 存储集群、以及可访问的存储池 及存储池中的数据。
ceph 支持多种类型的用户,但可管理的用户都属于 client 类型 区分用户类型的原因在于,MON/OSD/MDS 等系统组件特使用 cephx 协议,但是它们为非客户端。 通过点号来分割用户类型和用户名,格式为 TYPE.ID,例如client.admin。

[root@ceph-node2 ~]# cat /etc/ceph/ceph.client.admin.keyring
[client.admin] key = AQAGDKJfQk/dAxAA3Y+9xoE/p8in6QjoHeXmeg== caps mds = "allow *" caps mgr = "allow *" caps mon = "allow *" caps osd = "allow *"
列出指定用户信息:
[root@ceph-01 ~]# ceph auth get osd.10
[osd.10]key = AQCTtpZf6R/kFhAAz9nBeQ+0KU7t1hKlaZboCg==caps mgr = "allow profile osd"caps mon = "allow profile osd"caps osd = "allow *"
exported keyring for osd.10
[root@ceph-01 ~]# ceph auth get client.admin
[client.admin]key = AQBXkmlfcQsnLhAARpCVF4cgDMi92+cAH2wz3A==caps mds = "allow *"caps mgr = "allow *"caps mon = "allow *"caps osd = "allow *"
exported keyring for client.admin

5.3:ceph 授权和使能:

ceph 基于使能/能力(Capabilities,简称 caps )来描述用户可针对 MON/OSD 或 MDS 使用的授 权范围或级别。
通用的语法格式:daemon-type ‘allow caps’ […]
能力一览表:

  • r:向用户授予读取权限。访问监视器(mon)以检索 CRUSH 运行图时需具有此能力。
  • w:向用户授予针对对象的写入权限。
  • x:授予用户调用类方法(包括读取和写入)的能力,以及在监视器中执行 auth 操作的能 力。
  • *:授予用户对特定守护进程/存储池的读取、写入和执行权限,以及执行管理命令的能力 。
  • class-read:授予用户调用类读取方法的能力,属于是 x 能力的子集。
  • class-write:授予用户调用类写入方法的能力,属于是 x 能力的子集。
  • profile osd:授予用户以某个 OSD 身份连接到其他 OSD 或监视器的权限。授予 OSD 权限, 使 OSD 能够处理复制检测信号流量和状态报告(获取 OSD 的状态信息)。
  • profile mds:授予用户以某个 MDS 身份连接到其他 MDS 或监视器的权限。
  • profile bootstrap-osd:授予用户引导 OSD 的权限(初始化 OSD 并将 OSD 加入 ceph 集群),授 权给部署工具,使其在引导 OSD 时有权添加密钥。
  • profile bootstrap-mds:授予用户引导元数据服务器的权限,授权部署工具权限,使其在引导 元数据服务器时有权添加密钥。
列出用户
[root@ceph-01 ~]# ceph auth list
mds.ceph-01key: AQAVomlfjA25OBAAVIR0ukw//Y5oDl2hF1udqg==caps: [mds] allowcaps: [mon] allow profile mdscaps: [osd] allow rwx
mds.ceph-02key: AQAXomlfzwqjDBAAcuPbTNOGV3Tg9TFMw4oQjg==caps: [mds] allowcaps: [mon] allow profile mdscaps: [osd] allow rwx
mds.ceph-03key: AQAYomlfNz4THBAA3PihKm4mT2DcrKNQH1+qWA==caps: [mds] allowcaps: [mon] allow profile mdscaps: [osd] allow rwx
osd.0key: AQB+l2lfAjnPDBAAL7k9+aZSucTwquzIISvESw==caps: [mgr] allow profile osdcaps: [mon] allow profile osdcaps: [osd] allow *
添加用户
[root@ceph-01 ~]# ceph auth add client.zhangsan mon 'allow r' osd 'allow rwx pool=kube'
added key for client.zhangsan
# 验证key
[root@ceph-01 ~]# ceph auth get client.zhangsan
[client.zhangsan]key = AQCeTShhFeVDChAA4LUTYm4oPRbdHtgb71982g==caps mon = "allow r"caps osd = "allow rwx pool=kube"
exported keyring for client.zhangsan

ceph auth get-or-create:
ceph auth get-or-create 此命令是创建用户较为常见的方式之一,它会返回包含用户名(在方 括号中)和密钥的密钥文,如果该用户已存在,此命令只以密钥文件格式返回用户名和密钥, 还可以使用 -o 指定文件名选项将输出保存到某个文件。

[root@ceph-01 ~]# ceph auth get-or-create client.lisi mon 'allow r' osd 'allow rwx pool=kube'
[client.lisi]key = AQBzTihhdITOLBAAjH8qwJ07mvZmCaNqI/LkrA==
# 验证用户
[root@ceph-01 ~]# ceph auth get client.lisi
[client.lisi]key = AQBzTihhdITOLBAAjH8qwJ07mvZmCaNqI/LkrA==caps mon = "allow r"caps osd = "allow rwx pool=kube"
exported keyring for client.lisi
# 再次创建lisi用户
[root@ceph-01 ~]# ceph auth get-or-create client.lisi mon 'allow r' osd 'allow rwx pool=kube'
[client.lisi]key = AQBzTihhdITOLBAAjH8qwJ07mvZmCaNqI/LkrA==
# 可以看到返回得key和之前一样
删除用户
[ceph@ceph-deploy ceph-cluster]$ ceph auth del client.tom
updated

5.4:秘钥环管理:

ceph 的秘钥环是一个保存了 secrets、keys、certificates 并且能够让客户端通认证访问 ceph 的 keyring file(集合文件),一个 keyring file 可以保存一个或者多个认证信息,每一个 key 都 有一个实体名称加权限,类型为:

 {client、mon、mds、osd}.name
导出用户认证信息至 keyring 文件

将用户信息导出至 keyring 文件,对用户信息进行备份。

#创建用户:
[ceph@ceph-deploy ceph-cluster]$ ceph auth get-or-create client.user1 mon 'allow r' osd 'allow * pool=mypool'
[client.user1] key = AQAUUchfjpMqGRAARV6h0ofdDEneuaRnxuHjoQ==
#验证用户
[ceph@ceph-deploy ceph-cluster]$ ceph auth get client.user1
exported keyring for client.user1
[client.user1] key = AQAUUchfjpMqGRAARV6h0ofdDEneuaRnxuHjoQ== caps mon = "allow r" caps osd = "allow * pool=mypool"
#创建 keyring 文件:
[ceph@ceph-deploy ceph-cluster]$ ceph-authtool --create-keyring ceph.client.user1.keyring #验证 keyring 文件:
[ceph@ceph-deploy ceph-cluster]$ cat ceph.client.user1.keyring #是个空文件
[ceph@ceph-deploy ceph-cluster]$ file ceph.client.user1.keyring
ceph.client.user1.keyring: empty
#导出 keyring 至指定文件
[ceph@ceph-deploy ceph-cluster]$ ceph auth get client.user1 -o ceph.client.user1.keyring exported keyring for client.user1
#验证指定用户的 keyring 文件:
[ceph@ceph-deploy ceph-cluster]$ cat ceph.client.user1.keyring [client.user1] key = AQAUUchfjpMqGRAARV6h0ofdDEneuaRnxuHjoQ== caps mon = "allow r" caps osd = "allow * pool=mypool"

在创建包含单个用户的密钥环时,通常建议使用 ceph 集群名称、用户类型和用户名及 keyring 来 命 名 , 并 将 其 保 存 在 /etc/ceph 目 录 中 。 例 如 为 client.user1 用 户 创 建 ceph.client.user1.keyring。

Ceph rbd的使用

Ceph支持一个非常好的特性,以COW(写时复制)的方式从RBD快照创建克隆,在Ceph中被称为快照分层。分层特性允许用户创建多个CEPH RBD克隆实例。这些特性应用于OpenStack等云平台中,使用快照形式保护ceph RBD 镜像,快照是只读的,但COW克隆是完全可以写 ,可以多次来孵化实例,对云平台来说是非常有用的。
Ceph RBD镜像有format-1 和 format-2两种类型,RBD支持这两种类型,但是分层特性COW克隆特性只支持format-2镜像,默认RBD创建的镜像是format-1。(这个在克隆的时候特别重要)

先看看自己的Linux内核支不支持rbd块设备

modprobe rbd

如果有错误信息说明内核不支持,那你就先去升级一下内核吧~
没有则继续!
在一个ceph集群中,我们可以创建rbd块设备来进行使用。先看一下我的pool

我们这里新建了一个oss的pool,以下的块设备都是建立在oss这个pool中。

1. 首先先创建一个块设备

通过rbd create (pool_name)/(rbd_name) --size xxxxxMB就可以创建一个块设备了,这里有两个知识点。
一个是斜杠 / 前面的是这个块设备建立在的pool的名字,后面是这个块设备的名字(自己定义的),我们在test这个pool上建立了一个叫myrbd1的块设备,如果没有斜杠 / 则默认建立在rbd这个pool上(重要!!!!)
还有一个是这个size的大小,这个大小可以超过你实际pool的大小,这个叫做瘦分配,也叫超卖和按需分配。创建块之后可以通过指令rbd resize test/myrbd1 --size 51200 --allow-shrink来动态的更改。如下

2. 映射改块设备到你的机器

rbd map oss/myrbd1

得到块设备的映射/dev/rbd0
这个时候你就可以像操作机器上的 块设备一样操作该设备了。

3. 挂载并且使用
[root@ceph-04 ~]# mkfs.xfs -f /dev/rbd0
meta-data=/dev/rbd0              isize=512    agcount=16, agsize=819200 blks=                       sectsz=512   attr=2, projid32bit=1=                       crc=1        finobt=0, sparse=0
data     =                       bsize=4096   blocks=13107200, imaxpct=25=                       sunit=1024   swidth=1024 blks
naming   =version 2              bsize=4096   ascii-ci=0 ftype=1
log      =internal log           bsize=4096   blocks=6400, version=2=                       sectsz=512   sunit=8 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0
[root@ceph-04 ~]# mount /dev/rbd0 /mnt/

如上,写入文件系统以后就可以挂载到目录上去啦!
然后我们 写点东西进去试试

[root@ceph-04 ~]# mount /dev/rbd0 /mnt/
[root@ceph-04 ~]# dd if=/dev/zero of=/mnt/file bs=100M count=5 oflag=direct
5+0 records in
5+0 records out
524288000 bytes (524 MB) copied, 6.25902 s, 83.8 MB/s
[root@ceph-04 ~]# rados df
POOL_NAME                    USED OBJECTS CLONES COPIES MISSING_ON_PRIMARY UNFOUND DEGRADED   RD_OPS      RD   WR_OPS      WR USED COMPR UNDER COMPR
.rgw.root                 768 KiB       4      0     12                  0       0        0      154 154 KiB        4   4 KiB        0 B         0 B
cephfs_data               4.5 GiB   12109      0  36327                  0       0        0    28634 1.1 GiB 31918026 248 GiB        0 B         0 B
cephfs_metadata           2.1 GiB    1146      0   3438                  0       0        0  2447920 2.4 GiB 19105085  74 GiB        0 B         0 B
default.rgw.buckets.data   33 MiB       3      0      9                  0       0        0        0     0 B       13  11 MiB        0 B         0 B
default.rgw.buckets.index   253 B       1      0      3                  0       0        0       10  10 KiB        4   2 KiB        0 B         0 B
default.rgw.control           0 B       8      0     24                  0       0        0        0     0 B        0     0 B        0 B         0 B
default.rgw.log               0 B     207      0    621                  0       0        0 57607891  55 GiB 38383594     0 B        0 B         0 B
default.rgw.meta          1.9 MiB      11      0     33                  0       0        0      398 375 KiB       27  14 KiB        0 B         0 B
kube                       48 GiB    4242      0  12726                  0       0        0  1131983  41 GiB  8717671 535 GiB        0 B         0 B
oss                       1.5 GiB     155      0    465                  0       0        0      431 1.7 MiB      384 528 MiB        0 B         0 B
tgtpool                    52 MiB      12      0     36                  0       0        0      496 460 KiB        0     0 B        0 B         0 B total_objects    17898
total_used       68 GiB
total_avail      472 GiB
total_space      540 GiB
4. 创建快照
[root@ceph-04 ~]# rbd snap create --snap mysnap oss/myrbd1
[root@ceph-04 ~]# rbd snap ls oss/myrbd1
SNAPID NAME   SIZE   PROTECTED TIMESTAMP                4 mysnap 50 GiB           Fri Aug 27 11:28:08 2021

如上创建了一个myrbd1的 快照,快照的名字叫做mysnap,接下来我们试试快照的回滚功能。

5. 回滚

上一步我们创建了一个500M的空文件

[root@ceph-04 ~]# ll -h /mnt/
total 500M
-rw-r--r-- 1 root root 500M Aug 27 11:25 file

我们先删除该文件然后卸载块, 然后进行回滚。

[root@ceph-04 ~]# rm -rf /mnt/file
[root@ceph-04 ~]# ls /mnt/
[root@ceph-04 ~]# umount /dev/rbd0
[root@ceph-04 ~]# rbd unmap oss/myrbd1
[root@ceph-01 ~]# rbd snap rollback oss/myrbd1@mysnap
Rolling back to snapshot: 100% complete...done.
[root@ceph-01 ~]# rbd map oss/myrbd1
/dev/rbd0
[root@ceph-01 ~]# mount /dev/rbd0 /mnt/
[root@ceph-01 ~]# ls -l /mnt/
total 512000
-rw-r--r-- 1 root root 524288000 Aug 27 11:25 file

重新挂载/dev/rbd0然后发现!!file这个文件又出来啦~~

6. 模板与克隆

先看看该块设备支不支持创建快照模板
image-format 必须为2

[root@ceph-01 ~]# ls -l /mnt/
total 512000
-rw-r--r-- 1 root root 524288000 Aug 27 11:25 file
[root@ceph-01 ~]# rbd info oss/myrbd1
rbd image 'myrbd1':size 50 GiB in 12800 objectsorder 22 (4 MiB objects)snapshot_count: 1id: 15ab2f2d8e796block_name_prefix: rbd_data.15ab2f2d8e796format: 2features: layering, exclusive-lockop_features: flags: create_timestamp: Fri Aug 27 11:16:13 2021access_timestamp: Fri Aug 27 11:16:13 2021modify_timestamp: Fri Aug 27 11:16:13 2021

创建改块设备也可以这样设置

rbd create oss/myrbd3 --size 102400 --image-format 2

把该块做成模板,首先要把做成模板的快照做成protect(重要!!!)

rbd snap protect oss/myrbd1@mysnap

(通过rbd snap unprotect test/myrbd1@mysnap可以去掉这个保护,但是这样的话就 不能克隆了)
然后可以利用这个快照来当模板来克隆了,我们克隆一个叫myrbd2的块 出来试试
先umount myrbd1这个块。

umount /dev/rbd0

然后克隆一个在oss的pool的myrbd2的块。

rbd clone oss/myrbd1@mysnap test/myrbd2
[root@ceph-01 ~]# rbd -p oss ls
myrbd1
myrbd2

如上看到test这个池上有两个块设备了,一个是原来的myrbd1,一个是通过myrbd的镜像模板克隆出来的myrbd2。
接下来我们看看这个myrbd2看看和myrbd1有什么不一样。
先映射myrbd2

rbd map test/myrbd2

因为 是克隆myrbd1的,myrbd1上本来就有文件系统,所以myrbd2上也有文件系统,直接挂载就好了

[root@ceph-01 ~]# mount /dev/rbd0 /mnt/
[root@ceph-01 ~]# ls -l /mnt/
total 512000
-rw-r--r-- 1 root root 524288000 Aug 27 11:25 file

看到了吗!!!!myrbd2的内容上也是和myrbd1是相同的!!!(因为是克隆来的嘛)
看一下myrbd2信息

[root@ceph-01 ~]# rbd info oss/myrbd2
rbd image 'myrbd2':size 50 GiB in 12800 objectsorder 22 (4 MiB objects)snapshot_count: 0id: 15b0cca9d4976block_name_prefix: rbd_data.15b0cca9d4976format: 2features: layering, exclusive-lockop_features: flags: create_timestamp: Fri Aug 27 14:37:14 2021access_timestamp: Fri Aug 27 14:37:14 2021modify_timestamp: Fri Aug 27 14:37:14 2021parent: oss/myrbd1@mysnapoverlap: 50 GiB

这个时候的myrbd2还是依赖myrbd1的镜像mysnap的,如果myrbd1的mysnap被删除或者怎么样,myrbd2也不能够使用了,要想独立出去,就必须将父镜像的信息合并flattern到子镜像中,

[root@ceph-01 ~]# rbd flatten oss/myrbd2
Image flatten: 100% complete...done.
[root@ceph-01 ~]# rbd info oss/myrbd2
rbd image 'myrbd2':size 50 GiB in 12800 objectsorder 22 (4 MiB objects)snapshot_count: 0id: 15b0cca9d4976block_name_prefix: rbd_data.15b0cca9d4976format: 2features: layering, exclusive-lockop_features: flags: create_timestamp: Fri Aug 27 14:37:14 2021access_timestamp: Fri Aug 27 14:37:14 2021modify_timestamp: Fri Aug 27 14:37:14 2021

这样myrbd2就独立于myrbd1了
可以通过如下方法删除镜像模板了

[root@ceph-01 ~]# rbd snap unprotect oss/myrbd1@mysnap
[root@ceph-01 ~]# rbd snap rm oss/myrbd1@mysnap
Removing snap: 100% complete...done.
[root@ceph-01 ~]# rbd snap ls oss/myrbd1

这个时候就已经删除镜像模板了。

查看rbd得一些命令:

1、查看指定pool下得rbd:
[root@ceph-node01 ~]# rbd -p kube ls
kubernetes-dynamic-pvc-72de50ef-dc4c-11ea-a0f0-d2a608bc0edb
2、查看rbd镜像得详细信息
[root@ceph-node01 ~]# rbd -p kube info kubernetes-dynamic-pvc-72de50ef-dc4c-11ea-a0f0-d2a608bc0edb
rbd image 'kubernetes-dynamic-pvc-72de50ef-dc4c-11ea-a0f0-d2a608bc0edb':size 5 GiB in 1280 objectsorder 22 (4 MiB objects)id: 20db66b8b4567block_name_prefix: rbd_data.20db66b8b4567format: 2features: layeringop_features: flags: create_timestamp: Wed Aug 12 11:30:19 2020
3、查看rbd得块信息,每个块默认4M。
rados -p pri-c-4aed5defe55044d8a7cf246a06e00004 ls |grep rbd_data.1b1d06b8b4567
4、查看每个块得信息:
rados -p pri-c-4aed5defe55044d8a7cf246a06e00004 stat rbd_data.3fa0f06b8b4567.000000000000016a
5、查看每个blok得map信息:
ceph osd map pri-c-4aed5defe55044d8a7cf246a06e00004 rbd_data.3fa0f06b8b4567.000000000000016a
6、过滤指定pool rbd blok开头信息,并查看每个blok得map信息:
for i in `rados -p  pri-c-4aed5defe55044d8a7cf246a06e00004 ls | grep rbd_data.1b1d06b8b4567`;do ceph osd map pri-c-4aed5defe55044d8a7cf246a06e00004 ${i}; done
7、查看指定pool下的每个块设备使用情况
rbd du --pool kube

Cephx认证及rbd的使用相关推荐

  1. 【云原生 | Kubernetes 系列】--Ceph认证和RBD

    1. Ceph 认证机制 ceph使用cephx协议对客户端进行身份认证. cephx用于对ceph保存的数据进行认证访问和授权,用于对访问ceph的请求进行认证和授权检查,与mon通信的请求都要经过 ...

  2. CephX 认证机制

    Ceph 使用 cephx 协议对客户端进行身份认证. cephx 用于对 ceph 保存的数据进行认证访问和授权,用于对访问 ceph 的请求进行认证和授 权检测,与 mon 通信的请求都要经过 c ...

  3. Ceph 认证授权和RBD块存储、对象存储使用(三)

    RBD块存储 RBD介绍 1.RBD是Ceph分布式集群中最常用的存储类型 2.块是一个有序字节,普通的一个块大小为512字节,基于块的存储是最常见的存储方式,比如常见的硬盘.软盘和CD光盘等,都是存 ...

  4. 2. Ceph的权限管理、RBD与Cephfs的挂载使用和MDS的高可用

    1. Ceph用户的权限管理及授权流程 Ceph使用Ceph X协议对客户端进行身份的认证. 客户端与Mon节点的通讯均需要通过Cephx认证,可在Mon节点关闭Cephx认证,关闭认证后将允许所有访 ...

  5. 使用ceph的块存储rbd

    CEPH 块设备 块是一个字节序列(例如,一个 512 字节的数据块).基于块的存储接口是最常见的存储数据方法,它们基于旋转介质,像硬盘. CD .软盘.甚至传统的 9 磁道磁带.无处不在的块设备接口 ...

  6. Ceph 的用户管理与认证

    目录 文章目录 目录 前言 Ceph 的用户管理 用户管理常规操作 CephX 认证系统 身份认证原理 使用 ceph-authtool 进行密钥环管理 注意事项 前言 常规的身份认证系统无非三点: ...

  7. Ceph rbd的寻址(rbd块文件的下载)

    1. Ceph rbd 与 rgw的寻址(rbd块/对象存储文件的下载) 1.1. 索引的存储 1.2. rbd 的寻址 1.3. 小笔记 1.4. rgw的寻址 1.5. 数据恢复思路 1.5.1. ...

  8. openstack整合ceph

    2019独角兽企业重金招聘Python工程师标准>>> 环境:ubuntu16.04.ceph:10.2.3.openstack:14.0.1 一.在ceph集群中创建池 ceph ...

  9. OpenStack 对接 Ceph 环境可以创建卷但不能挂载卷的问题

    问题 环境:Nova.Cinder.Glance 都对接了 Ceph RBD 后端存储. 以往的操作包括上传镜像.创建卷.挂载卷都是一切正常的,但突然出现了无法挂载卷的问题,而且还是因为 Ceph 客 ...

最新文章

  1. [WinAPI] API 4 [注册][创建][消息][第一个框架类窗口]
  2. Docker - 安装
  3. 用AWStats分析网站日志
  4. quartz-misfire 错失、补偿执行
  5. 11月8日下午Jquery取属性值(复选框、下拉列表、单选按钮)、做全选按钮、JSON存储、去空格...
  6. pjsua帮助手册(中文)
  7. 2009岁末之复用系统框架(B/S)
  8. 有望年前发布?魅族16s Pro Plus曝光:下半年旗舰担当
  9. sliverlight+WCF项目发布到IIS
  10. 微型计算机汇编用什么软件,EMU8086 汇编工具软件的使用
  11. 刷流量php网站源码,在线模拟刷网站PV流量源码
  12. excel数据处理技巧笔记
  13. 走进小作坊(八)----公益之痒
  14. CSS 样式定义方式
  15. 什么是嵌入式?嵌入式技术应用领域
  16. Axure 教程:Axure加载第三方脚本
  17. 【电商】订单信息与状态流转
  18. 关于“复活节Easter”知识,你了解多少?
  19. Win10无法拖动最大化窗口
  20. SAS导入csv文件乱码解决办法

热门文章

  1. Ubuntu 20.04 -中文输入法-fcitx-connection failed [ip:91.189.91.38 80]
  2. kafka是什么?主要用在什么场景
  3. 渗透测试实战3——bulldog2靶机入侵
  4. php 起源来由(搜集整理)
  5. EOS源码分析(5)账号
  6. GIS+=地理信息+行业+大数据——纽约公开11亿条出租车和Uber原始数据下载及分析
  7. ZZULIOJ1096-1100Python解法
  8. FCN全卷积网络模型——高分辨率遥感影像地物识别
  9. 如何解决因网络问题导致的 github 下载出错
  10. 消遣时间的小程序有哪些?这3个好玩又有趣的游戏小程序送给你!