ceph
tiantao2012
这个作者很懒,什么都没留下…
展开
-
ceph系统的整体逻辑架构
ceph系统的逻辑结构如下:rados:是有大量的存储节点组成,每个节点都有字节的硬件资源(cpu/memory/net),和软件资源 例如os和文件系统,rados本身就是一个对象存储系统.librados:对rados进行的抽象和封装,因此librados也是对象存储的文件系统rdos gw:提供和swift兼容的RESTfulrbd:提供一个块设备接口,主要用于虚拟化场景原创 2017-07-24 14:24:14 · 834 阅读 · 0 评论 -
bluestore使用的cache
bluestore 自己管理裸设备为了提高性能自己也建立了cacheBlueStore::Cache *BlueStore::Cache::create(CephContext* cct, string type, PerfCounters *logger){ Cache *c = nullptr; if (type == "lru") c = new LR...原创 2018-05-03 15:15:28 · 1917 阅读 · 0 评论 -
空闲block分配的allocator
bluestore 中采用allocator来分配块。allocator的使用者保护bluefs和bluestoreAllocator *Allocator::create(CephContext* cct, string type, int64_t size, int64_t block_size){ if (type == "...原创 2018-05-03 09:52:10 · 1162 阅读 · 0 评论 -
wbthrottle限流
WBThrottle 是为让filestore来限流。throttle的核心函数如下:void WBThrottle::throttle(){ Mutex::Locker l(lock); while (!stopping && need_flush()) cond.Wait(lock);}可以看出wbthrottle 主要是通过cond_wait 来让出...原创 2018-05-09 11:08:03 · 572 阅读 · 0 评论 -
bluestore的空闲块管理
bluestore自己管理裸盘的块设备,管理空闲空间的类是FreelistManager,所有的块组成一个bitmap,0为空闲,1为使用。FreelistManager *FreelistManager::create( CephContext* cct, string type, KeyValueDB *kvdb, string prefix){ assert(pref...原创 2018-05-02 14:47:33 · 1143 阅读 · 0 评论 -
bluefs
在bluestore 中时通rocksenv为rockdb来运行环境来让rockdb存储元数据。所以ceph通过一个简单文件系统bluefs来实现rocksenv的接口class BlueFS {public: CephContext* cct; #可以看到bluefs中支持下面这三种块设备 static constexpr unsigned MAX_BDEV = 3; sta...原创 2018-05-02 13:58:15 · 1182 阅读 · 0 评论 -
ceph中使用文件系统的扩展属性
在ceph中的filestore中有实现chain_xattr.cc 中有实现级联的key-value。当然这里的xattr是保存在文件系统中的扩展属性中。所谓级联是指一个key 可以对应多个value的片段例如 key@1和key@2 这样被chain_xattr解析为key-12ceph中主要使用user 这个xattr的命令空间从下面的code中可以看出ceph使用的xattr中的...原创 2018-04-20 10:07:22 · 697 阅读 · 0 评论 -
osd的心跳机制
在osd的main函数中有新建三个用于heatbeat 发送和接收的messageC:\Users\Administrator\Desktop\source\ceph-master\ceph-master\src\ceph_osd.cc Messenger *ms_public = Messenger::create(g_ceph_context, public_msgr_type, ...原创 2018-04-24 14:36:33 · 1911 阅读 · 0 评论 -
ceph df 命令的实现
内核ACPI函数API之acpi_parse_spcrmonitor 所有的命令都在void Monitor::handle_command(MonOpRequestRef op) 中实现我们以ceph df的实现为例分析,下面这个函数就是handle_command 这个函数中对df 命令的解析else if (prefix == "df") { bool verbose ...原创 2018-04-23 19:27:12 · 2623 阅读 · 0 评论 -
osd scrub的过程
在osd的init函数中有新建一个time,这个time的回调函数是C_Tick_WithoutOSDLock。这个回调函数中会对pg做scrubint OSD::init(){tick_timer_without_osd_lock.add_event_after(cct->_conf->osd_heartbeat_interval, new C_Tick_WithoutOSDL...原创 2018-04-25 16:27:43 · 917 阅读 · 0 评论 -
CephContext 中的AdminSocket
在CephContext 的构造函数中会新建一个AdminSocket和一个CephContextHookCephContext::CephContext(uint32_t module_type_, enum code_environment_t code_env, int init_flags...原创 2018-05-10 10:14:36 · 939 阅读 · 0 评论 -
ceph 对动态加载类的管理
ceph提供了一个ClassHandler来管理动态链接库使用ClassHandler 之前必要要先注册ClassHandler::ClassData *ClassHandler::register_class(const char *cname){ assert(mutex.is_locked()); #根据name得到要使用的class ClassData *cls = _g...原创 2018-05-08 19:11:52 · 911 阅读 · 0 评论 -
ceph_perf_local
在ceph 源码ceph-master\ceph-master\src\test\CMakeLists.txt 中定义了一个ceph_perf_local的可执行文件,用于测试不同平台对ceph性能的影响#ceph_perf_localadd_executable(ceph_perf_local perf_local.cc perf_helper.cc)if(HAVE_SSE)...原创 2018-05-14 14:34:34 · 540 阅读 · 0 评论 -
bluestore用到的块设备
ceph中bluestore在user space 提供block device,bypass文件系统由ceph直接管理各种设备。ceph中的块设备都是blockdevice的子类BlockDevice *BlockDevice::create(CephContext* cct, const string& path, aio_callback_t cb, void *cbp...原创 2018-04-28 17:41:25 · 1045 阅读 · 0 评论 -
librbd
librbd是ceph 对外提供的块存储接口,这个接口了c/c++ 两种接口,接口提供的头文件分别在ceph-master\ceph-master\src\include\rbd\librbd.hpp和source\ceph-master\ceph-master\src\include\rbd\librbd.h中这里我们以提供的c++为例,namespace librbd { using ...原创 2018-05-07 09:42:38 · 1744 阅读 · 0 评论 -
ceph中的mgr 进程
ceph中的mgr 进程用于显示相关复位的统计信息,兵器额可以通过python提供接口来获取这些统计信息这个进程的入口函数在C:\Users\Administrator\Desktop\source\ceph-master\ceph-master\src\ceph_mgr.cc 中int main(int argc, const char **argv){#这个进程的名字就是ceph-mg...原创 2018-04-27 16:19:23 · 6103 阅读 · 0 评论 -
cephfs kernel client写的过程
kernel 中ceph的客户端的源码在fs/ceph 中,这里我们以ceph的写操作为例。从fs/ceph/file.c 中的ceph_file_fops 中可以知道写函数是ceph_write_iterconst struct file_operations ceph_file_fops = { .open = ceph_open, .release = ceph_release, ...原创 2018-04-27 09:27:56 · 1966 阅读 · 0 评论 -
ceph中的threadpool
ceph中采用threadpool来增加并发性能ThreadPool::ThreadPool(CephContext *cct_, string nm, string tn, int n, const char *option) : cct(cct_), name(std::move(nm)), thread_name(std::move(tn)), ioprio_class(-1)...原创 2018-05-11 14:54:44 · 757 阅读 · 0 评论 -
ceph中用到的压缩引擎
ceph可以默认支持snappy/zlib/zstd,如果要支持lz4的话,必须打开宏HAVE_LZ4set(compressor_srcs Compressor.cc)add_library(compressor_objs OBJECT ${compressor_srcs})## compressor pluginsset(compressor_plugin_dir ${CMA...原创 2018-05-17 10:09:43 · 1748 阅读 · 0 评论 -
ceph 中kv 存储的后端选择
filestore的omap中会按照key-value的方式存储对象的属性信息,在ceph中按照key-value存储属性信息有三个版本,分别是levleDB/ROCKSDB/kineticstore/memDB,目前主要用的是rocksDB。这四部分的源码在src/kv中从其makefile中可以看到set(kv_srcs KeyValueDB.cc MemDB.cc Rocks...原创 2018-04-23 11:29:56 · 1599 阅读 · 0 评论 -
ceph中的Throttle类
throttle类用来限制资源数量,主要提供两个成员get/put函数用于操作资源。其源码实现在src/common/throttle.cc中首先看看其构造函数Throttle::Throttle(CephContext *cct, const std::string& n, int64_t m, bool _use_perf) : cct(cct), name(n), ...原创 2018-04-04 16:06:22 · 1155 阅读 · 0 评论 -
ceph-deploy的rgw命令
ceph-deploy的rgw命令用于将conf_data 和key 写入到远程host中,并启动ceph-radosg和ceph.target其入口函数为E:\ceph-deploy-master\ceph-deploy-master\ceph_deploy\rgw.py 中的make函数@priority(30)def make(parser): """ Ceph RGW原创 2017-12-08 14:42:47 · 1682 阅读 · 0 评论 -
ceph-deploy的calamari命令
ceph-deploy的calamari主要用于将config文件写到远程host的/etc/salt/minion.d/calamari.conf文件中并安装salt-minion和diamod 这两个包,并是能salt-minion 这个service 开机自动启动其源码路径为:E:\ceph-deploy-master\ceph-deploy-master\ceph_deploy\cal原创 2017-11-29 08:56:22 · 719 阅读 · 0 评论 -
ceph-deploy new
ceph-deploy new 命令用于开始部署新的集群,使用的例子如下:ceph-deploy new host-225 host-227 host-229执行成功后该目录下会增加三个文件[root@dn-5-221 ceph]# lltotal 12-rw-r--r-- 1 root root 276 Jun 26 22:01 ceph.conf-rw-r--r-- 1 roo原创 2017-11-14 14:31:58 · 2868 阅读 · 0 评论 -
ceph-deploy-mon的create函数
ceph-deploy的mon 命令用于管理mon守护进程其入口函数在E:\ceph-deploy-master\ceph-deploy-master\ceph_deploy\mon.py 中的make函数@priority(30)def make(parser): """ Ceph MON Daemon management """ parser.forma原创 2017-11-17 20:03:03 · 1031 阅读 · 0 评论 -
ceph中的SafeTimer 用法和分析
在ceph中定时器是通过SafeTimer 类来实现的。首先看看SafeTimer该如何使用,例子在src/mgr/mgrclient.cc 中1:首先在其构造函数中构造SafeTimer的实例timerMgrClient::MgrClient(CephContext *cct_, Messenger *msgr_) : Dispatcher(cct_), cct(cct_), ms原创 2017-11-02 16:24:02 · 1480 阅读 · 0 评论 -
ceph-deploy的set_overrides函数
在E:\ceph-deploy-master\ceph-deploy-master\ceph_deploy\cli.py的_main函数中会调用set_overrides来将在配置文件中定义的命令 args = ceph_deploy.conf.cephdeploy.set_overrides(args) 其实现在E:\ceph-deploy-master\ceph-deploy-ma原创 2017-11-10 14:39:47 · 516 阅读 · 0 评论 -
ceph-deploy的入口函数
ceph-deploy是ceph部署集群的工具。其源码在https://github.com/ceph/ceph-deployscript 目录下的ceph-deploy是ceph-deploy的入口函数#!/usr/bin/env pythonimport osimport platformimport sys"""ceph-deploy - admin tool for ceph原创 2017-11-09 14:37:29 · 808 阅读 · 0 评论 -
ceph log的实现
在src/commin/ceph_context.cc 中有初始化ceph的log模块CephContext::CephContext(uint32_t module_type_, int init_flags_) : nref(1), _conf(new md_config_t(is_daemon(module_type_))), _log(NULL),{ ceph_原创 2017-10-20 17:15:01 · 1245 阅读 · 0 评论 -
ceph-deploy 中使用remoto
在ceph-deploy 中使用remoto 这个第三方库来访问远程host.这个库的源码的路径为https://github.com/alfredodeza/remoto例如在E:\ceph-deploy-master\ceph-deploy-master\ceph_deploy\hosts\common.py 中def ceph_version(conn): """ Log原创 2017-11-21 14:29:53 · 806 阅读 · 0 评论 -
ceph-deploy的pkg命令
ceph-deploy的pkg命令用于在远程在host上安装package,这个host可以是远程的,也可以是本地的。其入口函数在:E:\ceph-deploy-master\ceph-deploy-master\ceph_deploy\pkg.py 中的makedef make(parser): """ Manage packages on remote hosts.原创 2017-12-06 14:22:43 · 454 阅读 · 0 评论 -
在btrfs和zfs文件系统中ceph 并行写日志和数据
在filestore中中有针对btrfs或者zfs这样的文件系统提供parallel的功能,让日志和数据并行写入,这两个文件系统提供最多两个checkpoint 来保证数据的rollback而xfs这样的文件系统只能先写日志再写数据。具体可以从日志的的同步函数sync_entry 中可以明显看到void FileStore::sync_entry(){ #这个if条件成立的话,说明当前...原创 2018-04-16 19:26:41 · 1622 阅读 · 0 评论 -
ceph中的存储用到的类
在ceph os中可以明显看出ceph 目前支持的存储类型如下:ObjectStore *ObjectStore::create(CephContext *cct, const string& type, const string& data, const string& journal, osflagbits_t flags){...原创 2018-04-16 08:29:59 · 606 阅读 · 0 评论 -
ceph网络通信架构
ceph的网络通信的源码在src/msg下面目前实现由三个框架,这点从Messenger.cc 这个类中可以看出Messenger *Messenger::create(CephContext *cct, const string &type, entity_name_t name, string lname, uint64_t nonce, uint64...原创 2018-04-08 19:23:24 · 2089 阅读 · 1 评论 -
ceph monitor 选举leader和peon的过程
ceph中monitor 可以分为leader节点和peon节点,leader节点是分解rank值来决定,rank值又和ip地址有关。在ceph/mon/elector.cc 这个文件中实现的Elector 类用于选举monitor中的leader节点.leader节点的选举从start 这个成员函数开始void Elector::start(){ leader_acked = -原创 2018-02-24 19:13:43 · 2532 阅读 · 0 评论 -
ceph中的finisher类
finisher 类是ceph中定义的专门检查操作是否结束的一个类。我们首先看这个类的start函数void Finisher::start(){ ldout(cct, 10) << __func__ << dendl; finisher_thread.create(thread_name.c_str());}调用finisher_thread的creat...原创 2018-03-02 09:34:42 · 1359 阅读 · 0 评论 -
lease消息
monitor节点分为leader和peon两种角色,monitor会定义向peon发送lease消息,保证副本在一定的时间内可读.只要有一个peon没有回复lease的消息就会发起重新选举.lease消息是从extend_lease 这个函数发出的void Paxos::extend_lease(){ #从这里知道只有leader节点能发送lease消息 assert(mon-&...原创 2018-03-01 09:10:36 · 782 阅读 · 0 评论 -
rank和ip 地址的关系
在monitor 选举leader和peon的时候,rank这个值很关键,之前讲过这个值和ip地址有关,这个值和ip地址的关系如下在monitor.cc 中的bootstrap这个函数中可以看到void Monitor::bootstrap(){ // note my rank #可以看到是通过get_rank 这个函数得到rank的,这个函数的形参就是ip地址 int newr原创 2018-02-26 19:57:11 · 807 阅读 · 0 评论 -
ceph-deploy的admin 命令
ceph-deploy的admin命令指定了位置参数client用于将conf_data和keyring文件写到远端的host中其入口在E:\ceph-deploy-master\ceph-deploy-master\ceph_deploy\admin.py@priority(70)def make(parser): """ Push configuration and cl原创 2017-11-28 14:36:58 · 1809 阅读 · 0 评论 -
arm 的neon指令等同于arm64的asimd指令
在ceph 的src/test/test_arch.cc 中我们可以看到下面的code ,从kernel中的/proc/cpuinfo 中的feature来判断arm是否支持neon指令,需要注意这个指令在armv8 之后被称为asimd指令TEST(Arch, all){ ceph_arch_probe(); EXPECT_TRUE(ceph_arch_probed);#if ...原创 2018-05-16 09:34:47 · 7232 阅读 · 0 评论