一、Ceph RDB介绍

Ceph块设备,以前称为RADOS设备,为客户机提供可靠的、分布式的和高性能的块存储磁盘。RADOS块设备利用librbd库,并以顺序的形式在Ceph集群中的多个osd上存储数据块。RBD是由Ceph的RADOS层支持的,因此每个块设备都分布在多个Ceph节点上,提供了高性能和优异的可靠性。RDB有Linux内核的本地支持,这意味着RBD驱动程序从过去几年就与Linux内核集成得很好。除了可靠性和性能之外,RDB还提供了企业特性,例如:完整和增量快照、瘦配置、写时复制克隆、动态调整大小等等。RDB还支持内存缓存,这大大提高了其性能。任何普通的Linux主机(RHEL或基于debian的)都可以充当Ceph客户机。客户端通过网络与Ceph存储集群交互以存储或检索用户数据。Ceph RBD支持已经添加到Linux主线内核中,从2.6.34和以后的版本开始。

Ceph 块存储及客户端配置(二)

 二、客户端安装Ceph软件包

2.1 检查内核是否支持RBD

[root@192-168-5-70 ~]# uname -r    
3.10.0-957.el7.x86_64
[root@192-168-5-70 ~]# modprobe rbd
[root@192-168-5-70 ~]# echo $?
0

2.2 安装ceph软件

# 配置yum源
[root@192-168-5-70 ~]# vim /etc/yum.repos.d/ceph.repo 
[ceph]
name=ceph
baseurl=http://mirrors.aliyun.com/ceph/rpm-mimic/el7/x86_64/
gpgcheck=0
[ceph-noarch]
name=cephnoarch
baseurl=http://mirrors.aliyun.com/ceph/rpm-mimic/el7/noarch/
gpgcheck=0

# 安装ceph软件,要使用rbd命令
[root@192-168-5-70 ~]# yum install ceph -y

 三、为客户端创建Ceph块设备使用的用户名和密钥

3.1 使用ceph-deploy部署后并没有创建任何池,现在要创建块设备rbd默认池

Ceph 块存储及客户端配置(二)

确定 pg_num 取值是强制性的,因为不能自动计算。下面是几个常用的值(总的pg):
• 少于 5 个 OSD 时可把 pg_num 设置为 128
• OSD 数量在 5 到 10 个时,可把 pg_num 设置为 512
• OSD 数量在 10 到 50 个时,可把 pg_num 设置为 4096
• OSD 数量大于 50 时,你得理解权衡方法、以及如何自己计算 pg_num 取值

[cephadmin@ceph01 my-cluster]$ ceph osd lspools          # 查看集群存储池

[cephadmin@ceph01 my-cluster]$ ceph osd pool create rbd 64    # pg测试创建为64

  删除pool的方法

# 在ceph.conf中增加一行信息
[cephadmin@ceph01 my-cluster]$ sudo vim /etc/ceph/ceph.conf    
[global]
mon_allow_pool_delete = true

# 重启ceph-mon.target服务
[cephadmin@ceph01 my-cluster]$ sudo systemctl restart ceph-mon.target

# 删除pool操作
[cephadmin@ceph01 my-cluster]$ ceph osd pool rm rbd rbd --yes-i-really-really-mean-it

3.2 在rbd池中创建大小为2G的块设备

[cephadmin@ceph01 my-cluster]$ rbd create rbd1 --size 2048 --name client.rbd

   对块的其它操作

[cephadmin@ceph01 my-cluster]$ rbd ls           # 查看所有的块

[cephadmin@ceph01 my-cluster]$ rbd ls -p rbd       # -p 指定池的名称,查看池中所有的块

[cephadmin@ceph01 my-cluster]$ rbd info rbd/rbd1    # 查看块的具体信息

[cephadmin@ceph01 my-cluster]$ rbd rm rbd/rbd1         # 删除块

3.4 在管理端的进行创建帐号密码,也可以直接使用管理员帐号。

# 帐户名称是:client.rbd,mon允许读,osd允许读,rbd池允许读写和执行,并把输出的内容写入到 ceph.client.rbd.keyring文件中
[cephadmin@ceph01 my-cluster]$ ceph auth get-or-create client.rbd mon 'allow r' osd 'allow class-read object_prefix rbd_children, allow rwx pool=rbd' | tee ./ceph.client.rbd.keyring [client.rbd] key = AQACvTdesdXGCBAAqUAA5/wxwgvcGsb1vJ03jw==

 3.5 将生成的key和配置文件拷贝到客户端

[cephadmin@ceph01 my-cluster]$ scp ceph.client.rbd.keyring /etc/ceph/ceph.conf root@192.168.5.70:/etc/ceph/

 配置文件中只需要两行即可

[root@192-168-5-70 ~]# cat /etc/ceph/ceph.conf 
[global]
 mon_host = 192.168.5.91,192.168.5.92,192.168.5.93

 3.5 客户端映射块设备,直接映射会报错

Ceph 块存储及客户端配置(二)

 使用krbd(内核rbd)的客户端进行快速diff计算(需要对象映射),我们将无法在CentOS内核3.10上映射块设备映像,因为该内核不支持对象映射(object-map)、深平(deep-flatten)和快速diff(fastdiff)(在内核4.9中引入了支持)。为了解决这个问题,我们将禁用不支持的特性,有几个选项可以做到这一点:

# 动态禁用
rbd feature disable rbd1 exclusive-lock object-map deep-flatten fast-diff --name client.rbd

# 创建RBD镜像时,只启用分层特性。
rbd create rbd1 --size 3072 --image-feature layering --name client.rbd

# ceph 配置文件中禁用
rbd_default_features = 1

3.6 禁用后再进行映射rbd1块设备

[root@192-168-5-70 ~]# rbd map --image rbd1 --name client.rbd
/dev/rbd0

# 查看所有的映射 [root@192-168-5-70 ~]# rbd showmapped --name client.rbd
id pool image      snap device    
0  rbd  rbd1       -    /dev/rbd0
# 取消映射 [root@
192-168-5-70 ~]# rbd unmap /dev/rbd0

3.7 格式化文件系统并挂载

[root@192-168-5-70 ~]# mkfs.xfs /dev/rbd0                                                    # 格式化文件系统
[root@192-168-5-70 ~]# mkdir /mnt/ceph-disk1                                                 # 创建挂载目录
[root@192-168-5-70 ~]# mount /dev/rbd0 /mnt/ceph-disk1                                       # 进行挂载
[root@192-168-5-70 ~]# df -h /mnt/ceph-disk1/
Filesystem      Size  Used Avail Use% Mounted on
/dev/rbd0       2.0G   33M  3.0G   2% /mnt/ceph-disk1
[root@192-168-5-70 ~]# dd if=/dev/zero of=/mnt/ceph-disk1/test_file1.txt count=100 bs=2M     # 向目录写入数据
100+0 records in
100+0 records out
209715200 bytes (210 MB) copied, 0.250715 s, 836 MB/s

3.8 制作成服务开机自动挂载

[root@192-168-5-70 ~]# cat /usr/local/bin/rbd-mount
#!/bin/bash

# Pool name where block device image is stored 池名称,若不同请修改
export poolname=rbd
 
# Disk image name   块名称,若不同请修改
export rbdimage=rbd1
 
# Mounted Directory    # 挂载的目录,若不同请修改
export mountpoint=/mnt/ceph-disk1
 
# Image mount/unmount and pool are passed from the systemd service as arguments
# Are we are mounting or unmounting
if [ "$1" == "m" ]; then
   modprobe rbd
   rbd feature disable $rbdimage object-map fast-diff deep-flatten
   rbd map $rbdimage --id rbd --keyring /etc/ceph/ceph.client.rbd.keyring
   mkdir -p $mountpoint
   mount /dev/rbd/$poolname/$rbdimage $mountpoint
fi
if [ "$1" == "u" ]; then
   umount $mountpoint
   rbd unmap /dev/rbd/$poolname/$rbdimage
fi
[root@192-168-5-70 ~]# chmod +x /usr/local/bin/rbd-mount

[root@192-168-5-70 ~]# cat /etc/systemd/system/rbd-mount.service
[Unit]
Description=RADOS block device mapping for $rbdimage in pool $poolname"
Conflicts=shutdown.target
Wants=network-online.target
After=NetworkManager-wait-online.service
[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/usr/local/bin/rbd-mount m
ExecStop=/usr/local/bin/rbd-mount u
[Install]
WantedBy=multi-user.target
[root@192-168-5-70 ~]# systemctl daemon-reload
[root@192-168-5-70 ~]# systemctl enable rbd-mount.service
[root@192-168-5-70 ~]# reboot
vim /usr/local/bin/rbd-mount

相关文章: