集群组件

Ceph集群包括Ceph OSD,Ceph Monitor两种守护进程。

Ceph OSD(Object Storage Device): 功能是存储数据,处理数据的复制、恢复、回填、再均衡,并通过检查其他OSD守护进程的心跳来向Ceph Monitors提供一些监控信息。

Ceph Monitor: 是一个监视器,监视Ceph集群状态和维护集群中的各种关系。

Ceph存储集群至少需要一个Ceph Monitor和两个 OSD 守护进程。

环境准备:

1.准备四台机器,且都可以上网,分配静态IP(client计算机外,其余节点至少在增加一块硬盘,至少1GB,不分区)

每台机器编辑hosts,实现名称解析

vim  /etc/hosts

192.168.10.41  node1

192.,168.10.42 node2

192.168.10.43 node3

192,.168.10.44 client

2.关闭防火墙,selinux  

systemctl stop firewalld & systemctl disable firewalld 

setenforce  0

3.主机之间时间同步

systemctl restart  ntpd

systemctl enable ntpd

4.配置安装源:

yum install epel-release -y

vim /etc/yum.repos.d/ceph.repo


[ceph]

name=ceph

baseurl=http://mirrors.aliyun.com/ceph/rpm-mimic/el7/x86_64/

enabled=1

gpgcheck=0

priority=1

[ceph-noarch]

name=cephnoarch

baseurl=http://mirrors.aliyun.com/ceph/rpm-mimic/el7/noarch/

enabled=1

gpgcheck=0

priority=1

[ceph-source]

name=Ceph source packages

baseurl=http://mirrors.aliyun.com/ceph/rpm-mimic/el7/SRPMS

enabled=1

gpgcheck=0

priority=1

集群部署开始:

第1步: 配置ssh免密

以node1为==部署配置节点==,在node1上配置ssh等效性(要求ssh node1,node2,node3 ,client都要免密码)

说明: 此步骤不是必要的,做此步骤的目的:

  • 如果使用ceph-deploy来安装集群,密钥会方便安装

  • 如果不使用ceph-deploy安装,也可以方便后面操作: 比如同步配置文件

[root@node1 ~]# ssh-keygen  

[root@node1 ~]# ssh-copy-id -i node1

[root@node1 ~]# ssh-copy-id -i node2

[root@node1 ~]# ssh-copy-id -i node3

[root@node1 ~]# ssh-copy-id -i client

第2步: 在node1上安装部署工具

(其它节点不用安装)

​​[root@node1 ~]# yum install ceph-deploy -y

第3步: 在node1上创建集群

建立一个集群配置目录

[root@node1 ~]# mkdir /etc/ceph

[root@node1 ~]# cd /etc/ceph

[root@node1 ceph]# ceph-deploy new node1

[root@node1 ceph]# ls

ceph.conf  ceph-deploy-ceph.log  ceph.mon.keyring

说明:

ceph.conf      集群配置文件

ceph-deploy-ceph.log   使用ceph-deploy部署的日志记录

ceph.mon.keyring  mon的验证key文件

第4步: ceph集群节点安装ceph

# yum install ceph ceph-radosgw -y

# ceph -v

补充说明:

  • 如果公网OK,并且网速好的话,可以用​​ceph-deploy install node1 node2 node3​

所以这里我们选择直接用准备好的本地ceph源,然后​yum install ceph ceph-radosgw -y​安装。

第5步: 客户端安装​​ceph-common​

​[root@client ~]# yum install ceph-common -y

第6步: 创建mon(监控)

增加public网络用于监控

在[global]配置段里添加下面一句(直接放到最后一行)

[root@node1 ceph]# vim /etc/ceph/ceph.conf  

public network = 10.1.1.0/24 

监控节点初始化,并同步配置到所有节点(node1,node2,node3,不包括client)

[root@node1 ceph]# ceph-deploy mon create-initial

[root@node1 ceph]# ceph health    

HEALTH_OK 

将配置文件信息同步到所有节点

[root@node1 ceph]# ceph-deploy admin node1 node2 node3

[root@node1 ceph]# ceph -s

为了防止mon单点故障,你可以加多个mon节点(建议奇数个,因为有quorum仲裁投票)

[root@node1 ceph]# ceph-deploy mon add node2  

[root@node1 ceph]# ceph-deploy mon add node3

[root@node1 ceph]# ceph -s

监控到时间不同步的解决方法

1, 在ceph集群所有节点上(​​node1​​​,​​node2​​,​​node3​​)不使用ntpd服务,直接使用crontab同步

# systemctl stop ntpd

# systemctl disable ntpd

# crontab -e

*/10 * * * * ntpdate ntp1.aliyun.com    每5或10分钟同步1次公网的任意时间服务器

2. 调大时间警告的阈值

[root@node1 ceph]# vim ceph.conf

[global]        在global参数组里添加以下两行      

......

mon clock drift allowed = 2    # monitor间的时钟滴答数(默认0.5秒)

mon clock drift warn backoff = 30  # 调大时钟允许的偏移量(默认为5)

3, 同步到所有节点

[root@node1 ceph]# ceph-deploy --overwrite-conf admin node1 node2 node3

4, **所有ceph集群节点**上重启ceph-mon.target服务

# systemctl restart ceph-mon.target

第7步: 创建mgr(管理)

[root@node1 ceph]# ceph-deploy mgr create node1

[root@node1 ceph]# ceph -s

添加多个mgr可以实现HA

[root@node1 ceph]# ceph-deploy mgr create node2

[root@node1 ceph]# ceph-deploy mgr create node3

[root@node1 ceph]# ceph -s

第8步: 创建osd(存储盘)

[root@node1 ceph]# ceph-deploy disk --help

[root@node1 ceph]# ceph-deploy osd --help

列表查看节点上的磁盘

[root@node1 ceph]# ceph-deploy disk list node1

[root@node1 ceph]# ceph-deploy disk list node2

[root@node1 ceph]# ceph-deploy disk list node3

zap表示干掉磁盘上的数据,相当于格式化

[root@node1 ceph]# ceph-deploy disk zap node1 /dev/sdb

[root@node1 ceph]# ceph-deploy disk zap node2 /dev/sdb

[root@node1 ceph]# ceph-deploy disk zap node3 /dev/sdb

将磁盘创建为osd

[root@node1 ceph]# ceph-deploy osd create --data /dev/sdb node1

[root@node1 ceph]# ceph-deploy osd create --data /dev/sdb node2

[root@node1 ceph]# ceph-deploy osd create --data /dev/sdb node3

[root@node1 ceph]# ceph -s

 cluster:

   id:     c05c1f28-ea78-41b7-b674-a069d90553ac

   health: HEALTH_OK

 services:

   mon: 3 daemons, quorum node1,node2,node3

   mgr: node1(active), standbys: node2, node3

   osd: 3 osds: 3 up, 3 in         看到这里有3个osd

 data:

   pools:   0 pools, 0 pgs

   objects: 0  objects, 0 B

   usage:   41 MiB used, 2.9 GiB / 3.0 GiB avail  pgs 大小为3个磁盘的总和

集群节点的扩容方法

假设再加一个新的集群节点node4

1, 主机名配置和绑定

2, 在node4上​​yum install ceph ceph-radosgw -y​​安装软件

3, 在部署节点node1上同步配置文件给node4. ​​ceph-deploy admin node4​

4, 按需求选择在node4上添加mon或mgr或osd等

创建pool

创建test_pool,指定pg数为128

[root@node1 ceph]# ceph osd pool create test_pool 128

查看pg数量,可以使用ceph osd pool set test_pool pg_num 64这样的命令来尝试调整

[root@node1 ceph]# ceph osd pool get test_pool pg_num

说明: pg数与ods数量有关系

  • pg数为2的倍数,一般5个以下osd,分128个PG或以下即可(分多了PG会报错的,可按报错适当调低)

  • 可以使用​​ceph osd pool set test_pool pg_num 64​​这样的命令来尝试调整

存储测试

1. 我这里把本机的/etc/fstab文件上传到test_pool,并取名为newfstab

[root@node1 ceph]# rados put newfstab /etc/fstab --pool=test_pool

2. 查看

​[root@node1 ceph]# rados -p test_pool ls

3.删除

​[root@node1 ceph]# rados rm newfstab --pool=test_pool

删除pool

1.在部署节点node1上增加参数允许ceph删除pool

​[root@node1 ceph]# vim /etc/ceph/ceph.conf 

2.修改了配置,需要同步到其他集群节点

​[root@node1 ceph]# ceph-deploy --overwrite-conf admin node1 node2 node3

3.重启监控服务

​[root@node1 ceph]# systemctl restart ceph-mon.target

4.删除时pool名输入两次,然后接​--yes-i-really-really-mean-it​参数就可以删除了

​[root@node1 ceph]# ceph osd pool delete test_pool test_pool --yes-i-really-really-mean-it

五、创建Ceph文件存储

要运行Ceph文件系统, 你必须先创建至少带一个mds的Ceph存储集群.

创建文件存储并使用

第1步: 在node1部署节点上同步配置文件,并创建mds服务(也可以做多个mds实现HA)

​[root@node1 ceph]# ceph-deploy mds create node1 node2 node3

第2步: 一个Ceph文件系统需要至少两个RADOS存储池,一个用于数据,一个用于元数据。所以我们创建它们

[root@node1 ceph]# ceph osd pool create cephfs_pool 128

pool 'cephfs_pool' created

[root@node1 ceph]# ceph osd pool create cephfs_metadata 64

pool 'cephfs_metadata' created

[root@node1 ceph]# ceph osd pool ls |grep cephfs

cephfs_pool

cephfs_metadata

第3步: 创建Ceph文件系统,并确认客户端访问的节点

[root@node1 ceph]# ceph fs new cephfs cephfs_metadata cephfs_pool

[root@node1 ceph]# ceph fs ls

name: cephfs, metadata pool: cephfs_metadata, data pools: [cephfs_pool ]

[root@node1 ceph]# ceph mds stat

cephfs-1/1/1 up  {0=ceph_node3=up:active}, 2 up:standby  这里看到node3为up状态

​第4步: 客户端准备验证key文件

  • 说明: ceph默认启用了cephx认证, 所以客户端的挂载必须要验证

在集群节点(node1,node2,node3)上任意一台查看密钥字符串

[root@node1 ~]# cat /etc/ceph/ceph.client.admin.keyring

[client.admin]

       key = AQDEKlJdiLlKAxAARx/PXR3glQqtvFFMhlhPmw==  后面的字符串就是验证需要的

       caps mds = "allow *"

       caps mgr = "allow *"

       caps mon = "allow *"

       caps osd = "allow *"

在客户端上创建一个文件记录密钥字符串

[root@client ~]# vim admin.key   # 创建一个密钥文件,复制粘贴上面得到的字符串

AQDEKlJdiLlKAxAARx/PXR3glQqtvFFMhlhPmw==

第5步: 客户端挂载(挂载ceph集群中跑了mon监控的节点, mon监控为6789端口)

​[root@client ~]# mount -t ceph node1:6789:/ /mnt -o name=admin,secretfile=/root/admin.key

第6步: 验证

[root@client ~]# df -h |tail -1

node1:6789:/  3.8G     0  3.8G   0% /mnt # 大小不用在意,场景不一样,pg数,副本数都会影响

删除文件存储方法

如果需要删除文件存储,请按下面操作过程来操作

第1步: 在客户端上删除数据,并umount所有挂载

[root@client ~]# rm /mnt/* -rf

[root@client ~]# umount /mnt/

第2步: 停掉所有节点的mds(只有停掉mds才能删除文件存储)

[root@node1 ~]# systemctl stop ceph-mds.target

[root@node2 ~]# systemctl stop ceph-mds.target

[root@node3 ~]# systemctl stop ceph-mds.target

​第3步: 回到集群任意一个节点上(node1,node2,node3其中之一)删除

==如果要客户端删除,需要在node1上​​ceph-deploy admin client​​同步配置才可以==

[root@client ~]# ceph fs rm cephfs --yes-i-really-mean-it

[root@client ~]# ceph osd pool delete cephfs_metadata cephfs_metadata --yes-i-really-really-mean-it

pool 'cephfs_metadata' removed

[root@client ~]# ceph osd pool delete cephfs_pool cephfs_pool --yes-i-really-really-mean-it

pool 'cephfs_pool' removed

第4步: 再次mds服务再次启动

[root@node1 ~]# systemctl start ceph-mds.target

[root@node2 ~]# systemctl start ceph-mds.target

[root@node3 ~]# systemctl start ceph-mds.target

六、创建Ceph块存储

创建块存储并使用

第1步: 在node1上同步配置文件到client

​[root@node1 ceph]# ceph-deploy admin client

​第2步:建立存储池,并初始化

==注意:在客户端操作==

[root@client ~]# ceph osd pool create rbd_pool 128  

pool 'rbd_pool' created

[root@client ~]# rbd pool init rbd_pool

第3步:创建一个存储卷(我这里卷名为volume1,大小为5000M)

注意: volume1的专业术语为image, 我这里叫存储卷方便理解

[root@client ~]# rbd create volume1 --pool rbd_pool --size 5000

[root@client ~]# rbd ls rbd_pool

[root@client ~]# rbd info volume1 -p rbd_pool

第4步: 将创建的卷映射成块设备

  • 因为rbd镜像的一些特性,OS kernel并不支持,所以映射报错
  • [root@client ~]# rbd map rbd_pool/volume1
  • 解决方法: disable掉相关特性
  • [root@client ~]# rbd feature disable rbd_pool/volume1 exclusive-lock object-map fast-diff deep-flatten
  • 再次映射 [root@client ~]# rbd map rbd_pool/volume1​

第5步: 查看映射(如果要取消映射, 可以使用​rbd unmap /dev/rbd0​)

​[root@client ~]# rbd showmapped

第6步: 格式化,挂载

[root@client ~]# mkfs.xfs /dev/rbd0

[root@client ~]# mount /dev/rbd0 /mnt/

[root@client ~]# df -h |tail -1

==注意: 块存储是不能实现同读同写的,请不要两个客户端同时挂载进行读写==

​## 块存储扩容与裁减

在线扩容

经测试,分区后`/dev/rbd0p1`不能在线扩容,直接使用`/dev/rbd0`才可以

扩容成8000M

[root@client ~]# rbd resize --size 8000 rbd_pool/volume1

[root@client ~]# rbd info rbd_pool/volume1  |grep size

       size 7.8 GiB in 2000 objects

查看大小,并没有变化

[root@client ~]# df -h |tail -1

/dev/rbd0        4.9G   33M  4.9G   1%   /mnt

[root@client ~]# xfs_growfs -d /mnt/

再次查看大小,在线扩容成功

[root@client ~]# df -h |tail -1

块存储裁减

不能在线裁减.裁减后需重新格式化再挂载,所以请提前备份好数据.

再裁减回5000M

[root@client ~]# rbd resize --size 5000 rbd_pool/volume1 --allow-shrink

重新格式化挂载

[root@client ~]# umount /mnt/

[root@client ~]# mkfs.xfs -f /dev/rbd0

[root@client ~]# mount /dev/rbd0 /mnt/

再次查看,确认裁减成功

[root@client ~]# df -h |tail -1

删除块存储方法

[root@client ~]# umount /mnt/

[root@client ~]# rbd unmap /dev/rbd0

[root@client ~]# ceph osd pool delete rbd_pool rbd_pool --yes-i-really-really-mean-it

pool 'rbd_pool' removed