CentOS7 安装ceph(mimic版)
一、系统环境
由ceph1、ceph2、ceph3三台主机组成,其中ceph1、ceph2、ceph3是为Ceph存储集群节点,它们分别作为MON节点和OSD节点,各自拥有专用于存储数据的磁盘设备/dev/sdb,操作系统环境均为CentOS Linux release 7.9.2009。系统最小化安装,配置两块磁盘,一块为系统盘,另一块为裸设备(未做分区格式化)。ceph1上安装ceph-deploy用以部署ceph集群。ceph版本为mimic
~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 100G 0 disk
├─sda1 8:1 0 1G 0 part /boot
└─sda2 8:2 0 99G 0 part
└─centos-root 253:0 0 99G 0 lvm /
sdb 8:16 0 100G 0 disk
二、基础配置
最小化安装操作系统,关闭防火墙,禁用SELinux,配置本地域名解析,配置时间同步
~]# systemctl stop firewalld; systemctl disable firewalld; systemctl mask firewalld
~]# sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config && setenforce 0
~]# sed -i '/swap/s/^[^#]/#&/' /etc/fstab
配置hosts解析
~]# cat /etc/hosts
192.168.20.61 ceph1
192.168.20.62 ceph2
192.168.20.63 ceph3
配置阿里yum源
~]# curl -o /etc/yum.repos.d/Centos-7.repo http://mirrors.aliyun.com/repo/Centos-7.repo
~]# sed -i -e '/mirrors.cloud.aliyuncs.com/d' -e '/mirrors.aliyuncs.com/d' /etc/yum.repos.d/Centos-7.repo
安装基础软件,安装epel源
~]# yum -y install bash-completion vim-enhanced net-tools make cmake gcc gcc-c++ zip unzip yum-utils tree wget curl lrzsz epel-release
配置时间同步
~]# yum install chrony -y
~]# vim /etc/chrony.conf
server ntp1.aliyun.com iburst
server ntp2.aliyun.com iburst
server ntp3.aliyun.com iburst
allow 192.168.1.0/24 # 只允许192.168.1网段的客户端进行时间同步
~]# systemctl enable chronyd.service; systemctl restart chronyd.service
~]# chronyc sources -v #说明:^* #已同步
三、安装ceph集群
安装Ceph官方的仓库 http://download.ceph.com/
~]# rpm -ivh https://mirrors.aliyun.com/ceph/rpm-mimic/el7/noarch/ceph-release-1-1.el7.noarch.rpm
创建部署ceph的特定账号(不要使用ceph),并设置无密码运行sudo命令的权限
~]# useradd cephdep
~]# echo "ceph" | passwd --stdin cephdep
~]# echo "cephdep ALL = (root) NOPASSWD:ALL" | sudo tee /etc/sudoers.d/cephdep
~]# chmod 0440 /etc/sudoers.d/cephdep
在ceph1上用cephdep用户配置免秘钥登陆整个集群
~]# su - cephdep
[cephdep@ceph1 ~]$ ssh-keygen -t rsa -b 2048 -N '' ~/.ssh/id_rsa
[cephdep@ceph1 ~]$ ssh-copy-id cephdep@ceph1
[cephdep@ceph1 ~]$ ssh-copy-id cephdep@ceph2
[cephdep@ceph1 ~]$ ssh-copy-id cephdep@ceph3
修改管理节点上cephadm用户的 ~/.ssh/config 文件,设定其访问Ceph集群各节点时默认使用的用户名为cephdep
[cephdep@ceph1 ~]$ vim ~/.ssh/config
Host ceph1
Hostname ceph1
User cephdep
Host ceph2
Hostname ceph2
User cephdep
Host ceph3
Hostname ceph3
User cephdep
[cephdep@ceph1 ~]$ chmod 0600 ~/.ssh/config
Ceph存储集群的部署的过程可通过管理节点使用ceph-deploy全程进行,这里首先在管理节点安装ceph-deploy及其依赖到的程序包:
[cephdep@ceph1 ~]$ sudo yum -y install ceph-deploy python-setuptools python2-subprocess32
以cephadm用户创建集群相关的配置文件目录:
[cephdep@ceph1 ~]$ mkdir ceph-cluster; cd ceph-cluster
初始化第MON节点,准备创建集群
[cephdep@ceph1 ceph-cluster]$ ceph-deploy new ceph1 ceph2 ceph3
编辑生成的ceph.conf文件,例如在[global]配置段中设置Ceph集群面向客户端通信时使用的IP地址所在的网络,即公网网络地址:public network = 192.168.20.0/24
安装ceph集群,ceph-deploy命令能够以远程的方式连入Ceph集群各节点完成程序包安装等操作
ceph版本为13.2.10
[cephdep@ceph1 ceph-cluster]$ ceph-deploy install ceph1 ceph2 ceph3
[root@ceph1 ~]# rpm -qa | grep ceph
ceph-deploy-2.0.1-0.noarch
ceph-common-13.2.10-0.el7.x86_64
ceph-mds-13.2.10-0.el7.x86_64
ceph-radosgw-13.2.10-0.el7.x86_64
ceph-release-1-1.el7.noarch
python-cephfs-13.2.10-0.el7.x86_64
ceph-base-13.2.10-0.el7.x86_64
ceph-osd-13.2.10-0.el7.x86_64
ceph-mon-13.2.10-0.el7.x86_64
ceph-13.2.10-0.el7.x86_64
python-ceph-argparse-13.2.10-0.el7.x86_64
libcephfs2-13.2.10-0.el7.x86_64
ceph-selinux-13.2.10-0.el7.x86_64
ceph-mgr-13.2.10-0.el7.x86_64
配置初始MON节点,并收集所有密钥:
[cephdep@ceph1 ceph-cluster]$ ceph-deploy mon create-initial
把配置文件和admin密钥拷贝Ceph集群各节点,以免得每次执行”ceph“命令行时不得不明确指定MON节点地址和ceph.client.admin.keyring;在Ceph集群中需要运行ceph命令的的节点上(或所有节点上)以root用户的身份设定用户cephadm能够读取/etc/ceph/ceph.client.admin.keyring文件
[cephdep@ceph1 ceph-cluster]$ ceph-deploy admin ceph1 ceph2 ceph3
[cephdep@ceph1 ceph-cluster]$ sudo setfacl -m u:cephdep:r /etc/ceph/ceph.client.admin.keyring
配置Manager节点,启动ceph-mgr进程(仅Luminious+版本):
[cephdep@ceph1 ceph-cluster]$ ceph-deploy mgr create ceph1 ceph2
在Ceph集群内的节点上以cephadm用户的身份运行如下命令,测试集群的健康状态:
[cephdep@ceph1 ceph-cluster]$ ceph -s
cluster:
id: 1345fb27-3a07-4882-b716-675c61ba612c
health: HEALTH_OK
services:
mon: 3 daemons, quorum ceph1,ceph2,ceph3
mgr: ceph1(active), standbys: ceph2
osd: 3 osds: 3 up, 3 in
data:
pools: 0 pools, 0 pgs
objects: 0 objects, 0 B
usage: 3.0 GiB used, 297 GiB / 300 GiB avail
pgs
向RADOS集群添加OSD
“ceph-deploy disk”命令可以检查并列出OSD节点上所有可用的磁盘的相关信息:
[cephdep@ceph1 ceph-cluster]$ ceph-deploy disk list ceph1 ceph2 ceph3
/dev/sda为系统盘
使用ceph-deploy命令擦除计划专用于OSD磁盘上的所有分区表和数据以便用于OSD,命令格式
为”ceph-deploy disk zap {osd-server-name} {disk-name}“,需要注意的是此步会清除目标设备上的所有数据。
[cephdep@ceph1 ceph-cluster]$ ceph-deploy disk zap ceph1 /dev/sdb
[cephdep@ceph1 ceph-cluster]$ ceph-deploy disk zap ceph2 /dev/sdb
[cephdep@ceph1 ceph-cluster]$ ceph-deploy disk zap ceph3 /dev/sdb
把节点上的设备/dev/sdb添加为OSD:
[cephdep@ceph1 ceph-cluster]$ ceph-deploy osd create ceph1 --data /dev/sdb
[cephdep@ceph1 ceph-cluster]$ ceph-deploy osd create ceph2 --data /dev/sdb
[cephdep@ceph1 ceph-cluster]$ ceph-deploy osd create ceph3 --data /dev/sdb
使用”ceph-deploy osd list”命令列出指定节点上的OSD:
[cephdep@ceph1 ceph-cluster]$ ceph-deploy osd list ceph1 ceph2 ceph3
管理员也可以使用ceph命令查看OSD的相关信息:
[cephdep@ceph1 ceph-cluster]$ ceph osd stat
3 osds: 3 up, 3 in; epoch: e13
[cephdep@ceph1 ceph-cluster]$ ceph -s
cluster:
id: 1345fb27-3a07-4882-b716-675c61ba612c
health: HEALTH_OK
services:
mon: 3 daemons, quorum ceph1,ceph2,ceph3
mgr: ceph1(active), standbys: ceph2
osd: 3 osds: 3 up, 3 in
data:
pools: 0 pools, 0 pgs
objects: 0 objects, 0 B
usage: 3.0 GiB used, 297 GiB / 300 GiB avail
pgs
从RADOS集群中移除OSD的方法
Ceph集群中的一个OSD通常对应于一个设备,且运行于专用的守护进程。在某OSD设备出现故障,或管理员出于管
理之需确实要移除特定的OSD设备时,需要先停止相关的守护进程,而后再进行移除操作。对于Luminous及其之后
的版本来说,停止和移除命令的格式分别如下所示:
1.停用设备:ceph osd out {osd-num}
2.停止进程:sudo systemctl stop ceph-osd@{osd-num}
3.移除设备:ceph osd purge {id} --yes-i-really-mean-it
若类似如下的OSD的配置信息存在于ceph.conf配置文件中,管理员在删除OSD之后手动将其删除。
[osd.1] host = {hostname}
不过,对于Luminous之前的版本来说,管理员需要依次手动执行如下步骤删除OSD设备:
1.于CRUSH运行图中移除设备:ceph osd crush remove {name}
2.移除OSD的认证key:ceph auth del osd.{osd-num}
3.最后移除OSD设备:ceph osd rm {osd-num}
四、ceph集群应用
1、Ceph块设备接口(RBD)
• RBD, 全称RADOS Block Devices, 是一种建构在RADOS存储集群之上为客户端
提供块设备接口的存储服务中间层
• 这类的客户端包括虚拟化程序KVM(结合qemu) 和云的计算操作系统OpenStack和
CloudStack等
• RBD基于RADOS存储集群中的多个OSD进行条带化, 支持存储空间的简配(thinprovisioning) 和动态扩容等特性, 并能够借助于RADOS集群实现快照、 副本和一
致性
• BD自身也是RADOS存储集群的客户端, 它通过将存储池提供的存储服务抽象为一
到多个image(表现为块设备) 向客户端提供块级别的存储接口
• RBD支持两种格式的image, 不过v1格式因特性较少等原因已经处于废弃状态, 当前默认
使用的为v2格式
•客户端访问RBD设备的方式有两种
• 通过内核模块rbd.ko将image映射为节点本地的块设备, 相关的设备文件一般为
/dev/rdb#(#为设备编号, 例如rdb0等)
• 另一种则是librbd提供的API接口, 它支持C/C++和Python等编程语言, qemu即是此类接
口的客户端
例如,下面的命令创建一个名为rbddata的存储池,在启用rbd功能后对其进行初始化:
创建存储池rbdpool,PG数为128,并把存储池rbdpool设置为rbd,执行初始化
[cephdep@ceph1 ceph-cluster]$ ceph osd pool create rbdpool 128
pool 'rbdpool' created
[cephdep@ceph1 ceph-cluster]$ ceph osd pool application enable rbdpool rbd
enabled application 'rbd' on pool 'rbdpool'
[cephdep@ceph1 ceph-cluster]$ rbd pool init -p rbdpool
查看创建的存储池以及PG数
[cephdep@ceph1 ceph-cluster]$ ceph osd lspools
1 rbdpool
[cephdep@ceph1 ceph-cluster]$ ceph osd pool get rbdpool pg_num
pg_num: 128
[cephdep@ceph1 ceph-cluster]$ ceph -s
cluster:
id: 1345fb27-3a07-4882-b716-675c61ba612c
health: HEALTH_OK
services:
mon: 3 daemons, quorum ceph1,ceph2,ceph3
mgr: ceph1(active), standbys: ceph2
osd: 3 osds: 3 up, 3 in
data:
pools: 1 pools, 128 pgs
objects: 0 objects, 0 B
usage: 3.0 GiB used, 297 GiB / 300 GiB avail
pgs: 128 active+clean
rbd存储池并不能直接用于块设备,而是需要事先在其中按需创建映像(image),并把映像文件作为块设备使用。rbd命令可用于创建、查看及删除块设备相在的映像(image),以及克隆映像、创建快照、将映像回滚到快
照和查看快照等管理操作。
创建一个名为img1的镜像,大小为20G
创建的镜像默认具有5个特性features,这些特性可以单独启用或禁用
[cephdep@ceph1 ceph-cluster]$ rbd ls --pool rbdpool
img1
[cephdep@ceph1 ceph-cluster]$ rbd create img1 --size 20G --pool rbdpool
[cephdep@ceph1 ceph-cluster]$ rbd --image img1 --pool rbdpool info
rbd image 'img1':
size 20 GiB in 5120 objects
order 22 (4 MiB objects)
id: 5e846b8b4567
block_name_prefix: rbd_data.5e846b8b4567
format: 2
features: layering, exclusive-lock, object-map, fast-diff, deep-flatten
op_features:
flags:
create_timestamp: Fri May 21 22:56:31 2021
禁用镜像特性
[cephdep@ceph1 ceph-cluster]$ rbd feature disable --pool rbdpool --image img1 object-map fast-diff deep-flatten
[cephdep@ceph1 ceph-cluster]$ rbd --image img1 --pool rbdpool info
rbd image 'img1':
size 20 GiB in 5120 objects
order 22 (4 MiB objects)
id: 5e846b8b4567
block_name_prefix: rbd_data.5e846b8b4567
format: 2
features: layering, exclusive-lock
op_features:
flags:
create_timestamp: Fri May 21 22:56:31 2021
创建拥有访问相关存储池权限的账号,该账号对mon有只读,对rbdpool存储池有所有权限
[cephdep@ceph1 ~]$ ceph auth get-or-create client.userbd mon 'allow r' osd 'allow * pool=rbdpool'
[client.rbd]
key = AQCLSahge5jYHBAAEBKEO6+hF8QKB2v6NvienQ==
[cephdep@ceph1 ~]$ ceph auth get client.userbd -o ceph.client.userbd.keyring
[client.rbd]
key = AQCLSahge5jYHBAAEBKEO6+hF8QKB2v6NvienQ==
[root@ceph1 ceph]# ceph auth get client.userbd -o ceph.client.userbd.keyring
exported keyring for client.userbd
[root@ceph1 ceph]# ls
ceph.client.admin.keyring ceph.client.userbd.keyring ceph.conf rbdmap tmpbCpHL8
把ceph.conf 和keyring文件复制到客户端(ceph.client.admin.keyring或者ceph.client.userbd.keyring)
在客户端主机上,用户通过内核级的rbd驱动识别相关的设备,即可对其进行分区、创建文件系统并挂载使用。命令modinfo ceph可查看内核是否支持filename: /lib/modules/3.10.0-1160.el7.x86_64/kernel/fs/ceph/ceph.ko.xz
安装ceph-common
[root@hlro ~]# yum -y install ceph-common
拷贝ceph.conf 和keyring文件至/etc/cpeh目录下
[root@hlro ceph]# ls
ceph.client.userbd.keyring ceph.conf rbdmap
把存储池rbdpool下的img1镜像映射至客户端
[root@hlro ceph]# rbd showmapped
[root@hlro ceph]# rbd --user userbd map rbdpool/img1
/dev/rbd0
[root@hlro ceph]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 100G 0 disk
├─sda1 8:1 0 1G 0 part /boot
└─sda2 8:2 0 99G 0 part
└─centos-root 253:0 0 99G 0 lvm /
sr0 11:0 1 973M 0 rom
rbd0 252:0 0 20G 0 disk
[root@hlro ceph]# rbd showmapped
id pool image snap device
0 rbdpool img1 - /dev/rbd0
取消映射用[root@hlro ceph]# rbd unmap /dev/rbd0
对磁盘分区格式化后,挂载使用
[root@hlro ceph]# mkfs.xfs /dev/rbd0
Discarding blocks...Done.
meta-data=/dev/rbd0 isize=512 agcount=16, agsize=327680 blks
= sectsz=512 attr=2, projid32bit=1
= crc=1 finobt=0, sparse=0
data = bsize=4096 blocks=5242880, 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
[root@hlro ceph]# mkdir /rbddata; mount /dev/rbd0 /rbddata
[root@hlro ceph]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/centos-root 99G 2.3G 97G 3% /
/dev/sda1 1014M 151M 864M 15% /boot
tmpfs 182M 0 182M 0% /run/user/0
/dev/rbd0 20G 33M 20G 1% /rbddata
2、CephFS
• CephFS用于为RADOS存储集群提供一个POSIX兼容的文件系统接口
• 基于RADOS存储集群将数据与元数据IO进行解耦
• 动态探测和迁移元数据负载到其它MDS, 实现了对元数据IO的扩展
• 第一个稳定版随Jewel版本释出
• 自Luminous版本起支持多活MDS(Multiple Active MDS)
CephFS需要至少运行一个元数据服务器(MDS)守护进程(ceph-mds),此进程管理与CephFS上存储的文件相关
的元数据,并协调对Ceph存储集群的访问。因此,若要使用CephFS接口,需要在存储集群中至少部署一个MDS实
[root@ceph1 ~]# su - cephdep
[cephdep@ceph1 ~]$ cd ceph-cluster/
[cephdep@ceph1 ceph-cluster]$ ceph-deploy mds create ceph1
[cephdep@ceph1 ceph-cluster]$ ceph mds stat
, 1 up:standby
使用CephFS之前需要事先于集群中创建一个文件系统,并为其分别指定元数据和数据相关的存储池。下面创建一个
名为cephfs的文件系统用于测试,它使用cephfs-metadata为元数据存储池,使用cephfs-data为数据存储池:
[cephdep@ceph1 ceph-cluster]$ ceph osd pool create cephfs-metadata 64
pool 'cephfs-metadata' created
[cephdep@ceph1 ceph-cluster]$ ceph osd pool create cephfs-data 64
pool 'cephfs-data' created
[cephdep@ceph1 ceph-cluster]$ ceph fs new cephfs cephfs-metadata cephfs-data
new fs with metadata pool 1 and data pool 2
[cephdep@ceph1 ceph-cluster]$ ceph osd pool ls
cephfs-metadata
cephfs-data
[cephdep@ceph1 ceph-cluster]$ ceph mds stat
cephfs-1/1/1 up {0=ceph1=up:active}
[cephdep@ceph1 ceph-cluster]$ ceph fs status cephfs
cephfs - 0 clients
======
+------+--------+-------+---------------+-------+-------+
| Rank | State | MDS | Activity | dns | inos |
+------+--------+-------+---------------+-------+-------+
| 0 | active | ceph1 | Reqs: 0 /s | 10 | 13 |
+------+--------+-------+---------------+-------+-------+
+-----------------+----------+-------+-------+
| Pool | type | used | avail |
+-----------------+----------+-------+-------+
| cephfs-metadata | metadata | 2286 | 93.9G |
| cephfs-data | data | 0 | 93.9G |
+-----------------+----------+-------+-------+
+-------------+
| Standby MDS |
+-------------+
+-------------+
MDS version: ceph version 13.2.10 (564bdc4ae87418a232fc901524470e1a0f76d641) mimic (stable)
客户端通过内核中的cephfs文件系统接口即可挂载使用cephfs文件系统,或者通过FUSE接口与文件系统进行交互。
内核文件系统:ceph, libcephfs,客户端安装ceph-common
用户空间文件系统(FUSE):libcephfs,客户端安装ceph-fuse
创建访问存储池授权账号
[cephdep@ceph1 ceph-cluster]$ ceph auth get-or-create client.fsclient mon 'allow r' mds 'allow rw' osd 'allow * pool=cephfs-data,allow * pool=cephfs-metadata' -o ceph.client.fsclient.keyring
[cephdep@ceph1 ceph-cluster]$ ceph auth get client.fsclient
exported keyring for client.fsclient
[client.fsclient]
key = AQCgcahgX7+DIhAATyvysu8/A+Z1qRrWBIhQjw==
caps mds = "allow rw"
caps mon = "allow r"
caps osd = "allow * pool=cephfs-data"
内核文件系统挂载:客户端挂载使用需要把key和用户名需要分开指定,即需要把key和用户名分开保存
[cephdep@ceph1 ceph-cluster]$ ceph auth print-key client.fsclient > ceph.client.fsclient.key
客户端安装对应版本的ceph-common
[root@hlro ~]# yum -y install ceph-common
把ceph.conf 和ceph.client.fsclient.key复制到客户端的/etc/ceph
创建挂载点并挂载
[root@hlro ceph]# mkdir /fsdata
[root@hlro ceph]# mount -t ceph ceph1:6789,ceph2:6789,ceph3:6789:/ /fsdata -o name=fsclient,secretfile=/etc/ceph/ceph.client.fsclient.key #ceph1,2,3为mon运行的节点
[root@hlro ceph]# mount
192.168.20.61:6789,192.168.20.62:6789:/ on /fsdata type ceph (rw,relatime,name=fsclient,secret=<hidden>,acl,wsize=16777216)
设置开机自动挂载
[root@hlro ceph]# vim /etc/fstab
ceph1:6789,ceph2:6789,ceph3:6789/ /fsdata ceph name=fsclient,secretfile=/etc/ceph/ceph.client.fsclient.key,_netdev,noatime 0 0
用户空间文件系统(FUSE):若内核不支持ceph,则使用该方式(性能不如内核文件系统)
安装对应版本的ceph-fuse
[root@hlro ~]# yum -y install ceph-fuse
把把ceph.conf 和ceph.client.fsclient.keyring文件复制到客户端的/etc/ceph
创建挂载点并挂载
[root@hlro ceph]# mkdir /fsdata
[root@hlro ceph]# ceph-fuse -n client.fsclient -m ceph1:6789,ceph2:6789,ceph3:6789 /fsdata #ceph1,2,3为mon运行的节点
ceph-fuse[1574]: starting ceph client2021-05-22 11:39:59.684 7f0abcac1c00 -1 init, newargv = 0x5577d4551e00 newargc=7
ceph-fuse[1574]: starting fuse
[root@hlro ceph]# mount
ceph-fuse on /fsdata type fuse.ceph-fuse (rw,nosuid,nodev,relatime,user_id=0,group_id=0,allow_other)
开机自动挂载
[root@hlro ceph]# vim /etc/fstab
none /fsdata fuse.ceph ceph.id=fsclient,ceph.conf=/etc/ceph/ceph.conf,_netdev,defaults 0 0
[root@hlro ceph]# vim /etc/fstab
取消挂载后,执行mount -a验证
[root@hlro ceph]# umount /fsdata
[root@hlro ceph]# mount -a
ceph-fuse[1775]: starting ceph client
2021-05-22 11:48:19.227 7f032d0f1c00 -1 init, newargv = 0x5637a1de7b90 newargc=9
ceph-fuse[1775]: starting fuse
[root@hlro ceph]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/centos-root 99G 1.7G 98G 2% /
/dev/sda1 1014M 151M 864M 15% /boot
tmpfs 182M 0 182M 0% /run/user/0
ceph-fuse 94G 0 94G 0% /fsdata