CentOS7下搭建Ceph分布式存储架构

By | 2021年8月26日

(1).Ceph概述

Ceph是为了优秀的性能、可靠性和可扩展性而设计的统一的、分布式文件系统,并且还是一个开源的分布式文件系统。因为其支持块存储、对象存储,所以很自然的被用做云计算框架openstack或cloudstack整个存储的后端。当然Ceph也可以单独作为存储,例如部署一个集群作为对象存储、SAN存储、NAS存储等。

Ceph中文开源社区地址:http://ceph.org.cn/

Ceph官方文档:http://docs.ceph.org.cn/

所有Ceph部署都始于Ceph存储集群。你可以用同一个集群同时运行Ceph RADOS网关、Ceph FS文件系统、和Ceph块设备。

Ceph对象存储使用Ceph对象网关守护进程(radosgw),它是个与Ceph存储集群交互的FastCGI模块。因为它提供了与OpenStack Swift和Amazon S3兼容的接口,RADOS要有它自己的用户管理。Ceph对象网关可与Ceph FS客户端或Ceph块设备客户端共用一个存储集群。S3 和 Swift接口共用一个通用命名空间,所以你可以用一个接口写如数据、然后用另一个接口取出数据。具体查看官方文档:http://docs.ceph.org.cn/radosgw/

Ceph文件系统(Ceph FS)是个POSIX兼容的文件系统,它使用Ceph存储集群来存储数据。Ceph文件系统与Ceph块设备、同时提供S3和Swift API的Ceph对象存储、或者原生库( librados )一样,都使用着相同的 Ceph 存储集群系统。Ceph文件系统要求Ceph存储集群内至少有一个Ceph元数据服务器。具体查看官方文档:http://docs.ceph.org.cn/cephfs/

Ceph块设备是精简配置的、大小可调且将数据条带化存储到集群内的多个OSD。Ceph块设备利用RADOS的多种能力,如快照、复制和一致性。Ceph的RADOS块设备(RBD)使用内核模块或librbd库与OSD交互。Ceph 块设备靠无限伸缩性提供了高性能,如向内核模块、或向 abbr:KVM(kernel virtual machines)(如Qemu、OpenStack和CloudStack等云计算系统通过libvirt和Qemu可与Ceph块设备集成)。具体查看官方文档:http://docs.ceph.org.cn/rbd/rbd/

(2).Ceph优点

统一存储。虽然ceph底层是一个分布式文件系统,但Ceph能够同时提供对象存储、块存储和文件系统存储三种存储服务的统一存储架构,因此能够满足不同应用需求前提下的简化部署和运维,这是Ceph被OpenStack用户热衷的最主要原因。

高扩展性。扩容方便、容量大。能够管理上千台服务器、EB级的容量。

可靠性强。支持多份强一致性副本,EC。副本能够跨主机、机架、机房、数据中心存放。所以安全可靠。存储节点可以自动管理、自动修复。无单点故障,容错性强。

高性能。因为是多个副本,因此在读写操作时候能够做到高度并行化。理论上,节点越多,整个集群的IOPS和吞吐量越高。另外一点ceph客户端读写数据直接与存储设备(osd) 交互。

(3).Ceph组件

Ceph OSDs:Ceph OSD守护进程(Ceph OSD)的功能是存储数据,处理数据的复制、恢复、回填、再均衡,并通过检查其他OSD 守护进程的心跳来向Ceph Monitors提供一些监控信息。当Ceph存储集群设定为有2个副本时,至少需要2个OSD守护进程,集群才能达到active+clean状态(Ceph默认有3个副本,但你可以调整副本数)。

Monitors:Ceph Monitor维护着展示集群状态的各种图表,包括监视器图、OSD图、归置组(PG)图、和CRUSH图。Ceph保存着发生在Monitors 、OSD和PG上的每一次状态变更的历史信息(称为epoch)。

MDSs:Ceph元数据服务器(MDS)为Ceph文件系统存储元数据(也就是说,Ceph块设备和Ceph对象存储不使用MDS)。元数据服务器使得POSIX文件系统的用户们,可以在不对Ceph存储集群造成负担的前提下,执行诸如ls、find等基本命令。

(4).实验环境

xiaohuait1  10.10.10.101  admin,osd,mon

xiaohuait2  10.10.10.102  osd,mds

xiaohuait3  10.10.10.103  osd,mds

xiaohuait4  10.10.10.104  client

(5).实验

1)准备工作

临时关闭所有主机的防火墙和SELinux,这样可以更加快捷的配置ceph。

Ceph默认监听端口6789,数据传输OSD和MDS默认使用端口范围6800~7300,完成后根据需求选择关闭防火墙还是将端口号添加到防火墙规则中。

给xiaohuait1、xiaohuait2、xiaohuait3三台主机添加一块新硬盘,格式化硬盘,创建osd目录并挂载

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
[root@xiaohuait1 ~]# mkfs.xfs /dev/sdb
meta-data=/dev/sdb               isize=512    agcount=4, agsize=327680 blks
         =                       sectsz=512   attr=2, projid32bit=1
         =                       crc=1        finobt=0, sparse=0
data     =                       bsize=4096   blocks=1310720, imaxpct=25
         =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0 ftype=1
log      =internal log           bsize=4096   blocks=2560, version=2
         =                       sectsz=512   sunit=0 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0
[root@xiaohuait1 ~]# mkdir /var/local/osd{0,1,2}
[root@xiaohuait1 ~]# mount /dev/sdb /var/local/osd0/
[root@xiaohuait2 ~]# mkfs.xfs /dev/sdb
[root@xiaohuait2 ~]# mkdir /var/local/osd{0,1,2}
[root@xiaohuait2 ~]# mount /dev/sdb /var/local/osd1/
[root@xiaohuait3 ~]# mkfs.xfs /dev/sdb
[root@xiaohuait3 ~]# mkdir /var/local/osd{0,1,2}
[root@xiaohuait3 ~]# mount /dev/sdb /var/local/osd2/

上面是临时挂载,永久挂载需要写入到/etc/fstab文件中。

安装NTP,同步xiaohuait1、xiaohuait2、xiaohuait3的时间

1
2
3
4
5
6
7
8
9
10
11
[root@xiaohuait1 ~]# yum -y install ntp
[root@xiaohuait1 ~]# ntpdate ntp1.aliyun.com
25 Jul 14:22:55 ntpdate[1499]: adjust time server 120.25.115.20 offset 0.000847 sec
[root@xiaohuait2 ~]# yum -y install ntp
[root@xiaohuait2 ~]# ntpdate ntp1.aliyun.com
25 Jul 14:22:20 ntpdate[1490]: adjust time server 120.25.115.20 offset -0.001426 sec
[root@xiaohuait3 ~]# yum -y install ntp
[root@xiaohuait3 ~]# ntpdate ntp1.aliyun.com
25 Jul 14:25:54 ntpdate[1519]: adjust time server 120.25.115.20 offset -0.003259 sec

管理节点xiaohuait1生成密钥,并发布给所有主机,包括自身

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
[root@xiaohuait1 ~]# ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:kz3zyP0++2YnGvQpgW8iwDUHQP+1aOdeSIu3Vzmpjjs root@xiaohuait1
The key's randomart image is:
+---[RSA 2048]----+
|     .o..        |
|       . .       |
|        + . .    |
|     . . * + .   |
|      o S O *   o|
|       . + & = =.|
|        . = % =..|
|         . E.B+ +|
|           oB=+Bo|
+----[SHA256]-----+
[root@xiaohuait1 ~]# ssh-copy-id 10.10.10.101
[root@xiaohuait1 ~]# ssh-copy-id 10.10.10.102
[root@xiaohuait1 ~]# ssh-copy-id 10.10.10.103
[root@xiaohuait1 ~]# ssh-copy-id 10.10.10.104

编辑所有主机的/etc/hosts文件,将IP地址与主机名对应

1
2
3
4
10.10.10.101 xiaohuait1
10.10.10.102 xiaohuait2
10.10.10.103 xiaohuait3
10.10.10.104 xiaohuait4

2)在管理节点xiaohuait1安装ceph-deploy管理工具

编辑ceph的yum源,这里使用的是阿里云的yum源。如果yum源相当多,可以先将原本的yum源移出/etc/yum.repos.d/目录,然后使用命令”wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo”下载基础源以及使用命令”wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo”下载epel源。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
[root@xiaohuait1 ~]# vim /etc/yum.repos.d/ceph.repo
[ceph]
name=ceph
baseurl=http://mirrors.aliyun.com/ceph/rpm-jewel/el7/x86_64/
gpgcheck=0
priority=1
[ceph-noarch]
name=cephnoarch
baseurl=http://mirrors.aliyun.com/ceph/rpm-jewel/el7/noarch/
gpgcheck=0
priority=1
[ceph-source]
name=Ceph source packages
baseurl=http://mirrors.aliyun.com/ceph/rpm-jewel/el7/SRPMS
gpgcheck=0
priority=1
[root@xiaohuait1 ~]# yum clean all
[root@xiaohuait1 ~]# yum makecache  //使用yum list会更快一点

安装ceph-deploy管理工具

1
[root@xiaohuait1 ~]# yum -y install ceph-deploy

创建Monitor服务

1
2
3
4
5
6
[root@xiaohuait1 ~]# mkdir /etc/ceph
[root@xiaohuait1 ~]# cd /etc/ceph/
[root@xiaohuait1 ceph]# ls
[root@xiaohuait1 ceph]# ceph-deploy new xiaohuait1
[root@xiaohuait1 ceph]# ls  //以下三个文件分别对应ceph的配置文件、日志文件和monitor密钥环文件
ceph.conf  ceph-deploy-ceph.log  ceph.mon.keyring

如果想要修改守护进程数,也就是副本数,可以在ceph.conf配置文件中添加如下行

1
2
[root@xiaohuait1 ceph]# vim ceph.conf
osd_pool_default_size = 2  //副本数量

3)在所有主机上安装ceph

1
[root@xiaohuait1 ceph]# ceph-deploy install xiaohuait1 xiaohuait2 xiaohuait3 xiaohuait4

上面这个命令是去官方服务器下载安装,相当慢一般不会这样用。

之前管理节点xiaohuait1配置过ceph的阿里云的源,可以直接yum安装。不过另外三台主机xiaohuait2、xiaohuait3、xiaohuait4需要先配置yum源,再安装。

1
2
3
[root@xiaohuait1 ceph]# yum -y install epel-release
[root@xiaohuait1 ceph]# yum -y install ceph-release
[root@xiaohuait1 ceph]# yum -y install ceph ceph-radosgw

4)在管理节点上安装Monitor(监控)

1
2
3
4
5
6
[root@xiaohuait1 ceph]# ceph-deploy mon create xiaohuait1  //创建Monitor(监控)
[root@xiaohuait1 ceph]# ceph-deploy gatherkeys xiaohuait1  //收集keyring(密钥环)信息
[root@xiaohuait1 ceph]# ls
ceph.bootstrap-mds.keyring  ceph.bootstrap-rgw.keyring  ceph-deploy-ceph.log
ceph.bootstrap-mgr.keyring  ceph.client.admin.keyring   ceph.mon.keyring
ceph.bootstrap-osd.keyring  ceph.conf                   rbdmap

5)创建osd

前面已经创建过osd目录并挂载,这里只需要创建osd节点即可

1
2
3
4
5
[root@xiaohuait1 ceph]# ceph-deploy osd prepare xiaohuait1:/var/local/osd0 xiaohuait2:/var/local/osd1 xiaohuait3:/var/local/osd2
[root@xiaohuait1 ceph]# ls /var/local/osd0  //在不同的主机上可以看到,对应的节点会生成文件
ceph_fsid fsid magic
[root@xiaohuait1 ceph]# ls /var/local/osd1
[root@xiaohuait1 ceph]# ls /var/local/osd2

5)激活osd

在管理节点xiaohuait1上激活各节点的osd

1
[root@xiaohuait1 ceph]# ceph-deploy osd activate xiaohuait1:/var/local/osd0 xiaohuait2:/var/local/osd1 xiaohuait3:/var/local/osd2

如果报如下错误,需要给三个节点的/var/local/osd{0,1,2}/三个文件夹添加777权限(原来我想先赋权的,但试下来没用)

1
2
3
4
5
[root@xiaohuait1 ceph]# chmod 777 -R /var/local/osd{0,1,2}/
[root@xiaohuait2 ~]# chmod 777 -R /var/local/osd{0,1,2}/
[root@xiaohuait3 ~]# chmod 777 -R /var/local/osd{0,1,2}/

然后重新执行ceph-deploy osd activate xiaohuait1:/var/local/osd0 xiaohuait2:/var/local/osd1 xiaohuait3:/var/local/osd2即可

激活完成后可以使用命令查看osd

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
[root@xiaohuait1 ceph]# ceph-deploy osd list xiaohuait1  //也可以查看多个节点,中间用空格隔开
[ceph_deploy.conf][DEBUG ] found configuration file at: /root/.cephdeploy.conf
[ceph_deploy.cli][INFO  ] Invoked (1.5.39): /usr/bin/ceph-deploy osd list xiaohuait1
[ceph_deploy.cli][INFO  ] ceph-deploy options:
[ceph_deploy.cli][INFO  ]  username                      : None
[ceph_deploy.cli][INFO  ]  verbose                       : False
[ceph_deploy.cli][INFO  ]  overwrite_conf                : False
[ceph_deploy.cli][INFO  ]  subcommand                    : list
[ceph_deploy.cli][INFO  ]  quiet                         : False
[ceph_deploy.cli][INFO  ]  cd_conf                       : <ceph_deploy.conf.cephdeploy.Conf instance at 0x7f4c649e6fc8>
[ceph_deploy.cli][INFO  ]  cluster                       : ceph
[ceph_deploy.cli][INFO  ]  func                          : <function osd at 0x7f4c64a3ef50>
[ceph_deploy.cli][INFO  ]  ceph_conf                     : None
[ceph_deploy.cli][INFO  ]  default_release               : False
[ceph_deploy.cli][INFO  ]  disk                          : [('xiaohuait1', None, None)]
[xiaohuait1][DEBUG ] connected to host: xiaohuait1
[xiaohuait1][DEBUG ] detect platform information from remote host
[xiaohuait1][DEBUG ] detect machine type
[xiaohuait1][DEBUG ] find the location of an executable
[xiaohuait1][DEBUG ] find the location of an executable
[xiaohuait1][INFO  ] Running command: /bin/ceph --cluster=ceph osd tree --format=json
[xiaohuait1][DEBUG ] connected to host: xiaohuait1
[xiaohuait1][DEBUG ] detect platform information from remote host
[xiaohuait1][DEBUG ] detect machine type
[xiaohuait1][DEBUG ] find the location of an executable
[xiaohuait1][INFO  ] Running command: /usr/sbin/ceph-disk list
[xiaohuait1][INFO  ] ----------------------------------------
[xiaohuait1][INFO  ] ceph-0
[xiaohuait1][INFO  ] ----------------------------------------
[xiaohuait1][INFO  ] Path           /var/lib/ceph/osd/ceph-0
[xiaohuait1][INFO  ] ID             0
[xiaohuait1][INFO  ] Name           osd.0
[xiaohuait1][INFO  ] Status         up
[xiaohuait1][INFO  ] Reweight       1.0
[xiaohuait1][INFO  ] Active         ok
[xiaohuait1][INFO  ] Magic          ceph osd volume v026
[xiaohuait1][INFO  ] Whoami         0
[xiaohuait1][INFO  ] Journal path   /var/local/osd0/journal
[xiaohuait1][INFO  ] ----------------------------------------

使用命令将配置文件和admin密钥同步到各个节点,以便各个节点使用ceph命令时无需指定Monitor地址和ceph.client.admin.keyring密钥。注意:还需要修改各个节点ceph.client.admin.keyring密钥的权限

1
2
3
4
5
6
[root@xiaohuait1 ceph]# ceph-deploy admin xiaohuait1 xiaohuait2 xiaohuait3
[root@xiaohuait1 ceph]# chmod +r ceph.client.admin.keyring
[root@xiaohuait2 ~]# chmod +r /etc/ceph/ceph.client.admin.keyring
[root@xiaohuait3 ~]# chmod +r /etc/ceph/ceph.client.admin.keyring

最后查看osd状态

1
2
[root@xiaohuait1 ceph]# ceph health
HEALTH_OK

6)部署mds

1
2
3
[root@xiaohuait1 ceph]# ceph-deploy mds create xiaohuait1 xiaohuait2 xiaohuait3
[root@xiaohuait1 ceph]# ceph mds stat
e4:, 3 up:standby

7)查看集群状态

1
2
3
4
5
6
7
8
9
10
[root@xiaohuait1 ceph]# ceph -s
    cluster 8daf7524-b30c-4959-9103-812056c89a63
     health HEALTH_OK
     monmap e1: 1 mons at {xiaohuait1=10.10.10.101:6789/0}
            election epoch 3, quorum 0 xiaohuait1
     osdmap e15: 3 osds: 3 up, 3 in
            flags sortbitwise,require_jewel_osds
      pgmap v33: 64 pgs, 1 pools, 0 bytes data, 0 objects
            327 MB used, 15002 MB / 15330 MB avail
                  64 active+clean

8)创建ceph文件系统

在创建之前可以先查看一下文件系统

1
2
[root@xiaohuait1 ceph]# ceph fs ls
No filesystems enabled  //可以看到目前是没有的

先创建存储池

1
2
3
4
[root@xiaohuait1 ceph]# ceph osd pool create cephfs_data 128
pool 'cephfs_data' created
[root@xiaohuait1 ceph]# ceph osd pool create cephfs_metadata 128
pool 'cephfs_metadata' created

说明:命令最后的128是指定pg_num的值,这个值是不能自动计算的,需要手动赋予。一般来说,少于5个osd时,pg_num可以设置为128;osd在5到10个之间,pg_num可以设置为512;osd在10到50个之间,pg_num可以设置为4096;但是osd一旦超过50个,那么就得自己计算pg_num的取值,也可以借助工具pgcalc计算,网址是https://ceph.com/pgcalc/

随着osd数量的增加,正确的pg_num取值变得更加重要,因为它显著地影响着集群的行为、以及出错时的数据持久性(即灾难性事件导致数据丢失的概率)。

  接着创建文件系统

 

1
2
[root@xiaohuait1 ceph]# ceph fs new 128 cephfs_metadata cephfs_data
new fs with metadata pool 2 and data pool 1

此时再回头查看文件系统,mds节点状态

1
2
3
4
[root@xiaohuait1 ceph]# ceph fs ls
name: 128, metadata pool: cephfs_metadata, data pools: [cephfs_data ]
[root@xiaohuait1 ceph]# ceph mds stat
e7: 1/1/1 up {0=xiaohuait3=up:active}, 2 up:standby

一些可能会用到的命令

1
2
3
4
5
6
7
8
9
10
11
12
13
ceph osd pool get [存储池名称] size  //查看存储池副本数
ceph osd pool set [存储池名称] size 3  //修改存储池副本数
ceph osd lspools  //打印存储池列表
ceph osd pool create [存储池名称] [pg_num的取值]  //创建存储池
ceph osd pool rename [旧的存储池名称] [新的存储池名称]  //存储池重命名
ceph osd pool get [存储池名称] pg_num  //查看存储池的pg_num
ceph osd pool get [存储池名称] pgp_num  //查看存储池的pgp_num
ceph osd pool set [存储池名称] pg_num [pg_num的取值]  //修改存储池的pg_num值
ceph osd pool set [存储池名称] pgp_num [pgp_num的取值]  //修改存储池的pgp_num值
[root@xiaohuait1 ceph]# ceph osd pool get-quota cephfs_metadata  //查看存储池配额
quotas for pool 'cephfs_metadata':
max objects: N/A
max bytes : N/A

9)客户端xiaohuait4上挂载使用

第一种、内核驱动挂载ceph文件系统

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
[root@xiaohuait4 ~]# mkdir /ceph  //创建挂载点
[root@xiaohuait4 ~]# cat /etc/ceph/ceph.client.admin.keyring  //获取存储密钥,如果没有前往管理节点重新复制
[client.admin]
        key = AQBnbTpdmuOaIhAAb41IjqTno5irVAbPviRUWw==
[root@xiaohuait4 ~]# vim /etc/ceph/admin.secret  //将存储密钥保存到/etc/ceph/admin.secret文件中
AQBnbTpdmuOaIhAAb41IjqTno5irVAbPviRUWw==
//如果想开机挂载可以写入/etc/rc.d/rc.local文件中
[root@xiaohuait4 ~]# mount -t ceph 10.10.10.101:6789:/ /ceph -o name=admin,secretfile=/etc/ceph/admin.secret
[root@xiaohuait4 ~]# df -h
文件系统              容量  已用  可用 已用% 挂载点
/dev/mapper/vg1-root   17G  1.4G   16G    9% /
devtmpfs              476M     0  476M    0% /dev
tmpfs                 488M     0  488M    0% /dev/shm
tmpfs                 488M  7.6M  480M    2% /run
tmpfs                 488M     0  488M    0% /sys/fs/cgroup
/dev/sda1            1014M  130M  885M   13% /boot
tmpfs                  98M     0   98M    0% /run/user/0
10.10.10.101:6789:/   15G  352M   15G    3% /ceph
[root@xiaohuait4 ~]# umount /ceph  //卸载
[root@xiaohuait4 ~]# df -h      
文件系统              容量  已用  可用 已用% 挂载点
/dev/mapper/vg1-root   17G  1.4G   16G    9% /
devtmpfs              476M     0  476M    0% /dev
tmpfs                 488M     0  488M    0% /dev/shm
tmpfs                 488M  7.6M  480M    2% /run
tmpfs                 488M     0  488M    0% /sys/fs/cgroup
/dev/sda1            1014M  130M  885M   13% /boot
tmpfs                  98M     0   98M    0% /run/user/0

第二种、用户控件挂载ceph文件系统

这个方法需要安装ceph-fuse

1
2
3
4
5
6
[root@xiaohuait4 ~]# yum install -y ceph-fuse
[root@xiaohuait4 ~]# ceph-fuse -m 10.10.10.101:6789 /ceph  //挂载
ceph-fuse[1655]: starting ceph client
2019-07-26 16:59:34.477805 7fb5248a9f00 -1 init, newargv = 0x562910f74780 newargc=11
ceph-fuse[1655]: starting fuse
[root@xiaohuait4 ~]# fusermount -u /ceph  //卸载

(6).其他

清理机器上的ceph相关配置:

停止所有进程: stop ceph-all

卸载所有ceph程序:ceph-deploy uninstall [{ceph-node}]

删除ceph相关的安装包:ceph-deploy purge {ceph-node} [{ceph-data}]

删除ceph相关的配置:ceph-deploy purgedata {ceph-node} [{ceph-data}]

删除key:ceph-deploy forgetkeys

卸载ceph-deploy管理:yum -y remove ceph-deploy

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注