基于CentOS7安装部署Ceph集群实战演练 分布式存储 架构软件


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


ceph osd lspools0 rbd,

查看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 存储之块设备、文件系统、对象存储

签名:这个人很懒,什么也没有留下!
最新回复 (0)
返回