ceph排除了这个瓶颈,cepp的OSD和ceph客户端都清楚知道集群架构,每个OSD都知道集群中其他的OSD。第一个OSD,osd.25作为Primary,如果该OSD失效后,第二个OSD,osd.32成为Primary,并且osd.25将从up set中移除。一旦ceph客户端将数据分割成条带单元并且将条带单元映射到object,ceph的CRUSH算法在object存储到磁盘文件之前,映射object到PG,PG映射到ceph OSD。ceph文件系统服务包含了与ceph存储集群一起部署的ceph元数据服务器。
ceph工作原理和安装一、概述1. CRUSH算法。cd /ceph下载yum源,下载地址如下http://download.ceph.com/rpm-firefly/el6/noarch/在node1~4上把上面的网址设置为yum源yum install –y ceph到管理主机上的/ceph目录操作,创建一个新集群,并设置node1为mon节点ceph-deploy new node1执行完毕后,可以看到/ceph目录中生成了三个文件,其中有一个配置文件可以做各种参数优化,据说ceph的优化参数接近1000项。
分布式存储ceph——(6)ceph 讲解一、Ceph简介:Ceph可以提供对象存储、块设备存储和文件系统服务,其对象存储可以对接网盘(owncloud)应用业务等;3.文件系统存储:???? 通常意义是支持 POSIX 接口,它跟传统的文件系统如 Ext4 是一个类型的,但区别在于分布式存储提供了并行化的能力,如 Ceph 的 CephFS (CephFS是Ceph面向文件存储的接口),但是有时候又会把 GlusterFS ,HDFS 这种非POSIX接口的类文件存储接口归入此类。
理解 OpenStack + Ceph (2):Ceph 的物理和逻辑结构 [Ceph Architecture](1)Ceph client 通过 CRUSH 算法计算出存放 object 的 PG 的 ID:客户端输入 pool ID 和 object ID (比如 pool = “liverpool” and object-id = “john”)ceph 对 object ID 做 hashceph 对该 hash 值取 PG 总数的模,得到 PG ID (比如 58)ceph 或者 pool ID (比如 “liverpool” = 4)ceph 将 pool ID 和 PG ID 组合在一起(比如 4.58)
另外一点ceph客户端读写数据直接与存储设备(osd) 交互。Rados集群是ceph的存储核心。如图,rados集群中分为以下角色:mdss、osds、mons. Osd 对象存储设备,可以理解为一块硬盘+osd 管理进程,负责接受客户端的读写、osd间数据检验(srub)、数据恢复(recovery)、心跳检测等。Mons 主要解决分布式系统的状态一致性问题,维护集群内节点关系图(mon-map osd-map mds-map pg-map)的一致性,包括osd的添加、删除的状态更新。# ceph -s.
理解 Ceph:一个开源的分布式存储平台。Ceph存储集群运行在商用机上,为了确保集群中数据的分布式存储和良好的可扩展性,Ceph运用了著名的CRUSH(Controllled Replication Under Scalable Hashing)算法。OSD DaemonCeph MonitorCeph OSD Daemon.Ceph Monitor也是一种Ceph OSD Daemon,它主要负责管理全部集群。当你运行一个Ceph集群时,你就会需要Ceph Monitor每天帮你检查集群的健康情况和状态。Ceph Object storage。
解析Ceph和9000分布式存储 Ceph是呼声很高的开源分布式的SDS产品存储系统。搭建一台Ceph系统至少需要1个Ceph Monitor和2个Ceph OSD逻辑角色,而Ceph Metadata server仅仅是运行CephFS时存储文件元数据。在Ceph存储系统中,Ceph Metadata Daemon 提供了元数据服务器,而Ceph Object Storage Daemon 提供了数据和元数据的实际存储。虽然说Ceph在NAS功能上比较欠缺,但目前Ceph发展的策略是从Block、Object到FilesyStem。
OSD MAP:包含当前所有Pool的状态和所有OSD的状态。locator = object_name obj_hash = hash(locator) pg = obj_hash % num_pg osds_for_pg = crush(pg) # returns a list of osds primary = osds_for_pg[0] replicas = osds_for_pg[1:]过了M秒之后,假如还是无法连接该OSD,则它被标记为out,Ceph会重新计算PG到OSD set的映射(当有新的OSD加入到集群时,也会重新计算所有PG到OSD set的映射),以此保证PG的有效副本数是N。
CRUSH算法介绍。首先,select有2种操作方式:choose firstn: 深度优先选择出n个类型为t的子bucket,只到bucket为止chooseleaf: 先选择出n个类型为t的bucket,再在每个bucket下选择一个OSD设备。而在设置Placement Rule时,可以指定采用哪种bucket随机选择算法,即属于哪种bucket. 这里首先介绍一个重要的Hash函数,因为该函数在多个bucket选择算法中都用到了,但作用各不相同:hash(PG_ID, r, bucket_id)Bucket选择算法。
比如 OSD.a, OSD.b得到了新的 OSDMap,那么 OSD.c 和 OSD.d 可能部分 PG 也会在 OSD.a, OSD.b 上,这时它们的通信就会附带上 OSDMap 的 epoch,如果版本较低,OSD.c 和 OSD.d 会主动向 Monitor pull OSDMap,而部分情况 OSD.a, OSD.b 也会主动向 OSD.c 和 OSD.d push 自己的 OSDMap (如果更新)。
Ceph源码目录架构 简介。ceph.spec.in:Ceph打包的spec文件。[tools]:Ceph中的各种工具的实现:cephfs、rados、rbd、rbd-nbd、ceph-authtool、ceph-conf、ceph-kvstore-tool、ceph-monstore-tool、ceph-objectstore-tool、crushtool、monmaptool、osdmaptool.上图中的每一个模块对应Ceph的src目录下的一个目录,还有部分目录没有体现在该图中,这些通常是一些辅助性质的目录,详细情况可以参考《Ceph源代码目录结构详解》。
Ceph V10.2.0 Jewel正式版本发布。chown -R ceph:ceph /var/lib/ceph.此操作受Jewel监控器(Jewel monitor)的限制,因此,需使用如下的升级步骤:1.在monitor主机上更新Ceph2.重启所有的ceph-mon守护进程3.在所有的OSD主机上更新Ceph4.停止所有的ceph-osd守护进程5.将所有的OSD标记为down,所用的执行命令类似于:ceph osd down seq 0 10006.启动所有的ceph-osd守护进程7.升级并重启余下的守护进程(ceph-mds, radosgw)
Rados(conffile = ''/root/ceph/ceph-0.94.2/src/ceph.conf'') File "/usr/lib/python2.7/rados.py", line 215, in __init__ self.librados = CDLL(library_path if library_path is not None else ''librados.so.2'') File "/usr/lib/python2.7/ctypes/__init__.py", line 365, in __init__ self._handle = _dlopen(self._name, mode)OSError: librados.so.2: cannot open shared object file: No such file or directory.
ceph-deploy osd HOST:DISK[:JOURNAL]ceph-deploy osd prepare 数据盘:日志盘ceph-deploy osd prepare --zap-disk objStor02:/dev/sdd:/dev/sdb.每个 [stripe_unit] 的连续字节会被连续地保存到同一个对象中,client 写满 stripe unit 大小的数据后,接着去下一个 object 中写下一个 stripe unit 大小的数据。2. stripe_unit 为 object size 的四分之一,也就是说每个 object 包含 4 个 stripe。
因此,本文将对Ceph在OpenStack中的价值进行简要介绍,并且对Ceph和Swift进行对比。具体到Ceph而言,其最为符合软件定义存储的特性无疑是,Ceph的存储类型是可以通过软件方式定义的。同时,由于Ceph自身对于OSD硬件平台的特殊假设,以及由此导致的优化空间,则在成本合理的前提下,开发更加适用于Ceph OSD的定制硬件平台(类似于micro-server或者IP硬盘等),并突出存储的高密度、低功耗、高可维护性等特点,也可能成为一种选择。
librbd 对二进制块进行分块,默认块大小为 4M,每一块都有名字,成为一个对象 librbd 调用 librados 将对象写入 Ceph 集群 librados 向主 OSD 写入分好块的二进制数据块 (先建立TCP/IP连接,然后发送消息给 OSD,OSD 接收后写入其磁盘) 主 OSD 负责同时向一个或者多个次 OSD 写入副本。CEPH_OSD_OP_MAPEXT||CEPH_OSD_OP_SPARSE_READ.5.主osd,从osd的线程开始工作调用Filestore将Journal中的数据写入到底层文件系统中。
这里,我们直接在Monitor节点node1上安装ceph-deploy,然后通过ceph-deploy在node1上部署Monitor,在node2和node3节点上部署OSD,最后,在node4上部署Ceph网关rgw。ceph-deploy purgedata {ceph-node} [{ceph-node}]ceph-deploy forgetkeys.# ssh node2# sudo mkdir /var/local/osd0# chown ceph:ceph /var/local/osd0# exit# ssh node3# sudo mkdir /var/local/osd1# chown ceph:ceph /var/local/osd1# exit准备OSD.
2)接着做第二次快照,更新元数据,然后对obj1、obj2、obj3都进行写入,对于obj1,为快照2生成obj1-snap2对象,但是对于obj2就有所不同,因为obj2是做了第二次快照后才要进行修改,也就是说第一次快照和第二次快照之间这个对象的数据没有改变,因此只需要拷贝一次就行了,有两种做法,一种是为较老的快照生成快照对象(这里就是snap1),另外一种做法就是为最新的快照生成快照对象(即snap2)。
块存储,文件存储,对象存储的层次关系应用的角度聊过了,我们再看看这三种存储的一些技术细节,首先看看在系统层级的分布。当然对象存储通常不需要专业的存储设备,前面那些LV/VG/PV层也可以统统不要,直接在硬盘上做本地文件系统,之后再做成OSD,这种才是对象存储的标准模式,对象存储的硬件设备通常就用大盘位的服务器。块存储的数据结构是数组,而文件存储是二叉树(B,B-,B ,B*各种树),对象存储基本上都是哈希表。
ceph pg, osd, pool 之间的一些查找方法2017年08月01日 14:58:44阅读数:326 pg, osd, pool 之间的一些查找方法。pg --> osd: 通过 pg 查找 osd.osd --> pg: 通过 osd 查找 pg.ceph pg ls-by-osd osd.{osdid}pg --> pool: 通过 pg 查找 pool.pool --> pg: 通过 pool 查找 pg.ceph pg ls-by-pool {poolname}ceph pg ls {poolid}
OSD和ObjectStore层,都有一个线程池(tp)和消息队列(wq),每个线程会从不同消息队列中取出消息然后执行。消息入队后,线程池OSDService->op_tp(osd->osd_op_tp)从队列中拿出消息开始工作。图中,红色方框都是主OSD的操作,蓝色方框是从OSD的操作。首先会有主OSD消息,经过一定检查后,执行到右半部分,提交事务前,先将从OSD的op添加到Apply和Commit的等待队列,然后发消息给从PG的OSD,最后提交自己的操作到ObjectStore。
1、`ceph osd tree` 查看osd【5,4,6】其中一个所在的节点2、`ssh ceph-nodeN`,进入该节点 #osd.5所在的node节点3、`df -h | grep -i ceph-5`找出该osd.5的物理存储位置 ,ceph-5是指osd.54、`cd /var/lib/ceph/osd/ceph-5/current`进入osd.5所在的物理存储文件夹5、`ls -l |grep -i 6.31`找出和PG(6.31)相关的文件夹6、`cd 6.31_head`进入该PG文件夹7、`ls -l `就可以看到我们存储的testobject数据的详细信息。
2、客户端在获取pool信息的时候可知,目标base pool存在一个tier,叫做cache pool,那么操作base pool的请求都会发送给cache pool。紫框:当客户端发送请求到cache pool中,但是cache pool未命中,cache pool会选择将该ojbect从base pool中提升到cache pool中,然后在cache pool进行读写操作,操作完成后告知客户端请求完成,在cache pool会缓存该object,下次直接在cache中处理,和proxy_read存在的区别。
op_wq(this, g_conf->osd_op_thread_timeout, &op_tp)涉及的操作类型包括:CEPH_MSG_OSD_OP(client op) , MSG_OSD_SUBOP(for replication etc.) ,MSG_OSD_SUBOPREPLY。OSD *osd;: ThreadPool::WorkQueue<PG>("OSD::OpWQ", ti, ti*10, tp), osd(o) {}OpWQ主要操作osd->op_queue,即deque<OpSequencer*> op_queue;OpWQ的 void _process(PG *pg) 到 osd->dequeue_op(pg);中的代码如下:if (op->get_type() == CEPH_MSG_OSD_OP) {