
- 登场作品
- 孤岛危机
- 定 义
- 外星生物
- 中文名
- Ceph
- 其它名称
- Charybdis
-
ceph
2020-02-08 16:19:15分布式文件系统 分布式文件系统(Distributed File System)是指文件系统管理的物理存储资源不一定直接连接在本地节点上,而是通过计算机网络与...Ceph是一个分布式文件系统 具有高扩展,高可用,高性能的特点 C...分布式文件系统
- 分布式文件系统(Distributed File System)是指文件系统管理的物理存储资源不一定直接连接在本地节点上,而是通过计算机网络与节点相连
- 分布式文件系统的设计基于客户机/服务器模式
常用的分布式文件系统
- Lustre
- Hadoop
- FastDFS
- Ceph
- GlusterFS
什么是Ceph
- Ceph是一个分布式文件系统
- 具有高扩展,高可用,高性能的特点
- Ceph可以提供对象存储,块存储,文件系统存储
- 块存储(iscsi)客户端多了一个磁盘,文件系统(NFS)客户端直接mount
- Ceph可以提供PB级别的存储空间(PB→TB→GB),1024G*1024G=1058576G
- 软件定义存储(Software Defined Storage)作为存储行业的一大发展趋势,已经越来越受到市场的认可
链接在此!
Ceph组件
- OSDs 存储设备
- Monitors 集群监控软件
- RadosGateway(RGW) 对象存储网关
- MDSs 存放文件系统的元数据(对象存储和 块存储不需要该组件)
- Client ceph客户端
实验准备
问题
准备四台KVM虚拟机,其三台作为存储集群节点, 一台安装为客户端,实现如下功能:- 创建1台客户端虚拟机
- 创建3台存储集群虚拟机
- 配置主机名、IP地址、YUM源
- 修改所有主机的主机名
- 配置无密码SSH连接
– 配置NTP时间同步 - 创建虚拟机磁盘
实验拓扑图
- 1台客户端虚拟机
- 3台存储集群虚拟机
所有主机的主机名及对应的IP地址如表-1所示。
注意:所有主机基本系统光盘的YUM源必须提前配置好。
步骤
1)物理机为所有节点配置yum源服务器。所有主机都要做!!!
提示:前提ceph.iso已经挂载好才可以进行下一步!![root@node1 ~]# vim /etc/yum.repos.d/ceph.repo [MON] name=mon baseurl=file:///media/MON gpgcheck=0 [OSD] name=osd baseurl=file:///media/OSD gpgcheck=0 [Tools] name=tools baseurl=file:///media/Tools gpgcheck=0 [root@node1 ~]# yum repolist 已加载插件:fastestmirror Loading mirror speeds from cached hostfile 源标识 源名称 状态 !MON mon 41 !OSD osd 28 !Tools tools 33 !centos centos 9,911 repolist: 10,013
- SSH免密登录,配置无密码连接(包括自己远程自己也不需要密码),在node1操作。
[root@node1 ~]# ssh-keygen #一路回车 [root@node1 ~]# for i in 10 11 12 13 > do > ssh-copy-id 192.168.4.$i > done ############################################################# 测试: [root@node1 ~]# ssh 192.168.4.10 Last login: Thu Feb 6 00:17:09 2020 from 192.168.4.1 [root@client ~]# exit 登出 Connection to 192.168.4.10 closed. [root@node1 ~]# ssh 192.168.4.12 Last login: Wed Feb 5 23:21:36 2020 from 192.168.4.1 [root@node2 ~]# exit 登出 Connection to 192.168.4.12 closed. [root@node1 ~]# ssh 192.168.4.13 Last login: Wed Feb 5 23:25:45 2020 from 192.168.4.1 [root@node3 ~]# exit 登出 Connection to 192.168.4.13 closed. [root@node1 ~]# ssh 192.168.4.11 Last login: Thu Feb 6 00:18:12 2020 from 192.168.4.1 [root@node1 ~]# exit 登出 Connection to 192.168.4.11 closed. 确保每台计算机远程都不需要密码
3)修改/etc/hosts并同步到所有主机。
警告:/etc/hosts解析的域名必须与本机主机名一致!!!![root@node1 ~]# vim /etc/hosts 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6 192.168.4.10 client 192.168.4.11 node1 192.168.4.12 node2 192.168.4.13 node3 [root@node1 ~]# for i in client node2 node3 > do > scp /etc/hosts $i:/etc > done ########################################################### 测试:此时,每台计算机的hosts解析中都有client,node1,node2,node3 [root@node2 ~]# cat /etc/hosts 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6 192.168.4.10 client 192.168.4.11 node1 192.168.4.12 node2 192.168.4.13 node3
4)配置NTP时间同步(client做时间服务器,所有node节点与client时间同步)
[root@client ~]# vim /etc/chrony.conf 26 allow 192.168.4.0/16 29 local stratum 10 [root@client ~]# systemctl restart chronyd [root@client ~]# firewall-cmd --set-default-zone=trusted success [root@client ~]# vim /etc/sysconfig/selinux 7 SELINUX=permissive [root@client ~]# setenforce 0 所有node节点与client同步时间 [root@node1 ~]# vim /etc/chrony.conf 3 server 192.168.4.10 iburst [root@node1 ~]# for i in node1 node2 node3 > do > scp /etc/chrony.conf $i:/etc > ssh $i "systemctl restart chronyd" > done chrony.conf 100% 991 1.1MB/s 00:00 chrony.conf 100% 991 1.1MB/s 00:00 chrony.conf 100% 991 962.8KB/s [root@node1 ~]# chronyc sources -V #快速测试时间同步,*表示已经同步 210 Number of sources = 1 MS Name/IP address Stratum Poll Reach LastRx Last sample =============================================================================== ^* client 10 10 377 609 -12us[ -18us] +/- 150us
5)打开VMware,给除了client的每台虚拟机添加两块磁盘(20G)
一路下一步,最后呈现的效果如下:
添加完后,重启虚拟机,使用lsblk查看是否添加成功部署ceph集群
问题
部署Ceph集群服务器,实现以下目标:- 安装部署工具ceph-deploy
- 创建ceph集群
- 准备日志磁盘分区
- 创建OSD存储空间
- 查看ceph状态,验证
步骤
- 步骤一:安装部署软件ceph-deploy
1)在node1安装部署工具,学习工具的语法格式。
[root@node1 ~]# yum -y install ceph-deploy #一定要在有ssh密钥的主机上安装 [root@node1 ~]# mkdir ceph-cluster #但凡执行ceph-cluster脚本,必须在该目录下,否则会出错 [root@node1 ~]# cd ceph-cluster
- 步骤二:部署Ceph集群
1)给所有节点安装ceph相关软件包。
[root@node1 ceph-cluster]# for i in node1 node2 node3 > do > ssh $i "yum -y install ceph-mon ceph-osd ceph-mds ceph-radosgw" > done
部署mon集群,一定要确保 在ceph-cluster目录下!!!
首先关闭所有节点的防火墙和selinux [root@node1 ceph-cluster]# firewall-cmd --set-default-zone=trusted success [root@node1 ceph-cluster]# vim /etc/sysconfig/selinux 7 SELINUX=permissive [root@node1 ceph-cluster]# setenforce 0 ############################################################ [root@node1 ceph-cluster]# pwd /root/ceph-cluster
2)创建Ceph集群配置,在ceph-cluster目录下生成Ceph配置文件。
在ceph.conf配置文件中定义monitor主机是谁。[root@node1 ceph-cluster]# ceph-deploy new node1 node2 node3 #测试所有node节点的状态,创建了ceph的配置文件ceph.conf(在当前目录下) [root@node1 ceph-cluster]# ls ceph.conf ceph-deploy-ceph.log ceph.mon.keyring ################################### [root@node1 ceph-cluster]# ls /etc/ceph/ rbdmap #/etc/ceph目录是启动ceph需要读取配置文件的地方
3)初始化所有节点的mon服务,也就是启动mon服务(主机名解析必须对)。
[root@node1 ceph-cluster]# ceph-deploy mon create-initial #把当前目录下的ceph配置文件远程拷贝到目标主机(node1 node2 node3)放到/etc/ceph目录,并且启动ceph-mon服务(服务名为ceph-mon@主机名) ############################################################# 查看状态: [root@node1 ceph-cluster]# systemctl status ceph-mon@node1 #确认mon服务是否已经启动 [root@node1 ceph-cluster]# ceph -s cluster 3b2ca6aa-8018-42c4-8bfe-05902cd313dd health HEALTH_ERR 64 pgs are stuck inactive for more than 300 seconds 64 pgs stuck inactive no osds monmap e2: 3 mons at {node1=192.168.4.11:6789/0,node2=192.168.4.12:6789/0,node3=192.168.4.13:6789/0} #6789为起完服务后monitior的端口号 election epoch 8, quorum 0,1,2 node1,node2,node3 osdmap e1: 0 osds: 0 up, 0 in flags sortbitwise pgmap v2: 64 pgs, 1 pools, 0 bytes data, 0 objects 0 kB used, 0 kB / 0 kB avail 64 creating
常见错误及解决方法(非必要操作,有错误可以参考):
如果提示如下错误信息:[node1][ERROR ] admin_socket: exception getting command descriptions: [Error 2] No such file or directory
解决方案如下(在node1操作):
先检查自己的命令是否是在ceph-cluster目录下执行的!!!!如果确认是在该目录下执行的create-initial命令,依然报错,可以使用如下方式修复。[root@node1 ceph-cluster]# vim ceph.conf #文件最后追加以下内容 public_network = 192.168.4.0/24
修改后重新推送配置文件:
[root@node1 ceph-cluster]# ceph-deploy --overwrite-conf config push node1 node2 node3
- 步骤三:创建OSD
每台虚拟机都添加了 两块磁盘(/dev/sdb、/dev/sdc)
sdb用来做缓存盘,sdc做数据盘
读写操作 缓存 数据
client<-------->ceph集群[sdb]<-------->[sdc] 硬盘分为传统磁盘和固态盘
传统磁盘:性能较低,容量大
固态盘(SSD):容量很小,性能很好 可以使用固态盘做缓存盘,磁盘做数据盘假设每个磁盘是20G,最终我们的ceph集群提供60G的容量(不考虑冗余备份)
node1 [sdb]+[sdc]=20G #sdb为缓存盘,只能临时读写数据,不能算作容量内
node2 [sdb]+[sdc]=20G
node3 [sdb]+[sdc]=20G1)把所有磁盘初始化(格式化,仅在node1操作)
[root@node1 ~]# lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sda 8:0 0 20G 0 disk ├─sda1 8:1 0 1G 0 part /boot └─sda2 8:2 0 19G 0 part ├─centos-root 253:0 0 17G 0 lvm / └─centos-swap 253:1 0 2G 0 lvm [SWAP] sdb 8:16 0 20G 0 disk sdc 8:32 0 20G 0 disk sr0 11:0 1 284M 0 rom /media sr1 11:1 1 8.8G 0 rom /mnt [root@node1 ~]# cd ceph-cluster/ [root@node1 ceph-cluster]# ceph-deploy disk zap node1:sdb node1:sdc #相当于远程加for循环,写几个参数就循环几次 [root@node1 ceph-cluster]# ceph-deploy disk zap node2:sdb node2:sdc [root@node1 ceph-cluster]# ceph-deploy disk zap node3:sdb node3:sdc ######################################################## 也可以直接一次性初始化 [root@node1 ceph-cluster]# ceph-deploy disk zap node1:sdb node1:sdc node2:sdb node2:sdc node3:sdb node3:sdc
2)启动OSD服务,共享这些磁盘
[root@node1 ceph-cluster]# ceph-deploy osd create node1:sdc:/dev/sdb //远程node1启动osd服务,把/dev/sdc共享给用户,/dev/sdb做为缓存盘 并且把sdc挂载到了/var/lib/ceph/xxx目录 [root@node1 ceph-cluster]# ceph-deploy osd create node2:sdc:/dev/sdb [root@node1 ceph-cluster]# ceph-deploy osd create node3:sdc:/dev/sdb ######################################################### 也可以一次性远程多台主机 [root@node1 ceph-cluster]# ceph-deploy osd create node1:sdc:/dev/sdb node2:sdc:/dev/sdb node3:sdc:/dev/sdb
- 常见错误及解决方法(非必须操作)。
使用osd create创建OSD存储空间时,如提示下面的错误提示:
[ceph_deploy][ERROR ] RuntimeError: bootstrap-osd keyring not found; run 'gatherkeys'
可以使用如下命令修复文件,重新配置ceph的密钥文件:
[root@node1 ceph-cluster]# ceph-deploy gatherkeys node1 node2 node3
3)验证测试,检查集群状态:
[root@node1 ceph-cluster]# ceph -s cluster 3b2ca6aa-8018-42c4-8bfe-05902cd313dd health HEALTH_OK monmap e2: 3 mons at {node1=192.168.4.11:6789/0,node2=192.168.4.12:6789/0,node3=192.168.4.13:6789/0} election epoch 14, quorum 0,1,2 node1,node2,node3 osdmap e14: 3 osds: 3 up, 3 in flags sortbitwise pgmap v28: 64 pgs, 1 pools, 0 bytes data, 0 objects 100 MB used, 61306 MB / 61406 MB avail 64 active+clean 此时可以看到,有三个osd,容量为60G,状态为OK
验证是否挂载成功
[root@node1 ceph-cluster]# df -h 文件系统 容量 已用 可用 已用% 挂载点 /dev/mapper/centos-root 17G 1.4G 16G 8% / devtmpfs 224M 0 224M 0% /dev tmpfs 236M 0 236M 0% /dev/shm tmpfs 236M 5.6M 230M 3% /run tmpfs 236M 0 236M 0% /sys/fs/cgroup /dev/sr0 284M 284M 0 100% /media /dev/sr1 8.8G 8.8G 0 100% /mnt /dev/sda1 1014M 142M 873M 14% /boot tmpfs 48M 0 48M 0% /run/user/0 /dev/sdc1 20G 34M 20G 1% /var/lib/ceph/osd/ceph-0 可以看到/dev/sdc已经挂载到ceph集群中了 [root@node1 ceph-cluster]# systemctl status ceph-osd@0.service #服务已经成功启动,OSD的服务名称ceph-osd@数字(可以在@后tab) ● ceph-osd@0.service - Ceph object storage daemon Loaded: loaded (/usr/lib/systemd/system/ceph-osd@.service; enabled; vendor preset: disabled) Active: active (running) since 四 2020-02-06 18:49:43 CST; 40min ago Main PID: 1973 (ceph-osd)
[root@node1 ceph-cluster]# ceph osd tree ID WEIGHT TYPE NAME UP/DOWN REWEIGHT PRIMARY-AFFINITY -1 0.05846 root default -2 0.01949 host node1 0 0.01949 osd.0 up 1.00000 1.00000 -3 0.01949 host node2 1 0.01949 osd.1 up 1.00000 1.00000 -4 0.01949 host node3 2 0.01949 osd.2 up 1.00000 1.00000
2)常见错误(非必须操作)。
如果查看状态包含如下信息:health: HEALTH_WARN clock skew detected on node2, node3…
clock skew表示时间不同步,解决办法:请先将所有主机的时间都使用NTP时间同步!!!
Ceph要求所有主机时差不能超过0.05s,否则就会提示WARN。
如果状态还是失败,可以尝试执行如下命令,重启ceph服务:[root@node1 ~]# systemctl restart ceph\*.service ceph\*.target
Ceph块存储
- 单机块设备
1.光盘
2.磁盘 - 分布式块存储
1.ceph
2.cinder
什么是块存储
- ceph块设备也叫做RADOS块设备 RADOS block device : RBD
- RBD驱动已经很好地集成在了linux内核中
- RBD提供了企业功能,如快照,COW克隆等
- RBD还支持内存缓存,从而能够大大的提高性能
- Linux内核可以直接访问ceph块存储
- KVM可用于j借助于librbd访问
创建Ceph块存储
问题
使用Ceph集群的块存储功能,实现以下目标:-
创建块存储镜像
-
客户端映射镜像
-
创建镜像快照
-
使用快照还原数据
-
使用快照克隆镜像
-
删除快照与镜像
步骤 -
步骤一:创建镜像
1)查看存储池。
[root@node1 ~]# ceph osd lspools 0 rbd,
2)创建镜像、查看镜像
[root@node1 ~]# rbd create jacob --image-feature layering --size 5G
#这里的jacob为创建的镜像名称,可以为任意字符。
#–image-feature参数指定我们创建的镜像有哪些功能,layering是开启COW(写实复制)功能。
#提示:ceph镜像支持很多功能,但很多是操作系统不支持的,我们只开启layering。[root@node1 ~]# rbd list #列出所有共享镜像 jacob [root@node1 ~]# rbd info jacob #列出某个镜像的详细信息 rbd image 'jacob': size 5120 MB in 1280 objects order 22 (4096 kB objects) block_name_prefix: rbd_data.5e3a2ae8944a format: 2 features: layering flags:
- 步骤二:动态调整
1)扩容容量
[root@node1 ~]# rbd resize --size 15G jacob Resizing image: 100% complete...done. [root@node1 ~]# rbd info jacob rbd image 'jacob': size 15360 MB in 3840 objects order 22 (4096 kB objects) block_name_prefix: rbd_data.5e3a2ae8944a format: 2 features: layering flags:
2)缩减容量
[root@node1 ~]# rbd resize --size 10G jacob rbd: shrinking an image is only allowed with the --allow-shrink flag #此时缩减容量会报错,如果确认要缩减,添加--allow-shrink选项 [root@node1 ~]# rbd resize --size 10G jacob --allow-shrink Resizing image: 100% complete...done. [root@node1 ~]# rbd info jacob rbd image 'jacob': size 10240 MB in 2560 objects order 22 (4096 kB objects) block_name_prefix: rbd_data.5e3a2ae8944a format: 2 features: layering flags:
客户端访问共享(client做客户端主机)
首先确保客户端的yum源已经加载 [root@client ~]# yum repolist 已加载插件:fastestmirror Loading mirror speeds from cached hostfile 源标识 源名称 状态 MON mon 41 OSD osd 28 Tools tools 33 centos centos 9,911 repolist: 10,013 [root@client ~]# yum -y install ceph-common.x86_64 #客户端需要安装ceph-common软件包 [root@client ~]# scp 192.168.4.11:/etc/ceph/ceph.conf /etc/ceph #拷贝配置文件,配置文件中记录的有ceph集群服务器的IP信息 [root@client ~]# scp node1:/etc/ceph/ceph.client.admin.keyring /etc/ceph #拷贝访问集群的密钥文件,有了密钥才有权限访问集群 [root@client ~]# lsblk 查看磁盘分布情况 NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sda 8:0 0 20G 0 disk ├─sda1 8:1 0 1G 0 part /boot └─sda2 8:2 0 19G 0 part ├─centos-root 253:0 0 17G 0 lvm / └─centos-swap 253:1 0 2G 0 lvm [SWAP] sr0 11:0 1 284M 0 rom /media sr1 11:1 1 8.8G 0 rom /mnt [root@client ~]# rbd map jacob #客户端连接jacob镜像 /dev/rbd0 [root@client ~]# lsblk #再次查看 ,此时磁盘中多了一个rbd0 NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sda 8:0 0 20G 0 disk ├─sda1 8:1 0 1G 0 part /boot └─sda2 8:2 0 19G 0 part ├─centos-root 253:0 0 17G 0 lvm / └─centos-swap 253:1 0 2G 0 lvm [SWAP] sr0 11:0 1 284M 0 rom /media sr1 11:1 1 8.8G 0 rom /mnt rbd0 252:0 0 10G 0 disk
- 步骤三:客户端进行快照还原数据的实验:
快照:写数据;快照;模拟人为的误操作;还原快照
副本:写数据,可以自动备份3份;删数据时,删除3份,主要用来解决单点故障的问题
1)格式化,挂载,写数据
[root@client ~]# mkfs.xfs /dev/rbd0 [root@client ~]# mount /dev/rbd0 /data [root@client ~]# df -h 文件系统 容量 已用 可用 已用% 挂载点 /dev/mapper/centos-root 17G 1.2G 16G 8% / devtmpfs 224M 0 224M 0% /dev tmpfs 236M 0 236M 0% /dev/shm tmpfs 236M 5.6M 230M 3% /run tmpfs 236M 0 236M 0% /sys/fs/cgroup /dev/sr0 284M 284M 0 100% /media /dev/sda1 1014M 142M 873M 14% /boot /dev/sr1 8.8G 8.8G 0 100% /mnt tmpfs 48M 0 48M 0% /run/user/0 /dev/rbd0 10G 33M 10G 1% /data [root@client ~]# echo "abc hello world" > /data/test.txt
- 步骤四:回到node集群,创建快照
[root@node1 ~]# rbd snap ls jacob #默认该镜像没有快照 [root@node1~]# rbd snap create jacob --snap jacob-snap1 #给jacob镜像创建快照,快照名为jacob-snap1 [root@node1 ~]# rbd snap ls jacob SNAPID NAME SIZE 4 jacob-snap1 10240 MB
到client模拟数据被误操作删除(ceph不支持在线还原快照)
[root@client ~]# ls /data test.txt [root@client ~]# rm -rf /data/test.txt [root@client ~]# umount /data [root@client ~]# ls /data
到node集群还原快照
[root@node1 ~]# rbd snap rollback jacob --snap jacob-snap1 Rolling back to snapshot: 100% complete...done.
客户端再次挂载访问共享
[root@client ~]# mount /dev/rbd0 /data [root@client ~]# ls /data test.txt [root@client ~]# cat /data/test.txt abc hello world
- 步骤五:创建块照克隆
- 使用快照克隆一个新的镜像盘image
jacob--------3G数据(快照)--------->创建新的共享
创建一个新的共享
1)保护快照(防止快照被误删除)
[root@node1 ~]# rbd snap protect jacob --snap jacob-snap1 #保护快照 [root@node1 ~]# rbd snap rm jacob --snap jacob-snap1 #删除快照,此时无法删除,因为做了快照保护 rbd: snapshot 'jacob-snap1' is protected from removal. 2020-02-06 21:56:47.950350 7f10f5b44d80 -1 librbd::Operations: snapshot is protected
2)克隆快照
[root@node1 ~]# rbd clone jacob --snap jacob-snap1 jacob-clone --image-feature layering #使用现有jacob镜像盘的jacob-snap1这个快照,克隆一个新的共享镜像盘,名称为jacob-clone [root@node1 ~]# rbd ls jacob jacob-clone
3)查看克隆镜像与父镜像快照之间的关系
[root@node1 ~]# rbd info jacob rbd image 'jacob': size 10240 MB in 2560 objects order 22 (4096 kB objects) block_name_prefix: rbd_data.5e3a2ae8944a format: 2 features: layering flags: [root@node1 ~]# rbd info jacob-clone rbd image 'jacob-clone': size 10240 MB in 2560 objects order 22 (4096 kB objects) block_name_prefix: rbd_data.5e3e2ae8944a format: 2 features: layering flags: parent: rbd/jacob@jacob-snap1 #克隆镜像此时显示有父镜像 overlap: 10240 MB #克隆镜像很多数据都来自于快照链 #如果希望克隆镜像可以独立工作,就需要将父快照中的数据,全部拷贝一份,但比较耗时!!! [root@node1 ~]# rbd flatten jacob-clone Image flatten: 100% complete...done. [root@node1 ~]# rbd info jacob-clone rbd image 'jacob-clone': size 10240 MB in 2560 objects order 22 (4096 kB objects) block_name_prefix: rbd_data.5e3e2ae8944a format: 2 features: layering flags: #此时父快照的信息不见了! [root@node1 ~]# rbd snap unprotect jacob --snap jacob-snap1 #取消快照保护 [root@node1 ~]# rbd snap rm jacob --snap jacob-snap1 #删除快照,此时快照就可以被删除
客户端取消对ceph的挂载实验
[root@client ~]# df -h 文件系统 容量 已用 可用 已用% 挂载点 /dev/mapper/centos-root 17G 1.2G 16G 8% / devtmpfs 224M 0 224M 0% /dev tmpfs 236M 0 236M 0% /dev/shm tmpfs 236M 5.6M 230M 3% /run tmpfs 236M 0 236M 0% /sys/fs/cgroup /dev/sr0 284M 284M 0 100% /media /dev/sda1 1014M 142M 873M 14% /boot /dev/sr1 8.8G 8.8G 0 100% /mnt tmpfs 48M 0 48M 0% /run/user/0 /dev/rbd0 10G 33M 10G 1% /data [root@client ~]# umount /data #卸载 [root@client ~]# lsblk #查看,此时,rbd0依然存在 NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sda 8:0 0 20G 0 disk ├─sda1 8:1 0 1G 0 part /boot └─sda2 8:2 0 19G 0 part ├─centos-root 253:0 0 17G 0 lvm / └─centos-swap 253:1 0 2G 0 lvm [SWAP] sr0 11:0 1 284M 0 rom /media sr1 11:1 1 8.8G 0 rom /mnt rbd0 252:0 0 10G 0 disk [root@client ~]# rbd showmapped id pool image snap device 0 rbd jacob - /dev/rbd0 [root@client ~]# rbd unmap /dev/rbd0 #也可以写rbd unmap jacob [root@client ~]# lsblk #此时,rbd0不存在了 NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sda 8:0 0 20G 0 disk ├─sda1 8:1 0 1G 0 part /boot └─sda2 8:2 0 19G 0 part ├─centos-root 253:0 0 17G 0 lvm / └─centos-swap 253:1 0 2G 0 lvm [SWAP] sr0 11:0 1 284M 0 rom /media sr1 11:1 1 8.8G 0 rom /mnt [root@client ~]# rbd map jacob-clone /dev/rbd0 [root@client ~]# mount /dev/rbd0 /data [root@client ~]# ls /data test.txt [root@client ~]# umount /data [root@client ~]# rbd unmap /dev/rbd0
Ceph文件系统存储
什么是CephFS
- 分布式文件系统(Distributed File System)是指文件系统管理的物理存储资源不一定直接连接在本地节点上,而是通过计算机网络与节点相连
- CephFS使用Ceph集群提供与POSIX兼容的文件系统
- 允许 Linux直接将Ceph存储mount到本地
什么是元数据
- 元数据(Metadata)
- 任何文件系统中的数据分为数据和元数据
- 数据是指普通文件中的实际数据
- 而元数据指用来描述一个文件特征的系统数据
- 比如:访问权限、文件拥有者以及文件数据块的分布信息(inode…)等
- 所以CephFS必须要有MDSs节点
ceph集群支持块共享,文件系统共享,对象存储共享
块共享(同一时间仅可以同一个客户端访问)iscsi服务 server[挂载]格式化 mount 写数据10个文件
desktop 挂载 mount 写10个文件
server 再次访问 看到20个文件
文件系统共享
NFS(/common)
desktop (mount) 写数据,读数据
node1 (mount) 写数据,读数据Ceph 集群支持块共享、文件系统共享、对象存储共享 块共享(同一时间仅可以一个客户端访问) 块(没有格式化) 文件系统(格式化,NFS,fat32,ext4,xfs文件系统) 硬盘没有格式化,就相当于一幢空的大厦
假设一块硬盘此时有100G,将硬盘分为inode区域和block两个区域 inode block
2G 98G 再将inode区域的空间划分为每块256字节,block区域空间划分为每块4k的字节
写数据时,数据会被写入到block中(4M的文件,会占用多个block)
block中存数据,inode中存储元数据(metadata)【元数据是数据的数据,描述数据的数据,比如一个文件,有文件名,时间,权限,大小…类似于描述信息,同时还记录文件数据的地址】Ceph文件系统实验
问题
实现Ceph文件系统的功能。具体实现有以下功能:- 部署MDSs节点
- 创建Ceph文件系统
- 客户端挂载文件系统
方案
使用现有的虚拟机进行操作
步骤 - 1).ceph提供文件系统共享的实验:(使用node3做ceph-mds服务,操作指令在node1执行)
[root@node1 ~]# cd ceph-cluster/ [root@node1 ceph-cluster]# ceph-deploy mds create node3 ####################################################################### 此时: 【node1】/root/ceph-cluster/ceph.conf 【node3】/etc/ceph/ceph.conf 文件内容要一毛一样! [root@node1 ceph-cluster]# cat ceph.conf [global] fsid = 3b2ca6aa-8018-42c4-8bfe-05902cd313dd mon_initial_members = node1, node2, node3 mon_host = 192.168.4.11,192.168.4.12,192.168.4.13 auth_cluster_required = cephx auth_service_required = cephx auth_client_required = cephx [root@node3 ~]# cat /etc/ceph/ceph.conf [global] fsid = 3b2ca6aa-8018-42c4-8bfe-05902cd313dd mon_initial_members = node1, node2, node3 mon_host = 192.168.4.11,192.168.4.12,192.168.4.13 auth_cluster_required = cephx auth_service_required = cephx auth_client_required = cephx config file /etc/ceph/ceph.conf exist with different content 有文件,但内容不一致,可以加--overwrite-conf选项 在node3查看,此时ceph-mds服务已经启动 [root@node3 ~]# systemctl status ceph-mds@node3.service ● ceph-mds@node3.service - Ceph metadata server daemon Loaded: loaded (/usr/lib/systemd/system/ceph-mds@.service; enabled; vendor preset: disabled) Active: active (running) since 五 2020-02-07 18:13:49 CST; 9min ago
- 2).创建存储池
[root@node1 ~]# ceph osd pool create cephfs_data 128 pool 'cephfs_data' created #创建存储池,对应128个PG [root@node1 ceph-cluster]# ceph osd pool create cephfs_metadata 128 pool 'cephfs_metadata' created #创建存储池,对应128个PG #cephfs_metadata做inode ,cephfs_data做block [root@node1 ceph-cluster]# ceph osd lspools #查看 0 rbd,1 cephfs_data,2 cephfs_metadata,
- 3)创建文件系统
[root@node1 ceph-cluster]# ceph fs new myfs1 cephfs_metadata cephfs_data #创建一个文件系统,这个文件系统由inode和block组成,cephfs_metadata做inode,存元数据,cephfs_data做block,存数据,文件系统名称是myfs1 [root@node1 ceph-cluster]# ceph fs ls #查看文件系统 name: myfs1, metadata pool: cephfs_metadata, data pools: [cephfs_data ]
4)客户端mount访问
[root@client ~]# mkdir /cephfs [root@node1 ceph-cluster]# cat /etc/ceph/ceph.client.admin.keyring [client.admin] key = AQCb/TpeWGpVJBAALIlg4tgvgDTbr+Poza3xCw== #查看 /etc/ceph/ceph.client.admin.keyring找用户名和密码 [root@client ~]# mount -t ceph 192.168.4.11:6789:/ /cephfs -o name=admin,secret=AQCb/TpeWGpVJBAALIlg4tgvgDTbr+Poza3xCw== #客户端mount访问共享,-t访问的服务类型是ceph(nfs,cifs),服务IP是192.168.4.11,端口号是6789,ceph仅支持一个文件系统共享,只能写访问/,把共享挂载到/cephfs目录,name指定用户名,secret指定密码(因为ceph集群需要验证用户和密码才可以访问) [root@node1 ceph-cluster]# ceph -s cluster 3b2ca6aa-8018-42c4-8bfe-05902cd313dd health HEALTH_WARN too many PGs per OSD (320 > max 300) monmap e2: 3 mons at {node1=192.168.4.11:6789/0,node2=192.168.4.12:6789/0,node3=192.168.4.13:6789/0} election epoch 18, quorum 0,1,2 node1,node2,node3 fsmap e5: 1/1/1 up {0=node3=up:active} osdmap e31: 3 osds: 3 up, 3 in flags sortbitwise pgmap v830: 320 pgs, 3 pools, 84386 kB data, 2606 objects 362 MB used, 61044 MB / 61406 MB avail 320 active+clean
Ceph对象存储
- 对象存储:
- 基于kv的存储,通过API接口访问,对象存储中所有的数据都被认为是一个对象。基于对象的存储就是对象存储
- 也就是键值存储,通其接口指令,也就是简单的GET、PUT、DEL和其他扩展,向存储服务上传或下载数据
- 对象存储中所有数据都被认为是一个对象,所以,任何数据都可以存入对象服务器,如图片,视频,音频等
- RGW全称是Rados Gateway
- RGW是ceph对象存储网关,用于向客户端应用呈现存储页面,提供RESTful API访问接口
运维:部署集群,维护集群,故障排错
开发:写程序,基于程序中的指令连接ceph服务器,上传下载数据
百度云盘就属于对象存储(不能直接mount,不是在客户端多一个磁盘)
百度云盘,客户端需要下载他的客户端软件(网页也是软件)
Ceph对象存储实验
步骤
- 1)登录node1使用ceph-deploy运城启动RGW服务(radosgw)
[root@node1 ~]# cd ceph-cluster/ [root@node1 ceph-cluster]# ceph-deploy rgw create node3 ... [ceph_deploy.rgw][INFO ] The Ceph Object Gateway (RGW) is now running on host node3 and default port 7480 #起完服务后默认端口7480 [root@node3 ~]# systemctl status ceph-radosgw@rgw.node3.service #查看服务是否已经启动 ● ceph-radosgw@rgw.node3.service - Ceph rados gateway Loaded: loaded (/usr/lib/systemd/system/ceph-radosgw@.service; enabled; vendor preset: disabled) Active: active (running) since 五 2020-02-07 19:46:54 CST; 7min ago [root@node3 ~]# ss -nutlp | grep 7480 #也可以查看端口号 tcp LISTEN 0 128 *:7480 *:* users:(("radosgw",pid=2120,fd=27))
- 2)可以修改配置文件,修改服务的端口(非必须操作)【在node3操作】
[root@node3 ~]# vim /etc/ceph/ceph.conf 手动输入三行 [client.rgw.node3] host=node3 rgw_frontends="civetweb port=8000" [root@node3 ~]# systemctl restart ceph-radosgw@rgw.node3.service [root@node3 ~]# ss -nutlp | grep radosgw tcp LISTEN 0 128 *:8000 *:* users:(("radosgw",pid=2556,fd=27))
-
Ceph—Cephfs
2020-01-01 08:14:58Ceph File System (CephFS) 是与 POSIX 标准兼容的文件系统, 能够提供对 Ceph 存储集群上的文件访问. Jewel 版本 (10.2.0) 是第一个包含稳定 CephFS 的 Ceph 版本. CephFS 需要至少一个元数据服务器 (Metadata ...1.CephFs介绍
Ceph File System (CephFS) 是与 POSIX 标准兼容的文件系统, 能够提供对 Ceph 存储集群上的文件访问. Jewel 版本 (10.2.0) 是第一个包含稳定 CephFS 的 Ceph 版本. CephFS 需要至少一个元数据服务器 (Metadata Server - MDS) daemon (ceph-mds) 运行, MDS daemon 管理着与存储在 CephFS 上的文件相关的元数据, 并且协调着对 Ceph 存储系统的访问。
对象存储的成本比起普通的文件存储还是较高,需要购买专门的对象存储软件以及大容量硬盘。如果对数据量要求不是海量,只是为了做文件共享的时候,直接用文件存储的形式好了,性价比高。2.CephFS 架构
底层是核心集群所依赖的, 包括:
OSDs (ceph-osd): CephFS 的数据和元数据就存储在 OSDs 上
MDS (ceph-mds): Metadata Servers, 管理着 CephFS 的元数据
Mons (ceph-mon): Monitors 管理着集群 Map 的主副本 Ceph 存储集群的协议层是 Ceph 原生的 librados 库, 与核心集群交互.
CephFS 库层包括 CephFS 库 libcephfs, 工作在 librados 的顶层, 代表着 Ceph 文件系统.最上层是能够访问 Ceph 文件系统的两类客户端.3.配置 CephFS MDS
要使用 CephFS, 至少就需要一个 metadata server 进程。可以手动创建一个 MDS, 也可以使用 ceph-deploy 或者 ceph-ansible 来部署 MDS。
登录到ceph-deploy工作目录执行ceph-deploy mds create $hostname
4.部署Ceph文件系统
部署一个 CephFS, 步骤如下:
1.在一个 Mon 节点上创建 Ceph 文件系统.
2.若使用 CephX 认证,需要创建一个访问 CephFS 的客户端
3.挂载 CephFS 到一个专用的节点.以 kernel client 形式挂载 CephFS
以 FUSE client 形式挂载 CephFS
(1)创建一个 Ceph 文件系统
①CephFS 需要两个 Pools - cephfs-data 和 cephfs-metadata, 分别存储文件数据和文件元数据ceph osd pool create cephfs-data 256 256 ceph osd pool create cephfs-metadata 64 64
注:一般 metadata pool 可以从相对较少的 PGs 启动, 之后可以根据需要增加 PGs. 因为 metadata pool 存储着 CephFS 文件的元数据, 为了保证安全, 最好有较多的副本数. 为了能有较低的延迟, 可以考虑将 metadata 存储在 SSDs 上.
②创建一个 CephFS, 名字为 cephfs:ceph fs new cephfs cephfs-metadata cephfs-data
③验证至少有一个 MDS 已经进入 Active 状态
ceph fs status cephfs
④在 Monitor 上, 创建一个用户,用于访问CephFs
ceph auth get-or-create client.cephfs mon 'allow r' mds 'allow rw' osd 'allow rw pool=cephfs-data, allow rw pool=cephfs-metadata'
⑤验证key是否生效
ceph auth get client.cephfs
⑥检查CephFs和mds状态
ceph mds stat ceph fs ls ceph fs status
(2)以 kernel client 形式挂载 CephFS
①创建挂载目录 cephfsmkdir /cephfs
②挂载目录
mount -t ceph 10.151.30.125:6789,10.151.30.126:6789,10.151.30.127:6789:/ /cephfs/ -o name=cephfs,secret=AQDHjeddHlktJhAAxDClZh9mvBxRea5EI2xD9w==
③自动挂载
echo "mon1:6789,mon2:6789,mon3:6789:/ /cephfs ceph name=cephfs,secretfile=/etc/ceph/cephfs.key,_netdev,noatime 0 0" | sudo tee -a /etc/fstab
④验证是否挂载成功
stat -f /cephfs
(3)以 FUSE client 形式挂载 CephFS
①安装ceph-commonyum install -y ceph-common
②安装ceph-fuse
yum install -y ceph-fuse
③将集群的ceph.conf拷贝到客户端
scp root@10.151.30.125:/etc/ceph/ceph.conf /etc/ceph/ chmod 644 /etc/ceph/ceph.conf
④使用 ceph-fuse 挂载 CephFS
ceph-fuse --keyring /etc/ceph/ceph.client.cephfs.keyring --name client.cephfs -m 10.151.30.125:6789,10.151.30.126:6789,10.151.30.127:6789 /cephfs/
⑤验证 CephFS 已经成功挂载
stat -f /cephfs
⑥自动挂载
echo "none /cephfs fuse.ceph ceph.id=cephfs[,ceph.conf=/etc/ceph/ceph.conf],_netdev,defaults 0 0"| sudo tee -a /etc/fstab
或
echo "id=cephfs,conf=/etc/ceph/ceph.conf /mnt/ceph2 fuse.ceph _netdev,defaults 0 0"| sudo tee -a /etc/fstab
⑦卸载
fusermount -u /cephfs
5.MDS主备与主主切换
(1)配置主主模式
当cephfs的性能出现在MDS上时,就应该配置多个活动的MDS。通常是多个客户机应用程序并行的执行大量元数据操作,并且它们分别有自己单独的工作目录。这种情况下很适合使用多主MDS模式。
配置MDS多主模式 每个cephfs文件系统都有一个max_mds设置,可以理解为它将控制创建多少个主MDS。注意只有当实际的MDS个数大于或等于max_mds设置的值时,mdx_mds设置才会生效。例如,如果只有一个MDS守护进程在运行,并且max_mds被设置为两个,则不会创建第二个主MDS。
ceph fs set max_mds 2
(2)配置备用MDS
即使有多个活动的MDS,如果其中一个MDS出现故障,仍然需要备用守护进程来接管。因此,对于高可用性系统,实际配置max_mds时,最好比系统中MDS的总数少一个。
但如果你确信你的MDS不会出现故障,可以通过以下设置来通知ceph不需要备用MDS,否则会出现insufficient standby daemons available告警信息:ceph fs set <fs> standby_count_wanted 0
(3)还原单主MDS
①设置max_mdsceph fs set max_mds 1
② 删除不需要的rank
ceph mds deactivate cephfs:2
-
ceph客户端使用_ceph存储之ceph客户端
2020-12-22 06:00:13CEPH客户端:大多数Ceph用户不会直接往Ceph存储集群里存储对象,他们通常会选择Ceph块设备、Ceph文件系统、Ceph对象存储之中的一个或多个;块设备:要实践本手册,你必须先完成存储集群入门,并确保Ceph 存储集群...CEPH客户端:
大多数Ceph用户不会直接往Ceph存储集群里存储对象,他们通常会选择Ceph块设备、Ceph文件系统、Ceph对象存储之中的一个或多个;
块设备:
要实践本手册,你必须先完成存储集群入门 ,并确保 Ceph 存储集群处于 active + clean 状态,这样才能使用 Ceph 块设备。
1、在ceph-client安装ceph,在管理节点上,通过ceph-deploy把Ceph安装到ceph-client节点:
ceph-deploy install ceph-client
2、在管理节点上,用 ceph-deploy 把 Ceph 配置文件和 ceph.client.admin.keyring 拷贝到 ceph-client 。
ceph-deploy admin ceph-client
ceph-deploy 工具会把密钥环复制到 /etc/ceph 目录,要确保此密钥环文件可读(如 sudo chmod + r /etc/ceph/ceph.client.admin.keyring )。
配置块设备:
1、在ceph-client节点上创建一个块设备映像。
rbd create foo --size 4096 [-m {mon-IP}] [-k /path/to/ceph.client.admin.keyring]
2、在ceph-client节点上,把映像映射为块设备:
rbd map foo --pool rbd --name client.admin [-m {mon-IP}] [-k /path/to/ceph.client.admin.keyring]
3、在ceph-client节点上,创建文件系统后就可以使用了。
mkfs.ext4 -m0 /dev/rbd/rbd/foo
此命令可能耗时较长
4、在ceph-client节点上挂载此文件系统。
mkfir /mnt/ceph-block-device
mount /dev/rbd/foo /mnt/ceph-block-device
cd /mnt/ceph-block-device
-
ceph-deploy ceph-ansible部署ceph
2018-07-18 17:26:05Ceph当前的自动化部署有两个,分别是ceph-deploy和ceph-ansible,语言都是python,对应的github库地址为: ceph-deploy: https://github.com/ceph/ceph-deploy ceph-ansible: ...Ceph当前的自动化部署有两个,分别是ceph-deploy和ceph-ansible,语言都是python,对应的github库地址为:
ceph-deploy: https://github.com/ceph/ceph-deploy
ceph-ansible: https://github.com/ceph/ceph-ansible
ceph-deploy在手动部署中用的比较多,要实现自动化部署,必须再写脚本执行;
ceph-ansible基于ansible,可以实现根据配置文件的ceph自动化部署;
我在之前写过一个基于ceph-deploy部署ceph的自动化脚本,用起来比较方便熟练;
所以这里我写的自动化部署是基于自写脚本调用ceph-deploy的自动化部署;
-
Ceph基础篇
2018-11-28 12:26:50本课程主要讲解了以下几个方面:首先讲解了 Ceph 存储和组件的介绍,让大家了解到有哪些功能以及使用的一些地方。随后讲解了 使用 ceph-deploy 怎么去部署一个多节点的Ceph 集群架构,最后又详细的介绍了Ceph的块... -
ceph ansible部署ceph集群
2020-06-21 23:02:12ceph ansible部署ceph集群 参考:https://docs.ceph.com/ceph-ansible/master/ 项目地址:https://github.com/ceph/ceph-ansible https://www.cnblogs.com/zyxnhr/p/10543814.html 节点规划: 主机名 public-ip ... -
Ceph-ansible 部署Ceph
2020-08-23 15:43:38简介:Ceph-ansible 部署Ceph 1、安装notario yum install -y python-pip pip install notario 这个包用yum装的版本是不符合要求的,需要使用pip进行安装 2、下载ceph-ansible的代码到本地 git clone https://github... -
ceph 安装ceph问题汇总
2019-10-05 02:17:011、在不同节点安装ceph时,出现以下异常: 参考这里 ceph deploy RuntimeError: NoSectionError: No section: 'ceph' 解决方法: 在报错的机器上尝试: yum remove ceph-release rm /etc/yum.repos.d/ceph.... -
Learning Ceph
2015-05-06 22:18:47If you are learning Ceph, this book is a good choice. It is about the deployment and administration of Ceph. If you have no idea of Ceph, Please hurry up. -
Ceph实战 - Ceph FS
2020-05-06 09:35:19Ceph FS 它可以像NFS或SAMBA那样,提供共享文件夹,客户端通过挂载目录的方式使用CEPH的存储。 ** 1、cephFS需要一台MDS元数据服务器node4 2、在node4上安装软件包 [root@node4 ~]# yum install -y ceph-mds 3、在... -
Ceph入门到实战
2020-08-15 16:11:00SDS(英文:Software Define Storage)软件定义存储作为新基建(云计算中基础设施建设)重要的一环,Ceph作为未来统一软件定义存储系统,提供了RBD块存储,RGW对象存储和CephFS文件存储接口的接入,本课程结合在企业... -
ceph-ansible安装ceph
2019-02-13 10:38:431. 准备机器, 1台做ansible, 另外3台安装ceph http://docs.ceph.com/ceph-ansible/master/#demos 2. 在安装了ansible的机器上, vi /etc/hosts. 加三台机器的hostname 10.0.221.100 ceph1 10.0.221.101 ceph2 ... -
cephfs
2020-08-04 10:40:03一、启用cephfs Ceph文件系统至少需要两个RADOS池,一个用于数据,一个用于元数据 启用mds服务 ceph-deploy mds create node01 创建数据pool ceph osd pool create cephfs_data 128 创建Metadata池 ceph osd pool ... -
Ceph学习
2020-08-30 10:01:42文章目录1、Ceph概述1.1、什么是分布式存储1.2、常见的分布式文件系统1.3、什么是Ceph1.3.1、Ceph简介1.3.2、Ceph特点1.3.3、Ceph组件2、实验环境准备3、部署Ceph集群3.1、安装部署软件ceph-deploy3.2、部署Ceph ... -
ceph-cephfs基本概念
2020-05-06 20:17:58这里写自定义目录标题CEPHFS ...3、由于云计算大潮的突起,比cephfs完的ceph rbd和ceph radosgw发展比较活跃,cephfs发展比较滞后,在redhat收购inktank后许多应用环境对cephfs需求量大的原因,目前cephfs越来越... -
使用ceph的文件存储CephFS
2018-05-27 17:15:04Ceph FS是一个支持POSIX接口的文件系统,它使用 Ceph 存储集群来存储数据。文件系统对于客户端来说可以方便的挂载到本地使用。Ceph FS构建在RADOS之上,继承RADOS的容错性和扩展性,支持冗余副本和数据高可靠性。 ... -
ceph-deploy部署ceph集群
2020-06-19 14:55:15ceph-deploy安装集群 官方文档: https://ceph.readthedocs.io/en/latest/install/ceph-deploy/quick-start-preflight/ ceph版本列表: https://ceph.readthedocs.io/en/latest/releases/ 节点规划: 主机名 ... -
CEPH部署+CEPH节点扩容+CEPH数据恢复实验
2020-03-30 21:42:31文章目录一、环境介绍二、实验步骤三、部署ceph集群四、集群扩容(将ceph03加入集群)五、OSD数据恢复六、ceph常用命令 一、环境介绍 centos 7.6 二、实验步骤 ceph01节点和ceph02节点构建ceph集群 扩容ceph集群,... -
Ceph (1) - 安装Ceph集群方法 1:使用ceph-deploy安装Nautilus版Ceph集群
2020-10-24 16:02:46CEPH_DEPLOY_DIR=~/ceph-deploy PUBLIC_SUBNET=192.168.1 PRIVATE_SUBNET=192.168.99 CEPH_DEPLOY_NODE=ceph-deploy CEPH_NODE1=ceph-node1 CEPH_NODE2=ceph-node2 CEPH_NODE3=ceph-node3 EOF source ~/.bas.
-
routeros入门到精通v6311e.7z
-
C++电影院自助售票&管理系统
-
hadoop自动化运维工具Ambari应用实践
-
性能测试学习笔记(20201121)
-
FFmpeg4.3黄金系列课程:c++版
-
【数据分析-随到随学】SPSS调查问卷统计分析
-
国家注册渗透测试工程师(Web安全)
-
【监控系统】企业级分布式开源监控解决方案(参考)
-
linux ls查看年月日时分秒
-
echarts的图表大小自适应问题
-
【数据分析-随到随学】数据分析建模和预测
-
数据多的时候为什么要使用redis而不用mysql?
-
java八股文第四章:Java 虚拟机
-
【数据分析-随到随学】Mysql数据库
-
react项目添加ts
-
朱有鹏老师嵌入式linux核心课程2期介绍
-
自学编程的几大方法 czhztjz
-
备战2021软考网络规划设计师历年真题套餐
-
jQuery事件
-
Go-back-N(GBN)协议&选择性重复(SR)协议的区别