├── .gitignore ├── Dockerfile ├── LICENSE ├── README.md ├── SUMMARY.md ├── architecture ├── README.md ├── ceph_architecture.png ├── crush.md ├── crush_algorithm.png ├── crush_algorithm_easy.png ├── crush_conclusion.md ├── papers.md ├── rados.md └── rados_erasure_coding.png ├── book.json ├── ceph_logo.png ├── cephfs └── README.md ├── conclusion └── README.md ├── cover.jpg ├── development ├── README.md ├── ceph_docker.md ├── ceph_github.png └── contribute_to_ceph.md ├── docker_logo.jpg ├── foreword ├── README.md ├── about_author.md ├── ceph_company.jpg └── thanks.md ├── introduction ├── README.md ├── ceph_all_component.png ├── ceph_commands.md ├── component.md ├── docker_and_ceph.jpg ├── introduction.md ├── more_introduction.md └── use_ceph.md ├── monitor ├── README.md ├── ceph_monitor.jpg ├── ceph_rest_api.md ├── ceph_web.md └── ceph_web.png ├── rbd ├── README.md ├── python_librbd.md ├── rados_rbd.jpg ├── rbd_and_openstack.md ├── rbd_and_qemu.md ├── rbd_and_virsh.md ├── rbd_clone.md ├── rbd_commands.md └── rbd_snapshot.md ├── rgw ├── README.md ├── introduction.md ├── object_storage.png ├── rgw_architecture.jpg ├── rgw_usage.md ├── s3.png ├── s3_usage.md └── swift_usage.md ├── run └── usage ├── README.md ├── basic_commands.md ├── bucket_operations.md ├── ceph_commands.md ├── ceph_container.md ├── ceph_usage.png ├── object_operations.md └── rados_operations.md /.gitignore: -------------------------------------------------------------------------------- 1 | *~ 2 | 3 | _book -------------------------------------------------------------------------------- /Dockerfile: -------------------------------------------------------------------------------- 1 | FROM ubuntu:14.10 2 | MAINTAINER tobe tobeg3oogle@gmail.com 3 | 4 | RUN apt-get -y update 5 | 6 | # Install gitbook 7 | RUN apt-get install -y curl && \ 8 | curl -sL https://deb.nodesource.com/setup | bash - && \ 9 | apt-get install -y nodejs && \ 10 | npm install gitbook -g 11 | 12 | # Add the book 13 | ADD . /ceph_from_scratch 14 | WORKDIR /ceph_from_scratch 15 | 16 | EXPOSE 4000 17 | 18 | CMD ["gitbook", "serve", "."] 19 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2015 tobe 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | 23 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Ceph From Scratch 2 | 3 | [Ceph](https://github.com/ceph/ceph)是目前非常流行的统一存储系统,所谓统一存储系统,就是通过Ceph集群同时提供[块设备存储](https://en.wikipedia.org/wiki/Device_file#BLOCKDEV)、[对象存储](https://en.wikipedia.org/wiki/Object_storage)以及[文件系统](https://en.wikipedia.org/wiki/File_system)服务。 4 | 5 | ![](./ceph_logo.png) 6 | 7 | 本书将从零开始,介绍Ceph的用法以及CRUSH、RADOS等底层技术。借助Ceph官方提供的容器,任何人都可以在本地体验此教程,学习分布式存储系统就像家庭作业一样简单。 8 | 9 | ![](./docker_logo.jpg) 10 | 11 | -------------------------------------------------------------------------------- /SUMMARY.md: -------------------------------------------------------------------------------- 1 | # SUMMARY 2 | 3 | * [前言](README.md) 4 | * [前言](foreword/README.md) 5 | * [关于作者](foreword/about_author.md) 6 | * [致谢](foreword/thanks.md) 7 | * [Ceph简介](introduction/README.md) 8 | * [架构介绍](introduction/introduction.md) 9 | * [基础组件](introduction/component.md) 10 | * [更多介绍](introduction/more_introduction.md) 11 | * [Ceph用法](usage/README.md) 12 | * [Ceph容器](usage/ceph_container.md) 13 | * [基本命令](usage/basic_commands.md) 14 | * [RADOS操作](usage/rados_operations.md) 15 | * [Bucket操作](usage/bucket_operations.md) 16 | * [Object操作](usage/object_operations.md) 17 | * [Ceph架构](architecture/README.md) 18 | * [论文介绍](architecture/papers.md) 19 | * [CRUSH详解](architecture/crush.md) 20 | * [CRUSH总结](architecture/crush_conclusion.md) 21 | * [RADOS详解](architecture/rados.md) 22 | * [RBD](rbd/README.md) 23 | * [RBD命令](rbd/rbd_commands.md) 24 | * [RBD快照](rbd/rbd_snapshot.md) 25 | * [RBD克隆](rbd/rbd_clone.md) 26 | * [RBD和Qemu](rbd/rbd_and_qemu.md) 27 | * [RBD和Virsh](rbd/rbd_and_virsh.md) 28 | * [RBD和OpenStack](rbd/rbd_and_openstack.md) 29 | * [Python librbd](rbd/python_librbd.md) 30 | * [RGW](rgw/README.md) 31 | * [RGW介绍](rgw/introduction.md) 32 | * [RGW用法](rgw/rgw_usage.md) 33 | * [S3用法](rgw/s3_usage.md) 34 | * [Swift用法](rgw/swift_usage.md) 35 | * [CephFS](cephfs/README.md) 36 | * [Ceph监控](monitor/README.md) 37 | * [Ceph-rest-api](monitor/ceph_rest_api.md) 38 | * [Ceph-web](monitor/ceph_web.md) 39 | * [参与开发](development/README.md) 40 | * [贡献代码](development/contribute_to_ceph.md) 41 | * [Ceph-docker](development/ceph_docker.md) 42 | * [结语](conclusion/README.md) -------------------------------------------------------------------------------- /architecture/README.md: -------------------------------------------------------------------------------- 1 | # 第三章 Ceph架构 2 | 3 | 前面粗略地介绍了Ceph、RADOS、CRUSH等概念和用法,本章将重点剖析具体的架构与算法,详细介绍其设计和实现细节。 4 | 5 | 通过本章可以完全掌握Ceph的核心技术和算法。 6 | 7 | ![](./ceph_architecture.png) -------------------------------------------------------------------------------- /architecture/ceph_architecture.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tobegit3hub/ceph_from_scratch/373c0044673957f3dc6836ab7521ec205f1e991b/architecture/ceph_architecture.png -------------------------------------------------------------------------------- /architecture/crush.md: -------------------------------------------------------------------------------- 1 | # CRUSH详解 2 | 3 | ## CRUSH简介 4 | 5 | CRUSH全称Controlled Replication Under Scalable Hashing,是一种数据分发算法,类似于哈希和一致性哈希。哈希的问题在于数据增长时不能动态加Bucket,一致性哈希的问题在于加Bucket时数据迁移量比较大,其他数据分发算法依赖中心的Metadata服务器来存储元数据效率较低,CRUSH则是通过计算、接受多维参数的来解决动态数据分发的场景。 6 | 7 | ## 算法基础 8 | 9 | 在学习CRUSH之前,需要了解以下的内容。 10 | 11 | CRUSH算法接受的参数包括cluster map,也就是硬盘分布的逻辑位置,例如这有多少个机房、多少个机柜、硬盘是如何分布的等等。cluster map是类似树的多层结果,子节点是真正存储数据的device,每个device都有id和权重,中间节点是bucket,bucket有多种类型用于不同的查询算法,例如一个机柜一个机架一个机房就是bucket。 12 | 13 | 另一个参数是placement rules,它指定了一份数据有多少备份,数据的分布有什么限制条件,例如同一份数据不能放在同一个机柜里等的功能。每个rule就是一系列操作,take操作就是就是选一个bucket,select操作就是选择n个类型是t的项,emit操作就是提交最后的返回结果。select要考虑的东西主要包括是否冲突、是否有失败和负载问题。 14 | 15 | 算法的还有一个输入是整数x,输出则是一个包含n个目标的列表R,例如三备份的话输出可能是[1, 3, 5]。 16 | 17 | ## 算法解读 18 | 19 | ![](./crush_algorithm.png) 20 | 21 | 图虽然很复杂,但如果理解了几个基本操作的含义就很好读下来了,这里是三个操作的伪代码,take和emit很好理解,select主要是遍历当前bucket,如果出现重复、失败或者超载就跳过,其中稍微复杂的“first n”部分是一旦遇到失败,第一种情况是直接使用多备份,第二种情况是使用erasing code基本可以忽略。看着下面的图就更好理解具体的算法了。 22 | 23 | ![](./crush_algorithm_easy.png) 24 | 25 | 26 | -------------------------------------------------------------------------------- /architecture/crush_algorithm.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tobegit3hub/ceph_from_scratch/373c0044673957f3dc6836ab7521ec205f1e991b/architecture/crush_algorithm.png -------------------------------------------------------------------------------- /architecture/crush_algorithm_easy.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tobegit3hub/ceph_from_scratch/373c0044673957f3dc6836ab7521ec205f1e991b/architecture/crush_algorithm_easy.png -------------------------------------------------------------------------------- /architecture/crush_conclusion.md: -------------------------------------------------------------------------------- 1 | # CRUSH总结 2 | 3 | ## 算法总结 4 | 5 | CRUSH与一致性哈希最大的区别在于接受的参数多了cluster map和placement rules,这样就可以根据目前cluster的状态动态调整数据位置,同时通过算法得到一致的结果。 6 | 7 | ## 算法补充 8 | 9 | 前面介绍了bucket根据不同场景有四种类型,分别是Uniform、List、Tree和Straw,它们对应运行数据和数据迁移量有不同的tradeoff,目前大家都在用Straw因此不太需要关心其他。 10 | 11 | 目前erasing code可以大大减小三备份的数据量,但除了会导致数据恢复慢,部分ceph支持的功能也是不能直接用的,而且功能仍在开发中不建议使用。 12 | 13 | -------------------------------------------------------------------------------- /architecture/papers.md: -------------------------------------------------------------------------------- 1 | # 论文 2 | 3 | ## 简介 4 | 5 | Ceph是Sega本人的博士论文作品,想了解Ceph的架构设计最好的方式是阅读Sega的论文,其博士论文我们称之为长论文,后来整理成三篇较短的论文。 6 | 7 | ## 长论文 8 | 9 | 长论文包含了RADOS、CRUSH等所有内容的介绍,但篇幅相当长,如果感兴趣可以阅读,标题为《CEPH: RELIABLE, SCALABLE, AND HIGH-PERFORMANCE DISTRIBUTED STORAGE》,地址 https://ceph.com/wp-content/uploads/2016/08/weil-thesis.pdf 。 10 | 11 | ## CRUSH论文 12 | 13 | CRUSH论文标题为《CRUSH: Controlled, Scalable, Decentralized Placement of Replicated Data》,地址 https://ceph.com/wp-content/uploads/2016/08/weil-crush-sc06.pdf ,介绍了CRUSH的设计与实现细节。 14 | 15 | ## RADOS论文 16 | 17 | RADOS论文标题为《RADOS: A Scalable, Reliable Storage Service for Petabyte-scale Storage Clusters》,地址为 https://ceph.com/wp-content/uploads/2016/08/weil-rados-pdsw07.pdf ,介绍了RADOS的设计与实现细节。 18 | 19 | ## CephFS论文 20 | 21 | CephFS论文标题为《Ceph: A Scalable, High-Performance Distributed File System》,地址为 https://ceph.com/wp-content/uploads/2016/08/weil-ceph-osdi06.pdf ,介绍了Ceph的基本架构和Ceph的设计与实现细节。 22 | -------------------------------------------------------------------------------- /architecture/rados.md: -------------------------------------------------------------------------------- 1 | # RADOS详解 2 | 3 | ## RADOS简介 4 | 5 | RADOS是ceph实现高可用、数据自动恢复的框架,设计的点比较多后面在详细介绍。 6 | 7 | ![](./rados_erasure_coding.png) -------------------------------------------------------------------------------- /architecture/rados_erasure_coding.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tobegit3hub/ceph_from_scratch/373c0044673957f3dc6836ab7521ec205f1e991b/architecture/rados_erasure_coding.png -------------------------------------------------------------------------------- /book.json: -------------------------------------------------------------------------------- 1 | { 2 | "output": null, 3 | "generator": "site", 4 | "title": "Ceph From Scratch", 5 | "description": "Ceph From Scratch", 6 | "extension": null, 7 | "plugins": [], 8 | "pluginsConfig": { 9 | "fontSettings": { 10 | "theme": "sepia", "night" or "white", 11 | "family": "cns11643-sung", 12 | "size": 4 13 | } 14 | }, 15 | "pdf": { 16 | "toc": true, 17 | "pageNumbers": true, 18 | "fontSize": 18, 19 | // Choices are [u’a0’, u’a1’, u’a2’, u’a3’, u’a4’, u’a5’, u’a6’, u’b0’, u’b1’, u’b2’, u’b3’, u’b4’, u’b5’, u’b6’, u’legal’, u’letter’] 20 | "paperSize": "a4", 21 | // Note: 72 pts equals 1 inch 22 | "margin": { 23 | "right": 36, 24 | "left": 36, 25 | "top": 36, 26 | "bottom": 36 27 | } 28 | } 29 | "links": { 30 | "home": "https://github.com/tobegit3hub/understand_linux_process", 31 | "about": "https://github.com/tobegit3hub/understand_linux_process", 32 | "issues": "https://github.com/tobegit3hub/understand_linux_process/issues", 33 | "edit": null, 34 | "sharing": { 35 | "google": null, 36 | "facebook": null, 37 | "twitter": null, 38 | "weibo": null 39 | } 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /ceph_logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tobegit3hub/ceph_from_scratch/373c0044673957f3dc6836ab7521ec205f1e991b/ceph_logo.png -------------------------------------------------------------------------------- /cephfs/README.md: -------------------------------------------------------------------------------- 1 | # 第六章 CephFS 2 | 3 | 这一章计划介绍CephFS的搭建和使用。 4 | 5 | 由于CephFS仍未能上Production环境,本章内容将在CephFS稳定后继续完善。 -------------------------------------------------------------------------------- /conclusion/README.md: -------------------------------------------------------------------------------- 1 | # 结语 2 | 3 | 最后,感谢读者关注本书以及ceph存储系统。 4 | 5 | Ceph是开源的块设备、对象存储、文件系统服务,[UnitedStack](https://www.ustack.com/)有全国最优秀的ceph团队,欢迎与各位大牛交流。 6 | 7 | 本书所有内容也开源在[Github](https://github.com/tobegit3hub/ceph_from_scratch),如有勘误或者想要更详细的教程,欢迎提交issue与pull-request。 -------------------------------------------------------------------------------- /cover.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tobegit3hub/ceph_from_scratch/373c0044673957f3dc6836ab7521ec205f1e991b/cover.jpg -------------------------------------------------------------------------------- /development/README.md: -------------------------------------------------------------------------------- 1 | # 第八章 参与开发 2 | 3 | 本章将介绍如何参与Ceph社区开发,以及Ceph相关项目的介绍。 4 | 5 | ![](./ceph_github.png) -------------------------------------------------------------------------------- /development/ceph_docker.md: -------------------------------------------------------------------------------- 1 | # Ceph-docker 2 | 3 | Ceph-docker是ceph官方团队维护的docker镜像,这些镜像都是每次有代码提交都会automated build生成的,你可以使用这些镜像快速启动ceph环境或者使用docker部署ceph集群。 4 | 5 | 如果你对官方docker镜像不满意,也可以通过pull-request提交你的修改,例如前面提到的ceph-rest-api也是我们提交到ceph/demo镜像的。 -------------------------------------------------------------------------------- /development/ceph_github.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tobegit3hub/ceph_from_scratch/373c0044673957f3dc6836ab7521ec205f1e991b/development/ceph_github.png -------------------------------------------------------------------------------- /development/contribute_to_ceph.md: -------------------------------------------------------------------------------- 1 | # 贡献代码 2 | 3 | 目前Ceph代码托管到[Github](https://github.com/ceph/ceph),任何开发者都可以给Ceph项目提交Pull-request,由committer决定是否merge你的代码。 4 | 5 | 而Ceph使用自己的Bug跟踪系统[tracker](http://tracker.ceph.com/),代码的Bug、功能改进以及版本发布都会在tracker中及时更新。 6 | 7 | 如果你有志于参与Ceph的开发,请订阅他们的[邮件列表](https://ceph.com/resources/mailing-list-irc/)和IRC频道。 -------------------------------------------------------------------------------- /docker_logo.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tobegit3hub/ceph_from_scratch/373c0044673957f3dc6836ab7521ec205f1e991b/docker_logo.jpg -------------------------------------------------------------------------------- /foreword/README.md: -------------------------------------------------------------------------------- 1 | # 前言 2 | 3 | 2006年Sage Weil发表了Ceph论文,启动一个伟大的开源项目,感谢作者。 4 | 5 | 2014年Redhat及其收购的Inktank在Ceph贡献全球第一,中国的UnitedStack全球第二也是国内第一,Ubuntu麒麟也有卓越贡献,感谢开发者。 6 | 7 | 还要感谢国内外关注Ceph的开发者以及运维人员! 8 | 9 | 本书使用GitBook编写,通过`gitbook serve`运行,也可以在本地运行Docker容器: 10 | 11 | ``` 12 | docker run -d -p 4000:4000 tobegit3hub/ceph_from_scratch 13 | ``` 14 | 15 | ![](ceph_company.jpg) -------------------------------------------------------------------------------- /foreword/about_author.md: -------------------------------------------------------------------------------- 1 | # 关于作者 2 | 3 | [tobe](http://github.com/tobegit3hub),前小米基础架构工程师,Docker监控管理工具[seagull](http://github.com/tobegit3hub/seagull)和开源持续集成系统[ArchCI](https://github.com/ArchCI/archci)作者,开源电子书[理解Linux进程](http://github.com/tobegit3hub/understand_linux_process)作者,现在UnitedStack负责[Docker](http://github.com/docker/docker)容器和[Ceph](http://github.com/ceph/ceph)存储。 4 | -------------------------------------------------------------------------------- /foreword/ceph_company.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tobegit3hub/ceph_from_scratch/373c0044673957f3dc6836ab7521ec205f1e991b/foreword/ceph_company.jpg -------------------------------------------------------------------------------- /foreword/thanks.md: -------------------------------------------------------------------------------- 1 | # 致谢 2 | 3 | ``` 4 | sudo docker run ubuntu echo "致谢读者们!" 5 | ``` 6 | -------------------------------------------------------------------------------- /introduction/README.md: -------------------------------------------------------------------------------- 1 | # 第一章 Ceph简介 2 | 3 | 本章将介绍Ceph的设计思路和基本组件,帮助你快速入门和了解Ceph。 4 | 5 | 阅读本章内容可以理解Ceph的架构设计、CRUSH、RADOS等概念,并且知道基于Ceph的RBD、RGW和CephFS等服务。 6 | 7 | -------------------------------------------------------------------------------- /introduction/ceph_all_component.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tobegit3hub/ceph_from_scratch/373c0044673957f3dc6836ab7521ec205f1e991b/introduction/ceph_all_component.png -------------------------------------------------------------------------------- /introduction/ceph_commands.md: -------------------------------------------------------------------------------- 1 | # Ceph命令 2 | 3 | 运行`ceph/demo`容器后可以随心所欲执行Ceph命令了。 4 | 5 | ``` 6 | root@dev:/# ceph -w 7 | cluster 99ce2286-ac36-40c4-bdb7-c592893b6102 8 | health HEALTH_OK 9 | monmap e1: 1 mons at {dev=10.0.2.15:6789/0} 10 | election epoch 2, quorum 0 dev 11 | mdsmap e9: 1/1/1 up {0=0=up:active} 12 | osdmap e42: 1 osds: 1 up, 1 in 13 | pgmap v912: 120 pgs, 8 pools, 2810 bytes data, 63 objects 14 | 3437 MB used, 14198 MB / 18603 MB avail 15 | 120 active+clean 16 | 17 | 2015-06-29 15:17:07.137895 mon.0 [INF] pgmap v912: 120 pgs: 120 active+clean; 2810 bytes data, 3437 MB used, 14198 MB / 18603 MB avail 18 | ``` 19 | 20 | -------------------------------------------------------------------------------- /introduction/component.md: -------------------------------------------------------------------------------- 1 | # 基础组件 2 | 3 | ## Object 4 | 5 | Ceph最底层的存储单元是Object对象,每个Object包含元数据和原始数据。 6 | 7 | ## OSD 8 | 9 | OSD全称Object Storage Device,也就是负责响应客户端请求返回具体数据的进程。一个Ceph集群一般都有很多个OSD。 10 | 11 | ## PG 12 | 13 | PG全称Placement Groups,是一个逻辑的概念,一个PG包含多个OSD。引入PG这一层其实是为了更好的分配数据和定位数据。 14 | 15 | ## Monitor 16 | 17 | 一个Ceph集群需要多个Monitor组成的小集群,它们通过Paxos同步数据,用来保存OSD的元数据。 18 | 19 | ## RADOS 20 | 21 | RADOS全称Reliable Autonomic Distributed Object Store,是Ceph集群的精华,用户实现数据分配、Failover等集群操作。 22 | 23 | ## Librados 24 | 25 | Librados是Rados提供库,因为RADOS是协议很难直接访问,因此上层的RBD、RGW和CephFS都是通过librados访问的,目前提供PHP、Ruby、Java、Python、C和C++支持。 26 | 27 | ## CRUSH 28 | 29 | CRUSH是Ceph使用的数据分布算法,类似一致性哈希,让数据分配到预期的地方。 30 | 31 | ## RBD 32 | 33 | RBD全称RADOS block device,是Ceph对外提供的块设备服务。 34 | 35 | ## RGW 36 | 37 | RGW全称RADOS gateway,是Ceph对外提供的对象存储服务,接口与S3和Swift兼容。 38 | 39 | ## MDS 40 | 41 | MDS全称Ceph Metadata Server,是CephFS服务依赖的元数据服务。 42 | 43 | ## CephFS 44 | 45 | CephFS全称Ceph File System,是Ceph对外提供的文件系统服务。 46 | -------------------------------------------------------------------------------- /introduction/docker_and_ceph.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tobegit3hub/ceph_from_scratch/373c0044673957f3dc6836ab7521ec205f1e991b/introduction/docker_and_ceph.jpg -------------------------------------------------------------------------------- /introduction/introduction.md: -------------------------------------------------------------------------------- 1 | # 简介 2 | 3 | Ceph is a distributed object, block, and file storage platform. 4 | 5 | 也就是说,使用Ceph系统我们可以提供对象存储、块设备存储和文件系统服务,更有趣的是基于Ceph的key-value存储和NoSQL存储也在开发中,让Ceph成为目前最流行的统一存储系统。 6 | 7 | Ceph底层提供了分布式的RADOS存储,用于支撑上层的librados和RGW、RBD、CephFS等服务。Ceph实现了非常底层的object storage,是纯粹的SDS,并且支持通用的ZFS、BtrFS和Ext4文件系统,能轻易得Scale,没有单点故障。 8 | 9 | 接下来马上介绍Ceph的各个基础组件。 10 | 11 | ![](./ceph_all_component.png) 12 | 13 | -------------------------------------------------------------------------------- /introduction/more_introduction.md: -------------------------------------------------------------------------------- 1 | # 更多介绍 2 | 3 | 前面对Ceph各个组件都简要介绍了一下,最重要的是RADOS的设计和CRUSH算法的使用,后面会有更详细的介绍。 4 | 5 | 接下来要想学好Ceph,最重要是实践。 6 | 7 | ![](./docker_and_ceph.jpg) -------------------------------------------------------------------------------- /introduction/use_ceph.md: -------------------------------------------------------------------------------- 1 | # 使用Ceph 2 | 3 | 目前[Ceph官网](http://ceph.com/)提供了多种安装方式,但是最简单的方法当然是使用Docker。 4 | 5 | 首先通过命令`ifconfig`找到当前主机的IP,如下。 6 | 7 | ``` 8 | eth0 Link encap:Ethernet HWaddr 08:00:27:F9:89:52 9 | inet addr:10.0.2.15 Bcast:10.0.2.255 Mask:255.255.255.0 10 | inet6 addr: fe80::a00:27ff:fef9:8952/64 Scope:Link 11 | UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 12 | RX packets:288605 errors:0 dropped:0 overruns:0 frame:0 13 | TX packets:55395 errors:0 dropped:0 overruns:0 carrier:0 14 | collisions:0 txqueuelen:1000 15 | RX bytes:307079524 (292.8 MiB) TX bytes:3963682 (3.7 MiB) 16 | ``` 17 | 18 | 记住本机IP为10.0.2.15,然后可以使用[ceph-docker](https://github.com/ceph/ceph-docker)提供的命令。 19 | 20 | ``` 21 | docker run -d --net=host -e MON_IP=10.0.2.15 -e CEPH_PUBLIC_NETWORK=10.0.2.0/24 ceph/demo 22 | ``` 23 | 24 | 这样就启动一个单机版Ceph服务了,通过`docker exec`进入容器,开始体验Ceph命令吧。 25 | -------------------------------------------------------------------------------- /monitor/README.md: -------------------------------------------------------------------------------- 1 | # 第七章 Ceph监控 2 | 3 | 这一章将介绍Ceph的监控与运维,搭建Ceph是一次性的工作,但运维Ceph却是长久的任务,幸运的是Ceph本身提供了很好的监控管理工具,方便我们管理Ceph集群。 4 | 5 | 通过本章我们可以学到Ceph官方提供的ceph-rest-api,并带领大家一步一步实现基于ceph-rest-api的Web监控管理工具。 6 | 7 | ![](./ceph_monitor.jpg) -------------------------------------------------------------------------------- /monitor/ceph_monitor.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tobegit3hub/ceph_from_scratch/373c0044673957f3dc6836ab7521ec205f1e991b/monitor/ceph_monitor.jpg -------------------------------------------------------------------------------- /monitor/ceph_rest_api.md: -------------------------------------------------------------------------------- 1 | # Ceph REST API 2 | 3 | ## 简介 4 | 5 | Ceph-rest-api是Ceph官方提供的RESTful API接口,启动其进程后我们可以通过HTTP接口来收集Ceph集群状态与数据,并且进行起停OSD等管理操作。 6 | 7 | 详细的API文档可参考 https://dmsimard.com/2014/01/01/documentation-for-ceph-rest-api/ 。 8 | 9 | ## 启动API 10 | 11 | 因为ceph-rest-api需要管理一个ceph集群,我们建议通过ceph/demo来启动。 12 | 13 | ``` 14 | docker run -d --net=host -e MON_IP=10.0.2.15 -e CEPH_NETWORK=10.0.2.0/24 ceph/demo 15 | ``` 16 | 17 | ``` 18 | ceph-rest-api -n client.admin 19 | ``` 20 | 21 | 这样在启动单机版ceph的同时,也启动了ceph-rest-api。 22 | 23 | ## 测试API 24 | 25 | 通过简单的curl命令即可获得集群的状态信息。 26 | 27 | ``` 28 | root@dev:/# curl 127.0.0.1:5000/api/v0.1/health 29 | HEALTH_OK 30 | ``` 31 | 32 | 或者查询更复杂的数据。 33 | 34 | ``` 35 | root@dev:/# curl 127.0.0.1:5000/api/v0.1/osd/tree 36 | ID WEIGHT TYPE NAME UP/DOWN REWEIGHT PRIMARY-AFFINITY 37 | -1 1.00000 root default 38 | -2 1.00000 host dev 39 | 0 1.00000 osd.0 up 1.00000 1.00000 40 | -3 0 rack rack01 41 | -4 0 rack rack02 42 | -5 0 rack rack03 43 | ``` -------------------------------------------------------------------------------- /monitor/ceph_web.md: -------------------------------------------------------------------------------- 1 | # Ceph-web 2 | 3 | ## 监控工具 4 | 5 | 前面提到过的ceph-rest-api,为我们提供了HTTP接口来访问Ceph集群的状态信息,但是只有ceph-rest-api远远不够,我们需要更友好的Web管理工具。这里我们将介绍开源的ceph-web项目,是非常简单的Web前端,通过ceph-rest-api获得数据并展示。 6 | 7 | ## Ceph-web 8 | 9 | 为了不增加API的复杂性,ceph-web遵循官方ceph-rest-api的接口,只是提供HTTP服务器并展示Ceph的数据,开源地址 https://github.com/tobegit3hub/ceph-web 。 10 | 11 | 目前ceph-web已经支持通过容器运行,执行下述命令即可一键启动Ceph监控工具。 12 | 13 | ``` 14 | docker run -d --net=host tobegit3hub/ceph-web 15 | ``` 16 | 17 | 这样通过浏览器打开 http://127.0.0.1:8080 就可以看到以下管理界面。 18 | 19 | ![](ceph_web.png) -------------------------------------------------------------------------------- /monitor/ceph_web.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tobegit3hub/ceph_from_scratch/373c0044673957f3dc6836ab7521ec205f1e991b/monitor/ceph_web.png -------------------------------------------------------------------------------- /rbd/README.md: -------------------------------------------------------------------------------- 1 | # 第四章 RBD 2 | 3 | 本章将介绍使用ceph搭建块设备服务。 4 | 5 | ![](./rados_rbd.jpg) -------------------------------------------------------------------------------- /rbd/python_librbd.md: -------------------------------------------------------------------------------- 1 | # Python librbd 2 | 3 | ## 安装librbd 4 | 5 | Ceph官方提供Python库来访问RBD,通过以下命令可以安装。 6 | 7 | ``` 8 | apt-get install -y python-ceph 9 | ``` 10 | 11 | ## 创建Image 12 | 13 | 使用librbd创建Image也很简单,下面是示例代码。 14 | 15 | ``` 16 | import rados 17 | import rbd 18 | 19 | cluster = rados.Rados(conffile='/etc/ceph/ceph.conf') 20 | cluster.connect() 21 | ioctx = cluster.open_ioctx('rbd') 22 | 23 | rbd_inst = rbd.RBD() 24 | size = 1024**3 25 | image_name = "test_image" 26 | rbd_inst.create(ioctx, image_name, size) 27 | 28 | image = rbd.Image(ioctx, image_name) 29 | data = 'foo' * 200 30 | image.write(data, 0) 31 | 32 | image.close() 33 | ioctx.close() 34 | cluster.shutdown() 35 | ``` 36 | 37 | 也可以把下面代码保存成文件直接执行。 38 | 39 | ``` 40 | cluster = rados.Rados(conffile='/etc/ceph/ceph.conf') 41 | try: 42 | ioctx = cluster.open_ioctx('rbd') 43 | try: 44 | rbd_inst = rbd.RBD() 45 | size = 1024**3 46 | image_name = "test_image" 47 | rbd_inst.create(ioctx, image_name, size) 48 | image = rbd.Image(ioctx, image_name) 49 | try: 50 | data = 'foo' * 200 51 | image.write(data, 0) 52 | finally: 53 | image.close() 54 | finally: 55 | ioctx.close() 56 | finally: 57 | cluster.shutdown() 58 | ``` 59 | 60 | 或者这样。 61 | 62 | ``` 63 | with rados.Rados(conffile='/etc/ceph/ceph.conf') as cluster: 64 | with cluster.open_ioctx('rbd') as ioctx: 65 | rbd_inst = rbd.RBD() 66 | size = 1024**3 67 | image_name = "test_image" 68 | rbd_inst.create(ioctx, image_name, size) 69 | with rbd.Image(ioctx, image_name) as image: 70 | data = 'foo' * 200 71 | image.write(data, 0) 72 | ``` -------------------------------------------------------------------------------- /rbd/rados_rbd.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tobegit3hub/ceph_from_scratch/373c0044673957f3dc6836ab7521ec205f1e991b/rbd/rados_rbd.jpg -------------------------------------------------------------------------------- /rbd/rbd_and_openstack.md: -------------------------------------------------------------------------------- 1 | # RBD和OpenStack 2 | 3 | ## OpenStack介绍 4 | 5 | OpenStack开源的云平台,其中Nova提供虚拟机服务,Glance提供镜像服务,Cinder提供块设备服务。因为OpenStack是Python实现的,因此RBD与OpenStack集成需要安装下面的软件。 6 | 7 | ``` 8 | apt-get install -y python-ceph 9 | ``` 10 | 11 | ## Nova与RBD 12 | 13 | 修改nova.conf配置文件。 14 | 15 | ``` 16 | libvirt_images_type=rbd 17 | libvirt_images_rbd_pool=volumes 18 | libvirt_images_rbd_ceph_conf=/etc/ceph/ceph.conf 19 | rbd_user=cinder 20 | rbd_secret_uuid=457eb676-33da-42ec-9a8c-9293d545c337 21 | 22 | libvirt_inject_password=false 23 | libvirt_inject_key=false 24 | libvirt_inject_partition=-2 25 | ``` 26 | 27 | ## Glance与RBD 28 | 29 | 修改glance-api.conf配置文件。 30 | 31 | ``` 32 | default_store=rbd 33 | rbd_store_user=glance 34 | rbd_store_pool=images 35 | show_image_direct_url=True 36 | ``` 37 | 38 | ## Cinder与RBD 39 | 40 | 修改cinder.conf配置文件。 41 | 42 | ``` 43 | volume_driver=cinder.volume.drivers.rbd.RBDDriver 44 | rbd_pool=volumes 45 | rbd_ceph_conf=/etc/ceph/ceph.conf 46 | rbd_flatten_volume_from_snapshot=false 47 | rbd_max_clone_depth=5 48 | glance_api_version=2 49 | 50 | backup_driver=cinder.backup.drivers.ceph 51 | backup_ceph_conf=/etc/ceph/ceph.conf 52 | backup_ceph_user=cinder-backup 53 | backup_ceph_chunk_size=134217728 54 | backup_ceph_pool=backups 55 | backup_ceph_stripe_unit=0 56 | backup_ceph_stripe_count=0 57 | restore_discard_excess_bytes=true 58 | ``` -------------------------------------------------------------------------------- /rbd/rbd_and_qemu.md: -------------------------------------------------------------------------------- 1 | # RBD和Qemu 2 | 3 | ## 使用Qemu 4 | 5 | 官方Qemu已经支持librbd,使用Qemu创建镜像前需要安装工具。 6 | 7 | ``` 8 | apt-get install -y qemu-utils 9 | ``` 10 | 11 | ## 创建镜像 12 | 13 | 创建镜像非常简单,使用`qemu-img`命令,注意目前RBD只支持raw格式镜像。 14 | 15 | ``` 16 | qemu-img create -f raw rbd:rbd/test_image3 1G 17 | ``` 18 | 19 | ## 修改镜像大小 20 | 21 | 修改镜像大小可以使用`resize`子命令。 22 | 23 | ``` 24 | qemu-img resize rbd:rbd/test_image3 2G 25 | ``` 26 | 27 | ## 查看镜像信息 28 | 29 | 通过`info`可以获取Qemu镜像信息。 30 | 31 | ``` 32 | qemu-img info rbd:rbd/test_image3 33 | ``` 34 | 35 | -------------------------------------------------------------------------------- /rbd/rbd_and_virsh.md: -------------------------------------------------------------------------------- 1 | # RBD和Virsh 2 | 3 | ## 安装Virsh 4 | 5 | Virsh是通用的虚拟化技术抽象层,可以统一管理Qemu/KVM、Xen和LXC等,要结合Virsh和RBD使用,我们需要安装对应工具。 6 | 7 | ``` 8 | apt-get install -y virt-manager 9 | ``` 10 | -------------------------------------------------------------------------------- /rbd/rbd_clone.md: -------------------------------------------------------------------------------- 1 | # RBD克隆 2 | 3 | ## 创建clone 4 | 5 | RBD克隆就是通过快照克隆出新的可读可写的Image,创建前需要创建format为2的镜像快照。 6 | 7 | ``` 8 | rbd create test_image2 --size 1024 --image-format 2 9 | rbd snap create --image test_image2 --snap test_snap2 10 | rbd snap protect --image test_image2 --snap test_snap2 11 | ``` 12 | 13 | 通过`clone`子命令就可以创建clone了。 14 | 15 | ``` 16 | rbd clone --image test_image2 --snap test_snap2 test_clone 17 | ``` 18 | 19 | ## 列举clone 20 | 21 | 通过`children`子命令可以列举这个快照的所有克隆。 22 | 23 | ``` 24 | rbd children --image test_image2 --snap test_snap2 25 | ``` 26 | 27 | ## 填充克隆 28 | 29 | 填充克隆也就是把快照数据flatten到clone中,如果你想删除快照你需要flatten所有的子Image。 30 | 31 | ``` 32 | rbd flatten --image test_clone 33 | ``` 34 | -------------------------------------------------------------------------------- /rbd/rbd_commands.md: -------------------------------------------------------------------------------- 1 | # RBD命令 2 | 3 | ## 检查Pool 4 | 5 | Ceph启动后默认创建rbd这个pool,使用rbd命令默认使用它,我们也可以创建新的pool。 6 | 7 | ``` 8 | rados lspools 9 | ceph osd pool create rbd_pool 1024 10 | ``` 11 | 12 | ## 创建Image 13 | 14 | 使用rbd命令创建image,创建后发现rbd这个pool会多一个`rbd_directory`的object。 15 | 16 | ``` 17 | rbd create test_image --size 1024 18 | rbd ls 19 | rbd --image test_image info 20 | rados -p rbd ls 21 | ``` 22 | 23 | ## 修改Image大小 24 | 25 | 增加Image大小可以直接使用`resize`子命令,如果缩小就需要添加`--allow-shrink`参数保证安全。 26 | 27 | ``` 28 | rbd --image test_image resize --size 2000 29 | rbd --image test_image resize --size 1000 --allow-shrink 30 | ``` 31 | 32 | ## 使用Image 33 | 34 | 通过`map`子命令可以把镜像映射成本地块设备,然后就可以格式化和`mount`了。 35 | 36 | ``` 37 | rbd map test_image 38 | rbd showmapped 39 | mkfs.ext4 /dev/rbd0 40 | mount /dev/rbd0 /mnt/ 41 | ``` 42 | 43 | ## 移除Image 44 | 45 | ``` 46 | umount /dev/rbd0 47 | rbd unmap /dev/rbd0 48 | rbd showmapped 49 | ``` 50 | 51 | ## 删除Image 52 | 53 | 删除和Linux类似使用`rm`命令即可。 54 | 55 | ``` 56 | rbd --image test_image rm 57 | ``` -------------------------------------------------------------------------------- /rbd/rbd_snapshot.md: -------------------------------------------------------------------------------- 1 | # RBD快照 2 | 3 | ## 创建快照 4 | 5 | 通过`snap`子命令可以创建和查看快照。 6 | 7 | ``` 8 | rbd snap create --image test_image --snap test_snap 9 | rbd snap ls --image test_image 10 | ``` 11 | 12 | ## 快照回滚 13 | 14 | 使用`snap rollback`就可以回滚快照,由于快照命名是镜像名后面加@,我们还可以下面的简便写法。 15 | 16 | ``` 17 | rbd snap rollback --image test_image --snap test_snap 18 | rbd snap rollback rbd/test_image@test_snap 19 | ``` 20 | 21 | ## 删除快照 22 | 23 | 删除快照也很简单,使用`rm`子命令,如果想清理所有快照可以使用`purge`子命令,注意Ceph删除是异步的不会立即释放空间。 24 | 25 | ``` 26 | rbd snap rm --image test_image --snap test_snap 27 | rbd snap purge --image test_image 28 | ``` 29 | 30 | ## 保护快照 31 | 32 | 保护快照可以防止用户误删数据,这是clone前必须做的。 33 | 34 | ``` 35 | rbd snap protect --image test_image --snap test_snap 36 | ``` 37 | 38 | 要想不保护快照也很容易,使用`unprotect`子命令即可。 39 | 40 | ``` 41 | rbd snap unprotect --image test_image --snap test_snap 42 | ``` 43 | 44 | -------------------------------------------------------------------------------- /rgw/README.md: -------------------------------------------------------------------------------- 1 | # 第五章 RGW 2 | 3 | RGW是ceph提供对象存储服务,本章将介绍RGW的搭建和使用,从而提供类似S3和Swift服务。 4 | 5 | 通过本章你可以在本地起ceph的S3服务,然后使用命令行或者SDK工具来访问对象存储服务,并且使用ceph管理用户和quota。 6 | 7 | ![](./object_storage.png) -------------------------------------------------------------------------------- /rgw/introduction.md: -------------------------------------------------------------------------------- 1 | # RGW介绍 2 | 3 | RGW全称Rados Gateway,是ceph封装RADOS接口而提供的gateway服务,并且实现S3和Swift兼容的接口,也就是说用户可以使用S3或Swift的命令行工具或SDK来使用RGW。 4 | 5 | RGW对象存储也可以作为[docker registry](https://github.com/docker/registry)的后端,相对与本地存储,将docker镜像存储到RGW后端可以保证即使机器宕机或者操作系统crush也不会丢失数据。 6 | 7 | ![](./rgw_architecture.jpg) -------------------------------------------------------------------------------- /rgw/object_storage.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tobegit3hub/ceph_from_scratch/373c0044673957f3dc6836ab7521ec205f1e991b/rgw/object_storage.png -------------------------------------------------------------------------------- /rgw/rgw_architecture.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tobegit3hub/ceph_from_scratch/373c0044673957f3dc6836ab7521ec205f1e991b/rgw/rgw_architecture.jpg -------------------------------------------------------------------------------- /rgw/rgw_usage.md: -------------------------------------------------------------------------------- 1 | # RGW用法 2 | 3 | ## 使用RGW 4 | 5 | RGW同时提供了S3和Swift兼容的接口,因此只要启动了RGW服务,就可以像使用S3或Swift那样访问RGW的object和bucket了。 6 | 7 | 本地启动RGW的命令也很简单,启动[ceph/demo](https://github.com/ceph/ceph-docker/tree/master/demo)镜像即可,命令如下。 8 | 9 | ``` 10 | docker run -d --net=host -e MON_IP=10.251.0.105 -e CEPH_NETWORK=10.251.0.0/24 ceph/demo 11 | ``` 12 | 13 | ## 用户操作 14 | 15 | 查看用户信息。 16 | 17 | ``` 18 | radosgw-admin user info --uid=mona 19 | ``` 20 | 21 | ## Bucket操作 22 | 23 | 查看bucket信息。 24 | 25 | ``` 26 | root@dev:~# radosgw-admin bucket stats 27 | [] 28 | ``` 29 | 30 | -------------------------------------------------------------------------------- /rgw/s3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tobegit3hub/ceph_from_scratch/373c0044673957f3dc6836ab7521ec205f1e991b/rgw/s3.png -------------------------------------------------------------------------------- /rgw/s3_usage.md: -------------------------------------------------------------------------------- 1 | # S3命令 2 | 3 | ![](./s3.png) 4 | 5 | ## 创建用户 6 | 7 | ``` 8 | root@dev:/# radosgw-admin user create --uid=mona --display-name="Monika Singh" --email=mona@example.com 9 | { 10 | "user_id": "mona", 11 | "display_name": "Monika Singh", 12 | "email": "mona@example.com", 13 | "suspended": 0, 14 | "max_buckets": 1000, 15 | "auid": 0, 16 | "subusers": [], 17 | "keys": [ 18 | { 19 | "user": "mona", 20 | "access_key": "2196PJ0MA6FLHCVKVFDW", 21 | "secret_key": "eO1\/dmEOEU5LlooexlWwcqJYZrt3Gzp\/nBXsQCwz" 22 | } 23 | ], 24 | "swift_keys": [], 25 | "caps": [], 26 | "op_mask": "read, write, delete", 27 | "default_placement": "", 28 | "placement_tags": [], 29 | "bucket_quota": { 30 | "enabled": false, 31 | "max_size_kb": -1, 32 | "max_objects": -1 33 | }, 34 | "user_quota": { 35 | "enabled": false, 36 | "max_size_kb": -1, 37 | "max_objects": -1 38 | }, 39 | "temp_url_keys": [] 40 | } 41 | ``` 42 | 43 | ## 添加Capabilities 44 | 45 | ``` 46 | radosgw-admin caps add --uid=mona --caps="users=*" 47 | radosgw-admin caps add --uid=mona --caps="buckets=*" 48 | radosgw-admin caps add --uid=mona --caps="metadata=*" 49 | radosgw-admin caps add --uid=mona --caps="zone=*" 50 | ``` 51 | 52 | ## 安装s3cmd 53 | 54 | ``` 55 | apt-get install python-setuptools 56 | git clone https://github.com/s3tools/s3cmd.git 57 | cd s3cmd/ 58 | python setup.py install 59 | ``` 60 | 61 | ## 使用s3cmd 62 | 63 | 必须提前设置.s3cfg文件。 64 | 65 | ``` 66 | s3cmd ls 67 | ``` -------------------------------------------------------------------------------- /rgw/swift_usage.md: -------------------------------------------------------------------------------- 1 | # Swift命令 2 | 3 | ## 创建用户 4 | 5 | ``` 6 | root@dev:~# radosgw-admin subuser create --uid=mona --subuser=mona:swift --access=full --secret=secretkey --key-type=swift 7 | { 8 | "user_id": "mona", 9 | "display_name": "Monika Singh", 10 | "email": "mona@example.com", 11 | "suspended": 0, 12 | "max_buckets": 1000, 13 | "auid": 0, 14 | "subusers": [ 15 | { 16 | "id": "mona:swift", 17 | "permissions": "" 18 | } 19 | ], 20 | "keys": [ 21 | { 22 | "user": "mona", 23 | "access_key": "2196PJ0MA6FLHCVKVFDW", 24 | "secret_key": "eO1\/dmEOEU5LlooexlWwcqJYZrt3Gzp\/nBXsQCwz" 25 | }, 26 | { 27 | "user": "mona:swift", 28 | "access_key": "2FTDLNGGOWALF1ZS5XHY", 29 | "secret_key": "" 30 | } 31 | ], 32 | "swift_keys": [ 33 | { 34 | "user": "mona:swift", 35 | "secret_key": "secretkey" 36 | } 37 | ], 38 | "caps": [ 39 | { 40 | "type": "buckets", 41 | "perm": "*" 42 | }, 43 | { 44 | "type": "metadata", 45 | "perm": "*" 46 | }, 47 | { 48 | "type": "users", 49 | "perm": "*" 50 | }, 51 | { 52 | "type": "zone", 53 | "perm": "*" 54 | } 55 | ], 56 | "op_mask": "read, write, delete", 57 | "default_placement": "", 58 | "placement_tags": [], 59 | "bucket_quota": { 60 | "enabled": false, 61 | "max_size_kb": -1, 62 | "max_objects": -1 63 | }, 64 | "user_quota": { 65 | "enabled": false, 66 | "max_size_kb": -1, 67 | "max_objects": -1 68 | }, 69 | "temp_url_keys": [] 70 | } 71 | ``` 72 | 73 | ## 安装Swift客户端 74 | 75 | ``` 76 | apt-get install python-pip 77 | pip install python-swiftclient 78 | ``` 79 | 80 | ## Swift命令 81 | 82 | ``` 83 | swift -V 1.0 -A http://localhost/auth -U mona:swift -K secretkey post example-bucket 84 | ``` 85 | 86 | ``` 87 | swift -V 1.0 -A http://localhost/auth -U mona:swift -K secretkey list 88 | ``` 89 | 90 | 91 | 92 | -------------------------------------------------------------------------------- /run: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | docker run -d -p 4000:4000 tobegit3hub/ceph_from_scratch 4 | -------------------------------------------------------------------------------- /usage/README.md: -------------------------------------------------------------------------------- 1 | # 第二章 Ceph用法 2 | 3 | 本章将带领大家一步一步使用Ceph,分布式系统的安装和部署一般都是非常复杂的,而且很多教程不一定适用于本地的环境,我们本章所有代码与命令都使用官方提供Docker容器,保证任何人都能轻易地使用Ceph并且得到预期的结果。 4 | 5 | 通过本章大家都可以掌握Ceph的基本操作命令,基于Ceph搭建自己的存储系统。 6 | 7 | ![](./ceph_usage.png) -------------------------------------------------------------------------------- /usage/basic_commands.md: -------------------------------------------------------------------------------- 1 | # Ceph命令 2 | 3 | ## 检查状态 4 | 5 | 最简单的ceph命令是,`ceph -w`,也就是watch整个ceph集群的状态。 6 | 7 | ``` 8 | root@dev:/# ceph -w 9 | cluster fee30c76-aec4-44d4-8138-763969aaa562 10 | health HEALTH_OK 11 | monmap e1: 1 mons at {dev=10.0.2.15:6789/0} 12 | election epoch 2, quorum 0 dev 13 | mdsmap e5: 1/1/1 up {0=0=up:active} 14 | osdmap e18: 1 osds: 1 up, 1 in 15 | pgmap v22: 120 pgs, 8 pools, 2810 bytes data, 63 objects 16 | 4519 MB used, 13115 MB / 18603 MB avail 17 | 120 active+clean 18 | 19 | 2015-07-12 06:53:58.454077 mon.0 [INF] pgmap v22: 120 pgs: 120 active+clean; 2810 bytes data, 4519 MB used, 13115 MB / 18603 MB avail 20 | ``` 21 | 22 | 或者通过`ceph status`命令。 23 | 24 | ``` 25 | root@dev:/# ceph status 26 | cluster fee30c76-aec4-44d4-8138-763969aaa562 27 | health HEALTH_OK 28 | monmap e1: 1 mons at {dev=10.0.2.15:6789/0} 29 | election epoch 2, quorum 0 dev 30 | mdsmap e5: 1/1/1 up {0=0=up:active} 31 | osdmap e21: 1 osds: 1 up, 1 in 32 | pgmap v30: 120 pgs, 8 pools, 2810 bytes data, 63 objects 33 | 4521 MB used, 13114 MB / 18603 MB avail 34 | 120 active+clean 35 | ``` 36 | 37 | 38 | 39 | 40 | 41 | -------------------------------------------------------------------------------- /usage/bucket_operations.md: -------------------------------------------------------------------------------- 1 | # Bucket命令 2 | 3 | ## 创建Bucket 4 | 5 | ``` 6 | root@dev:/# ceph osd tree 7 | ID WEIGHT TYPE NAME UP/DOWN REWEIGHT PRIMARY-AFFINITY 8 | -1 1.00000 root default 9 | -2 1.00000 host dev 10 | 0 1.00000 osd.0 up 1.00000 1.00000 11 | root@dev:/# ceph osd crush add-bucket rack01 rack 12 | added bucket rack01 type rack to crush map 13 | root@dev:/# ceph osd crush add-bucket rack02 rack 14 | added bucket rack02 type rack to crush map 15 | root@dev:/# ceph osd crush add-bucket rack03 rack 16 | added bucket rack03 type rack to crush map 17 | root@dev:/# ceph osd tree 18 | ID WEIGHT TYPE NAME UP/DOWN REWEIGHT PRIMARY-AFFINITY 19 | -5 0 rack rack03 20 | -4 0 rack rack02 21 | -3 0 rack rack01 22 | -1 1.00000 root default 23 | -2 1.00000 host dev 24 | 0 1.00000 osd.0 up 1.00000 1.00000 25 | ``` 26 | 27 | ## 移动Rack 28 | 29 | ``` 30 | root@dev:/# ceph osd crush move rack01 root=default 31 | moved item id -3 name 'rack01' to location {root=default} in crush map 32 | root@dev:/# ceph osd crush move rack02 root=default 33 | moved item id -4 name 'rack02' to location {root=default} in crush map 34 | root@dev:/# ceph osd crush move rack03 root=default 35 | moved item id -5 name 'rack03' to location {root=default} in crush map 36 | root@dev:/# ceph osd tree 37 | ID WEIGHT TYPE NAME UP/DOWN REWEIGHT PRIMARY-AFFINITY 38 | -1 1.00000 root default 39 | -2 1.00000 host dev 40 | 0 1.00000 osd.0 up 1.00000 1.00000 41 | -3 0 rack rack01 42 | -4 0 rack rack02 43 | -5 0 rack rack03 44 | ``` 45 | 46 | -------------------------------------------------------------------------------- /usage/ceph_commands.md: -------------------------------------------------------------------------------- 1 | # Ceph命令 2 | 3 | ## OSD状态 4 | 5 | 列举当前所有OSD。 6 | 7 | ``` 8 | root@dev:/# ceph osd ls 9 | 0 10 | ``` 11 | 12 | 查看OSD状态。 13 | 14 | ``` 15 | root@dev:/# ceph osd stat 16 | osdmap e21: 1 osds: 1 up, 1 in 17 | ``` 18 | 19 | 查看OSD树形结构。 20 | 21 | ``` 22 | root@dev:/# ceph osd tree 23 | ID WEIGHT TYPE NAME UP/DOWN REWEIGHT PRIMARY-AFFINITY 24 | -1 1.00000 root default 25 | -2 1.00000 host dev 26 | 0 1.00000 osd.0 up 1.00000 1.00000 27 | ``` 28 | 29 | 导出OSD详细信息。 30 | 31 | ``` 32 | root@dev:/# ceph osd dump 33 | epoch 21 34 | fsid fee30c76-aec4-44d4-8138-763969aaa562 35 | created 2015-07-12 05:59:12.189734 36 | modified 2015-07-12 11:57:56.706958 37 | flags 38 | pool 0 'rbd' replicated size 1 min_size 1 crush_ruleset 0 object_hash rjenkins pg_num 64 pgp_num 64 last_change 2 flags hashpspool stripe_width 0 39 | pool 1 'cephfs_data' replicated size 1 min_size 1 crush_ruleset 0 object_hash rjenkins pg_num 8 pgp_num 8 last_change 7 flags hashpspool crash_replay_interval 45 stripe_width 0 40 | pool 2 'cephfs_metadata' replicated size 1 min_size 1 crush_ruleset 0 object_hash rjenkins pg_num 8 pgp_num 8 last_change 6 flags hashpspool stripe_width 0 41 | pool 3 '.rgw.root' replicated size 1 min_size 1 crush_ruleset 0 object_hash rjenkins pg_num 8 pgp_num 8 last_change 8 owner 18446744073709551615 flags hashpspool stripe_width 0 42 | pool 4 '.rgw.control' replicated size 1 min_size 1 crush_ruleset 0 object_hash rjenkins pg_num 8 pgp_num 8 last_change 10 owner 18446744073709551615 flags hashpspool stripe_width 0 43 | pool 5 '.rgw' replicated size 1 min_size 1 crush_ruleset 0 object_hash rjenkins pg_num 8 pgp_num 8 last_change 12 owner 18446744073709551615 flags hashpspool stripe_width 0 44 | pool 6 '.rgw.gc' replicated size 1 min_size 1 crush_ruleset 0 object_hash rjenkins pg_num 8 pgp_num 8 last_change 13 owner 18446744073709551615 flags hashpspool stripe_width 0 45 | pool 7 '.users.uid' replicated size 1 min_size 1 crush_ruleset 0 object_hash rjenkins pg_num 8 pgp_num 8 last_change 14 owner 18446744073709551615 flags hashpspool stripe_width 0 46 | max_osd 1 47 | osd.0 up in weight 1 up_from 20 up_thru 20 down_at 19 last_clean_interval [5,19) 10.0.2.15:6800/199 10.0.2.15:6801/2000199 10.0.2.15:6802/2000199 10.0.2.15:6803/2000199 exists,up 5aaf2355-aa45-4452-a401-9add47541a88 48 | ``` 49 | 50 | ## Monitor状态 51 | 52 | 查看Monitor状态。 53 | 54 | ``` 55 | root@dev:/# ceph mon stat 56 | e1: 1 mons at {dev=10.0.2.15:6789/0}, election epoch 2, quorum 0 dev 57 | ``` 58 | 59 | 导出Monitor详细信息。 60 | 61 | ``` 62 | root@dev:/# ceph mon dump 63 | dumped monmap epoch 1 64 | epoch 1 65 | fsid fee30c76-aec4-44d4-8138-763969aaa562 66 | last_changed 2015-07-12 05:59:11.900924 67 | created 2015-07-12 05:59:11.900924 68 | 0: 10.0.2.15:6789/0 mon.dev 69 | ``` 70 | 71 | ## PG操作 72 | 73 | 导出PG详细信息。 74 | 75 | ``` 76 | root@dev:/# ceph pg dump 77 | pool 0 0 0 0 0 0 0 0 0 78 | pool 1 0 0 0 0 0 0 0 0 79 | pool 2 20 0 0 0 0 1962 30 30 80 | pool 3 3 0 0 0 0 848 3 3 81 | pool 4 8 0 0 0 0 0 50 50 82 | pool 5 0 0 0 0 0 0 0 0 83 | pool 6 32 0 0 0 0 0 192 192 84 | pool 7 0 0 0 0 0 0 0 0 85 | sum 63 0 0 0 0 2810 275 275 86 | osdstat kbused kbavail kb hb in hb out 87 | 0 4630564 13428604 19049892 [] [] 88 | sum 4630564 13428604 19049892 89 | ``` 90 | 91 | ## CRUSH操作 92 | 93 | 导出CRUSH详细信息。 94 | 95 | ``` 96 | root@dev:/# ceph osd crush dump 97 | ``` 98 | 99 | 将CURHS导出为不可读的配置文件。 100 | 101 | ``` 102 | root@dev:/# ceph osd getcrushmap -o crushmap.txt 103 | got crush map from osdmap epoch 21 104 | ``` 105 | 106 | 解码CRUSH配置文件为可读的文本文件。 107 | 108 | ``` 109 | root@dev:/# crushtool -d crushmap.txt -o crushmap-decompile.txt 110 | root@dev:/# vim crushmap-decompile.txt 111 | ``` 112 | 113 | 114 | -------------------------------------------------------------------------------- /usage/ceph_container.md: -------------------------------------------------------------------------------- 1 | # Ceph容器 2 | 3 | ## 使用Docker 4 | 5 | 试用Ceph最简单的方法是启动Ceph容器,使用前必须保证本地已经安装好Docker。Debian/Ubuntu用户可以通过`apt-get install docker.io`安装,CentOS/Redhat用户可以通过`yum install docker`安装,Mac和Windows建议下载boot2docker来使用。 6 | 7 | 基本的docker命令如下。 8 | 9 | ``` 10 | docker images 11 | docker pull ubuntu 12 | docker run -i -t ubuntu /bin/bash 13 | docker exec -i -t ubuntu /bin/bash 14 | docker ps 15 | ``` 16 | 17 | ## Ceph容器 18 | 19 | Ceph社区提供了官方的docker镜像,代码与教程都托管到Github上 https://github.com/ceph/ceph-docker。 20 | 21 | 由于Ceph的配置文件必须指定IP地址,因此使用Ceph容器前我们必须获得本机IP,如果是boot2docker用户需要获得其虚拟机IP。 22 | 23 | ``` 24 | docker@dev:~$ ifconfig | grep "eth0" -A 2 25 | eth0 Link encap:Ethernet HWaddr 08:00:27:F9:89:52 26 | inet addr:10.0.2.15 Bcast:10.0.2.255 Mask:255.255.255.0 27 | inet6 addr: fe80::a00:27ff:fef9:8952/64 Scope:Link 28 | ``` 29 | 30 | ## 启动Ceph 31 | 32 | 启动单机版ceph非常简单,使用下述命令。 33 | 34 | ``` 35 | docker@dev:~$ docker run -d --net=host -e MON_IP=10.0.2.15 -e CEPH_NETWORK=10.0.2.0/24 ceph/demo 36 | badaf5c8fed1e0edf6f2281539669d8f6522ba54b625076190fe4d6de79745ff 37 | ``` 38 | 39 | 然后可以通过`docker ps`来检查容器状态。 40 | 41 | ``` 42 | docker@dev:~$ docker ps 43 | CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 44 | badaf5c8fed1 ceph/demo "/entrypoint.sh" 9 seconds ago Up 9 seconds loving_pasteur 45 | ``` 46 | 47 | 这里ceph容器的ID为“badaf5c8fed1”,可以快速进入容器。 48 | 49 | ``` 50 | docker@dev:~$ docker exec -i -t badaf5c8fed1 /bin/bash 51 | root@dev:/# 52 | ``` 53 | 54 | -------------------------------------------------------------------------------- /usage/ceph_usage.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tobegit3hub/ceph_from_scratch/373c0044673957f3dc6836ab7521ec205f1e991b/usage/ceph_usage.png -------------------------------------------------------------------------------- /usage/object_operations.md: -------------------------------------------------------------------------------- 1 | # Object操作 2 | 3 | ## 创建Pool 4 | 5 | ``` 6 | root@dev:/# ceph osd pool create web-services 128 128 7 | pool 'web-services' created 8 | root@dev:/# rados lspools 9 | rbd 10 | cephfs_data 11 | cephfs_metadata 12 | .rgw.root 13 | .rgw.control 14 | .rgw 15 | .rgw.gc 16 | .users.uid 17 | web-services 18 | ``` 19 | 20 | ## 添加Object 21 | 22 | ``` 23 | root@dev:/# echo "Hello Ceph, You are Awesome like MJ" > /tmp/helloceph 24 | root@dev:/# rados -p web-services put object1 /tmp/helloceph 25 | root@dev:/# rados -p web-services ls 26 | object1 27 | root@dev:/# ceph osd map web-services object1 28 | osdmap e29 pool 'web-services' (8) object 'object1' -> pg 8.bac5debc (8.3c) -> up ([0], p0) acting ([0], p0) 29 | ``` 30 | 31 | ## 查看Object 32 | 33 | ``` 34 | root@dev:/# cd /var/lib/ceph/osd/ 35 | root@dev:/var/lib/ceph/osd# ls ceph-0/current/8.3c_head/ 36 | __head_0000003C__8 object1__head_BAC5DEBC__8 37 | root@dev:/var/lib/ceph/osd# cat ceph-0/current/8.3c_head/object1__head_BAC5DEBC__8 38 | Hello Ceph, You are Awesome like MJ 39 | ``` 40 | -------------------------------------------------------------------------------- /usage/rados_operations.md: -------------------------------------------------------------------------------- 1 | # RADOS命令 2 | 3 | ## Pool简介 4 | 5 | Pool是Ceph中的逻辑概念,不同的应用可以使用不同的Pool。 6 | 7 | ## Pool相关命令 8 | 9 | ``` 10 | root@dev:/# rados lspools 11 | rbd 12 | cephfs_data 13 | cephfs_metadata 14 | .rgw.root 15 | .rgw.control 16 | .rgw 17 | .rgw.gc 18 | .users.uid 19 | ``` 20 | 21 | 如果想获得特定Pool的数据。 22 | 23 | ``` 24 | root@dev:/# rados -p .rgw ls 25 | root@dev:/# rados -p .rgw.root ls 26 | default.region 27 | region_info.default 28 | zone_info.default 29 | ``` 30 | 31 | ## 容量相关 32 | 33 | 获得当前OSD所用容量。 34 | 35 | ``` 36 | root@dev:/# rados df 37 | pool name KB objects clones degraded unfound rd rd KB wr wr KB 38 | .rgw 0 0 0 0 0 0 0 0 0 39 | .rgw.control 0 8 0 0 0 0 0 0 0 40 | .rgw.gc 0 32 0 0 0 288 256 192 0 41 | .rgw.root 1 3 0 0 0 0 0 3 3 42 | .users.uid 0 0 0 0 0 0 0 0 0 43 | cephfs_data 0 0 0 0 0 0 0 0 0 44 | cephfs_metadata 2 20 0 0 0 0 0 31 8 45 | rbd 0 0 0 0 0 0 0 0 0 46 | total used 4630192 63 47 | total avail 13428976 48 | total space 19049892 49 | ``` --------------------------------------------------------------------------------