Ceph 集群部署详细过程

贵有恒,何必三更起、五更眠、最无益,只怕一日曝、十日寒。这篇文章主要讲述Ceph 集群部署详细过程相关的知识,希望能为你提供帮助。
集群组件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]
【Ceph 集群部署详细过程】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

    推荐阅读