1.11.21.31.41.51.61.71.8Table of Contents简介硬件配置软件配置部署监控性能测试和调优维护操作故障处理1虚拟存储简介基于CephCeph 以其先进的设计和在Redhat公司的收购运营下,随着产品的成熟,Ceph已经成为分布式块存储领域最有吸引力的项目。 Openstack更是集成Ceph作为的镜像存储和块存储的解决方案。 由此我们也采用Ceph 作为的我们云硬盘的底层系统。然而Ceph 发展迅速,新特性不断添加,Bug较多,文档不够完善,业界应用还不够广泛,网上资料少。作实验测试,了解基本的概念,就很容易根据官网的文档进行搭建集群。 但是如果使用Ceph作为生产级的系统,就要系统深入的理解Ceph,才能设计并运维好Ceph集群。YY虚拟存储特点YY云平台的云硬盘基于Ceph打造,具有如下本地存储所不具有的特性:高可靠性, 3个副本分布不同机架和TOR的架构使数据99.999999%具有可靠性容量和性能线性扩容,可以通过增加机器方便的进行线性扩容IO并行性高,单IO延时高,随机写IOPS达3000,顺序写达200MB/s统一存储,云平台的OS镜像和VM块设备都存储在Ceph集群上快速备份,通过Ceph的快照功能可以快速备份块设备数据VM秒级启动,不需要传输整个镜像到宿主机,系统可以快速启动。VM秒级故障恢复,因宿主机故障导致其上的VM宕机时,可以在另外一台宿主机上启动故障的VM。本章目的本章描述搭建分布式块存储的过程中的设计和实践,主要内容包括Ceph集群的架构设计、配置、部署、常用操作、调优、监控和故障处理。希望让私有云开发者有所参考和借鉴,打造一个稳定、高效的分布式块存储系统。简介2硬件配置为了打造生产级CEPH集群,我们对OSD的机型进行了定制,每台OSD服务器挂载12个SATA盘和2个10Gb网卡。OSD服务器硬盘总带宽为9.6Gb,计算公式为 12 * 100MB(SATA硬盘带宽) * 8 。只有使用10Gb网卡才能发挥全部硬盘带宽能力。 使用10Gb网卡的好处主要是更短的OSD间数据的复制时间。 例如在新增OSD物理节点后,在执行这PG的重新平衡操作时需要从其他OSD节点复制1T数据到这个新节点,如果使用1Gb网卡,则需要8000s,而10Gb网卡,只需要800s。在规划硬件需求时,应该重点分析故障域,故障域的隔离好坏直接影响集群的可用性。一个故障域是指任何阻止访问一个或多个OSD的故障。这有如下情况:一个主机上停止的一个OSD进程一个硬盘故障一个OS 崩溃网卡故障主机电源故障网络不可用其他应该在把过多的组件放到太少的故障域来降低成本的和增加成本来隔离每个可能故障域之间取得一个平衡。YY云平台为了防止因TOR故障导致整个集群不可用,使用3台TOR,并通过crush map和ruleset设置使对象副本分布在3个不同的机架,这就从网络架构上保障了一台TOR故障,集群还正常可用的。YY云平台 Ceph 集群硬件清单:名称数量TOR3OSD21MON3ceph网络配置Ceph网络架构public 网络,是Client、MON、MDS与OSD通信的网络cluster网络,是OSD与OSD通信通信的网络 硬件配置3网络设备:万兆接入交换机:10GB网口数量=服务器数量 * 2核心交换机:40GB核心交换机,用于跨机柜级联服务器配置MON配置MON进程建议配置:CPU1. 64-bit AMD-64 * 12. 32-bit ARM dual-core * 13. i386 dual-core * 14 GB RAM1 Gb NIC100GB以上的硬盘YY云平台的MON服务器配置:组件数量CPUE5-2620v2 * 2RAM16GNIC1Gb * 2OS Disk300G SAS * 2硬件配置4OSD配置OSD 建议配置:CPU1. 64-bit AMD-64 * 12. 32-bit ARM dual-core * 13. i386 dual-core * 1一个OSD进程配置 RAM大小为 1GB每1TB硬盘一个OSD物理节点配置2个10Gb接口,分别作为public网络和cluster网络的接口一个OSD独占一个硬盘一个物理节点磁盘数量12 (估算公式:最大网卡带宽 / OSD磁盘带宽)建议使用SSD盘做日志盘,SSD和SATA配比为1:3~5 (估算公式:SSD带宽/SATA带宽)若使用纯SATA盘,建议划为2个分区,一个做日志分区,一个做数据分区。SSD作为日志盘的注意事项 使用SSD作为日志盘是有效提升性能的手段,当评估SSD时,最重要的是考虑顺序读写性能,当一个SSD存储多个OSD的日志时,顺序写吞吐量500MB/s的SSD性能远要好于120MB/s的。 下面是一些重要的性能参考项:写密集:日志是一个写密集型的场景,选择SSD时写性能必须高于普通硬盘,有些便宜的SSD写性能甚至比不上高性能的普通硬盘。顺序写:当使用一个SSD存储多个OSD日志时,因为SSD同时处理多个OSD写日志请求,你必须考虑SSD的顺序写限制。分区对齐:一个普通问题是大家都希望把给SSD分区作为最佳实践,但是他们往往忽视了SSD合理分区对齐,这导致SSD性能下降,所以要确保SSD分区合理对齐。YY云平台OSD服务器配置:组件数量CPUE5-2620v3 * 2RAM64GNIC10Gb * 2OS Disk300G SAS * 2OSD Disk4T SATA * 12硬件配置5软件配置OS和Ceph版本Ceph 发布的大版本类似于 Ubuntu 的发布管理,每两个大版本会有一个长期维护版本(LTS),社区的测试集群会确保 LTS 版本之间的无缝升级,并且 LTS 会维护大约 2 年的时间,也就是当出现严重 bug 和漏洞时,LTS 都会得到 backport 并发布新的修复版本。下表是官方推荐的Linux和Ceph版本配套,推荐使用如下Testing列为B,I,C的版本。YY云平台为了方便管理,计算、存储、网络、管理节点的系统OS都使用ubuntu 14.04,Ceph使用最新的LTS版本Jewel 10.2.2。参考 :软件配置6说明:Notes1: 默认的内核有一个老版本的 btrfs,我们不建议作为OSD的存储。 请升级至推荐的内核版本或使用 XFS文件系统.2: 默认的内核有一个老版本的 Ceph client,我们不建议使用作为ceph client(内核RBD和Ceph FS)。 请升级至推荐的内核版本。Testing软件配置7B: 我们为这个平台构建发行包, 为这些平台中部分,我们可能也持续构建所有的ceph分支并且执行基本的单元测试。I: 我们为这个平台的发行版本做基础的安装和功能测试。C: 我们在这个平台作持续运行一个综合功能、回归、压力测试套。这包括了开发分支、预发行和发行代码。软件配置8部署使用ceph-deploy按照官网文档,一步一步的可以轻松部署一个的集群。注意如果集群规模节点很多时,可以写一些shell脚本避免重复的执行OSD创建的命令。本节不再详细描述部署步骤部分,重点描述一下集群部署完成后Pool的副本分布设置技巧。怎样设置副本分布到不同的机架对象映射到OSD过程简述Ceph中Pools的属性有:Object的副本数Placement Groups的数量所使用的CRUSH Ruleset在Ceph中,Object先映射到PG,再由PG映射到OSD set。每个Pool有多个PG,每个Object通过计算hash值并取模得到它所对应的PG。PG再映射到一组OSD(OSD的个数由Pool 的副本数决定),第一个OSD是Primary,剩下的都是Replicas。数据映射的方式决定了存储系统的性能和扩展性。PG到OSD set的映射由四个因素决定:CRUSH算法:一种伪随机算法。OSD MAP:包含当前所有Pool的状态和所有OSD的状态。CRUSH MAP:包含当前磁盘、服务器、机架的层级结构。CRUSH Rules:数据映射的策略。这些策略可以灵活的设置object存放的区域。比如可以指定 pool1中所有objecst放置在机架1上,所有objects的第1个副本放置在机架1上的服务器A上,第2个副本分布在机架1上的服务器B上。 pool2中所有的object分布在机架2、3、4上,所有Object的第1个副本分布在机架2的服务器上,第2个副本分布在机架3的服器上,第3个副本分布在机架4的服务器上。 部署9Client从Monitors中得到CRUSH MAP、OSD MAP、CRUSH Ruleset,然后使用CRUSH算法计算出Object所在的OSD set。所以Ceph不需要Name服务器,Client直接和OSD进行通信。伪代码如下所示: obj_hash = hash(object_name) pg = obj_hash % num_pg osds = crush(pg, crushmap, osdmap, ruleset) # returns a list of osds for pg primary = osds[0] replicas = osds[1:]编辑CRUSH Map以YY云平台为例:集群中包括3个机架,每个机架有7个主机,每个主机有12个OSD。bucket有4种: root、row、rack、host,包含关系如下:部署10下面命令过程以把 ip-10-25-194-2 为例重新设置此Host在CRUSH Map中的位置,可以仿此逐步完成每个Host的编辑,如果你觉得麻烦也可以像我们一样通过脚本工具完成这个过程。你也可以参考下节直接编辑CRUSHMAP的文本文件进行重新设定,这也是一个比较快捷的方法。 ceph osd crush add-bucket 02 row ceph osd crush move 02 root=default ceph osd crush add-bucket 02-06 rack ceph osd crush move 02-06 row=02 sudo ceph osd crush move ip-10-25-194-2 rack=02-06工具代码参考:cat'EOF' gen_crushmap.py#!/bin/python#row 每行的格式为ip row-rackrows = '''10.25.194.22 03-0710.25.194.20 03-1010.25.194.2 02-06'''hosts = []racks = set()rows = set()for l in rows.splitlines(): import re ary = re.split('\s+', l) #ip to hostname like ip-10.25.194.22 if len(ary) == 2: hosts.append([ary[0].replace('.', '-'), ary[1]]) racks.add(ary[1]) rows.add(ary[1].split('-')[0])for row in rows: print sudo ceph osd crush add-bucket %s row % row print sudo ceph osd crush move %s root=default % rowfor rack in racks: print sudo ceph osd crush add-bucket %s rack % rack print sudo ceph osd crush move %