Percona 开始尝试基于Ceph做上层感知的分布式MySQL集群

本文由 Ceph 中国社区 -QiYu 翻译、半天河校稿。

英文出处:Using Ceph with MySQL 欢迎加入CCTG

过去的一年,Ceph的世界吸引了我。部分是因为我对分布式系统的品味,但也是因为我认为Ceph描绘了对特定的MySQL和通用数据库的一个大机会。从本地存储到分布式存储的转变和从裸磁盘主机配置到LVM管理磁盘配置的转变相似。

我用Ceph做完的大部分工作是和Red Hat的伙伴 (主要是 Brent Compton and Kyle Bader)合作完成的。这些工作在4月份的Percona在线会议和六月末旧金山的Red hat峰会上引起了一些讨论。我可以写很多在Ceph上使用数据库的经验,我希望这篇博客是有关Ceph的一个长系列博客中的第1个。在我开始讲解使用案例、设置配置和性能基准测试之前,我想我应该快速回顾一下Ceph背后的架构和原理。

Ceph介绍

作为主机服务公司的DreamHost的独立子公司,Inktank几年前创造了Ceph。 Red Hat 在2014年收购了Inktank并且现在作为一个存储解决方案推出。OpenStack使用Ceph作为它的主要存储后端。然而本篇博文聚焦在一个更通用角度,而不局限在虚拟环境中。

一个描述Ceph的简化方式是说:它是一个对象存储,像S3或Swift。这是一个正确的表述,但只提到一个特定的点。Ceph最少有2种类型的节点,监视器(MON)和对象存储守护进程(OSD)。监视器负责维护一个集群map,或者如果你喜欢,也可以叫集群元数据。 没有从监视器节点获取访问信息,集群对你是没有用的。在监视器层面的冗余和选举法定人数是很重要的。

任何有价值的Ceph配置至少需要3个监视器,监视器是轻量级进程,可以和OSD节点(最小配置需要的其他节点类型)部署在一起。OSD节点存储数据到本地磁盘,单个物理服务器可以承载很多OSD节点,然而对于超过1个监视器节点部署在在单个服务器上则毫无意义。OSD节点在集群元数据(crushmap)中以一个层次结构展现,它可以跨数据中心、机架、服务器等。还可以通过磁盘类型组织OSD,比如一些对象存储在SSD磁盘,其他一些对象则存储在机械磁盘上。

通过监视器的CRUSHMAP提供的信息,任何客户端都可以基于一个预先设计的伪随机哈希算法访问数据。这不需要一个转发代理。因为这些代理会带来性能瓶颈,这会成为影响扩展性的一个大因子。聪明的架构设计,这有点类似NDB API,通过NDB管理节点给定的一个集群映射,客户可以直接访问数据节点上的数据。

Ceph将数据存储在一个叫做资源池的逻辑容器中。随着资源池的定义,就产生了一些PG(放置组)。 PG是资源池中的数据的分片。例如,在一个4个节点的Ceph集群上,如果一个资源池被定义有256个PG,则每个OSD都会有这个资源池的64个PG。你可以将pgs看作是数据在节点间实现均匀分布的一个间接层。在资源池层面,你可以定义副本数(Ceph术语 ‘size’ )

对于普通机械硬盘,副本数的推荐值是3,对于SSD/Flash盘 则是2。 对于临时的测试虚拟机镜像,我经常使用1个副本。副本数大于1意味着每个PG都与一个或多个其他OSD节点上的PG进行关联。当数据被修改时,它被同步复制到其他关联PG,以保存数据在一个OSD节点坏掉后仍然可用。

到目前为止,我已经阐述了一个对象存储的基础。但是能自动更新对象的能力使得ceph与众不同并且比其他的对象存储更好(在我看来)。 底层的对象访问协议RADOS,在对象的任意位置更新任意字节,就像它是一个普通的文件一样。这种更新能力使得对象存储支更多高级应用-比如支持块设备,rbd设备,甚至网络文件系统cephfs。

在Ceph上使用MySQL时,rbd磁盘的块设备特性非常地吸引人。Ceph的一个rbd磁盘基本上是一系列对象(默认4M)的串联,它被Linux内核的rbd模块识别为块设备。功能上相当像一个iSCSI设备,因为它可以被挂载在任何可以访问存储网络的节点上,而且它依赖网络的性能。

使用Ceph的优势

便捷

在什么都追求虚拟化和容器化的世界里,Ceph提供了不主机间的便捷的数据库资源迁移

IO扩展性

在一个单主机,你只可以访问这个节点提供的IO能力。使用Ceph,基本上你可以把所有主机的全部IO能力并行化。如果一个主机有1000 iops,4个节点集群可以达到4000 iops。

高可用性

Ceph 在存储层面复制数据,并提供存储节点宕机的可用性。一种DRBD。

备份

Ceph rbd块设备支持快照,它很快且没有性能影响。快照是执行MySQL备份的理想方式。

精简置备

你可以将快照克隆并挂载为一个块设备。着对于部署新的用来复制的数据库服务器是一个相当有用的特性,而且有异步复制或Galera复制。

使用Ceph的忠告

当然,没有东西是免费的。 使用Ceph需要遵循一些忠告。

Ceph 丢失OSD的反应

如果一个OSD宕机,Ceph集群以比设定值小的副本数开始复制数据。虽然着有助于高可用性,但是复制过程明显的影响了性能。这意味着你不能在接近满的存储上运行Ceph,你必须有足够的硬盘空间处理一个节点的丢失。

OSD的 no nout 属性减轻了这些,并且阻止Ceph自动地处理一个失败(但你需要随后自己处理)。当使用 no nout 属性时,你必须监控并检测集群运行在降级模式,并采取措施。这和一个RAID集的一个磁盘失败类似。你可以设置 mon_osd_auto_mark_auto_out_in 选择这个行为作为默认。

数据清理

每天和每周(深度),Ceph执行清理操作,虽然它被限流,仍然湖影响性能。你可以修改控制清理动作的间隔和执行时间。一天一次和一周一次可能是好的。但是你应该设置 osd_scrub_begin_hour 和 osd_scrub_end_hour 来限制清理的具体执行时间。并且并且限制清理自身不要造成过多的负载到节点。osd_scrub_load_threshold 变量设置这个阈值。

调优

Ceph有很多参数,因此对Ceph进行调优是复杂和令人困惑的。由于分布式系统推进硬件,恰当地的调优Ceph可能需要诸如在所有核之间分发中断负载,线程和CPU核绑定,处理Numa域-尤其是你使用一个NVMe设备

结论

希望这篇博文提供了一个好的Ceph介绍。 我已经论述了Ceph的架构、好处和忠告。 在未来的博文中,我将呈现在Ceph上使用MySQL的案例。 这些案例包括使用Ceph快照调优XtraDB 集群的 SST操作、部署异步slave和构建HA配置。 我也希望提供怎样构建和配置一个高效的Ceph集群的指导。

最后,给那些认为构建Ceph集群的成本和复杂度难以企及的人一个提示。下面的图片展示我家的集群(我重度地使用)。 这个集群由4个基于ARM的节点(Odroid-XU4)构成,每个带1个USB-3接口的2TB的硬盘、1个16GB的EMMC闪存盘和1个1Gb的以太网口。

我不会宣称性能记录打破(虽然足够好),但从很难从成本方面打败(近600$)。

Leave a Comment

电子邮件地址不会被公开。