linux ceph原理及搭建

葫芦的运维日志

下一篇 搜索 上一篇

浏览量 3981

2018/06/19 21:52


基础知识:

1  Ceph基础介绍

Ceph是一个可靠地、自动重均衡、自动恢复的分布式存储系统,根据场景划分可以将Ceph分为三大块,分别是对象存储、块设备存储和文件系统服务。在虚拟化领域里,比较常用到的是Ceph的块设备存储,比如在OpenStack项目里,Ceph的块设备存储可以对接OpenStack的cinder后端存储、Glance的镜像存储和虚拟机的数据存储,比较直观的是Ceph集群可以提供一个raw格式的块存储来作为虚拟机实例的硬盘。

Ceph相比其它存储的优势点在于它不单单是存储,同时还充分利用了存储节点上的计算能力,在存储每一个数据时,都会通过计算得出该数据存储的位置,尽量将数据分布均衡,同时由于Ceph的良好设计,采用了CRUSH算法、HASH环等方法,使得它不存在传统的单点故障的问题,且随着规模的扩大性能并不会受到影响。

 

2  Ceph的核心组件

Ceph的核心组件包括Ceph OSD、Ceph Monitor和Ceph MDS。

Ceph OSD:OSD的英文全称是Object Storage Device,它的主要功能是存储数据、复制数据、平衡数据、恢复数据等,与其它OSD间进行心跳检查等,并将一些变化情况上报给Ceph Monitor。一般情况下一块硬盘对应一个OSD,由OSD来对硬盘存储进行管理,当然一个分区也可以成为一个OSD。

Ceph OSD的架构实现由物理磁盘驱动器、Linux文件系统和Ceph OSD服务组成,对于Ceph OSD Deamon而言,Linux文件系统显性的支持了其拓展性,一般Linux文件系统有好几种,比如有BTRFS、XFS、Ext4等,BTRFS虽然有很多优点特性,但现在还没达到生产环境所需的稳定性,一般比较推荐使用XFS。

伴随OSD的还有一个概念叫做Journal盘,一般写数据到Ceph集群时,都是先将数据写入到Journal盘中,然后每隔一段时间比如5秒再将Journal盘中的数据刷新到文件系统中。一般为了使读写时延更小,Journal盘都是采用SSD,一般分配10G以上,当然分配多点那是更好,Ceph中引入Journal盘的概念是因为Journal允许Ceph OSD功能很快做小的写操作;一个随机写入首先写入在上一个连续类型的journal,然后刷新到文件系统,这给了文件系统足够的时间来合并写入磁盘,一般情况下使用SSD作为OSD的journal可以有效缓冲突发负载。

Ceph Monitor:由该英文名字我们可以知道它是一个监视器,负责监视Ceph集群,维护Ceph集群的健康状态,同时维护着Ceph集群中的各种Map图,比如OSD Map、Monitor Map、PG Map和CRUSH Map,这些Map统称为Cluster Map,Cluster Map是RADOS的关键数据结构,管理集群中的所有成员、关系、属性等信息以及数据的分发,比如当用户需要存储数据到Ceph集群时,OSD需要先通过Monitor获取最新的Map图,然后根据Map图和object id等计算出数据最终存储的位置。

Ceph MDS:全称是Ceph MetaData Server,主要保存的文件系统服务的元数据,但对象存储和块存储设备是不需要使用该服务的。

查看各种Map的信息可以通过如下命令:ceph osd(mon、pg) dump

 

3  Ceph基础架构组件

从架构图中可以看到最底层的是RADOS,RADOS自身是一个完整的分布式对象存储系统,它具有可靠、智能、分布式等特性,Ceph的高可靠、高可拓展、高性能、高自动化都是由这一层来提供的,用户数据的存储最终也都是通过这一层来进行存储的,RADOS可以说就是Ceph的核心。

RADOS系统主要由两部分组成,分别是OSD和Monitor。

基于RADOS层的上一层是LIBRADOS,LIBRADOS是一个库,它允许应用程序通过访问该库来与RADOS系统进行交互,支持多种编程语言,比如C、C++、Python等。

基于LIBRADOS层开发的又可以看到有三层,分别是RADOSGW、RBD和CEPH FS。

RADOSGW:RADOSGW是一套基于当前流行的RESTFUL协议的网关,并且兼容S3和Swift。

RBD:RBD通过Linux内核客户端和QEMU/KVM驱动来提供一个分布式的块设备。

CEPH FS:CEPH FS通过Linux内核客户端和FUSE来提供一个兼容POSIX的文件系统。

 

4  Ceph数据分布算法

在分布式存储系统中比较关注的一点是如何使得数据能够分布得更加均衡,常见的数据分布算法有一致性Hash和Ceph的Crush算法。Crush是一种伪随机的控制数据分布、复制的算法,Ceph是为大规模分布式存储而设计的,数据分布算法必须能够满足在大规模的集群下数据依然能够快速的准确的计算存放位置,同时能够在硬件故障或扩展硬件设备时做到尽可能小的数据迁移,Ceph的CRUSH算法就是精心为这些特性设计的,可以说CRUSH算法也是Ceph的核心之一。

在说明CRUSH算法的基本原理之前,先介绍几个概念和它们之间的关系。

存储数据与object的关系:当用户要将数据存储到Ceph集群时,存储数据都会被分割成多个object,每个object都有一个object id,每个object的大小是可以设置的,默认是4MB,object可以看成是Ceph存储的最小存储单元。

object与pg的关系:由于object的数量很多,所以Ceph引入了pg的概念用于管理object,每个object最后都会通过CRUSH计算映射到某个pg中,一个pg可以包含多个object。

pg与osd的关系:pg也需要通过CRUSH计算映射到osd中去存储,如果是二副本的,则每个pg都会映射到二个osd,比如[osd.1,osd.2],那么osd.1是存放该pg的主副本,osd.2是存放该pg的从副本,保证了数据的冗余。

pg和pgp的关系:pg是用来存放object的,pgp相当于是pg存放osd的一种排列组合,我举个例子,比如有3个osd,osd.1、osd.2和osd.3,副本数是2,如果pgp的数目为1,那么pg存放的osd组合就只有一种,可能是[osd.1,osd.2],那么所有的pg主从副本分别存放到osd.1和osd.2,如果pgp设为2,那么其osd组合可以两种,可能是[osd.1,osd.2]和[osd.1,osd.3],是不是很像我们高中数学学过的排列组合,pgp就是代表这个意思。一般来说应该将pg和pgp的数量设置为相等。这样说可能不够明显,我们通过一组实验来体会下:

先创建一个名为testpool包含6个PG和6个PGP的存储池
ceph osd pool create testpool 6 6
通过写数据后我们查看下pg的分布情况,使用以下命令:

ceph pg dump pgs | grep ^1 | awk '{print $1,$2,$15}'
dumped pgs in format plain
1.1 75 [3,6,0]
1.0 83 [7,0,6]
1.3 144 [4,1,2]
1.2 146 [7,4,1]
1.5 86 [4,6,3]
1.4 80 [3,0,4]
第1列为pg的id,第2列为该pg所存储的对象数目,第3列为该pg所在的osd

我们扩大PG再看看
ceph osd pool set testpool pg_num 12
再次用上面的命令查询分布情况:
1.1 37 [3,6,0]
1.9 38 [3,6,0]
1.0 41 [7,0,6]
1.8 42 [7,0,6]
1.3 48 [4,1,2]
1.b 48 [4,1,2]
1.7 48 [4,1,2]
1.2 48 [7,4,1]
1.6 49 [7,4,1]
1.a 49 [7,4,1]
1.5 86 [4,6,3]
1.4 80 [3,0,4]
我们可以看到pg的数量增加到12个了,pg1.1的对象数量本来是75的,现在是37个,可以看到它把对象数分给新增的pg1.9了,刚好是38,加起来是75,而且可以看到pg1.1和pg1.9的osd盘是一样的。
而且可以看到osd盘的组合还是那6种。

我们增加pgp的数量来看下,使用命令:
ceph osd pool set testpool pgp_num 12
再看下
1.a 49 [1,2,6]
1.b 48 [1,6,2]
1.1 37 [3,6,0]
1.0 41 [7,0,6]
1.3 48 [4,1,2]
1.2 48 [7,4,1]
1.5 86 [4,6,3]
1.4 80 [3,0,4]
1.7 48 [1,6,0]
1.6 49 [3,6,7]
1.9 38 [1,4,2]
1.8 42 [1,2,3]
再看pg1.1和pg1.9,可以看到pg1.9不在[3,6,0]上,而在[1,4,2]上了,该组合是新加的,可以知道增加pgp_num其实是增加了osd盘的组合。

通过实验总结:
(1)PG是指定存储池存储对象的目录有多少个,PGP是存储池PG的OSD分布组合个数
(2)PG的增加会引起PG内的数据进行分裂,分裂相同的OSD上新生成的PG当中
(3)PGP的增加会引起部分PG的分布进行变化,但是不会引起PG内对象的变动

pg和pool的关系:pool也是一个逻辑存储概念,我们创建存储池pool的时候,都需要指定pg和pgp的数量,逻辑上来说pg是属于某个存储池的,就有点像object是属于某个pg的。

以下这个图表明了存储数据,object、pg、pool、osd、存储磁盘的关系

 本质上CRUSH算法是根据存储设备的权重来计算数据对象的分布的,权重的设计可以根据该磁盘的容量和读写速度来设置,比如根据容量大小可以将1T的硬盘设备权重设为1,2T的就设为2,在计算过程中,CRUSH是根据Cluster Map、数据分布策略和一个随机数共同决定数组最终的存储位置的。

Cluster Map里的内容信息包括存储集群中可用的存储资源及其相互之间的空间层次关系,比如集群中有多少个支架,每个支架中有多少个服务器,每个服务器有多少块磁盘用以OSD等。

数据分布策略是指可以通过Ceph管理者通过配置信息指定数据分布的一些特点,比如管理者配置的故障域是Host,也就意味着当有一台Host起不来时,数据能够不丢失,CRUSH可以通过将每个pg的主从副本分别存放在不同Host的OSD上即可达到,不单单可以指定Host,还可以指定机架等故障域,除了故障域,还有选择数据冗余的方式,比如副本数或纠删码。

下面这个式子简单的表明CRUSH的计算表达式:

CRUSH(X)  -> (osd.1,osd.2.....osd.n)

式子中的X就是一个随机数。

下面通过一个计算PG ID的示例来看CRUSH的一个计算过程:

(1)Client输入Pool ID和对象ID;

(2)CRUSH获得对象ID并对其进行Hash运算;

(3)CRUSH计算OSD的个数,Hash取模获得PG的ID,比如0x48;

(4)CRUSH取得该Pool的ID,比如是1;

(5)CRUSH预先考虑到Pool ID相同的PG ID,比如1.48。

 

搭建环境:

主机系统:centos7 x86_64 server
ceph版本:ceph 12.2.1(luminous)
硬件配置:4台vm,1核1G内存,每台至少挂载1块为osd准备的空闲盘

主机名            ip                       role
admin            192.168.197.144          admin
node1            192.168.197.142          mon/ mgr / osd 
node2            192.168.197.141          osd
node3            192.168.197.143          osd

1 准备工作

1.1 开启网络(所有节点,root用户)

Centos7默认是不启用有线网卡的,需要手动开启。打开终端:

# cd /etc/sysconfig/network-scripts/
# ls

ls 查看一下ifcfg-eno后面对应的数字是什么,以eno32为例:

# vi ifcfg-eno32

设置 ONBOOT=yes,即开启自动启用网络连接。重启网络:

# service network restart  

最后验证能否ping通外网:

# ping www.baidu.com

1.2 修改主机名(所有节点,root用户)

修改主机名,以便后面切换部署时识别相应节点的主机名
1)修改主机名

# vi /etc/hostname 

2)修改127.0.0.1 后的内容为主机名:

# vi /etc/hosts 

并添加如下信息:

192.168.197.144    admin
192.168.197.142    node1
192.168.197.141    node2
192.168.197.143    node3

3)验证各个主机之间能否互相ping通主机名

1.3 创建用户(所有节点,root用户)

在所有节点上执行如下操作:
1)创建用户名:cephu,设置密码:

# useradd  –d  /home/ceph  –m  cephu
# passwd  cephu

2)修改visudo文件,否则提示cephu不再sudoer列表中的错误。命令行输入visudo,在root ALL=(ALL) ALL下面添加:

cephu  ALL=(ALL) ALL

3)切换至cephu用户,为该用户增加root权限:

$ echo “ceph ALL=(root) NOPPASSWD:ALL” | sudo tee /etc/sudoers.d/ceph
$ sudochmod 0440 /etc/sudoers.d/ceph

1.4 实现ssh无密码登录(admin节点)

1)cephu用户下,生成秘钥:

$ ssh-keygen

2)cephu用户下,把生成的密钥拷贝到各Ceph节点:

$ ssh-copy-id cephu@node1
$ ssh-copy-id cephu@node2
$ ssh-copy-id cephu@node3

3)root用户下,添加~/.ssh/config配置文件,并进行如下设置:

Host node1
Hostname node1
User cephu

Host node2
Hostname node2
User cephu

Host node3
Hostname node3
User cephu

1.5 添加下载源,安装ceph-deploy(admin节点,root用户)

1)添加ceph源:

# cat >/etc/yum.repos.d/ceph.repo
[ceph-noarch]
name=Ceph noarch packages
baseurl=https://download.ceph.com/rpm-luminous/el7/noarch
enabled=1
gpgcheck=1
type=rpm-md
gpgkey=https://download.ceph.com/keys/release.asc

ctrl + d 保存

2)更新源,安装ceph-deploy:

# sudo yum makecache
# sudo yum update
# sudo yum install ceph-deploy -y

1.6 设置TTY(所有节点)

# sudo visudo

找到 Defaults requiretty 注释掉

1.7 设置selinux(所有节点)

# vi /etc/selinux/config

把 selinux 设为 disabled

1.8 安装ntp(所有节点)

# yum install -y ntp ntpdate ntp-doc
# systemctl start ntpd 
# systemctl status ntpd  

确认打开NTP服务

2 搭建ceph集群

没有特别说明以下所有操作均是在admin节点,cephu用户下执行

2.1 创建ceph操作目录:

$ mkdir my-cluster  //切记不可用sudo创建
$ cd my-cluster

之后,所有ceph-deploy命令操作必须在该目录下执行

2.2 创建集群:

$ ceph-deploy new node1

创建成功会有三个文件:ceph.conf, ceph.mon.keyring, and a log file

2.3 安装luminous(12.2.1):

$ ceph-deploy install --release luminous node1 node2 node3

由于网速慢的问题,安装并不会成功。之所以仍进行这一步,只因执行过了该命令就会自动创建相应文件夹。在进入各个节点手动安装的时候,才能把下载的不成功的包放到正确的目录下,这样,手动安装使用yum命令才会成功。之后进入每个节点执行安装。以node1为例:

  • 先从https://download.ceph.com/rpm-luminous/el7/ x86_64/ 下载所有最有最新版本的rpm包到本地

  • 之后使用secure shell client上传到node1的/var/cache/yum/x86_64/7/Ceph/packages/文件夹下

  • 然后安装ceph:
$ ssh node1
$ sudo yum install –y epel-release ceph ceph-radosgw

必须说的是,虽然所有安装包都在相应的目录中了,但仍可能不成功,这个时候只需要再次重新把安装包放到对应目录后再执行该命令就成功了,原因不清楚,反正这样做就对了。

  • 确认安装版本为12.2.1:
$ ceph --version
  • 设置防火墙(由于node1既是mon节点又是osd节点,所以要添加下面两个规则。其他节点只开启ceph服务即可):
$ sudo firewall-cmd --zone=public --add-service=ceph-mon --permanent  //该规则仅在mon节点执行,如果不添加就不能在其他osd上进行一些查询操作
$ sudo firewall-cmd --zone=public --add-service=ceph --permanent
$ sudo firewall-cmd --reload

需要说明的是,该防火墙规则只能在安装成功ceph后才能添加,否则就不识别,添加失败。最后退出node1节点,返回admin节点

2.4 初始化mon:

$ ceph-deploy mon create-initial

2.5 赋予各个节点使用命令免用户名权限:

$ ceph-deploy admin node1 node2 node3

2.6 安装ceph-mgr:

$ ceph-deploy mgr create node1  //只有luminous才有,为使用dashboard做准备 

2.7 添加osd:

$ ceph-deploy osd create node1:/dev/sdb node2:/dev/sdb node3:/dev/sdb

需要说明的是该/dev/sdb是在各个节点上为osd准备的空闲磁盘(无需分区格式化,如果有分区需要指定具体分区),通过如下命令查看:

$ ssh node1 lsblk -f    

最后通过如下命令查看集群状态:

$ ssh node1 sudo ceph -s

如果显示health_ok,3个osd up就成功了

3 Dashboard的配置:

把ceph-mgr和ceph-mon安装在同一个主机上,最好只有一个ceph-mgr

3.1 创建管理域秘钥:

$ sudo ceph auth get-or-create mgr.node1 mon 'allow profile mgr' osd 'allow *' mds 'allow *'

3.2 开启 ceph-mgr 管理域:

$ sudo ceph-mgr -i node1

3.3 查看ceph的状态:

$ sudo ceph status

确认mgr的状态为active

3.4 打开dashboard模块:

$ sudo ceph mgr module enable dashboard

3.5 绑定开启dashboard模块的ceph-mgr节点的ip地址:

$ sudo ceph config-key set mgr/dashboard/node1/server_addr 192.168.197.142

ip地址为mgr节点的ip地址

3.6 web登录:

浏览器地址栏输入:192.168.197.142:7000

4 配置客户端使用rbd:

创建块设备之前需要创建存储池,存储池相关命令需要在mon节点执行

4.1 创建存储池:

$ sudo ceph osd pool create rbd 128 128

4.2 初始化存储池:

$ sudo rbd pool init rbd

4.3 准备客户端client:

另备一台主机,系统centos7用来作为client。主机名为client,ip:192.168.197.146。修改hosts文件实现和admin节点的主机名互通。

1)升级client内核到4.x:
参考:https://www.tesun.net/centos7sheng-ji-nei-he/

2)为client安装ceph:
参考2.3

3)配置client防火墙:

$ sudo firewall-cmd --zone=public --add-service=ceph --permanent
$ sudo firewall-cmd --reload

4)在admin节点赋予client使用命令免用户名权限:

$ ceph-deploy admin client

5)修改client下该文件的读权限:

$ sudo chmod +r /etc/ceph/ceph.client.admin.keyring

6)修改client下的ceph配置文件:

$ sudo vi /etc/ceph/ceph.conf 

在global section下添加:

rbd_default_features = 1

该配置为了解决映射镜像时出错参见:
http://www.cnblogs.com/styshoo/p/6505794.html

4.4 client节点创建块设备镜像:

$ rbd create foo --size 4096

4.5 client节点映射镜像到主机:

$ sudo rbd map foo --name client.admin

4.6 client节点格式化块设备:

$ sudo mkfs.ext4 -m0 /dev/rbd/rbd/foo

4.7 client节点mount块设备:

$ sudo mkdir /mnt/ceph-block-device
$ sudo mount /dev/rbd/rbd/foo /mnt/ceph-block-device
$ cd /mnt/ceph-block-device

4.8 测试块设备:

dd if=/dev/zero of=/mnt/ ceph-block-device /file1 count=100 bs=1M

5 源码安装ceph:

注意要足够多的内核,足够多的内存,才能make成功。这里内核16内存16G。另外编译目录的大小至少50g,越大越好!如果一开始编译目录没有那么大,就扩展其容量,参见:http://www.cnblogs.com/lighten/p/6825938.html,注意:替换 resize2fs为xfs_growfs

5.1 安装git:

$ sudo yum install -y git

5.2 克隆源代码:

$ git clone --recursive https://github.com/ceph/ceph.git

5.3 下载依赖库及分支(切换到源码下载到的目录):

$ git submodule update --force --init --recursive

5.4 安装必要的库和工具:

$ cd ceph
$ ./install-deps.sh

5.5 编译安装 ceph:

$ cd ceph
$./do_cmake.sh
$ cd build
$ make -j16
$ sudo make install

6 pool常用命令:

说明:斜体表示自行设置的参数

6.1 创建pool:

创建副本池:

$ sudo ceph osd pool create pool-name pg_num pgp_num

创建ec池:

$ sudo ceph osd pool create pool-name pg_num pgp_num erasure

6.2 列出pool:

$ sudo rados lspools
$ sudo rados df //详细信息
$ sudo ceph osd lspools
$ sudo ceph osd pool ls detail  //详细信息

6.3 设置pool参数:

设置副本数:

$ sudo ceph osd pool set pool-name size num

6.4 获取pool参数:

获取副本数:

$ sudo ceph osd pool get pool-name size

6.5 更多pool命令参见:

http://docs.ceph.com/docs/master/rados/operations/pools/#create-a-pool

7 image常用命令:

说明:斜体表示自行设置的参数

7.1 创建image:

$ sudo rbd create image-name --size 4096

7.2 列出image:

$ sudo rbd ls

7.3 查看image特性:

$ sudo rbd info image-name

7.4 删除image:

$ sudo rbd rm image-name

 

转载自:https://www.cnblogs.com/luohaixian/p/8087591.html

https://www.cnblogs.com/sisimi/p/7717297.html

葫芦的运维日志

打赏

上一篇 搜索 下一篇
© 冰糖葫芦甜(bthlt.com) 2021 王梓打赏联系方式 陕ICP备17005322号-1