Ceph Documentation
http://docs.ceph.org.cn/
ceph部署完全手册
http://xiaqunfeng.cc/2017/07/17/ceph%E9%83%A8%E7%BD%B2%E5%AE%8C%E5%85%A8%E6%89%8B%E5%86%8C/
基于CentOS 7.3安装部署jewel版本Ceph集群实战演练
https://www.linuxidc.com/Linux/2017-09/146760.htm
从零开始,一步一步搭建一个ceph集群。
1.1 硬件资源
硬件配置:5台云主机,4核4G内存,Ubuntu14系统,每台挂载1 块100G 的SSD 和3 块200G 的SATA 盘。
root@ceph0:~# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sr0 11:0 1 436K 0 rom
vda 253:0 0 20G 0 disk
├─vda1 253:1 0 2M 0 part
├─vda2 253:2 0 476M 0 part /boot
└─vda3 253:3 0 19.5G 0 part /
vdb 253:16 0 100G 0 disk
vdc 253:32 0 200G 0 disk
vdd 253:48 0 200G 0 disk
vde 253:64 0 200G 0 disk
磁盘分区
ceph-mon可以和osd节点混布,但要物理隔离。单台机器可以由多个osd进程,每个osd的数据盘和journal盘分别处于独立分区,为了高性能,建议journal放在在ssd盘,分区大小10G即可(更精确的大小计算参见这里, 大致的计算原则是 磁盘的吞吐osd持久化间隔的两倍,默认的持久化间隔是5s,按照磁盘吞吐200M计算,2G空间就够了)。
以上述的推荐举个例子:
某机器上含有4T的sata盘/dev/sdb, /dev/sdc, /dev/sdc。ssd盘480G,/dev/sdd。使用lsscsi可以看到磁盘的类型(sata or ssd),fdisk -l可以查看磁盘容量。
# lsscsi
[0:0:0:0] disk SEAGATE ST300MM0006 0003 /dev/sda
[0:0:1:0] disk ATA ST4000NM0033-9ZM SN06 /dev/sdb
[0:0:2:0] disk ATA ST4000NM0033-9ZM SN06 /dev/sdc
[0:0:3:0] disk ATA ST4000NM0033-9ZM SN06 /dev/sdd
[0:0:4:0] disk ATA ST4000NM0033-9ZM SN06 /dev/sde
[0:0:5:0] disk ATA INTEL SSDSC2BB48 0150 /dev/sdf
[0:0:6:0] disk ATA TOSHIBA MG03ACA4 FL1A /dev/sdg
[0:0:7:0] disk ATA TOSHIBA MG03ACA4 FL1A /dev/sdh
[0:0:8:0] disk ATA TOSHIBA MG03ACA4 FL1A /dev/sdi
[0:0:9:0] disk ATA TOSHIBA MG03ACA4 FL1A /dev/sdj
[0:0:10:0] disk ATA TOSHIBA MG03ACA4 FL1A /dev/sdk
[0:0:11:0] disk ATA TOSHIBA MG03ACA4 FL1A /dev/sdl
[0:0:12:0] disk ATA INTEL SSDSC2BB48 0150 /dev/sdm
[0:0:13:0] enclosu PMCSIERA SXP 24Sx12G RevB -
可以使用parted工具进行分区。
parted -s /dev/sdb mklabel gpt #对/dev/sdb分区
parted /dev/sdb mkpart primary ext4 1 1000000 # 第一个分区占用1M到1000000M。
对于ssd盘,可以创建多个分区
parted -s /dev/sdd mklabel gpt #对/dev/sdb分区
parted /dev/sdb mkpart primary ext4 1 10000 # 第一个分区占用1M到10000M。
parted /dev/sdb mkpart primary ext4 10000 20000#
第二个分区占用10000M到20000M。
parted /dev/sdb mkpart primary ext4 20000 30000 #
第三个分区占用20000M到30000M,剩余的分区可以由你自由分配。
实际分区部署操作
分区的时候这里仅针对SSD分3个区,每个区给挂载在该主机上的3个SATA盘使用。
为ceph准备好磁盘分区,仅作分区,不需要挂载和建立文件系统,部署osd节点时,ceph自己会做这个工作。
将SSD分为3个主分区,SATA盘一个分区,独立挂载。
root@ceph0:~# parted -s /dev/vdb mklabel gpt
root@ceph0:~# parted /dev/vdb mkpart primary ext4 0 40G
Warning: The resulting partition is not properly aligned for best performance.
Ignore/Cancel? Cancel
#生成的分区没有正确地对齐以实现最佳性能。忽略/取消?
正确对齐分区的快速分步指南:
首先获得你阵列的alignment参数:
root@ceph0:~# cat /sys/block/vdb/queue/optimal_io_size 0
root@ceph0:~# cat /sys/block/vdb/queue/minimum_io_size 512
root@ceph0:~# cat /sys/block/vdb/alignment_offset 0
root@ceph0:~# cat /sys/block/vdb/queue/physical_block_size 512
其次,把optimal_io_size的值与alignment_offset的值相加,之后除以physical_block_size的值。在我的例子中是:(512 + 0) / 512 = 1。这个数值是分区起始的扇区。
最后,新的parted命令应该写成类似下面这样 mkpart primary 1s 100%
字母s是很有意义的:它告诉parted,你的输入是1个扇区,而不是1个字节,也不是1兆字节。
root@ceph0:~# parted /dev/vdb mkpart primary ext4 1 40G
Information: You may need to update /etc/fstab.
root@ceph0:~# parted /dev/vdb mkpart primary ext4 40G 70G
Information: You may need to update /etc/fstab.
root@ceph0:~# parted /dev/vdb mkpart primary ext4 70G 100G
Information: You may need to update /etc/fstab.
# 不需要update。parted命令是实时生效的,分区命令完成后已经将分区表数据写入了硬盘。
# /etc/fstab文件,是系统的自动挂载分区的配置。目的是让系统重启后,能够自动将某个分区挂载到指定挂载点,而不用再手动mount。
SATA盘需要一个主分区,200G大小,分区过程同上。
分区后的磁盘挂载树状结构图:
root@ceph0:~/my-cluster# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sr0 11:0 1 436K 0 rom
vda 253:0 0 20G 0 disk
├─vda1 253:1 0 2M 0 part
├─vda2 253:2 0 476M 0 part /boot
└─vda3 253:3 0 19.5G 0 part /
vdb 253:16 0 100G 0 disk
├─vdb1 253:17 0 37.3G 0 part
├─vdb2 253:18 0 28G 0 part
└─vdb3 253:19 0 28G 0 part
vdc 253:32 0 200G 0 disk
└─vdc1 253:33 0 186.3G 0 part
vdd 253:48 0 200G 0 disk
└─vdd1 253:49 0 186.3G 0 part
vde 253:64 0 200G 0 disk
└─vde1 253:65 0 186.3G 0 part
对其他主机上挂载的SSD和SATA盘操作同上。
3 添加ceph-osd节点
3.1 安装ceph到osd节点
| ceph-deploy install --release {release-name} node-list |
这里把之前装monitor前没装的主机装上,我这里还剩ceph3, ceph4没装,执行如下(其实命令里选择版本号这个可以去掉,因为默认的下载源已经指定了版本):
| ceph-deploy install --release jewel ceph3 ceph4 |
3.2 设置并启动osd
| ceph-deploy osd prepare ceph-4:/dev/vdb1:/dev/vde1 ceph-4:/dev/vdc1:/dev/vde2 ceph-4:/dev/vdd1:/dev/vde3
#磁盘准备ssh ceph-4 'chown ceph:ceph /dev/vdb1 /dev/vdc1 /dev/vdd1 /dev/vde1 /dev/vde2 /dev/vde3'
#设置权限ceph-deploy osd activate ceph-4:/dev/vdb1:/dev/vde1 ceph-4:/dev/vdc1:/dev/vde2 ceph-4:/dev/vdd1:/dev/vde3
#启动osd |
上述代码会在ceph-4机器创建三个osd进程,磁盘组合/dev/vdb1:/dev/vde1的vdb1作为第一个osd的数据盘,vde1作为journal盘。然后运行ceph -s,可以看到osd节点已经加入。
具体执行如下:
1 磁盘准备
root@ceph0:~/my-cluster# ceph-deploy osd prepare ceph0:/dev/vdc1:/dev/vdb1 ceph0:/dev/vdd1:/dev/vdb2 ceph0:/dev/vde1:/dev/vdb3
……
……
[ceph0][INFO ] checking OSD status...
[ceph0][DEBUG ] find the location of an executable
[ceph0][INFO ] Running command: /usr/bin/ceph --cluster=ceph osd stat --format=json
[ceph_deploy.osd][DEBUG ] Host ceph0 is now ready for osd use.
2 设置权限
| ssh ceph0 'chown ceph:ceph /dev/vdb1 /dev/vdb2 /dev/vdb3 /dev/vdc1 /dev/vdd1 /dev/vde1' |
3 启动OSD
root@ceph0:~/my-cluster# ceph-deploy osd activate ceph0:/dev/vdc1:/dev/vdb1 ceph0:/dev/vdd1:/dev/vdb2 ceph0:/dev/vde1:/dev/vdb3
……
……
[ceph0][INFO ] checking OSD status...
[ceph0][DEBUG ] find the location of an executable
[ceph0][INFO ] Running command: /usr/bin/ceph --cluster=ceph osd stat --format=json
其他四台主机上的OSD设置同上,注意SSD盘符和SATA盘符的不同。
所有五台机器设置完后,运行ceph -s,可以看到15个osd节点已经加入。
| ceph -s
cluster 4d7e1b04-2a4c-45aa-b6fe-a98241db0c2f
health HEALTH_WARNtoo few PGs per OSD (12 < min 30)
monmap e1: 3 mons at {ceph0=172.20.0.196:6789/0,
ceph1=172.20.0.197:6789/0,ceph2=172.20.0.198:6789/0}
election epoch 4, quorum 0,1,2 ceph0,ceph1,ceph2
osdmap e80: 15 osds: 15 up, 15 inflags sortbitwise
pgmap v181: 64 pgs, 1 pools, 0 bytes data, 0 objects
525 MB used, 2792 GB / 2792 GB avail
64 active+clean |
4 设置使集群处于健康状态
注意上面的ceph 处于 HEALTH_WARN 状态
查看副本数:
ceph osd dump | grep 'replicated size'pool 0 'rbd' replicated size 3 min_size 2 crush_ruleset 0 object_hash rjenkins pg_num 64 pgp_num 64 last_change 1 flags hashpspool stripe_width 0
查看已经存在的pools
查看rbd pool中的 pg_num 和 pgp_num 属性
| ceph osd pool get rbd pg_numpg_num: 64root@ceph0:/etc/ceph
ceph osd pool get rbd pgp_numpgp_num: 64 |
健康的 pg_num 和 pgp_num 计算方法:
关于pgmap的数目,osd_num *100 / replica_num,向上取2的幂。比如15个osd,三备份,15 *100/3=500,得到pg_num = 512,线上重新设定这个数值时会引起数据迁移,请谨慎处理。
设置
| ceph osd pool set rbd pg_num 512set pool 0 pg_num to 512root
ceph osd pool set rbd pgp_num 512set pool 0 pgp_num to 512root |
再次查看 ceph 集群状态,HEALTH_OK
| ceph -s
cluster 4d7e1b04-2a4c-45aa-b6fe-a98241db0c2f
health HEALTH_OK
monmap e1: 3 mons at {ceph0=172.20.0.196:6789/0,
ceph1=172.20.0.197:6789/0,ceph2=172.20.0.198:6789/0}
election epoch 4, quorum 0,1,2 ceph0,ceph1,ceph2
osdmap e84: 15 osds: 15 up, 15 inflags sortbitwise
pgmap v226: 512 pgs, 1 pools, 0 bytes data, 0 objects
561 MB used, 2792 GB / 2792 GB avail512 active+clean |
4 设置ceph的rbd块存储设备
确保ceph存储集群处于 active + clean 的状态,这样才能使用块设备。
4.1 建立主控机器到rbd所在设备的ssh免密登录关系
参见上文:章节1.2。
4.2 安装ceph环境,并授予权限
假设rbd所在机器的hostname为 ceph-cli(这里新建一台主机,名为ceph-cli)。在主控节点上的 /etc/ceph 目录下执行操作。
1 在ceph0上使用ceph-deploy 工具ceph二进制程序安装到ceph-cli上面
注意:在 ceph-cli 主机上将ceph 源改为国内源。
| cd /etc/ceph/ # 主控节点ceph-deploy install ceph-cli |
2 将ceph配置文件(ceph.conf)复制到ceph-cli
| ceph-deploy config push ceph-cli |
3 客户机需要ceph密钥去访问ceph集群。ceph创建了一个默认用户 client.admin,它有足够的权限去访问ceph集群。不建议把client.admin共享到所有其他客户端节点。更好的做法是用分开的密钥创建一个新的ceph用户去访问特定的存储池。
这里,创建了一个ceph用户 client.rbd,它拥有访问rbd存储池的权限
| ceph auth get-or-create client.rbd mon 'allow r' osd 'allow class-read object_prefix rbd_children, allow rwx pool=rbd'
[client.rbd]
key = AQAmVzVYzXDjBhAAWlcdtEnQ6XBscmU58ZljAw== |
4 为ceph-cli上的client.rbd用户添加密钥
| ceph auth get-or-create client.rbd | ssh 'sudo tee /etc/ceph/ceph.client.rbd.keyring'sudo: unable to resolve host ceph-cli
[client.rbd]
key = AQAmVzVYzXDjBhAAWlcdtEnQ6XBscmU58ZljAw== |
5 至此,ceph-cli 应该准备好充当ceph客户端了。通过提供用户名和密钥在 ceph-cli 上检查集群的状态
| ssh 'cat /etc/ceph/ceph.client.rbd.keyring >> /etc/ceph/keyring
ssh 'ceph -s --name client.rbd'
cluster 4d7e1b04-2a4c-45aa-b6fe-a98241db0c2f
health HEALTH_OK
monmap e1: 3 mons at {ceph0=172.20.0.196:6789/0,
ceph1=172.20.0.197:6789/0,ceph2=172.20.0.198:6789/0}
election epoch 4, quorum 0,1,2 ceph0,ceph1,ceph2
osdmap e84: 15 osds: 15 up, 15 inflags sortbitwise
pgmap v232: 512 pgs, 1 pools, 0 bytes data, 0 objects
547 MB used, 2792 GB / 2792 GB avail512 active+clean |
至此,ceph客户端已经配置完毕。接下来在客户端上创建块设备。
4.3 创建ceph块设备
1 创建一个102400M 大小的RADOS 块设备,取名 rbd1
| root@ceph-cli:~# rbd create rbd1 --size 102400 --name client.rbd --image-feature layering
#14.04的内核只支持layering,增加不支持的特性会导致后续的map失败。 |
2 列出RBD 镜像
| root@ceph-cli:~# rbd ls --name client.rbdrbd1 |
3 检查rbd 镜像的细节
| root@ceph-cli:~# rbd --image rbd1 info --name client.rbdrbd image 'rbd1':
size 102400 MB in 25600 objects order 22 (4096 kB objects)
block_name_prefix: rbd_data.10912ae8944a
format: 2
features: layering
flags: |
4.4 映射块设备并初始化
1 映射块设备到 ceph-cli
| root@ceph-cli:~# rbd map --image rbd1 --name client.rbd/dev/rbd0 |
2 检查被映射的块设备
root@ceph-cli:~# rbd showmapped --name client.rbd
id pool image snap device
0 rbd rbd1 - /dev/rbd0
3 要使用这个块设备,我们需要创建并挂载一个文件系统
root@ceph-cli:~# fdisk -l /dev/rbd0
#创建文件系统
root@ceph-cli:~# mkfs.ext4 /dev/rbd0
#创建文件夹 ceph-disk1,并将块设备 rbd0 挂载在该目录下
root@ceph-cli:~# mkdir /mnt/ceph-disk1 && mount /dev/rbd0 /mnt/ceph-disk1
root@ceph-cli:~# df -h /mnt/ceph-disk1
Filesystem Size Used Avail Use% Mounted on
/dev/rbd0 99G 60M 94G 1% /mnt/ceph-disk1
4.5 测试块设备
接下来就可以开始对这个块存储进行任意读写了。可以使用dd或者fio进行性能测试,注意fio是破坏性测试,会毁坏数据甚至文件系统。不过破坏了也没关系,删除rbd设备后,重新添加rbd设备,格式化即可。
root@ceph-cli:~# dd if=/dev/zero of=/mnt/ceph-disk1/file1 count=100 bs=1M
100+0 records in
100+0 records out
104857600 bytes (105 MB) copied, 0.12931 s, 811 MB/s
Ceph 存储之块设备、文件系统、对象存储