块存储

  1. # 查看块设备映射信息
  2. [root@client1 ~]# rbd showmapped
  3. id pool image snap device
  4. 0 rbd demo-image - /dev/rbd0
  5. [root@client1 ~]# lsblk
  6. NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
  7. vda 253:0 0 30G 0 disk
  8. └─vda1 253:1 0 30G 0 part /
  9. rbd0 252:0 0 7G 0 disk /mnt
  10. # 停用设备
  11. [root@client1 ~]# umount /mnt/
  12. [root@client1 ~]# lsblk
  13. NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
  14. vda 253:0 0 30G 0 disk
  15. └─vda1 253:1 0 30G 0 part /
  16. rbd0 252:0 0 7G 0 disk # 已经卸载
  17. [root@client1 ~]# rbd unmap /dev/rbd0
  18. [root@client1 ~]# lsblk # /dev/rbd0消失
  19. NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
  20. vda 253:0 0 30G 0 disk
  21. └─vda1 253:1 0 30G 0 part /

快照

  • 快照可以保存某一时间点时的状态数据
  • 希望回到以前的一个状态,可以恢复快照
  1. # 新建名为img1的镜像
  2. [root@node1 ~]# rbd create img1 --size 10G
  3. [root@client1 ~]# rbd list # 查看镜像名
  4. # 映射为本地硬盘
  5. [root@client1 ~]# rbd map img1
  6. /dev/rbd0
  7. # 格式化后挂载
  8. [root@client1 ~]# mkfs.ext4 /dev/rbd0
  9. [root@client1 ~]# mount /dev/rbd0 /mnt
  10. [root@client ~]# cp /etc/hosts /mnt/
  11. [root@client ~]# ls /mnt/
  12. hosts lost+found
  13. # 查看img1的快照
  14. [root@node1 ~]# rbd snap ls img1
  15. # 为img1创建名为img1-snap1的快照。
  16. [root@node1 ~]# rbd snap create img1 --snap img1-snap1
  17. [root@node1 ~]# rbd snap ls img1 # 查看镜像的快照
  18. SNAPID NAME SIZE
  19. 6 img1-snap1 10240 MB
  20. # 删除快照
  21. [root@node1 ~]# rbd snap remove img1 --snap img1-snap1
  22. # 删除镜像,删除前需要在客户端卸载它
  23. [root@client1 ~]# umount /mnt
  24. [root@client1 ~]# rbd unmap /dev/rbd0
  25. [root@node1 ~]# rbd rm img1
  • 使用镜像、快照综合示例 ```shell

    1. 在rbd存储池中创建10GB的镜像,名为img1

    [root@node1 ~]# rbd —help # 查看子命令 [root@node1 ~]# rbd help create # 查看子命令create的帮助 [root@node1 ~]# rbd create img1 —size 10G [root@node1 ~]# rbd list img1 [root@node1 ~]# rbd info img1 rbd image ‘img1’: size 10240 MB in 2560 objects order 22 (4096 kB objects) block_name_prefix: rbd_data.1061238e1f29 format: 2 features: layering flags:

2. 在客户端使用镜像img1,将其挂载到/mnt

[root@client1 ~]# rbd list img1 [root@client1 ~]# rbd map img1 /dev/rbd0 [root@client1 ~]# mkfs.xfs /dev/rbd0 [root@client1 ~]# mount /dev/rbd0 /mnt/ [root@client1 ~]# rbd showmapped id pool image snap device
0 rbd img1 - /dev/rbd0 [root@client1 ~]# df -h /mnt/ 文件系统 容量 已用 可用 已用% 挂载点 /dev/rbd0 10G 33M 10G 1% /mnt

3. 向/mnt中写入数据

[root@client1 ~]# cp /etc/{hosts,passwd} /mnt/ [root@client1 ~]# cp /etc/hosts /mnt/ [root@client1 ~]# cp /etc/passwd /mnt/ [root@client1 ~]# ls /mnt/ hosts passwd

4. 创建img1的快照,名为img1-sn1

[root@node1 ~]# rbd snap create img1 —snap img1-sn1 [root@node1 ~]# rbd snap ls img1 SNAPID NAME SIZE 8 img1-sn1 10240 MB

5. 删除/mnt/中的数据

[root@client1 ~]# rm -f /mnt/*

6. 通过快照还原数据

[root@client1 ~]# umount /mnt/ [root@client1 ~]# rbd unmap /dev/rbd0 [root@node1 ~]# rbd help snap rollback # 查看子命令帮助

回滚img1到快照img1-sn1

[root@node1 ~]# rbd snap rollback img1 —snap img1-sn1

重新挂载

[root@client1 ~]# rbd map img1 /dev/rbd0 [root@client1 ~]# mount /dev/rbd0 /mnt/ [root@client1 ~]# ls /mnt/ # 数据还原完成 hosts passwd

  1. - 保护快照,防止删除
  2. ```shell
  3. [root@node1 ~]# rbd help snap protect
  4. # 保护镜像img1的快照img1-sn1
  5. [root@node1 ~]# rbd snap protect img1 --snap img1-sn1
  6. [root@node1 ~]# rbd snap rm img1 --snap img1-sn1 # 不能删

快照克隆

  • 不能将一个镜像同时挂载到多个节点,如果这样操作,将会损坏数据
  • 如果希望不同的节点,拥有完全相同的数据盘,可以使用克隆技术
  • 克隆是基于快照的,不能直接对镜像克隆
  • 快照必须是受保护的快照,才能克隆
  • 克隆流程 块存储,分布式文件系统,对象存储 - 图1
  • 给多个客户端生成数据相同的数据盘 ```shell

    1. 创建名为img2的镜像,大小10GB

    [root@node1 ~]# rbd create img2 —size 10G

2. 向镜像中写入数据

[root@node1 ~]# rbd map img2 /dev/rbd0 [root@node1 ~]# mkfs.xfs /dev/rbd0 [root@node1 ~]# mount /dev/rbd0 /mnt/ [root@node1 ~]# for i in {1..20}

do echo “Hello World $i” > /mnt/file$i.txt done [root@node1 ~]# ls /mnt/ file10.txt file15.txt file1.txt file5.txt file11.txt file16.txt file20.txt file6.txt file12.txt file17.txt file2.txt file7.txt file13.txt file18.txt file3.txt file8.txt file14.txt file19.txt file4.txt file9.txt

3. 卸载镜像

[root@node1 ~]# umount /mnt/ [root@node1 ~]# rbd unmap /dev/rbd0

4. 为img2创建名为img2-sn1快照

[root@node1 ~]# rbd snap create img2 —snap img2-sn1

5. 保护img2-sn1快照

[root@node1 ~]# rbd snap protect img2 —snap img2-sn1

6. 通过受保护的快照img2-sn1创建克隆镜像

[root@node1 ~]# rbd clone img2 —snap img2-sn1 img2-sn1-1 —image-feature layering [root@node1 ~]# rbd clone img2 —snap img2-sn1 img2-sn1-2 —image-feature layering

7. 查看创建出来的、克隆的镜像

[root@node1 ~]# rbd list img1 img2 img2-sn1-1 img2-sn1-2

8. 不同的客户端挂载不同的克隆镜像,看到的是相同的数据

[root@client1 ~]# rbd map img2-sn1-1 /dev/rbd1 [root@client1 ~]# mkdir /data [root@client1 ~]# mount /dev/rbd1 /data [root@client1 ~]# ls /data file10.txt file15.txt file1.txt file5.txt file11.txt file16.txt file20.txt file6.txt file12.txt file17.txt file2.txt file7.txt file13.txt file18.txt file3.txt file8.txt file14.txt file19.txt file4.txt file9.txt

  1. - 查询镜像和快照
  2. ```shell
  3. # 查看快照信息
  4. [root@node1 ~]# rbd info img2 --snap img2-sn1
  5. rbd image 'img2':
  6. size 10240 MB in 2560 objects
  7. order 22 (4096 kB objects)
  8. block_name_prefix: rbd_data.107a238e1f29
  9. format: 2
  10. features: layering
  11. flags:
  12. protected: True # 受保护
  13. # 查看克隆的快照
  14. [root@node1 ~]# rbd info img2-sn1-2
  15. rbd image 'img2-sn1-2':
  16. size 10240 MB in 2560 objects
  17. order 22 (4096 kB objects)
  18. block_name_prefix: rbd_data.10842eb141f2
  19. format: 2
  20. features: layering
  21. flags:
  22. parent: rbd/img2@img2-sn1 # 父对象是rbd池中img2镜像的img2-sn1快照
  23. overlap: 10240 MB
  • 合并父子镜像
    • img2-sn1-2是基于img2的快照克隆来的,不能独立使用。
    • 如果父镜像删除了,子镜像也无法使用。
    • 将父镜像内容合并到子镜像中,子镜像就可以独立使用了。 ```shell

      把img2的数据合并到子镜像img2-sn1-2中

      [root@node1 ~]# rbd flatten img2-sn1-2

      查看状态,它就没有父镜像了

      [root@node1 ~]# rbd info img2-sn1-2 rbd image ‘img2-sn1-2’: size 10240 MB in 2560 objects order 22 (4096 kB objects) block_name_prefix: rbd_data.10842eb141f2 format: 2 features: layering flags:

删除父镜像,如果镜像正在被使用,则先取消

[root@client ~]# umount /data/ [root@client ~]# rbd unmap /dev/rbd1

1. 删除镜像img2-sn1-1

[root@node1 ~]# rbd rm img2-sn1-1

2. 取消img2-sn1的保护

[root@node1 ~]# rbd snap unprotect img2 —snap img2-sn1

3. 删除img2-sn1快照

[root@node1 ~]# rbd snap rm img2 —snap img2-sn1

4. 删除img2

[root@node1 ~]# rbd rm img2

因为img2-sn1-2已经是独立的镜像了,所以它还可以使用

[root@client1 ~]# rbd list img1 img2-sn1-2 [root@client1 ~]# rbd map img2-sn1-2 /dev/rbd1 [root@client1 ~]# mount /dev/rbd1 /data/ [root@client1 ~]# ls /data/ file10.txt file15.txt file1.txt file5.txt file11.txt file16.txt file20.txt file6.txt file12.txt file17.txt file2.txt file7.txt file13.txt file18.txt file3.txt file8.txt file14.txt file19.txt file4.txt file9.txt

镜像改名

[root@client1 ~]# rbd rename img2-sn1-2 img3

  1. <a name="u7eFN"></a>
  2. # ceph文件系统
  3. - 文件系统:相当于是组织数据存储的方式。
  4. - 格式化时,就是在为存储创建文件系统。
  5. - Linux对ceph有很好的支持,可以把ceph文件系统直接挂载到本地。
  6. - 要想实现文件系统的数据存储方式,需要有MDS组件
  7. - 安装并启用mds
  8. ```shell
  9. # 在node3节点上安装MDS
  10. [root@node1 ~]# ssh node3
  11. [root@node3 ~]# yum install -y ceph-mds
  12. # 的node1配置MDS
  13. [root@node1 ~]# cd ceph-cluster/
  14. [root@node1 ceph-cluster]# ceph-deploy mds create node3

使用MDS

  • 元数据就是描述数据的属性。如属主、属组、权限等。
  • ceph文件系统中,数据和元数据是分开存储的
  • 新建存储池
    • 归置组PG:存储池包含PG。PG是一个容器,用于存储数据。
    • 为了管理方便,将数量众多的数据放到不同的PG中管理,而不是直接把所有的数据扁平化存放。
    • 通常一个存储池中创建100个PG。
  • 创建ceph文件系统 ```shell

    1. 新建一个名为data1的存储池,目的是存储数据,有100个PG

    [root@node1 ceph-cluster]# ceph osd pool create data1 100

2. 新建一个名为metadata1的存储池,目的是存储元数据

[root@node1 ceph-cluster]# ceph osd pool create metadata1 100

3. 创建名为myfs1的cephfs,数据保存到data1中,元数据保存到metadata1中

[root@node1 ceph-cluster]# ceph fs new myfs1 metadata1 data1

查看存储池

[root@node1 ceph-cluster]# ceph osd lspools 0 rbd,1 data1,2 metadata1, [root@node1 ceph-cluster]# ceph df GLOBAL: SIZE AVAIL RAW USED %RAW USED 92093M 91574M 519M 0.56 POOLS: NAME ID USED %USED MAX AVAIL OBJECTS rbd 0 86469k 0.28 30488M 2606 data1 1 0 0 30488M 0 metadata1 2 2068 0 30488M 20

查看文件系统

[root@node1 ~]# ceph fs ls name: myfs1, metadata pool: metadata1, data pools: [data1 ]

  1. - 客户端使用cephfs
  2. ```shell
  3. # 挂载文件系统需要密码。查看密码
  4. [root@client1 ~]# cat /etc/ceph/ceph.client.admin.keyring
  5. [client.admin]
  6. key = AQBmhINh1IZjHBAAvgk8m/FhyLiH4DCCrnrdPQ==
  7. # -t 指定文件系统类型。-o是选项,提供用户名和密码
  8. # cephfs的端口号默认是6789
  9. [root@client1 ~]# mkdir /mydata
  10. [root@client1 ~]# mount -t ceph -o name=admin,secret=AQBmhINh1IZjHBAAvgk8m/FhyLiH4DCCrnrdPQ== 192.168.88.13:6789:/ /mydata
  11. [root@client1 ~]# df -h /mydata
  12. 文件系统 容量 已用 可用 已用% 挂载点
  13. 192.168.88.13:6789:/ 90G 520M 90G 1% /mydata

对象存储

  • 需要专门的客户端访问
  • 键值对存储方式
  • 对象存储需要rgw组件
  • 安装部署

    1. [root@node1 ceph-cluster]# ssh node3
    2. [root@node3 ~]# yum install -y ceph-radosgw
    3. [root@node1 ~]# cd ceph-cluster/
    4. [root@node1 ceph-cluster]# ceph-deploy rgw create node3
  • 客户端使用:http://docs.ceph.org.cn/radosgw/s3/python/