ZFS CoW and Ceph CoW and CSI (by quqi99)

古城微笑少年丶 2022-11-04 08:20 234阅读 0赞

作者:张华 发表于:2021-03-08
版权声明:可以任意转载,转载时请务必以超链接形式标明文章原始出处和作者信息及本版权声明

ZFS Basic Usage

  1. sudo apt install zfsutils-linux
  2. #sudo zpool create new-pool /dev/sdb /dev/sdc #striped pool, raid-0
  3. #sudo zpool create new-pool mirror /dev/sdb /dev/sdc #mirrored pool, raid-1
  4. sudo zpool create -m /usr/share/pool new-pool mirror /dev/sdb /dev/sdc #-m is mount point
  5. sudo zpool add new-pool /dev/sdx
  6. sudo zpool status
  7. zfs list
  8. sudo zpool destroy new-pool
  9. sudo zfs snapshot <pool-id>
  10. sudo zfs rollback <pool-id>

ZFS CoW Test

使用vim或rsync修改ZFS上的文件会导制整个文件重新写入,以CoW写入 (ZFS是文件系统级别CoW, Ceph是块级别Cow)

  1. sudo apt install zfs -y && sudo /sbin/modprobe zfs
  2. dd if=/dev/zero of=/tmp/disk0 bs=1M count=100
  3. sudo zpool create testpool /tmp/disk0
  4. sudo zfs create testpool/sdc
  5. sudo zfs get recordsize testpool/sdc
  6. sudo cp ~/.vimrc /testpool/sdc/vimrc
  7. $ ls -i /testpool/sdc/
  8. 256 vimrc
  9. $ zdb -ddddd testpool/sdc 256
  10. ...
  11. Indirect blocks:
  12. 0 L0 0:4ae00:3800 3800L/3800P F=1 B=152/152 cksum=52e2222c06f:25cf8696e8501d:b54096cb07913e1f:d6eba6a36d42e991
  13. zdb -R testpool 0:4ae00:3800:r > /tmp/file
  14. $ diff /tmp/file /testpool/sdc/vimrc
  15. 459d458
  16. <
  17. \ No newline at end of file
  18. echo 'modify vimrc' |sudo tee -a /testpool/sdc/vimrc
  19. $ ls -i /testpool/sdc/vimrc
  20. 256 /testpool/sdc/vimrc
  21. $ zdb -ddddd testpool/sdc 256
  22. 0 L0 0:69e00:3800 3800L/3800P F=1 B=189/189 cksum=52f651a16b5:25cf8cebaf016b:b54096de7b2dc560:d6eba6d2669c6ef3
  23. zdb -R testpool 0:4ae00:3800:r > /tmp/file_old
  24. zdb -R testpool 0:69e00:3800:r > /tmp/file_new
  25. #vimdiff /tmp/file_old /tmp/file2
  26. $ diff /tmp/file_old /tmp/file_new
  27. 459c459,462
  28. <
  29. \ No newline at end of file
  30. ---
  31. > modify vimrc
  32. sudo cp /testpool/sdc/vimrc /tmp/vimrc
  33. echo 'xxxxxxxxx' |sudo tee -a /tmp/vimrc
  34. $ sudo rsync -av --inplace --no-whole-file /tmp/vimrc /testpool/sdc/vimrc
  35. sending incremental file list
  36. vimrc
  37. sent 506 bytes received 161 bytes 1,334.00 bytes/sec
  38. total size is 14,335 speedup is 21.49
  39. $ zdb -ddddd testpool/sdc 256
  40. ...
  41. 0 L0 0:84e00:3800 3800L/3800P F=1 B=318/318 cksum=53056157fa5:25cf8f4613d2d3:b54096e2b7747740:d6eba6d8fd3d794b
  42. zdb -R testpool 0:84e00:3800:r > /tmp/file_after_rsync_replace

Ceph CoW Test

ceph snapshot是把源volume基于CoW做一个只读副本,以后用于恢复。
ceph clone可以基于snapshot来做clone, 也是基于CoW。即基于snapshot的clone只创建了映射到源(这里是快照)的逻辑,没有给clone分配真实的物理空间。虽然快照是只读的,但是基于快照创建的克隆是可读可写的。当我们给clone的镜像写操作时系统才会真正的给clone的镜像分配物理空间。明白了上面的道理所以我们知道从快照克隆的镜像时依赖于快照的,一旦快照被删除则这个克隆镜像也就毁了,所以我们要保护好这个快照。

  1. ./generate-bundle.sh --ceph --name k8s --create-model --run
  2. juju scp kubernetes-master/0:config ~/.kube/config
  3. juju ssh ceph-mon/0 -- sudo -s
  4. ceph -s
  5. ceph df
  6. ceph osd tree
  7. ceph osd lspools #rados lspools
  8. rbd ls <pool>
  9. sudo modprobe rbd
  10. #pg_num=128(<5 OSDs), pg_num=512(5~10 OSDs), pg_num=4096(10~50 OSDs)
  11. # pg_num(https://ceph.com/pgcalc/) (> 50 OSDs)
  12. ceph osd pool create testpool 128
  13. sudo rbd create --size 1 -p testpool test1
  14. sudo rbd ls testpool
  15. sudo rbd info testpool/test1
  16. #create snap
  17. sudo rbd snap create testpool/test1@test1-snap
  18. # sudo rbd snap list testpool/test1
  19. SNAPID NAME SIZE PROTECTED TIMESTAMP
  20. 4 test1-snap 1 MiB Mon Mar 8 02:57:24 2021
  21. # create clone
  22. sudo rbd snap protect testpool/test1@test1-snap
  23. sudo rbd clone testpool/test1@test1-snap testpool/test1-snap-clone
  24. sudo rbd snap unprotect testpool/test1@test1-snap
  25. #sudo rbd snap rm testpool/test1@test1-snap
  26. # sudo rbd ls testpool
  27. test1
  28. test1-snap-clone
  29. # sudo rbd info testpool/test1-snap-clone |grep parent
  30. parent: testpool/test1@test1-snap
  31. #如果不想被依赖于快照,需要对克隆和快照做一个合并
  32. sudo rbd flatten testpool/test1-snap-clone
  33. # sudo rbd info testpool/test1-snap-clone |grep parent
  34. #

k8s使用ceph-csi消费RBD作为持久化存储

  1. #set up ceph k8s env
  2. ./generate-bundle.sh --ceph --name k8s --create-model --run
  3. juju scp kubernetes-master/0:config ~/.kube/config
  4. charm yaml已经帮助部署了ceph-csi(git clone https://github.com/ceph/ceph-csi.git), 如果重头开始搭建见:
  5. K8S使用ceph-csi持久化存储之RBD - https://mp.weixin.qq.com/s?__biz=MzAxMjk0MTYzNw==&mid=2247484067&idx=1&sn=43bdeb61540c088035d798ee42bbd076

k8s使用ceph-csi持久化存储之CephFS

k8s也可以在块的基础上来使用FS, 见 - https://www.cnblogs.com/wsjhk/p/13710577.html

k8s CSI插件开发

k8s CSI插件开发导读见 - https://www.jianshu.com/p/88ec8cba7507

ZFS CSI Driver - https://github.com/openebs/zfs-localpv
Ceph CSI Driver - https://github.com/ceph/ceph-csi

ZFS基于文件级实现CoW, Ceph基于块级实现CoW.

ZFS CSI Driver(https://github.com/openebs/zfs-localpv/blob/master/pkg/driver/controller.go)实现了Volume, Snap等生命周期管理的方法。

  • CreateZFSVolume
  • CreateSnapClone

Ceph CSI Driver 不仅实现了Volume, Snap的生命周期管理,也实现了Clone的生命周期管理,所以理论上Ceph CSI Driver也是支持CoW的。见:
https://github.com/ceph/ceph-csi/blob/devel/internal/rbd/clone.go
https://github.com/ceph/ceph-csi/blob/devel/internal/rbd/driver.go

Reference

[1] https://ubuntu.com/tutorials/setup-zfs-storage-pool\#2-installing-zfs
[2] http://tim-tang.github.io/blog/2016/06/05/zfs-cow-deepin
[3] https://my.oschina.net/wangzilong/blog/1595081

发表评论

表情:
评论列表 (有 0 条评论,234人围观)

还没有评论,来说两句吧...

相关阅读

    相关 debug glance(by quqi99)

    作者:张华 发表于:2021-05-19 版权声明:可以任意转载,转载时请务必以超链接形式标明文章原始出处和作者信息及本版权声明 glance与nova都使用rbd的话使