一、基础环境描述
本次ceph部署实验使用三台虚拟机
操作系统 CentOS 7.7
虚拟机硬件:4C 2G
每台虚拟机的磁盘:160G 用于rootvg , 50G 用于OSD

二、Ceph软件安装的准备
1. 安装epel源(Ceph依赖的一些包在centos标准源里没有,所以需要epel源)
yum install -y https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm

2. 下载ceph.repo源配置文件(这会创建ceph.repo文件)
wget -O /etc/yum.repos.d/ceph.repo https://raw.githubusercontent.com/aishangwei/ceph-demo/master/ceph-deploy/ceph.repo

实际上ceph.repo就是如下的内容,如果下载实在很慢,就手动创建ceph.repo文件,把内容粘贴进去

[ceph]
 name=ceph
 baseurl=http://mirrors.aliyun.com/ceph/rpm-luminous/el7/x86_64/
 gpgcheck=0
 priority=1[ceph-noarch]
 name=cephnoarch
 baseurl=http://mirrors.aliyun.com/ceph/rpm-luminous/el7/noarch/
 gpgcheck=0
 priority=1[ceph-source]
 name=Ceph source packages
 baseurl=http://mirrors.aliyun.com/ceph/rpm-luminous/el7/SRPMS
 enabled=0
 gpgcheck=1
 type=rpm-md
 gpgkey=http://mirrors.aliyun.com/ceph/keys/release.asc
 priority=1

三、主机操作系统的准备
1. 主机名和IP地址规划

##public network
 172.24.1.191 p-ceph1
 172.24.1.192 p-ceph2
 172.24.1.193 p-ceph3##Storage network
 10.27.199.191 ceph1
 10.27.199.192 ceph2
 10.27.199.193 ceph3

注:公共网络用于管理,存储网络是专有的,仅供集群内部使用

2. 修改主机名(指定存储网络的主机名)

hostnamectl set-hostname ceph1
 hostnamectl set-hostname ceph2
 hostnamectl set-hostname ceph3

3. 时间服务配置
所有ceph节点必须具有相同的时间,因此需要为它们配置时间服务。
假设已经有一个配置好的内网时间服务器172.20.100.151
修改ceph节点的/etc/chrony.conf,注释掉原有的server行,然后添加新server行
server 172.20.100.151 iburst

启动chronyd服务,并设置为随主机启动

systemctl start chronyd
 systemctl enable chronyd

4. 创建ceph管理账户

useradd -d /home/stgadm -m stgadm
 passwd stgadm

5. 配置ceph管理账户免密码sudo执行root命令
创建/etc/sudoers.d/stgadm文件,添加以下内容

stgadm ALL = (root) NOPASSWD:ALL

修改/etc/sudoers.d/stgadm文件权限

chmod 0400 /etc/sudoers.d/stgadm

6. 配置ceph管理账户的ssh互信
切换到stgadm账户,执行命令生成密钥(注意,在产生密钥的过程中不需要输入任何字符,直接回车)
ssh-keygen

把生成的密钥拷贝到其他节点

ssh-copy-id stgadm@ceph1
 ssh-copy-id stgadm@ceph2
 ssh-copy-id stgadm@ceph3

注,确保每个节点都有其他节点的密钥:
节点ceph1上执行

ssh-copy-id stgadm@ceph2
 ssh-copy-id stgadm@ceph3


节点ceph2上执行

ssh-copy-id stgadm@ceph1
 ssh-copy-id stgadm@ceph3


节点ceph3上执行

ssh-copy-id stgadm@ceph1
 ssh-copy-id stgadm@ceph2

验证免密码执行命令(通过ssh远程执行命令不要求输密码)

ssh ceph1 date
 ssh ceph2 date
 ssh ceph3 date

7. 防火墙放行端口(在所有节点上以root用户执行)
放行ceph监视端口tcp 6789

firewall-cmd --zone=public --add-port=6789/tcp --permanent

放行ceph OSD通信端口tcp 6800至tcp 7300

firewall-cmd --zone=public --add-port=6800-7300/tcp --permanent

使防火墙配置生效

sudo firewall-cmd --reload

8. 暂时禁用selinux(配置完ceph之后再开启)

sudo setenforce 0

四、ceph集群配置
1. ceph管理节点的配置
仅在ceph1节点上,创建集群管理目录(由stgadm用户执行)

sudo mkdir /my-cluster
 cd /my-cluster

2. 在所有三个节点上,安装ceph-deploy包
sudo yum install -y https://download.ceph.com/rpm-nautilus/el7/noarch/ceph-deploy-2.0.1-0.noarch.rpm

3. 创建ceph集群监视节点(至少指定一个节点,会要求输入非当前节点的密码)

sudo ceph-deploy new ceph1 ceph2 ceph3

4. 在所有三个节点部署ceph集群(这个过程要求输入其他节点的root密码,并从网络下载安装包,可能相当缓慢)

sudo ceph-deploy install ceph1 ceph2 ceph3

5. 配置初始监视,收集所有密钥:

sudo ceph-deploy mon create-initial

6. 为节点分配秘钥和配置文件

sudo ceph-deploy admin ceph1 ceph2 ceph3

7. 配置管理节点(至少创建一个管理节点)

sudo ceph-deploy mgr create ceph1 ceph2 ceph3

8. 查看节点上的可用磁盘

sudo ceph-deploy disk list ceph1 ceph2 ceph3

9. 创建osd(每台虚拟机上的一个50G磁盘)

sudo ceph-deploy osd create --data /dev/sdb ceph1
 sudo ceph-deploy osd create --data /dev/sdb ceph2
 sudo ceph-deploy osd create --data /dev/sdb ceph3

附:擦除磁盘的命令

sudo ceph-deploy disk zap ceph1 /dev/sdb
 sudo ceph-deploy disk zap ceph2 /dev/sdb
 sudo ceph-deploy disk zap ceph3 /dev/sdb

附:如果部署ceph出现无法解决的问题想从头再来,可以使用下面的命令
删除ceph软件包

ceph-deploy purge {ceph-node} [{ceph-node}]...

清理ceph数据

ceph-deploy purgedata {ceph-node} [{ceph-node}]...
 ceph-deploy forgetkeys

10. 集群状态检查
sudo ceph -s

[stgadm@ceph1 ~]$ sudo ceph -s
   cluster:
     id:     580998f2-e760-4a39-9a04-8d1f7baf439e
     health: HEALTH_OK


 
  services:

mon: 1 daemons, quorum ceph1
     mgr: ceph1(active)
     osd: 3 osds: 3 up, 3 in


  data:

pools:   0 pools, 0 pgs
     objects: 0 objects, 0B
     usage:   3.01GiB used, 147GiB / 150GiB avail
     pgs:

12. 集群健康检查

sudo ceph health
[stgadm@ceph1 ~]$ sudo ceph health
 HEALTH_OK

可以查看集群健康细节,如果返回值不是HEALTH_OK时,使用detail对诊断问题有用
sudo ceph health detail

13. 查看已有的osd磁盘

sudo ceph osd tree
[stgadm@ceph1 ~]$ sudo ceph osd tree
 ID CLASS WEIGHT  TYPE NAME      STATUS REWEIGHT PRI-AFF 
 -1       0.14639 root default                           
 -3       0.04880     host ceph1                         
  0   hdd 0.04880         osd.0      up  1.00000 1.00000 
 -5       0.04880     host ceph2                         
  1   hdd 0.04880         osd.1      up  1.00000 1.00000 
 -7       0.04880     host ceph3                         
  2   hdd 0.04880         osd.2      up  1.00000 1.00000

14. 创建ceph池

sudo ceph osd pool create voting-pool 50 50       ##最后两个数字分别是pg_num和pgp_num
 sudo ceph osd pool create asm-pool 50 50       ##最后两个数字分别是pg_num和pgp_num

PG是placement groups(放置组)的缩写。CRUSH先将数据分解成一组对象,然后根据对象名称、复制级别和系统中的PG数量等信息执行哈希运算,生成PG ID(PG号)。
PG是一个包含多个对象的逻辑容器,该逻辑容器被映射到多个OSD上。如果不使用PG,在成千上万个OSD上管理和跟踪数亿对象的复制和传播将是一个巨大挑战。如果没有PG,管理海量对象所消耗的计算资源也是不可想象的。
建议在每个OSD上配置50~100个PG。

Ceph集群中的PG总数:
PG总数 = (OSD总数 * 100) / 最大副本数      ## 舍入到最接近的2的N次方幂的值。

Ceph集群中每个池的PG总数:
存储池PG总数 = (OSD总数 * 100 / 最大副本数) / 池数

每个存储池中的PG数和每个OSD中的PG数对于降低OSD的方差、避免速度缓慢的恢复再平衡进程是相当重要的。

PGP是为了实现定位而设置的PG,它的值应该和PG总数(即pg_num)保持一致。对于一个ceph池,如果增加pg_num,也应该把pgp_num调整为相同值,这样集群才会开始再平衡。
参数pg_num定义PG的数量,PG被映射至OSD。当任何一个池的PG数被增加时,PG依然保持和源OSD的映射关系,因此Ceph不会有再平衡动作。而当pgp_num的值被增加,PG才会被从源OSD迁移至其他OSD,此时再平衡才会开始。

为了避免大规模再平衡动作导致I/O降级,建议采用增加pool的办法来对ceph集群扩容。

15. 查看已有的ceph池

sudo ceph osd lspools
[stgadm@ceph1 my-cluster]$ sudo ceph osd lspools
 1 voting-pool
 2 asm-pool

16. 创建ceph块设备(注意容量单位不能用小写)

sudo rbd create voting-pool/img-voting-1 --size 2G --image-format 2 --image-feature layering
 sudo rbd create voting-pool/img-voting-2 --size 2G --image-format 2 --image-feature layering
 sudo rbd create voting-pool/img-voting-3 --size 2G --image-format 2 --image-feature layeringsudo rbd create asm-pool/img-asm-arch-1 --size 10G --image-format 2 --image-feature layering
 sudo rbd create asm-pool/img-asm-data-1 --size 30G --image-format 2 --image-feature layering

设置ceph池的应用程序类型,指定为块设备

sudo ceph osd pool application enable voting-pool rbd
 sudo ceph osd pool application enable asm-pool rbd

17. 查看池中的块设备

sudo rbd ls --pool voting-pool
[stgadm@ceph1 my-cluster]$ sudo rbd ls --pool voting-pool
 img-voting-1
 img-voting-2
 img-voting-3

18. 映射块设备(注意,可以只在ceph客户端节点上做)

sudo rbd map voting-pool/img-voting-1
 sudo rbd map voting-pool/img-voting-2
 sudo rbd map voting-pool/img-voting-3
 sudo rbd map asm-pool/img-asm-arch-1
 sudo rbd map asm-pool/img-asm-data-1

至此,ceph集群的块设备已经准备好,可以用操作系统命令lsblk看到它们了:

[stgadm@ceph1 my-cluster]$ sudo lsblk
 NAME                                                               MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
 fd0                                                                  2:0    1    4K  0 disk 
 sda                                                                  8:0    0  160G  0 disk 
 ├─sda1                                                               8:1    0    1G  0 part /boot
 └─sda2                                                               8:2    0  159G  0 part 
   ├─rootvg-rootlv                                                  253:0    0   50G  0 lvm  /
   └─rootvg-swaplv                                                  253:1    0    4G  0 lvm  [SWAP]
 sdb                                                                  8:16   0   50G  0 disk 
 └─ceph--2be235e1--6054--4ed8--a30c--ca0099f10219-osd--block--9fc2735f--5630--4fa5--8924--d7ecdb047084
                                                                    253:2    0   50G  0 lvm  
 sr0                                                                 11:0    1 1024M  0 rom  
 rbd0                                                               252:0    0    2G  0 disk 
 rbd1                                                               252:16   0    2G  0 disk 
 rbd2                                                               252:32   0    2G  0 disk 
 rbd3                                                               252:48   0   10G  0 disk 
 rbd4                                                               252:64   0   30G  0 disk