Ceph RBD 使用

6 Ceph RBD 使用

6.1 RBD 结构图

Ceph 可以同时提供对象存储 RADOSGW、块存储 RBD、文件系统存储 Ceph FS,RBD 即 RADOS Block Device 的简称,RBD 块存储是常用的存储类型之一,RBD 块设备类似磁盘可以被挂载,RBD 块设备具有快照、多副本、克隆和一致性等特性,数据以条带化的方式存储在 Ceph 集群的多个 OSD 中。

条带化技术就是一种自动的将 I/O 的负载均衡到多个物理磁盘上的技术,条带化技术就是将一块连续的数据分成很多小部分并把他们分别存储到不同磁盘上去。这就能使多个进程同时访问数据的多个不同部分而不会造成磁盘冲突,而且在需要对这种数据进行顺序访问的时候可以获得最大程度上的 I/O 并行能力,从而获得非常好的性能。

通常来说 Ceph 的块存储会结合 K8S 提供存储,一般提供给 K8S 中的有状态服务,比如数据库主从,或者 redis 集群等等,给他们提供数据存储服务 ,所以他们的访问方式就是类似于我们的客户端可能是跑在 K8S 中的一个应用程序,然后这些客户端可以访问对象存储、文件存储、块存储,然后下面就连接到 Ceph 中去了,然后再通过 ceph 给他提供底层的数据存储服务

CRUSH Map 就是用来集群映射的,比如数据存放到那个 PG 中,而且这个 PG 的主 osd 也是通过 CRUSH 计算出来的,可能说刚才 osd1 是主,后面 osd1 挂了,这个时候就需要通过 CRUSH 来进行重新计算出新的 OSD 主节点

6.2 RBD 块设备介绍

RBD(RADOS Block Devices)即为块存储的一种,RBD 通过 librbd(ceph 库文件) 库与 OSD 进行交互,RBD 为 KVM 等虚拟化技术和云服务(如 OpenStack 和 CloudStack)提供高性能和无限可扩展性的存储后端,这些系统依赖于 libvirt 和 QEMU 实用程序与 RBD 进行集成,客户端基于 librbd 库即可将 RADOS 存储集群用作块设备。

使用 rbd 的存储池需要事先启用 rbd 功能并进行初始化。例如,下面的命令创建一个名为 myrbd1 的存储池,并在启用 rbd 功能后对其进行初始化,然后再创建镜像才可以使用:

6.2.1 创建 RBD

一般我们在公司中创建一个块存储都是提供给一个项目使用

1.创建存储池:

[16:19:49 ceph@ceph-deploy ceph-cluster]$ceph osd pool create myrbd1 64 64
pool 'myrbd1' created                   # 创建成功

# 创建存储池,指定 pg 和 pgp 的数量,pgp 是对存在于 pg 的数据进行组合存储,pgp 通常等于 pg 的值
# 这里的 pg 和 pgp 都是 64 

2.对存储启动 RBD 功能

如果不启动 rbd 功能的话该块存储没法使用

[16:42:51 ceph@ceph-deploy ceph-cluster]$ceph osd pool application enable myrbd1 rbd
enabled application 'rbd' on pool 'myrbd1'  # 开启功能

3.初始化块存储池

[16:48:23 ceph@ceph-deploy ceph-cluster]$rbd pool init -p myrbd1
# -p myrbd1 指定初始化的块存储为刚才开启 rbd 功能的 myrbd1

但是当我们创建好了块存储之后还不能够直接被使用,因为这个块存储不能直接被挂载,我们的客户端想使用的话肯定需要将 ceph 的块存储挂在过去,还需要对这个块存储创建一个镜像,客户端才能够实现挂载

6.2.2 创建并验证 img:

不过,rbd 存储池并不能直接用于块设备,而是需要事先在其中按需创建映像(image),并把映像文件作为块设备使用,rbd 命令可用于创建、查看及删除块设备在的映像(image),以及克隆映像、创建快照、将映像回滚到快照和查看快照等管理操作,例如,

1.创建 image

下面的命令能够创建一个名为 myimg1 的 image ,并且将它映射到 myrbd1 的块存储使用

[16:48:57 ceph@ceph-deploy ceph-cluster]$rbd create myimg1 --size 5G --pool myrbd1


# 创建 myimg1 的 image 大小 5G 指定映射到 myrbd1 块存储使用,创建的 image 一般都是根据公司中的需求来实现

其实一个数据库一般也就会分配几十个 G 就差不多了

注意:

创建好了 image 之后还需要内核支持,并不是所有的机器都能被挂载,如上操作在创建 image1 的时候没有指定格式,就会使用 image 默认格式创建,当然我们在创建的时候也可以指定自己想要的 image 格式如下操作:

2.通过自定义格式创建 myimg2,也提供给 myrbd1 块存储

# 后续步骤会使用 myimg2 ,由于 centos 系统内核较低无法挂载使用,因此只开启部分特性。除了 layering 其他特性需要高版本内核支持
[16:56:07 ceph@ceph-deploy ceph-cluster]$rbd create myimg2 --size 3G --pool myrbd1 --image-format 2 --image-feature layering

# --image-format 2        :镜像格式为 2 
# --image-feature layering:镜像特性为 layering

3.查看 myrbd1 块存储中的 image

[17:04:20 ceph@ceph-deploy ceph-cluster]$rbd ls --pool myrbd1
myimg1
myimg2

# 现在 myrbd1 块存储中有两个 image 分别是 myimg1、myimg2

6.2.3 查看镜像特征信息

1.查看 myimg1 镜像详细信息

[17:09:29 ceph@ceph-deploy ceph-cluster]$rbd --image myimg1 --pool myrbd1 info
rbd image 'myimg1':
    size 5 GiB in 1280 objects      # 该镜像总大小 5G 被切分为了 1280 个对象
    order 22 (4 MiB objects)        # 指定每个对象为大小为 4M 也就是默认值,通过 2 的22 次方进行计算
    snapshot_count: 0               # 当前没有快照
    id: 86498b22ad64
    block_name_prefix: rbd_data.86498b22ad64    # 存储的块对象会添加前缀 rbd_data.
    format: 2                       # 镜像格式为 2
    features: layering, exclusive-lock, object-map, fast-diff, deep-flatten # 镜像特性,默认 layering, exclusive-lock, object-map, fast-diff, deep-flatten 这么多
    op_features:
    flags:
    create_timestamp: Thu Aug 26 16:56:03 2021 # 创建时间
    access_timestamp: Thu Aug 26 16:56:03 2021 # 访问时间
    modify_timestamp: Thu Aug 26 16:56:03 2021 # 修改时间

# --image myimg1:指定镜像 myimg1 
# --pool myrbd1 :指定 myimg1 镜像所在的 myrbd1 存储池
# info          : 查看详细信息

2.查看 myimg2 镜像信息

[17:11:49 ceph@ceph-deploy ceph-cluster]$rbd --image myimg2 --pool myrbd1 info
rbd image 'myimg2':
	size 3 GiB in 768 objects			# 总大小 3G 分为 768 对象
	order 22 (4 MiB objects)			# 每个对象默认大小 4M
	snapshot_count: 0					# 没有快照
	id: d38257e44fdd					
	block_name_prefix: rbd_data.d38257e44fdd	# 存储对象数据前缀
	format: 2							# 镜像格式 2 
	features: layering					# 镜像特征,由于在创建的时候只指定了 layering
	op_features:						
	flags:
	create_timestamp: Thu Aug 26 17:04:16 2021	# 创建时间
	access_timestamp: Thu Aug 26 17:04:16 2021  # 访问时间
	modify_timestamp: Thu Aug 26 17:04:16 2021	# 修改时间

3.查看当前 ceph 磁盘空间状态

# ceph df 和 服务器上使用的 df 命令类似
[17:18:32 ceph@ceph-deploy ceph-cluster]$ceph df
--- RAW STORAGE ---						# ceph 原生数据
#磁盘		总空间	   可用空间   已使用  总使用
CLASS     SIZE    AVAIL     USED  RAW USED  %RAW USED
hdd    1.6 TiB  1.6 TiB  149 MiB   149 MiB          0
# 总数使用情况
TOTAL  1.6 TiB  1.6 TiB  149 MiB   149 MiB          0

--- POOLS ---							# pool 存储池的数据
POOL                   ID  PGS  STORED  OBJECTS    USED  %USED  MAX AVAIL
device_health_metrics   1    1     0 B        0     0 B      0    507 GiB
32                      2   32     0 B        0     0 B      0    507 GiB
mypool                  3   32     0 B        0     0 B      0    507 GiB
myrbd1                  4   64   405 B        7  48 KiB      0    507 GiB

6.2.4 image 特性简介

特性简介:

#特性简介 
layering: 支持镜像分层快照特性,用于快照及写时复制,可以对 image 创建快照并保护, 然后从快照克隆出新的 image 出来,父子 image 之间采用 COW 技术,共享对象数据。 

striping: 支持条带化 v2,类似 raid 0,只不过在 ceph 环境中的数据被分散到不同的对象 中,可改善顺序读写场景较多情况下的性能。 

exclusive-lock: 支持独占锁,限制一个镜像只能被一个客户端使用。 

object-map: 支持对象映射(依赖 exclusive-lock),加速数据导入导出及已用空间统计等,此 特性开启的时候,会记录 image 所有对象的一个位图,用以标记对象是否真的存在,在一 些场景下可以加速 io。

fast-diff: 快速计算镜像与快照数据差异对比(依赖 object-map)。 

deep-flatten: 支持快照扁平化操作,用于快照管理时解决快照依赖关系等。 

journaling: 修改数据是否记录日志,该特性可以通过记录日志并通过日志恢复数据(依赖独 占锁),开启此特性会增加系统磁盘 IO 使用。

jewel 默认开启的特性包括: layering/exlcusive lock/object map/fast diff/deep flatten

6.2.4.1 镜像特性的启用

启用指定存储池中的指定镜像的特性

# 指定 rbd-data1 pool 开启 exclusive-lock 镜像特性
$ rbd feature enable exclusive-lock --pool rbd-data1 --image data-img1 

# 指定 rbd-data1 pool 开启 object-map 镜像特性
$ rbd feature enable object-map --pool rbd-data1 --image data-img1 

# 指定 rbd-data1 pool 开启 fast-diff  镜像特性
$ rbd feature enable fast-diff --pool rbd-data1 --image data-img1

6.2.4.2 镜像特性的禁用

# 禁用指定存储池中指定镜像的特性: 
# 禁用 fast-diff 特性
$ rbd feature disable fast-diff --pool rbd-data1 --image data-img1

6.2.5 以 json 格式显示镜像信息

--format json --pretty-format 参数以 json 格式展示

# 查看 rbd-data1 的镜像信息
root@ceph-deploy:~# rbd ls --pool rbd-data1 -l --format json --pretty-format
[
    {
        "image": "myimg1",
        "id": "170ec10cd4ce7",
        "size": 5368709120,
        "format": 2
    },
    {
        "image": "myimg2",
        "id": "170ede77fd6b1",
        "size": 3221225472,
        "format": 2
    }
]

6.3 RBD通过 admin 授权客户端挂载

客户端无论是什么操作系统在使用 rbd 存储的时候需要提前安装 ceph-common

6.3.1 centos 挂载演示

6.3.1.1 客户端安装 ceph-common

客户端服务器配置 yum 源及 ceph 认证文件,在下载 ceph-common 工具

# 安装 epel 
[17:26:47 root@server ~]#yum install epel-release.noarch -y

# 下载 ceph-release-1-1.el7.noarch.rpm,由于 centos7 不支持 pacific 版本所以我这下noarch 版
[17:45:02 root@server ~]#wget https://mirrors.aliyun.com/ceph/rpm-15.2.9/el7/noarch/ceph-release-1-1.el7.noarch.rpm

# 安装 ceph-release-1-1.el7.noarch.rpm
[17:46:51 root@server ~]#rpm -ivh ceph-release-1-1.el7.noarch.rpm

# 安装 ceph-common
[17:46:59 root@server ~]#yum install ceph-common -y

6.3.1.2 客户端授权

拷贝 ceph 服务器同步认证文件,在公司一般都是使用普通用户授权,这里我演示使用 admin 授权

这个认证文件是允许客户端连接至我们的 ceph-mon 服务器,如果没有这个认证文件的话客户端找不到 mon 服务器,数据就写不进去,因为需要在 mon 服务器中进行运算,来请求我们的 pool 中的pg

# ceph-deploy 节点操作

# 查看 ceph.client.admin.keyring 是让客户端能够使用 admin 用户
[17:56:40 ceph@ceph-deploy ceph-cluster]$cat ceph.client.admin.keyring
[client.admin]
	key = AQC/hB9hmcMEHBAAbRGwWgJQ+OXacHEPvTM6BA==	# 这个是 admin 用户的 key 
	caps mds = "allow *"
	caps mgr = "allow *"
	caps mon = "allow *"
	caps osd = "allow *"
	
# 将认证文件和配置拷贝至客户端/etc/ceph/,告诉客户端到那个节点上进行认证
[17:55:00 ceph@ceph-deploy ceph-cluster]$sudo scp ceph.conf ceph.client.admin.keyring 10.0.0.30:/etc/ceph/

客户端验证授权成功

# 客户端操作

# 在客户端执行 ceph -s 也能够看到 ceph 集群信息
[17:55:24 root@server ~]#ceph -s
  cluster:
    id:     14ce1d1a-3323-4337-963a-f96484ddd363
    health: HEALTH_WARN
            clock skew detected on mon.ceph-mon2, mon.ceph-mon3

  services:
    mon: 3 daemons, quorum ceph-mon1,ceph-mon2,ceph-mon3 (age 2h)
    mgr: ceph-mgr2(active, since 8h), standbys: ceph-mgr1
    osd: 16 osds: 16 up (since 8h), 16 in (since 5d)

  data:
    pools:   4 pools, 129 pgs
    objects: 7 objects, 405 B
    usage:   149 MiB used, 1.6 TiB / 1.6 TiB avail
    pgs:     129 active+clean

6.3.1.3 客户端映射 img

# 这里我映射的存储池是 myrbd1 ,并且映射当前存储池中的 myimg2 镜像
[17:58:55 root@server ~]#rbd -p myrbd1 map myimg2
/dev/rbd0

假如我这里映射 myimg1 的话就会报错

[18:07:24 root@server ~]#rbd -p myrbd1 map myimg1
rbd: sysfs write failed
RBD image feature set mismatch. You can disable features unsupported by the kernel with "rbd feature disable myrbd1/myimg1 object-map fast-diff deep-flatten".
In some cases useful info is found in syslog - try "dmesg | tail".
rbd: map failed: (6) No such device or address

# 报错为功能不匹配,也就是当前 centos7 的内核不支持,当然我们可以关闭对应功能来实现映射

6.3.1.4 客户端验证 RBD

# 通过查看 rbd0 已经映射过来了
[18:06:39 root@server ~]#lsblk
NAME   MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sda      8:0    0  100G  0 disk
├─sda1   8:1    0    2G  0 part /boot
└─sda2   8:2    0   90G  0 part /
sr0     11:0    1  9.6G  0 rom
rbd0   253:0    0    3G  0 disk	# 存储为 3G

# 通过 fdisk -l 查看
[18:06:44 root@server ~]#fdisk -l

Disk /dev/sda: 107.4 GB, 107374182400 bytes, 209715200 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk label type: dos
Disk identifier: 0x000a0538

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1   *        2048     4196351     2097152   83  Linux
/dev/sda2         4196352   192940031    94371840   83  Linux

Disk /dev/rbd0: 3221 MB, 3221225472 bytes, 6291456 sectors	# 映射过来大小为 3G 因为我们在创建的时候这个镜像大小就是 3g
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 4194304 bytes / 4194304 bytes

6.3.1.5 客户端格式化磁盘并挂载使用

在使用挂载之前我们需要先将该 ceph 提供的映射磁盘格式化

  1. 格式化磁盘

# 这里我格式化为 xfs 格式,ext4 格式也支持
[18:11:08 root@server ~]#mkfs.xfs /dev/rbd0
meta-data=/dev/rbd0              isize=512    agcount=8, agsize=98304 blks
         =                       sectsz=512   attr=2, projid32bit=1
         =                       crc=1        finobt=0, sparse=0
data     =                       bsize=4096   blocks=786432, imaxpct=25
         =                       sunit=1024   swidth=1024 blks
naming   =version 2              bsize=4096   ascii-ci=0 ftype=1
log      =internal log           bsize=4096   blocks=2560, version=2
         =                       sectsz=512   sunit=8 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0

  1. 挂载磁盘

# 挂载至 /mnt/
[18:14:15 root@server ~]#mount /dev/rbd0 /mnt/

# 通过查看实现挂载
[18:15:31 root@server ~]#df | grep rbd0
/dev/rbd0        3135488   33184   3102304   2% /mnt

6.3.1.6 客户端验证

挂载完之后我们验证是否能够成功写入数据

# 写入 /mnt/test.txt 写入成功
[18:18:11 root@server ~]#echo "test mount client" >  /mnt/test.txt

6.4 RBD 通过 centos 普通用户授权挂载演示

6.4.1 创建 pool 开启 RBD 和创建镜像

范例如下:

# 创建 rbd-data1 存储池 pg 和 pgp 都是 32
root@ceph-deploy:~# ceph osd pool create rbd-data1 32 32
pool 'rbd-data1' created

# 启动 RBD 功能
root@ceph-deploy:~# ceph osd pool application enable rbd-data1 rbd
enabled application 'rbd' on pool 'rbd-data1'

# 初始化 rbd-data1
root@ceph-deploy:~# rbd pool init -p rbd-data1

# 创建 img2 镜像,镜像特性为 layering ,镜像格式为 2 这个镜像大小为 3G
root@ceph-deploy:~# rbd create myimg2 --size 3G --pool rbd-data1 --image-format 2 --image-feature layering

# 然后再创建一个 img1 的镜像
root@ceph-deploy:~# rbd create myimg1 --size 5G --pool rbd-data1 --image-format 2 --image-feature layering

# 验证已经创建成功
root@ceph-deploy:~# rbd ls --pool rbd-data1 -l
NAME    SIZE   PARENT  FMT  PROT  LOCK
myimg1  5 GiB            2
myimg2  3 GiB            2

6.4.2 客户端安装 ceph-common

客户端服务器配置 yum 源及 ceph 认证文件,在下载 ceph-common 工具

# 安装 epel 
[17:26:47 root@server ~]#yum install epel-release.noarch -y

# 下载 ceph-release-1-1.el7.noarch.rpm,由于 centos7 不支持 pacific 版本所以我这下noarch 版
[17:45:02 root@server ~]#wget https://mirrors.aliyun.com/ceph/rpm-15.2.9/el7/noarch/ceph-release-1-1.el7.noarch.rpm

# 安装 ceph-release-1-1.el7.noarch.rpm
[17:46:51 root@server ~]#rpm -ivh ceph-release-1-1.el7.noarch.rpm

# 安装 ceph-common
[17:46:59 root@server ~]#yum install ceph-common -y

6.4.3 创建普通账户并授权

测试客户端使用普通账户挂载并使用 RBD

1.在 depoly 节点上创建普通用户 guiyuan 对 rbd-data1 这个 pool 有读写执行请求

root@ceph-deploy:~# ceph auth add client.guiyuan mon 'allow r' osd 'allow rwx pool=rbd-data1'

2.验证用户信息

root@ceph-deploy:~# ceph auth get client.guiyuan
[client.guiyuan]
	key = AQDbmCxhAmWoLxAAmrqnCg1kK46uVOmfl5417Q==
	caps mon = "allow r"
	caps osd = "allow rwx pool=rbd-data1"
exported keyring for client.guiyuan

3.创建 guiyuan 用户的 keyring 文件

root@ceph-deploy:~# ceph-authtool --create-keyring ceph.client.guiyuan.keyring
creating ceph.client.guiyuan.keyring

4.导出用户 keyring

# 将 client.guiyuan 用户指定导出至 ceph.client.guiyuan.keyring 文件
root@ceph-deploy:~# ceph auth get client.guiyuan -o ceph.client.guiyuan.keyring
exported keyring for client.guiyuan

# 验证导出来的文件 key 相同
root@ceph-deploy:~# cat ceph.client.guiyuan.keyring
[client.guiyuan]
	key = AQDbmCxhAmWoLxAAmrqnCg1kK46uVOmfl5417Q==
	caps mon = "allow r"
	caps osd = "allow rwx pool=rbd-data1"

6.4.4 同步普通用户认证文件至客户端

^Croot@ceph-deploy:~# scp ceph.client.guiyuan.keyring /home/ceph/ceph-cluster/ceph.conf root@10.0.0.3:/etc/ceph

# ceph.client.guiyuan.keyring :桂元用户的 keyring
# ceph.conf					  :ceph 配置文件,客户端需要找配置文件中的 mon 节点进行查询 osd

6.4.5 在客户端验证权限

现在至少能够保证我们的 guiyuan 普通用户能够访问 ceph 集群中的 mon 节点了

# 查看 /etc/ceph/ 目录下文件正常
[16:32:15 root@go ~]#ll /etc/ceph/
total 12
-rw------- 1 root root 126 Aug 31 16:52 ceph.client.guiyuan.keyring
-rw-r--r-- 1 root root 260 Aug 31 16:52 ceph.conf
-rw-r--r-- 1 root root  92 Aug  6 01:41 rbdmap

# 通过 --user 指定我们通过 guiyuan 用户来访问 ceph
[17:08:47 root@go ~]#ceph --user guiyuan -s
  cluster:
    id:     14ce1d1a-3323-4337-963a-f96484ddd363
    health: HEALTH_WARN
            clock skew detected on mon.ceph-mon2

  services:
    mon: 3 daemons, quorum ceph-mon1,ceph-mon2,ceph-mon3 (age 8h)
    mgr: ceph-mgr2(active, since 8h), standbys: ceph-mgr1
    mds: 1/1 daemons up
    osd: 16 osds: 16 up (since 8h), 16 in (since 2d)
    rgw: 1 daemon active (1 hosts, 1 zones)

  data:
    volumes: 1/1 healthy
    pools:   11 pools, 377 pgs
    objects: 272 objects, 14 MiB
    usage:   557 MiB used, 1.6 TiB / 1.6 TiB avail
    pgs:     377 active+clean

6.4.6 映射 rbd

使用普通用户权限映射 rbd

# 映射 rbd
[17:10:03 root@go ~]#rbd --user guiyuan -p rbd-data1 map myimg1
/dev/rbd0

# 验证 rbd
[17:37:02 root@go ~]#fdisk -l /dev/rbd0

Disk /dev/rbd0: 5368 MB, 5368709120 bytes, 10485760 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 4194304 bytes / 4194304 bytes

6.4.5 格式化并使用 rbd 镜像

1.格式化

# 格式化为 ext4 
[17:38:41 root@go ~]#mkfs.xfs /dev/rbd0
mke2fs 1.42.9 (28-Dec-2013)
Discarding device blocks: done
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
Stride=1024 blocks, Stripe width=1024 blocks
327680 inodes, 1310720 blocks
65536 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=1342177280
40 block groups
32768 blocks per group, 32768 fragments per group
8192 inodes per group
Superblock backups stored on blocks:
	32768, 98304, 163840, 229376, 294912, 819200, 884736

Allocating group tables: done
Writing inode tables: done
Creating journal (32768 blocks): done
Writing superblocks and filesystem accounting information:
done

2.创建 mysql 文件进行验证

[17:38:51 root@go ~]#mkdir /data/mysql

[17:40:17 root@go ~]#mount /dev/rbd0 /data/mysql/
 
[17:40:40 root@go ~]#df -Hl | grep mysql
/dev/rbd0       5.2G   21M  4.9G   1% /data/mysql

3.安装 mariadb 验证

[17:40:46 root@go ~]#yum install mariadb-server -y

# 修改 mysql 配置文件将存储目录指定到 /data/mysql
[17:45:48 root@go ~]#vim /etc/my.cnf

[mysqld]
datadir=/data/mysql

# 授权 mysql
[18:04:26 root@go ~]#chown -R mysql.mysql /data/mysql/

# 启动 mysql
[18:05:53 root@go ~]#systemctl enable --now mariadb.service

4.再次查看我们会发现 /dev/rbd0 已经有 50M 数据了

[18:06:04 root@go ~]#df -h
Filesystem      Size  Used Avail Use% Mounted on
devtmpfs        900M     0  900M   0% /dev
tmpfs           910M     0  910M   0% /dev/shm
tmpfs           910M  9.5M  901M   2% /run
tmpfs           910M     0  910M   0% /sys/fs/cgroup
/dev/sda2        90G  3.7G   87G   5% /
/dev/sda1       2.0G  142M  1.9G   7% /boot
tmpfs           182M     0  182M   0% /run/user/0
/dev/rbd0       4.8G   50M  4.5G   2% /data/mysql		# 已经有数据了

6.4.6 验证 ceph 内核模块

挂载 rbd 之后系统内核会自动加载 libceph.ko 模块

# 验证加载 libceph  
[18:06:29 root@go ~]#lsmod | grep ceph
libceph               306750  1 rbd
dns_resolver           13140  1 libceph
libcrc32c              12644  2 xfs,libceph

# 查看 libceph 模块信息
[18:08:57 root@go ~]#modinfo libceph
filename:       /lib/modules/3.10.0-1127.el7.x86_64/kernel/net/ceph/libceph.ko.xz
license:        GPL
description:    Ceph core library	
author:         Patience Warnick <patience@newdream.net>
author:         Yehuda Sadeh <yehuda@hq.newdream.net>
author:         Sage Weil <sage@newdream.net>
retpoline:      Y
rhelversion:    7.8
srcversion:     D4ABB648AE8130ECF90AA3F
depends:        libcrc32c,dns_resolver
intree:         Y
vermagic:       3.10.0-1127.el7.x86_64 SMP mod_unload modversions
signer:         CentOS Linux kernel signing key
sig_key:        69:0E:8A:48:2F:E7:6B:FB:F2:31:D8:60:F0:C6:62:D8:F1:17:3D:57
sig_hashalgo:   sha256

6.4.7 镜像空间拉伸

可以扩展空间,不建议缩小空间,在公司中都是通过逻辑卷然后再进行拉伸,如果后期镜像空间不足的话直接通过镜像空间拉伸、把镜像从 3G 扩展到 10G、50G 等

1.查看 rbd 镜像空间当前大小

root@ceph-deploy:~# rbd ls -p rbd-data1 -l
NAME    SIZE   PARENT  FMT  PROT  LOCK
myimg1  5 GiB            2			# 当前在客户端使用的该镜像 5G
myimg2  3 GiB            2

2.通过 rbd resize 命令拉伸镜像大小

root@ceph-deploy:~# rbd resize --pool rbd-data1 --image myimg1 --size 8G
Resizing image: 100% complete...done.

# 指定 pool --image 指定客户端正在使用的 myimg1 镜像 --size 8G 扩展到 8G

3.验证拉伸成功

root@ceph-deploy:~# rbd ls -p rbd-data1 -l
NAME    SIZE   PARENT  FMT  PROT  LOCK
myimg1  8 GiB            2				# 当前客户端使用该镜像 8G
myimg2  3 GiB            2

6.4.8 客户端验证镜像空间

# 默认我们客户端识别不了,现在依旧是 3G
[19:20:33 root@go ~]#df -h| grep rbd
/dev/rbd0       3.0G   72M  3.0G   3% /data/mysql

# 在客户端通过 xfs_growfs 识别
[19:24:33 root@go ~]#xfs_growfs /dev/rbd0
meta-data=/dev/rbd0              isize=512    agcount=8, agsize=98304 blks
         =                       sectsz=512   attr=2, projid32bit=1
         =                       crc=1        finobt=0 spinodes=0
data     =                       bsize=4096   blocks=786432, imaxpct=25
         =                       sunit=1024   swidth=1024 blks
naming   =version 2              bsize=4096   ascii-ci=0 ftype=1
log      =internal               bsize=4096   blocks=2560, version=2
         =                       sectsz=512   sunit=8 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0

# 再次查看 rbd0 已经扩容到了 8G
[19:33:15 root@go ~]#df -h | grep rbd0
/dev/rbd0       8.0G   63M  8.0G   1% /data/mysql

6.4.9 客户端实现开机自动挂载

1.我们只需要将挂载命令放到 /etc/rc.d/rc.local

[18:29:59 root@go ~]#vim /etc/rc.d/rc.local
# 开机之后实现映射
rbd --user guiyuan -p rbd-data1 map myimg1

# 并挂载至 /data/mysql/ 目录
mount /dev/rbd0 /data/mysql/

2.添加执行权限

[18:33:28 root@go ~]#chmod +x /etc/rc.d/rc.local

3.重启验证

[18:33:39 root@go ~]#reboot

# 已经挂载成功
[18:41:22 root@go ~]#df -h | grep dev/rbd0
/dev/rbd0       4.8G   50M  4.5G   2% /data/mysql

6.4.10:卸载 rbd 镜像

当我们客户端不想使用 ceph rbd 挂载了,可以通过下面方式取消挂载

# 先将开机挂载注释
[18:43:00 root@go ~]#vim /etc/rc.d/rc.local
#rbd --user guiyuan -p rbd-data1 map myimg1
#mount /dev/rbd0 /data/mysql/

# 停掉对应挂载服务
[18:43:46 root@go ~]#systemctl stop mariadb.service
[18:44:20 root@go ~]#systemctl disable mariadb.service

# 取消挂载
[18:43:56 root@go ~]#umount /data/mysql

# 但是我们现在还能看见映射关系
[18:59:58 root@go ~]#rbd showmapped
id  pool       namespace  image   snap  device
0   rbd-data1             myimg1  -     /dev/rbd0

# 所以我们需要卸载 rbd
[19:02:28 root@go ~]#rbd --user guiyuan -p rbd-data1 unmap myimg1
# --user guiyuan:指定 guiyuan 用户
# -p rbd-data1 :指定 pool 存储池
# unmap myimg1:卸载 myimg1 镜像

6.4.11 删除 rbd 镜像

镜像删除后数据也会被删除而且是无法恢复,因此在执行删除操作的时候要慎重。

# 在 deploy 节点上删除 myimg1 镜像
root@ceph-deploy:~# rbd rm --pool rbd-data1 --image myimg1
Removing image: 100% complete...done.
# --pool rbd-data1:指定存储池 rbd-data1
# --image myimg1:指定删除镜像 myimg1

# 通过验证 myimg1 已经被删除
root@ceph-deploy:~# rbd ls -p rbd-data1 -l
NAME    SIZE   PARENT  FMT  PROT  LOCK
myimg2  3 GiB            2

镜像被删除的时候 ceph 有个保护机制,就类似于回收站一样

6.4.12 rbd 镜像回收站机制

删除的镜像数据无法恢复,但是还有另外一种方法可以先把镜像移动到回收站,后期确认删除的时候再从回收站删除即可。

这工作中我们一般删除了数据之后等待一周至两周如果没有其他同事来找我,就可以将回收站的数据进行删除

1.查看帮助

root@ceph-deploy:~# rbd help trash 
    trash list (trash ls)             List trash images.
    trash move (trash mv)             Move an image to the trash.
    trash purge                       Remove all expired images from trash.
    trash purge schedule add          Add trash purge schedule.
    trash purge schedule list (... ls)
                                      List trash purge schedule.
    trash purge schedule remove (... rm)
                                      Remove trash purge schedule.
    trash purge schedule status       Show trash purge schedule status.
    trash remove (trash rm)           Remove an image from trash.
    trash restore                     Restore an image from trash.
    watch                             Watch events on image.

2.查看镜像状态

root@ceph-deploy:~# rbd status --pool rbd-data1 --image data-img1
Watchers:
	watcher=10.0.0.3:0/3634085130 client.94543 cookie=18446462598732840961

# --pool rbd-data1:指定查看 rbd-data1
# --image data-img1:指定查看镜像 data-img1

3.删除镜像之前需取消挂载

# 客户端操作
# 先停止客户端应用
[10:00:13 root@go ~]#systemctl stop mariadb.service

# 取消挂载
[10:00:30 root@go ~]#umount /data/mysql

# 取消映射
[10:04:01 root@go ~]#rbd --user guiyuan -p rbd-data1 unmap data-img1

4.将镜像移动至回收站

我们想将回收的镜像在回收站放几天,如果没人找我们的话就可以将其删除

# deploy 节点操作
# 将 data-img1 移动至回收站
root@ceph-deploy:~# rbd trash move --pool rbd-data1 --image data-img1

# 验证当前存储池镜像就没了 data-img1 镜像
root@ceph-deploy:~# rbd ls -p rbd-data1 -l
NAME    SIZE   PARENT  FMT  PROT  LOCK
myimg2  3 GiB            2

5.查看回收站镜像

root@ceph-deploy:~# rbd trash list --pool rbd-data1
1713a9593728e data-img1

# 1713a9593728e 镜像 id

6.还原回收站镜像

如果有人找我们的话我们就可以还原镜像

root@ceph-deploy:~# rbd trash restore --pool rbd-data1 --image data-img1 --image-id 1713a9593728e

# --image-id 1713a9593728e 指定我们想还原的 image-id

7.验证镜像已经还原

root@ceph-deploy:~# rbd ls -p rbd-data1 -l
NAME       SIZE    PARENT  FMT  PROT  LOCK
data-img1  10 GiB            2
myimg2  3 GiB            	 2

# 通过查看 rbd-data1 pool 发现 data-img1 镜像已经还原

8.客户端就可以直接挂载使用,不用格式化

因为该镜像在还原之前已经格式了

# 使用普通用户权限映射 rbd 
[10:16:26 root@go ~]#rbd --user guiyuan -p rbd-data1 map data-img1
/dev/rbd0

# 然后挂载
[10:16:33 root@go ~]#mount /dev/rbd0 /data/mysql/

# 查看挂载信息 xfs 文件系统
[10:16:41 root@go ~]#df -Th| grep data
/dev/rbd0      xfs        10G   63M   10G   1% /data/mysql

# 查看挂载目录
[10:18:07 root@go ~]#ll /data/mysql/
total 28700
-rw-rw---- 1 mysql mysql    16384 Sep  1 10:00 aria_log.00000001
-rw-rw---- 1 mysql mysql       52 Sep  1 10:00 aria_log_control
-rw-rw---- 1 mysql mysql 18874368 Sep  1 10:00 ibdata1
-rw-rw---- 1 mysql mysql  5242880 Sep  1 10:00 ib_logfile0
-rw-rw---- 1 mysql mysql  5242880 Aug 31 19:19 ib_logfile1
drwx------ 2 mysql mysql     4096 Aug 31 19:19 mysql
drwx------ 2 mysql mysql     4096 Aug 31 19:19 performance_schema
drwx------ 2 mysql mysql        6 Aug 31 19:19 test

# 重启客户端服务成功
[10:18:13 root@go ~]#systemctl restart mariadb.service

9.在 rbd 回收机制中删除镜像

# 将 myimg2 镜像添加至回收站
root@ceph-deploy:~# rbd trash move --pool rbd-data1 --image myimg2

# 列出回收站中的镜像
root@ceph-deploy:~# rbd trash list --pool rbd-data1
170ede77fd6b1 myimg2

# 回收站指定 image-id 删除
root@ceph-deploy:~# rbd trash remove --pool rbd-data1 --image-id 170ede77fd6b1
Removing image: 100% complete...done.

# 验证当前回收站已经没有该镜像
root@ceph-deploy:~# rbd trash list --pool rbd-data1

6.5 镜像快照

块存储的话可以通过镜像实现快照的备份,但是会很占用磁盘空间

# 查看帮助
[ceph@ceph-deploy ceph-cluster]$ rbd help snap 
	snap create (snap add)  # 创建快照 
	snap limit clear 		# 清楚镜像的快照数量限制 
	snap limit set		    # 设置一个镜像的快照上限 
	snap list (snap ls) 	# 列出快照 
	snap protect 			# 保护快照被删除 
	snap purge 				# 删除所有未保护的快照 
	snap remove (snap rm) 	# 删除一个快照 
	snap rename 			# 重命名快照 
	snap rollback (snap revert) # 还原快照 
	snap unprotect 			# 允许一个快照被删除(取消快照保护)

6.5.1 客户端创建数据演示

  1. 先在客户端查看 ceph 挂载数据信息

  1. 进入数据库创建数据

    [10:29:31 root@go ~]#mysql
    Welcome to the MariaDB monitor.  Commands end with ; or \g.
    Your MariaDB connection id is 2
    Server version: 5.5.68-MariaDB MariaDB Server
    
    Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.
    
    Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
    
    MariaDB [(none)]> create database zgy;	# 创建 zgy 数据库
    Query OK, 1 row affected (0.00 sec)
    
    MariaDB [(none)]> show databases;
    +--------------------+
    | Database           |
    +--------------------+
    | information_schema |
    | mysql              |
    | performance_schema |
    | test               |
    | zgy                |
    +--------------------+
    5 rows in set (0.01 sec)

这个时候我们想对该数据进行备份的话我们可以使用 mysqldump ,但是这里我使用的是 ceph 的快照机制

6.5.2 创建并验证快照

1.回到 deploy 节点,对刚才客户端使用的镜像做快照

root@ceph-deploy:~# rbd snap create --pool rbd-data1 --image data-img1 --snap mysql-snap-20210831
Creating snap: 100% complete...done.

# rbd snap create 				:创建快照
# --pool rbd-data1				:指定对 rbd-data1 存储池
# --image data-img1				:指定对该镜像 data-img1 创建快照
# --snap mysql-snap-20210831	:自定义创建的快照名字 mysql-snap-20210831

2.验证快照

# 查看当前 rbd-data1 存储池的 data-img1 快照信息
root@ceph-deploy:~# rbd snap list --pool rbd-data1 --image data-img1
SNAPID  NAME                 SIZE    PROTECTED  TIMESTAMP
     4  mysql-snap-20210831  10 GiB             Tue Aug 31 10:33:17 2021

6.5.3 删除数据并还原快照

1.客户端删除数据

# 删除挂载目录数据
[10:38:14 root@go ~]#rm -fr /data/mysql/*

# 验证数据
[10:38:26 root@go ~]#ll /data/mysql/
total 0

2.停止客户端对应服务

[10:38:30 root@go ~]#systemctl stop mariadb.service

3.取消客户端挂载

[10:39:34 root@go ~]#umount /data/mysql

4.客户端取消映射

[10:39:54 root@go ~]#rbd unmap /dev/rbd0

5.回到 ceph-deploy 节点执行快照还原

root@ceph-deploy:~# rbd snap rollback --pool rbd-data1 --image data-img1 --snap mysql-snap-20210831
Rolling back to snapshot: 100% complete...done.

6.5.4 客户端验证数据

客户端需要重新映射并挂载 rbd

#客户端映射 rbd
[10:44:41 root@go ~]#rbd --user guiyuan -p rbd-data1 map data-img1
/dev/rbd0

# 重新挂载至 data/mysql
[10:44:57 root@go ~]#mount /dev/rbd0 /data/mysql/

# 验证数据
[10:45:11 root@go ~]#ll /data/mysql/
total 28700
-rw-rw---- 1 mysql mysql    16384 Sep  1 10:00 aria_log.00000001
-rw-rw---- 1 mysql mysql       52 Sep  1 10:00 aria_log_control
-rw-rw---- 1 mysql mysql 18874368 Sep  1 10:00 ibdata1
-rw-rw---- 1 mysql mysql  5242880 Sep  1 10:18 ib_logfile0
-rw-rw---- 1 mysql mysql  5242880 Aug 31 19:19 ib_logfile1
drwx------ 2 mysql mysql     4096 Aug 31 19:19 mysql
drwx------ 2 mysql mysql     4096 Aug 31 19:19 performance_schema
drwx------ 2 mysql mysql        6 Aug 31 19:19 test
drwx------ 2 mysql mysql       20 Sep  1 10:30 zgy		# zgy 数据库已经还原

# 客户端重启服务
[10:45:28 root@go ~]#systemctl start mariadb.service

# 进入数据
[10:45:39 root@go ~]#mysql
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 2
Server version: 5.5.68-MariaDB MariaDB Server

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| test               |
| zgy                |				# 创建的 zgy 数据库已经还原
+--------------------+
5 rows in set (0.01 sec)

6.5.5 删除快照

deploy 节点操作

# 删除指定快照
root@ceph-deploy:~# rbd snap remove --pool rbd-data1 --image data-img1 --snap mysql-snap-20210831
Removing snap: 100% complete...done.

# 验证快照是否删除
root@ceph-deploy:~# rbd snap list --pool rbd-data1 --image data-img1

6.5.6 快照数量限制

也就是我允许这个存储池中的这个快照只能创建几个,这个主要是限制快照的空间太多会把磁盘占满

1.限制快照数量机制

# 限制 data-img1 快照最多只能有 5 个
root@ceph-deploy:~# rbd snap limit set --pool rbd-data1 --image data-img1 --limit 5

2.清除快照数量限制

root@ceph-deploy:~# rbd snap limit clear --pool rbd-data1 --image data-img1
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇