大规模分布式存储系统的定义如下:
“分布式系统是大量普通的PC通过网络互连,对外提供一个整体的存储服务”。
分布式存储系统有以下的特性:
可扩展性:分布式存储系统可以扩展到几百台的集群规模,而且随着集群规模的增长,系统的整体性能呈线性增长;
低成本:分布式存储系统的自动容错、自动负载均衡机制使其可以构建在普通的PC机器上,另外,线性扩展的能力也使得增加、减少机器非常的方便,可以实现自动运维;
高性能:无论是针对整个集群还是单台服务器,都要求分布式存储系统具备高性能;
易用:分布式存储系统需要对外提供易用的接口,另外,也要求具备完善的运维、监控工具,并可以方便的和系统进行集成。
分布式存储系统的主要挑战在于数据、状态信息的持久化,要求在自动迁移、自动容错、并发读写的过程中保证数据的一致性。分布式存储涉及的技术主要来自两个领域:分布式系统以及数据库,如下所示:
数据分布:如何将数据分布到多台机器上并保证数据分布均匀?数据分布到多台服务器之后如何实现跨服务器读写操作?
一致性:如何将数据的多个副本复制到多台服务器,即使在异常的清空下,也能够保证数据在不同副本之间的一致性
容错:如何检测到服务器故障?如何自动将出现故障的机器上的数据和服务迁移到别的机器上?
负载均衡:新增服务器和集群正常运行的过程中如何实现自动负载均衡?数据迁移的过程中如何保证不影响已有的服务?
事务和并发控制:如何设计对外接口使得系统更容易使用?如何设计监控系统并将系统的内部系统状态以方便的形式暴露给运维人员?
压缩、解压缩算法:如何根据数据的特点设计合理的压缩和解压缩算法?如何平衡压缩算法节省的空间存储和对CPU资源的消耗?
存储 分类 本地存储 系统级文件系统 ext4 xfs ntfs 网络存储 网络级文件系统 共享的都是文件系统 nfs 网络文件系统 hdfs 分布式网络文件系统 glusterfs 分布式网络文件系统 共享的是裸设备 块存储 cinder ceph(块存储 对象存储 网络文件系统-分布式) SAN(存储区域网) 分布式 集群 client | namenode 元数据服务器 | ------------------------------------ | | | datanode datanode datanode
Hadoop HDFS(大数据分布式文件系统)
Hadoop分布式文件系统(HDFS)是一个分布式文件系统,适用于商用硬件上高数据吞吐量对大数据集的访问的需求。
该系统仿效了谷歌文件系统(GFS),数据在相同节点上以复制的方式进行存储以实现将数据合并计算的目的。
该系统的主要设计目标包括:容错,可扩展性,高效性和可靠性。
HDFS采用了MapReduce,不迁移数据而是以将处理任务迁移到物理节点(保存数据)的方式降低网络I/O。HDFS是Apache Hadoop的一个子项目并且安装Hadoop。
OpenStack的对象存储Swift
OpenStack Swift提供一个类似Amazon S3的对象存储。其主要特点为:
所有的存储对象都有自身的元数据和一个URL,这些对象在尽可能唯一的区域复制3次,而这些区域可被定义为一组驱动器,一个节点,一个机架等。
开发者通过一个RESTful HTTP API与对象存储系统相互作用。
对象数据可以放置在集群的任何地方。
在不影响性能的情况下,集群通过增加外部节点进行扩展。这是相对全面升级,性价比更高的近线存储扩展。
数据无需迁移到一个全新的存储系统。
集群可无宕机增加新的节点。
故障节点和磁盘可无宕机调换。
在标准硬件上运行,例如戴尔,HP和Supermicro。
公有云对象存储
公有云大都只有对象存储。例如,谷歌云存储是一个快速,具有可扩展性和高可用性的对象存储。而且云存储无需一种模式也就是图像,视频文件就可以存储海量数据。
Amazon类似产品就是S3: http://aws.amazon.com/s3;
微软类似产品Azure Bolb:http://azure.microsoft.com/en-us/documentation/articles/storage-dotnet-how-to-use-blobs/;
阿里类似的有OSS:https://www.aliyun.com/product/oss/;
Facebook用于图片存储的Haystack
Facebook Haystack拥有大量元数据,适用于图片的对象存储,采用每张图片一个文件的方式取代NFS文件系统。
http://cse.unl.edu/~ylu/csce990/notes/HayStack_Facebook_ShakthiBachala.ppt;
此外,Facebook着眼于长尾服务,因此传统缓存和CDN(内容发布网络)的表现并不甚佳。一般正常的网站有99%CDN点击量,但Facebook只有约80%CDN点击率。
f4: Facebook的暖性BLOB存储
Haystack最初是用于Facebook图片应用的主要存储系统。到2016年已有近8年的历史。
这期间它通过比如减少磁盘数设法读取一个BLOB到1,跨地理位置通过复制(3个复制因子即文件副本数)实现容错等更多优化而运作良好。在此期间Facebook虽然服务良好但依然进行了演变。
截止2014年2月,Haystack存储了约4000亿张图片。
https://www.usenix.org/system/files/conference/osdi14/osdi14-paper-muralidhar.pdf
目前,f4存储了超过65PB的本地BLOB,而且将其有效复制因子从3.6降低到任意2.8或2.1。
f4提供低延迟,可恢复磁盘,主机,机柜和数据中心故障并为暖性BLOB提供足够的吞吐量。
PS:f4仅存储“暖性”图片
OpenStack块存储Cinder
OpenStack(类似商业云)还可以作为一个Linux访问的文件系统提供传统块存储。Cinder能虚拟化块存储设备池并向需要和消费这些资源的终端用户提供一个自助服务API,而无需了解存储部署的实际位置或是存储设备的类型。
OpenStack Cinder类似于亚马逊EBS(Elastic Block Storage )和微软Azure Files以及谷歌Persistent Storage。
Lustre
Lustre是一个并行分布式文件系统,通常用于大规模集群计算。??它的名字取自Linux和cluster(集群)的组合词。Lustre文件系统软件遵循GPL2认证协议并为(各类规模)计算机集群提供高性能文件系统。
因为Lustre文件系统拥有高性能的能力和开放式认证,所以经常应用于超级计算机。
Lustre文件系统具有可扩展性,可支持在数百台服务器上配置数万客户端节点,PB级容量的多个计算机集群,并超出TB级聚合I/O吞吐量。
这让Lustre文件系统受到拥有大型数据中心企业的青睐,其中也包括例如气象,虚拟,石油天然气,生命科学,多功能媒体和金融行业。Lustre曾辗转过几家企业,最近的三个所有者(时间先后排序)依次为甲骨文,Whamcloud和英特尔。
Gluster
http://www.gluster.org/http://en.wikipedia.org/wiki/Gluster
GlusterFS遵循Infiniband RDMA或TCP/IP协议创建块集中存储,在单一全局命名空间内集中磁盘和内存资源并管理数据。
对于公有云部署,GlusterFS提供了一个AWS AMI(亚马逊机器镜像)。它不是在物理服务器上部署,而是在Elastic Compute Cloud (EC2)实例上部署,并且地层存储空间是Amazon的Elastic Block Storage(EBS)。
在这样的环境里,容量通过部署更多EBS存储设备进行扩展,性能则通过部署更多EC2实例进行增强,而可用性通过AWS可用区域之间进行多方复制来提升。
FUSE(Filesystem in Userspace 用户空间文件系统)
FUSE GPL/LGPL认证是一个操作系统机制,针对类Unix计算操作系统,让用户无需编辑内核代码即可构建自身文件系统。这虽然是通过在用户空间内运行文件系统代码实现,但FUSE模块仅提供了一个到达真正内核接口的一架“桥梁”。
FUSE最初是作为一个可加载的核心模块来实现的,通过GlusterFS使用,尤其适用于编写虚拟文件系统。但与传统文件系统,尤其是可存储数据和从磁盘上检索数据的系统不同,虚拟文件系统检索实际上无法存储自身数据。它们充当一个现有文件系统或存储设备的视图或翻译。
Ceph
Ceph是红帽的,Ceph是一个遵循LGPL协议的存储平台,它可以在单个分布式节点上同时支持对象存储,块存储和文件存储。
Cphe主要设计的初衷是变成一个可避免单节点故障的分布式文件系统,EB级别的扩展能力,而且是一种开源自由软件,许多超融合的分布式文件系统都是基于Ceph开发的,作为开源软件在超融合商业领域的应用,Ceph因为性能等问题被诟病,但不乏许多厂商在Ceph上不断优化和努力。
IBM General Parallel File System(GPFS通用并行文件系统)
这个专有GPFS是一个由IBM开发的高性能集群文件系统。它可以在共享磁盘或非共享分布式并行模式中进行部署。
GPFS-SNC,其中SNC代表Shared Nothing Cluster(非共享集群),它是2012年12月正式发布的GPFS 3.5版本,如今被称为GPFS-FPO(文件配置优化)。这让GPFS可以在一个联网服务器的集群上采用本地连接磁盘,而不需要配置共享磁盘的专用服务器(例如使用SAN),GPFS-FPO可充当HDFS兼容的文件系统。
GPFS时常通过调用计算集群上的MPI-IO(Message Passing Interface)进行访问。功能包括:
分布式元数据处理。包括目录树。没有单独的“目录控制器”或“索引服务器”管理文件系统。
对非常大的目录进行高效索引目录项。很多文件系统被限制在单一目录(通常, 65536或类似的小二进制数)中的少数文件内,而GPFS并没有这样的限制。
分布式锁定。该功能考虑了完整的Posix文件系统语义,包括锁定文件进行独占访问。
Global Federated File System(GFFS全局联合文件系统)
XSEDE文件系统在美国弗吉尼亚大学Genesis II项目的一部分。
GFFS的出现是源于一个对诸如文件系统的资源以一种联合,安全,标准化,可扩展和透明化的方式进行访问和远程操作的需求,而无需数据所有者或应用程序开发者和用户改变他们存储和访问数据的任何方式。
GFFS通过采用一个全局基于路径的命名空间实现,例如/data/bio/file1。
在现有文件系统中的数据,无论它们是否是 Windows文件系统, MacOS文件系统,AFS,Linux或者Lustre文件系统都可以导出或链接到全局命名空间。
例如,一个用户可以将它 “C” 盘上一个本地根目录结构,C:\work\collaboration-with-Bob导出到全局命名空间,/data/bio/project-Phil,那么用户 “C” 盘\work\collaboration-with-bob 内的文件和目录将会受到访问限制,用户可以通过/data/bio/project-Bob路径在 GFFS上访问。
最后谈一下,最常见的GPFS和HDFS有什么区别?
GPFS和Hadoop的HDFS系统对比起来相当有趣,它设计用于在商用硬件上存储类似或更大的数据——换言之就是,不配置 RAID 磁盘的数据中心和一个SAN。
HDFS还将文件分割成块,并将它们存储在不同的文件系统节点内。
HDFS对磁盘可靠性的依赖并不高,它可以在不同的节点内存储块的副本。保存单一副本块的一个节点出现故障是小问题,可以再复制该组其它有效块内的副本。相较而言,虽然GPFS支持故障节点恢复,但它是一个更严重的事件,它可能包括数据(暂时性)丢失的高风险。
GPFS支持完整的Posix文件系统语义。 HDFS和GFS(谷歌文件系统)并不支持完整的Posix语义。
GPFS跨文件系统分布它的目录索引和其它元数据。相反, Hadoop将它们保留在主要和次要Namenode中,大型服务器必须在RAM内存储所有的索引信息。
GPFS将文件分割成小块。Hadoop HDFS喜欢64MB甚至更多的块,因为这降低了Namenode的存储需求。小块或很多小的文件会快速填充文件系统的索引,因此限制了文件系统的大小。
说到分布式文件系统,不得不提到许多超融合厂商,一部分是基于Ceph的,还有一部分是完全自主研发的。
高扩展性
高性能
无单点的分布式⽂文件存储系统
可用于对象存储,块设备存储和⽂文件系统存储
读写速度快利利于共享
典型设备: 磁盘阵列,硬盘
主要是将裸磁盘空间映射给主机使用的。
优点:
通过Raid与LVM等手段,对数据提供了保护。
多块廉价的硬盘组合起来,提高容量。
多块磁盘组合出来的逻辑盘,提升读写效率。
缺点:
采用SAN架构组网时,光纤交换机,造价成本高。
主机之间无法共享数据。
使用场景:
Docker容器、虚拟机磁盘存储分配。
日志存储。
文件存储。
…
典型设备: FTP、NFS服务器
为了克服块存储文件无法共享的问题,所以有了文件存储。
在服务器上架设FTP与NFS服务,就是文件存储。
优点:
造价低,随便一台机器就可以了。
方便文件共享。
缺点:
读写速率低。
传输速率慢。
使用场景:
日志存储。
有目录结构的文件存储。
…
为什么需要对象存储?
首先,一个文件包含了属性(术语叫metadata,元数据,例如该文件的大小、修改时间、存储路径等)以及内容(以下简称数据)。
例如FAT32这种文件系统,存储过程是链表的形式。
而对象存储则将元数据独立了出来,控制节点叫元数据服务器(服务器+对象存储管理软件),里面主要负责存储对象的属性(主要是对象的数据被打散存放到了那几台分布式服务器中的信息),而其他负责存储数据的分布式服务器叫做OSD,主要负责存储文件的数据部分。当用户访问对象,会先访问元数据服务器,元数据服务器只负责反馈对象存储在哪些OSD,假设反馈文件A存储在B、C、D三台OSD,那么用户就会再次直接访问3台OSD服务器去读取数据。
这时候由于是3台OSD同时对外传输数据,所以传输的速度就加快了。当OSD服务器数量越多,这种读写速度的提升就越大,通过此种方式,实现了读写快的目的。
另一方面,对象存储软件是有专门的文件系统的,所以OSD对外又相当于文件服务器,那么就不存在文件共享方面的困难了,也解决了文件共享方面的问题。
所以对象存储的出现,很好地结合了块存储与文件存储的优点。
典型设备: 内置大容量硬盘的分布式服务器(Swift, S3)
多台服务器内置大容量硬盘,安装上对象存储管理软件,对外提供读写访问功能。
优点:
具备块存储的读写高速。
具备文件存储的共享等特性。
使用场景: (适合更新变动较少的数据)
图片存储。
视频存储。
如下图:
无论使用哪种存储方式(对象、块、挂载),存储的数据都会被切分成对象(Objects)。Objects size大小可以由管理员调整,通常为2M或4M。每个对象都会有一个唯一的OID,由ino与ono生成,虽然这些名词看上去很复杂,其实相当简单。ino即是文件的File ID,用于在全局唯一标示每一个文件,而ono则是分片的编号。比如:一个文件FileID为A,它被切成了两个对象,一个对象编号0,另一个编号1,那么这两个文件的oid则为A0与A1。Oid的好处是可以唯一标示每个不同的对象,并且存储了对象与文件的从属关系。由于ceph的所有数据都虚拟成了整齐划一的对象,所以在读写时效率都会比较高。
但是对象并不会直接存储进OSD中,因为对象的size很小,在一个大规模的集群中可能有几百到几千万个对象。这么多对象光是遍历寻址,速度都是很缓慢的;并且如果将对象直接通过某种固定映射的哈希算法映射到osd上,当这个osd损坏时,对象无法自动迁移至其他osd上面(因为映射函数不允许)。为了解决这些问题,ceph引入了归置组的概念,即PG。
PG是一个逻辑概念,我们linux系统中可以直接看到对象,但是无法直接看到PG。它在数据寻址时类似于数据库中的索引:每个对象都会固定映射进一个PG中,所以当我们要寻找一个对象时,只需要先找到对象所属的PG,然后遍历这个PG就可以了,无需遍历所有对象。而且在数据迁移时,也是以PG作为基本单位进行迁移,ceph不会直接操作对象。
对象时如何映射进PG的?还记得OID么?首先使用静态hash函数对OID做hash取出特征码,用特征码与PG的数量去模,得到的序号则是PGID。由于这种设计方式,PG的数量多寡直接决定了数据分布的均匀性,所以合理设置的PG数量可以很好的提升CEPH集群的性能并使数据均匀分布。
最后PG会根据管理员设置的副本数量进行复制,然后通过crush算法存储到不同的OSD节点上(其实是把PG中的所有对象存储到节点上),第一个osd节点即为主节点,其余均为从节点。
Ceph核心组件及概念介绍 Monitor 一个Ceph集群需要多个Monitor组成的小集群,它们通过Paxos同步数据,用来保存OSD的元数据。 OSD -- OSD全称Object Storage Device,也就是负责响应客户端请求返回具体数据的进程。一个Ceph集群一般都有很多个OSD。 MDS MDS全称Ceph Metadata Server,是CephFS服务依赖的元数据服务。 Object -- Ceph最底层的存储单元是Object对象,每个Object包含元数据和原始数据。 PG -- PG全称Placement Grouops,是一个逻辑的概念,一个PG包含多个OSD。引入PG这一层其实是为了更好的分配数据和定位数据。 RADOS RADOS全称Reliable Autonomic Distributed Object Store,是Ceph集群的精华,用户实现数据分配、Failover等集群操作。 Libradio Librados是Rados提供库,因为RADOS是协议很难直接访问,因此上层的RBD、RGW和CephFS都是通过librados访问的,目前提供PHP、Ruby、Java、Python、C和C++支持。 CRUSH -- CRUSH是Ceph使用的数据分布算法,类似一致性哈希,让数据分配到预期的地方。 RBD -- RBD全称RADOS block device,是Ceph对外提供的块设备服务。 RGW RGW全称RADOS gateway,是Ceph对外提供的对象存储服务,接口与S3和Swift兼容。 CephFS -- CephFS全称Ceph File System,是Ceph对外提供的文件系统服务。
注意版本更新非常快,有问题看官方文档 官方文档: http://docs.ceph.com/docs/master/start/ 目录 部署luminous(ceph12.2.10的版本代号) 配置dashboard 客户端使用rbd ====================================== 部署环境 系统版本:centos7.5 x86_64 server ceph版本:ceph 12.2.10(luminous) 硬件配置:5台vm,1核1G内存,每台node角色的机器至少挂载1块为osd准备的空闲盘 主机名 ip role admin 192.168.245.135 admin node1 192.168.245.136 mon / mgr / osd node2 192.168.245.137 osd node3 192.168.245.138 osd client 192.168.245.10 ====================================== 1 准备工作 1.1 开启网络(所有节点,root用户) 1.2 修改主机名/互相解析(所有节点,root用户) 1.3 创建用户(所有节点,root用户) 在所有节点上执行如下操作: 1)创建用户名:cephu,设置密码: # useradd cephu # passwd cephu 2)修改visudo文件,否则提示cephu不再sudoer列表中的错误。 命令行输入visudo,在root ALL=(ALL) ALL下面添加: cephu ALL=(ALL) ALL 3)切换至cephu用户,为该用户增加root权限: $ echo "cephu ALL=(root) NOPASSWD:ALL" | sudo tee /etc/sudoers.d/cephu $ sudo chmod 0440 /etc/sudoers.d/cephu 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 # vim /etc/yum.conf keepcache=1 # sudo yum install ceph-deploy -y 1.6 设置TTY(所有节点) 注意:此设置由官方文档指出,但是并未在这里找不到此配置行,不用做此步 # sudo visudo 找到 Defaults requiretty 注释掉 1.7 关闭selinux(所有节点) 1.8 安装ntp(所有节点) 选择任何一台机器当ntp时间服务器,其他的节点当时间服务器的客户端跟服务器同步时间 admin上: # yum install -y ntp # vim /etc/ntp.conf //有4行server的位置,把那4行server行注释掉,填写以下两行 server 127.127.1.0 # local clock fudge 127.127.1.0 stratum 10 # systemctl start ntpd # systemctl status ntpd //确认打开NTP服务 其他所有节点: # yum install ntpdate -y # ntpdate 时间服务器ip ====================================== 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.9): 目标:在node1,node2,node3三个节点上安装ceph和ceph-radosgw主包 方法1:利用官方脚本全自动安装 脚本会帮助node1,node2,node3创建epel源和ceph源,并且自动安装ceph和ceph-radosgw主包 $ ceph-deploy install --release luminous node1 node2 node3 这一步实际上是给3个节点安装两个软件:如果ceph和ceph-radosgw安装不上,则采用方法2 在千锋做实验要注意epel的源(切记) 测试是否安装完成:分别在node1 node2 node3中确认安装版本为12.2.9 $ ceph --version 方法2:手动部署安装 1)安装epel源 2)创建Ceph源,内容如下: [Ceph] name=Ceph packages for $basearch baseurl=http://download.ceph.com/rpm-luminous/el7/$basearch enabled=1 gpgcheck=1 type=rpm-md gpgkey=https://download.ceph.com/keys/release.asc priority=1 [Ceph-noarch] name=Ceph noarch packages baseurl=http://download.ceph.com/rpm-luminous/el7/noarch enabled=1 gpgcheck=1 type=rpm-md gpgkey=https://download.ceph.com/keys/release.asc priority=1 [ceph-source] name=Ceph source packages baseurl=http://download.ceph.com/rpm-luminous/el7/SRPMS enabled=1 gpgcheck=1 type=rpm-md gpgkey=https://download.ceph.com/keys/release.asc priority=1 3)分别在node1,node2,node3节点执行下面命令安装软件 可以完全手动安装,但需要yum的ceph缓存目录结构 $sudo yum install ceph ceph-radosgw -y 如果因为速度慢导致安装失败可以按ctrl+c,利用它创建的yum缓存目录,手动把安装包下载下来保存到缓存目录/var/cache/yum/x86_64/Ceph/packages目录下 再次执行安装命令: $sudo yum install ceph ceph-radosgw -y 分别在node1 node2 node3中确认安装版本为12.2.1: $ ceph --version 2.4 初始化mon: $ ceph-deploy mon create-initial 2.5 赋予各个节点使用命令免用户名权限: $ ceph-deploy admin node1 node2 node3 2.6 安装ceph-mgr:只有luminous才有,为使用dashboard做准备 $ ceph-deploy mgr create node1 2.7 添加osd: 注意:各个节点上提供存储空间的磁盘大小不能太小,最好5G以上 $ ceph-deploy osd create --data /dev/sdb node1(12.2.10版本是这条命令,分开给各节点安装) $ ceph-deploy osd create --data /dev/sdb node2 $ ceph-deploy osd create --data /dev/sdb node3 命令中/dev/sdb是在各个节点上为osd准备的空闲磁盘(无需分区格式化,如果有分区需要指定具体分区),通过如下命令查看: $ ssh node1 lsblk -f 最后通过如下命令查看集群状态: $ ssh node1 sudo ceph -s 如果显示health_ok,3个osd up就成功了 ====================================== 3 Dashboard的配置:在node1上操作 把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.245.136 ip地址为mgr节点的ip地址 3.6 web登录: 浏览器地址栏输入: mgr地址: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.245.10。修改hosts文件实现和admin节点的主机名互通。 1)升级client内核到4.x,方法在子目录中 Centos7升级内核 更新前,内核版本为: #uname -r 3.10.0-327.10.1.el7.x86_64 升级方法 导入key: #rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org 安装elrepo的yum源: #rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-2.el7.elrepo.noarch.rpm 安装内核: #yum --enablerepo=elrepo-kernel install kernel-ml-devel kernel-ml ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 当前为4.4.4: ============================================================ Package 架构 版本 源 大小 ============================================================ 正在安装: kernel-ml x86_64 4.4.4-1.el7.elrepo elrepo-kernel 38M kernel-ml-devel x86_64 4.4.4-1.el7.elrepo elrepo-kernel 10M ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 查看默认启动顺序 #awk -F\' '$1=="menuentry " {print $2}' /etc/grub2.cfg CentOS Linux (4.4.4-1.el7.elrepo.x86_64) 7 (Core) CentOS Linux (3.10.0-327.10.1.el7.x86_64) 7 (Core) CentOS Linux (0-rescue-c52097a1078c403da03b8eddeac5080b) 7 (Core) 默认启动的顺序是从0开始,新内核是从头插入(目前位置在0,而4.4.4的是在1),所以需要选择0。 #grub2-set-default 0 然后reboot重启,使用新的内核,下面是重启后使用的内核版本: #uname -r 4.4.4-1.el7.elrepo.x86_64 5、删除旧的内核 #yum remove kernel 2)为client安装ceph: 参考2.3 在做2.3之前先在client上做1.3的三步 还要做着一步 否则报错 #yum -y install python-setuptools 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 4.4 client节点创建块设备镜像:单位是M,这里是4个G $ rbd create foo --size 4096 4.5 client节点映射镜像到主机: $ sudo rbd map foo --name client.admin 4.6 client节点格式化块设备: $ sudo mkfs.ext4 -m 0 /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 客户端重起之后,设备需要重新作映射,不然可能会卡死
自建ceph源的方法
https://blog.csdn.net/michaelwoshi/article/details/94183198
[cephu@centos7u3_1 my-cluster]$ ceph-deploy new node1 Traceback (most recent call last): File "/bin/ceph-deploy", line 18, in <module> from ceph_deploy.cli import main File "/usr/lib/python2.7/site-packages/ceph_deploy/cli.py", line 1, in <module> import pkg_resources ImportError: No module named pkg_resources 重新安装python的distribution: 下载 distribution : https://pypi.python.org/pypi/distribute cd distribution-0.7.3/ sudo python setup.py install distribution下载地址: https://files.pythonhosted.org/packages/5f/ad/1fde06877a8d7d5c9b60eff7de2d452f639916ae1d48f0b8f97bf97e570a/distribute-0.7.3.zip 问题二 [ERROR ] admin_socket: exception getting command descriptions: [Errno 2] No such file or dir cat /etc/ceph/ceph.conf 添加 public_network= 192.168.122.0/24 推送 ceph-deploy --overwrite-conf config push admin node1 node2 node3 https://www.cnblogs.com/aguncn/p/7352393.html https://blog.csdn.net/zhydream77/article/details/81041767 问题三: ceph-deploy mon create-initial 时候 ``` [node1][INFO ] Running command: sudo ceph --cluster=ceph --admin-daemon /var/run/ceph/ceph-mon.node1.asok mon_status [node1][ERROR ] no valid command found; 10 closest matches: [node1][ERROR ] perf reset <var> [node1][ERROR ] perf histogram schema [node1][ERROR ] log reopen [node1][ERROR ] log flush [node1][ERROR ] perf histogram dump {<logger>} {<counter>} [node1][ERROR ] perf dump {<logger>} {<counter>} [node1][ERROR ] git_version [node1][ERROR ] get_command_descriptions [node1][ERROR ] log dump [node1][ERROR ] help [node1][ERROR ] admin_socket: invalid command [node1][WARNIN] monitor: mon.node1, might not be running yet [node1][INFO ] Running command: sudo ceph --cluster=ceph --admin-daemon /var/run/ceph/ceph-mon.node1.asok mon_status [node1][ERROR ] no valid command found; 10 closest matches: [node1][ERROR ] perf reset <var> [node1][ERROR ] perf histogram schema [node1][ERROR ] log reopen [node1][ERROR ] log flush [node1][ERROR ] perf histogram dump {<logger>} {<counter>} [node1][ERROR ] perf dump {<logger>} {<counter>} [node1][ERROR ] git_version [node1][ERROR ] get_command_descriptions [node1][ERROR ] log dump [node1][ERROR ] help [node1][ERROR ] admin_socket: invalid command [node1][WARNIN] monitor node1 does not exist in monmap ``` 原因: 第一次在做的时候没有修改主机名是就生成了公私钥,结果拷贝的公钥有问题,在问题二推送配置的时候,排查后发现主机名的问题。 之后初始化mon的时候出错,排错两个小时,差点怀疑人生的时候突然发现,想起主机名的事情,就检查了以下公私钥,结果发现生成的公私钥是以原主机名生成的,删除后生成新的公私钥,传送公钥后,还是失败。 但是感觉已经找到了问题所在,继续排查,到node1查看日志发现,地址被占用,平复以下自己激动的心,然后冷静的杀掉进程,重新初始化OK 问题四: ceph-deploy osd create --data /dev/vdc node3 [node1][WARNIN] ceph-volume lvm create: error: GPT headers found, they must be removed on: /dev/vdb [node1][ERROR ] RuntimeError: command returned non-zero exit status: 2 [ceph_deploy.osd][ERROR ] Failed to execute command: /usr/sbin/ceph-volume --cluster ceph lvm create --bluestore --data /dev/vdb [ceph_deploy][ERROR ] GenericError: Failed to create 1 OSDs 千万不要分区,然后重新加磁盘,重新做 又文档说加上参数也可以但是 ceph-deploy osd create --data /dev/vdc --fs-type xfs node3 不行 [cephu@node1 ~]$ sudo ceph auth get-or-create mgr.node1 mon 'allow profile mgr' osd 'allow *' mds 'allow *' [mgr.node1] key = AQD8HPdcmntqJRAAlZ3Aeialqq0nVcdcg+axqQ== ------------- 问题:rdb map出错rbd sysfs write failed 创建了一个rbd镜像 $ rbd create --size 4096 docker_test 然后,在Ceph client端将该rbd镜像映射为本地设备时出错。 $ rbd map docker_test --name client.admin rbd: sysfs write failed RBD image feature set mismatch. You can disable features unsupported by the kernel with "rbd feature disable". In some cases useful info is found in syslog - try "dmesg | tail" or so. 原因: rbd镜像的一些特性,OS kernel并不支持,所以映射失败。我们查看下该镜像支持了哪些特性。 $ rbd info docker_test rbd image 'docker_test': size 4096 MB in 1024 objects order 22 (4096 kB objects) block_name_prefix: rbd_data.43702ae8944a format: 2 features: layering, exclusive-lock, object-map, fast-diff, deep-flatten flags: 可以看到特性feature一栏,由于我OS的kernel只支持layering,其他都不支持,所以需要把部分不支持的特性disable掉。 方法一: 直接diable这个rbd镜像的不支持的特性: $ rbd feature disable docker_test exclusive-lock object-map fast-diff deep-flatten 方法二: 创建rbd镜像时就指明需要的特性,如: $ rbd create --size 4096 docker_test --image-feature layering 方法三: 如果还想一劳永逸 那么就在执行创建rbd镜像命令的服务器中, 修改Ceph配置文件/etc/ceph/ceph.conf, 在global section下,增加rbd_default_features = 1 再创建rdb镜像。 $ rbd create --size 4096 docker_test 通过上述三种方法后,查看rbd镜像的信息。 $ rbd info docker_test rbd image 'docker_test': size 4096 MB in 1024 objects order 22 (4096 kB objects) block_name_prefix: rbd_data.43a22ae8944a format: 2 features: layering flags: 再次尝试映射rdb镜像到本地块设备,成功! $ rbd map docker_test --name client.admin /dev/rbd0 ====================================== 问题1: 2.3步骤中,如果由于网速太慢,可以如下操作 由于网速慢的问题,安装并不会成功。之所以仍进行这一步,只因执行过了该命令就会自动创建相应文件夹。在进入各个节点手动安装的时候,才能把下载的不成功的包放到正确的目录下,这样,手动安装使用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 虽然所有安装包都在相应的目录中了,但仍可能不成功,这个时候只需要再次重新把安装包放到对应目录后再执行该命令就成功了,原因不明。 ====================================== 问题2: 2.3步骤中如果开启防火墙需要做如下操作 设置防火墙(由于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节点 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 问题3: 激活 OSD 的时候需要先把OSD所在服务器的目录所有者和所属组手动改成ceph,不然无法激活 [root@vm42 yum.repos.d]# chown ceph:ceph /var/local/osd2 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 问题4: ceph:health_warn clock skew detected on mon的解决办法 造成集群状态health_warn:clock skew detected on mon节点的原因有两个,一个是mon节点上ntp服务器未启动,另一个是ceph设置的mon的时间偏差阈值比较小。 排查时也应遵循先第一个原因,后第二个原因的方式。 第一步:确认ntp服务是否正常工作 第二步:修改ceph配置中的时间偏差阈值 1. 在admin部署节点修改配置参数: # vi ~/my-cluster/ceph.conf在global字段下添加: mon clock drift allowed = 2 mon clock drift warn backoff = 30 2. 向需要同步的mon节点推送配置文件: # ceph-deploy --overwrite-conf config push node{1..3}这里是向node1 node2 node3推送,也可以后跟其它不联系节点 3. 重启mon服务(centos7环境下) # systemctl restart ceph-mon.target4.验证: # ceph -s显示health_ok说明问题解决 问题5: 有些场景下,对osd进行一些操作,但是并不想要集群进行数据恢复,此时,可以通过设置noout标志来实现: [root@node3 ~]# ceph osd set noout noout is set [root@node3 ~]# ceph -s cluster: id: b8b4aa68-d825-43e9-a60a-781c92fec20e health: HEALTH_WARN noout flag(s) set services: mon: 1 daemons, quorum node1 mgr: node1(active) osd: 6 osds: 6 up, 6 in flags noout data: pools: 0 pools, 0 pgs objects: 0 objects, 0 bytes usage: 6339 MB used, 55100 MB / 61440 MB avail pgs: 去除noout标志命令: [root@node3 ~]# ceph osd unset noout noout is unset [root@node3 ~]# ceph -s cluster: id: b8b4aa68-d825-43e9-a60a-781c92fec20e health: HEALTH_OK services: mon: 1 daemons, quorum node1 mgr: node1(active) osd: 6 osds: 6 up, 6 in data: pools: 0 pools, 0 pgs objects: 0 objects, 0 bytes usage: 6339 MB used, 55100 MB / 61440 MB avail pgs: ================================================== Error: Package: 2:librbd1-12.2.12-0.el7.x86_64 (Ceph) Requires: liblttng-ust.so.0()(64bit 方法1 sudo yum install -y yum-utils && sudo yum-config-manager --add-repo https://dl.fedoraproject.org/pub/epel/7/x86_64/ &&sudo yum install --nogpgcheck -y epel-release &&sudo rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-7 &&sudo rm -f /etc/yum.repos.d/dl.fedoraproject.org* 方法二: yum install epel-release -y wget https://dl.fedoraproject.org/pub/epel/7/x86_64/Packages/e/epel-release-7-12.noarch.rpm rpm -Uvh epel-release*rpm yum install lttng-ust -y