一、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软件包
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默认池
确定 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 客户端映射块设备,直接映射会报错
使用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