① CentOS 7部署 Ceph分布式存储架构
随着OpenStack日渐成为开源云计算的标准软件栈,Ceph也已经成为OpenStack的首选后端存储。Ceph是一种为优秀的性能、可靠性和可扩展性而设计的统一的、分布式文件系统。
Ceph是一个开源的分布式文件系统。因为它还支持块存储、对象存储,所以很自然的被用做云计算框架openstack或cloudstack整个存储后端。当然也可以单独作为存储,例如部署一套集群作为对象存储、SAN存储、NAS存储等。
前三台服务器增加一块硬盘/dev/sdb实验, 创建目录并挂载到/var/local/osd{1,2,3};
规范系统主机名添加hosts文件实现集群主机名与主机名之间相互能够解析(host 文件添加主机名不要使用fqdn方式)可用 hostnamectl set-hostname [name] 设置分别打开各节点的 /etc/hosts 文件,加入这四个节点ip与名称的对应关系:
在管理节点使用ssh-keygen 生成ssh keys 发布到各节点
第一步:增加 yum配置文件(各个节点都需要增加yum源) vim /etc/yum.repos.d/ceph.repo
或阿里的ceph源
复制配置文件到其它节点和客户端
在ceph1更新软件源并安装ceph-deploy 管理工具
配置文件的默认副本数从3改成2,这样只有两个osd也能达到 active+clean 状态,添加行 osd_pool_default_size = 2
(如果网络源安装失败,手工安装epel-release 然后安装yum –yinstall cep-release再yum –y install ceph ceph-radosgw)
错误参考: https://blog.csdn.net/yenai2008/article/details/72457463
添加osd节点 (所有osd节点执行)
我们实验准备时已经创建目录/var/local/osd{id}
(用ceph-deploy把配置文件和admin密钥拷贝到所有节点,这样每次执行Ceph命令行时就无需指定monitor地址和ceph.client.admin.keyring了)
以上基本上完成了ceph存储集群的搭建。
其中: <pg_num> = 128 ,
关于创建存储池
确定 pg_num 取值是强制性的,因为不能自动计算。下面是几个常用的值:
随着 OSD 数量的增加,正确的 pg_num 取值变得更加重要,因为它显着地影响着集群的行为、以及出错时的数据持久性(即灾难性事件导致数据丢失的概率)。
创建好存储池后,你就可以用 fs new 命令创建文件系统了
ceph fs new <fs_name> cephfs_metadata cephfs_data
其中: <fs_name> = cephfs 可自定义
在这里想起没在/etc/fstab配置ceph1、ceph2、ceph3的sdb自动挂载。
ceph在开源社区还是比较热门的,但是更多的是应用于云计算的后端存储。所以大多数在生产环境中使用ceph的公司都会有专门的团队对ceph进行二次开发,ceph的运维难度也比较大。但是经过合理的优化之后,ceph的性能和稳定性都是值得期待的。
清理机器上的ceph相关配置
可以参考内容: http://blog.51cto.com/12270625/1887648
② ceph(第三步) 基本使用
系统的开始使用一个 ceph 集群。
本文将系统的介绍如何使用一个 ceph 集群。
涉及: crush、osd、pool、cache
ceph 版本:nautilus
ceph-deploy 版本:2.0.1
在基本使用需求下,一般需要存储集群提供高性能存储(SSD)和普通存储(hdd)。
在 ceph 中,具体表现为某些池使用高性能存储,某些池使用普通存储。而这种需求在 ceph 中由 crush 规则实现。
ceph 提供了缓存的概念。在普通的存储池之上架设一层高性能的缓存池,外部访问首先到达缓存池,如果发生未命中等情况再去访问存储池。这里需要提一点,并不是任何情况都需要缓存。
针对不同的场景,ceph 的使用方式多种多样,这里的介绍只能一切从简,但是会尽量全面。
一个标准的场景:一个存储池加一个缓存池,存储池使用普通设备,缓存池使用高性能设备。
首先添加一块高性能硬盘(我这里是虚拟环境,只能用普通硬盘充数)
然后需要利用 crush 让不同池使用不同的存储设备
这里只能拿普通的虚拟硬盘来做测试。
在 ceph02 虚拟机上增加一块 30G 的虚拟硬盘弊罩。
在 ceph03 虚拟机上增加一块 30G 的虚拟硬盘。
现在到部署节点进行操作:
如图 ceph02 出现了 osd.6,ceph03 出现了 osd.7。
这里涉及到 root (根)的概念,在文章末尾【扩展】中会介绍。这里可以直接先使用。
将 osd.6 osd.7 加入名称为 cache 的根中(根名称会自动创建,注意,由于默认情况下 osd 在启动时读取的是 hostname,因此该方法只是临时生效,在文章末尾【扩展】中会介绍永久生效办法)
“高性能”存储盘现在已经有了,并且将其置于 cache 根下,这么做的意义在下一步中有体现。
现在可以进行下一步了。
当前环境下已经有一个默认的 crush 规则。
具体属性解释参考:
https://docs.ceph.com/docs/mimic/rados/operations/crush-map-edits/#crush-map-rules
如上图划线处,当前规则只会使用 default 根的 osd。
前面创建高性能设备时,将其设帆卜稿置根为 cache。我们现在就可以创建一个只使用 cache 根中的 osd 的规则,从而实现缓存池和存储池使用不同的设备。
创建缓存池使用的规则:
其中:
replicated_cache 指该规则的名字。
cache 指该规则使用的根。
host 指故障域级别。
再次查看所有规则:
现在我们有了一个只使用高性能存储设备的规则了。接下来就可以开始创建使用不同规则的池了。
创建存储池:
查看池:
查看该池的规则:
存储池至此已经好了。
缓存池在 ceph 中常以 hot 标识。
普通存储池在 ceph 中常以 cold 标识。
缓存有多种形式(官方文档列出以下几种,实际更多):
缓存参考:
https://docs.ceph.com/docs/master/rados/operations/cache-tiering/
创建缓存池
缓存池创建好以后,要将这个缓存池与对应存储池联系起来。这个联系的概念叫做 cache tiering,可以称之为缓存态孝层,缓存代理。
参考:
https://docs.ceph.com/docs/master/rados/operations/cache-tiering/
对于 test_storage 池,我们有一个只读的缓存池了。只要我们读取 test_storage 中的某个对象,这个对象就应该自动的置于缓存池中一段时间。
可以发现,将对象上传回写模式的缓存池,存储池中也出现了对应的数据。
osd 的大小可能不相同,因此其上的数据量也不应该相同,因此引入权重来影响数据分布。
比如100G的 osd 权重为1,则200G的 osd 权重就应设置为2。
ceph osd tree 命令可以看到存储结构。可以结合自己机器执行的结果往下阅读。
一张官方图:
这是描述 ceph 存储结构的一张图。
首先这是一个树形结构。
其中最上层的 root default :root 是根的意思,default 就是这个根的名字。
中间 host foo :host 是主机的意思,foo 就是这个主机的名字。这里的主机名仅仅是个别称,不代表实际的主机,可以随意更改。
最下面的就是叶子节点了,具体指向 osd。
划分这三层结构的意义(不完全):
本文使用 ceph-deploy 添加 osd 时,并没有直接将其设置到最终根下,后续还需要手动配置。这么操作是不合理的,暂时未找到 ceph-deploy 指定根的参数。
当前文章配置的缓存池是2副本的。
某些时候,缓存数据是允许丢失的,比如只读的缓存。这种缓存池单副本即可,但是经测试,单副本池在 ceph 中似乎困难重重。
可以通过修改该机器的 hostname ,一劳永逸
这个时候,当机器重启后,该机器的所有 osd 的 host 名称都一样了,导致 osd tree 混乱。这个时候可以在 ceph.conf 中具体配置某块盘的信息。
当前环境配置参考:
增加如下内容:
重启后,一切正常。
在 osd 的启动上做文章。
比如,配置 osd 的启动方式,容器化 osd,容器会记住某些信息,因此可以实现永久生效 hostname。
osd 上的 pg 数量会对整体集群性能造成影响,并不是越多越好,也不是越少越好。
由于池有副本的概念,因此产生了如下的计算方式:
官方建议每个 osd 上的 pg 数为 100。实际测试每个 osd 上的 pg 数到达 250 时开始告警,因此该集群的总 pg 数不应超过:
因此出现此问题的原因:
所有池的 pg 数加起来超过了设定的 总 pg 数 。但集群依然可正常使用,因此只是一个警告。
解决该问题的手段:
目前个人经验来说,不要使用单副本。
crush 规则参考:
https://docs.ceph.com/docs/master/rados/operations/crush-map/
③ ceph相关命令
Ceph 存储集群包含两种类型的守护进程: Ceph 监视器 Ceph OSD 守护进程
RBD是Ceph对外提供的基于块的存储接口
ceph常用命令
集群状态监控
ceph -s #显示ceph集群状态
ceph osd tree #显示当前osd树结构
ceph osd pool ls 显示所有资源池
ceph -w #动态显示ceph当前动态,主要可以观察读写流量
ceph df #集群的数据用量及其在存储池内的分布情况
ceph osd df # 查看所有osd使用情况
ceph osd perf #显示各个osd响应时间,个别响应慢的osd可以考虑踢出集群(慎用)
设置pool副本数
ceph osd pool get <pool-name> size #查看pool副本数
ceph osd pool set <pool-name> size *** #设袭明置pool副本数
设置pg和pgp数(一磨培般pg=pgp)
ceph osd pool get <pool-name> pg_num #查看pool pg_num
ceph osd pool set <pool-name> pg_num *** #设置pool pg_num
ceph osd pool get <pool-name> pgp_num #查看pool pgp_num
ceph osd pool set <pool-name> pgp_num *** #设置pool pgp_num
查看当前ceph配置 ceph --admin-daemon /var/run/ceph/ceph-osd.0.asok config show
rbd常用命令
rbd –p <pool-name> create <rbd-name> --size 1G #创建
rbd –p <pool-name> list #查看pool下所有块
rbd –p <pool-name> info <rbd-name> #查看块详情
rbd –p <pool-name> resize --size *G <rbd-name> #扩拍游告容大小至*G
rbd –p <pool-name> resize –size *G <rbd-name> --allow-shrink #缩容至*G
rbd –p <pool-name> rm <rbd-name> #删除
快照操作
rbd –p <pool-name> snap create <rbd-name> --snap <snap-name> #创建快照
rbd –p <pool-name> snap ls <rbd-name> #列出卷的所有快照
rbd –p <pool-name> snap rollback <rbd-name> --snap <snap-name> #回滚快照
rbd –p <pool-name> snap rm <rbd-name> --snap <snap-name> #删除快照
rbd –p <pool-name> snap protect <rbd-name> --snap <snap-name> #保护快照,此时无法删除
rbd –p <pool-name> snap unprotect <rbd-name> --snap <snap-name> #解除保护
rbd –p <pool-name> import <file-name> #导入文件
krbd使用
rbd –p <pool-name> create <rbd-name> --size *G –image-feature layering #创建krbd块
rbd map <pool-name>/<rbd-name> #映射到本地
rbd –p <pool-name> showmapped #查看映射关系
rbd unmap <pool-name>/<rbd-name> #解除本地映射