Planet Ceph

Aggregated news from external sources

  • March 29, 2017
    Ceph如何实现文件系统的横向扩展

    前言 在跟一个朋友聊天的时候,聊到一个技术问题,他们的一个环境上面小文件巨多,是我目前知道的集群里面规模算非常大的了,但是目前有个问题,一方面会进行一倍的硬件的扩容,而文件的数量也在剧烈的增长着,所以有没有什么办法来 缓解这个增长的压力当时也没想到太多的办法,只是觉得这么用下去风险太大 后来在思考了一段时间后,大概有了一个想法,这个就要看是否能把方案做下去,如果是我自己在用的集群,而非客户,我会这么去用的 方案介绍 方案一 也就是默认的方案,一般来说就是一个主MDS,然后几个备用MDS,整个一个挂载点,全局混用的空间 存在问题: 扩容以后,有大量的数据迁移 所有的元数据请求,只有一个MDS服务,到了巨型数据的时候,可能出现卡顿或MDS卡掉的问题 优点: 全局统一命名空间 方案二: 采用分存储池的结构,也就是将集群内的目录树分配到整个集群的多个相互独立的空间里面 存在问题: 同样是所有的元数据请求,只有一个MDS服务,到了巨型数据的时候,可能出现卡顿或MDS卡掉的问题 优点: 全局统一命名空间下面对应目录到不同的存储池当中,在进行扩容的时候,不会影响原有的数据,基本是没有迁移数据 方案三: 物理分存储池的结构并没有解决元数据压力过大的问题,而元数据的处理能力并非横向扩展的,而文件数量和集群规模都是在横向增长,所以必然是一个瓶颈点 这个方案其实很简单,相当于方案二的扩展,我们在方案二中进行了物理存储池的分离,然后把空间映射到子目录,来实现数据的分离,既然规模能够大到分物理空间,那么我们可以考虑部署多套集群,并且来真正的实现了数据处理能力的横向扩展,因为MDS,可以是多个的了,那么比较重要的问题就是统一命名空间的问题了,怎么实现,这个也简单,主要是跟客户沟通好,让客户接受提出的方案 我们在一些商业系统上面可以看到一些限制,比如单卷的大小最大支持多大,在这里我们需要跟客户沟通好,无限的扩展,会带来一些压力的风险,有方案能够解决这种问题,而这种数据量在之前是没有太多的案例可借鉴的,所以需要人为控制一个目录的最大空间,也就是单套集群的大小,下面举例来说明下 假设我们的空间一期规模为2P,二期规模要4P,三期规模6P那么我们的命名空间上就分离出三个逻辑空间,也就是对应三套集群 弄清楚客户的存储的目录结构,一般来说客户并不太关心目录的设计,如果能够引导的情况下,可以引导客户,我们需要弄清楚目录可变化的那个点在哪里,举例说明,假如客户的数据可以去按年进行分类的话,数据就可以是 20142015 20162017 这样的增长趋势,并且数据量之前的肯定已知,未来可大概估计,并且集群准备存储多少年的数据,也是可大概预估的,那么这个环境我们就先认为到2017的数据我们放在集群一内,2017年以后的数据放在集群二内,那么挂载点是这样的 192.168.10.101:/2014192.168.10.101:/2015192.168.10.101:/2016192.168.10.101:/2017192.168.10.102:/2018192.168.10.102:/2019192.168.10.102:/2020192.168.10.102:/2021 挂载到本地的服务的机器上本地创建好目录 /share/2014/share/2015/share/2016/share/2017/share/2018/share/2019/share/2020/share/2021 然后把上面的集群挂载点按名称挂载到本地的这些目录上面 本地的共享就把/share共享出去,那么用户看到的就是一个全局命名空间了,这个是用本地子目录映射的方式来实现统一命名空间,技术难度小,难点在于跟客户沟通好数据的层级结构,如果客户能够自己随意增加目录,那么更好实现了,随意的将目录分配到两个集群即可,最终能达到满意的效果就行 当然主要还是需要客户能够接受你的方案,海量小文件的情况下,分开到多个集群当然会更好些,并且集群万一崩溃,也是只会影响局部的集群了 总结 我们在利用一些新的技术的时候我们很多时候关注的是他最好的那个点,而这个点有的时候反而阻碍了我们的想法,比如集群,那就是把所有硬盘管理起来,搞成一个集群,那么为什么不能往上再走一层,我用管理的方式把多套集群在管理的层面组合成一个集群池呢?然后从多个集群里面来分配我们需要的资源即可 变更记录 Why Who When 创建 武汉-运维-磨渣 2017-03-29 Source: zphj1987@gmail (Ceph如何实现文件系统的横向扩展)

  • March 29, 2017
    Predicting Ceph PG placement

    When creating a new Ceph pool, deciding for the number of PG requires some thinking to ensure there are a few hundred PGs per OSD. The distribution can be verified with crush analyze as follows: $ crush analyze –rule data –type device –replication-count 2 –crushmap crushmap.txt –pool 0 –pg-num 512 –pgp-num 512 ~id~ ~weight~ ~over/under …Read more

  • March 27, 2017
    Debug Ceph Docker containers

    For the last couple of weeks, Erwan Velu and I have been busy refactoring the entire ceph-docker code base. Through these cosmetic changes, we implemented new mechanisms to finely grained debug containers at run time. This article was co-written with Erwan Velu and will explain what we worked on. I. Rationale People tend to believe …Read more

  • March 24, 2017
    从hammer到jewel的RGW升级实战-by秦牧羊

    前言 本篇来自秦牧羊的一篇分享,讲述的是从hammer升级到jewel的过程,以及其中的一些故障的处理,是一篇非常详细的实战分享 初始状态 pool状态 root@demo:/home/demouser# rados lspoolsrbd.cn.rgw.root.cn-zone1.rgw.root.cn-zone1.rgw.domain.cn-zone1.rgw.control.cn-zone1.rgw.gc.cn-zone1.rgw.buckets.index.cn-zone1.rgw.buckets.extra.cn-zone1.rgw.buckets.cn-zone1.log.cn-zone1.intent-log.cn-zone1.usage.cn-zone1.users.cn-zone1.users.email.cn-zone1.users.swift.cn-zone1.users.uid ceph.conf配置 [client.radosgw.us-zone1] rgw dns name = s3.ceph.work rgw frontends = fastcgi host = ceph.work rgw region = cn rgw region root pool = .cn.rgw.root rgw zone = us-zone1 rgw zone root pool = .cn-zone1.rgw.root keyring = /etc/ceph/ceph.client.radosgw.keyring rgw socket path = /home/ceph/var/run/ceph-client.radosgw.us-zone1.sock log file = /home/ceph/log/radosgw.us-zone1.log rgw print …Read more

  • March 24, 2017
    小文件测试数据准备

    前言 在看一个Linux Vault 2017的资料的时候,看到红帽分享的一个测试的过程,里面关于小文件元数据性能测试的,环境准备的还比较好,可以作为一种测试模型 测试用例 测试用例一: 使用find -name 测试 find -size 测试测试用例二: 使用find -name 测试 find -size 测试 测试用例三: 使用rmdir进行测试 总结 本篇就是记录一个测试模型 变更记录 Why Who When 创建 武汉-运维-磨渣 2017-03-24 Source: zphj1987@gmail (小文件测试数据准备)

  • March 23, 2017
    编译的Ceph二进制文件过大问题

    前言 在ceph的研发群里看到一个cepher提出一个问题,编译的ceph的二进制文件过大,因为我一直用的打包好的rpm包,没有关注这个问题,重新编译了一遍发现确实有这个问题 本篇就是记录如何解决这个问题的 打rpm包的方式 用我自己的环境编译的时候发现一个问题,编译出来的rpm包还是很大,开始怀疑是机器的原因,换了一台发现二进制包就很小了,然后查询了很多资料以后,找到了问题所在 在打rpm包的时候可以通过宏变量去控制是否打出一个的debug的包,这个包的作用就是把二进制文件当中包含的debug的相关的全部抽离出来形成一个新的rpm包,而我的环境不知道什么时候在/root/.rpmmacros添加进去了一个 d%ebug_package %{nil} 搜寻资料后确定就是这个的问题,这个变量添加了以后,在打包的时候就不会进行debug相关包的剥离,然后打出的包就是巨大的,可以这样检查自己的rpmbuild的宏变量信息 [root@host1 ceph-10.2.6]# rpmbuild –showrc|grep debug_package %{!?__debug_package: %{?__debug_package:%{__debug_install_post}}-14: _enable_debug_packages 1-14: debug_package %global __debug_package 1-14: install %{?_enable_debug_packages:%{?buildsubdir:%{debug_package}}} 如果开启了debug包抽离(默认就是开启的),那么rpmbuild在打包的过程中会有个调用 /usr/lib/rpm/find-debuginfo.sh –strict-build-id -m –run-dwz –dwz-low-mem-die-limit 10000000 –dwz-max-die-limit 110000000 /root/rpmbuild/BUILD/ceph-10.2.5 这个就是rpmbuild过程中,进行抽离debug信息的操作,也就是缩小二进制的过程,这个并不能直接执行命令,需要用rpmbuild -bb ceph.spec 打包的时候内部自动进行调用的 上面是rpm打包过程中进行的二进制缩小,那么如果我们是源码编译安装时候,如何缩小这个二进制,答案当然是可以的 源码编译安装的方式 ./configure 后make生成的二进制文件就在./src下面了我们以ceph-mon为例进行抽离 这个-O3并没有影响到太多的生成的二进制的大小,—with-debug会有一定的影响,关键还是strip的这个操作 ./configure –with-debug CXXFLAGS=-O3 CFLAGS=-O3 CCASFLAGS=-O3 所以默认的就行 如果整体进行安装就使用make install-strip安装即可 [root@host1 ceph-10.2.6]# make install-strip[root@host1 …Read more

  • March 22, 2017
    Ceph实现数据的’不拆分’

    前言 之前看过一个朋友一篇文章,讲述的是Vsan为什么使用的是两副本,而ceph则大多数情况下需要三副本,当时个人观点是这个并不是关键点,但是在仔细考虑了问题的出发点以后,这个也可以说是其中的一个点一个集群数据丢失可以从多方面去看 发生丢失数据的事件,这个来说,出现这个事件的概率是一致的,同等硬件情况下没有谁的系统能够说在两副本情况下把这个出现坏盘概率做的比其他系统更低 发生坏盘事件以后,数据丢失波及的范围,这个就是那个朋友提出的一个观点,对于Vsan来说因为文件的不拆分,也就是在丢了的情况下,只是局部数据的丢失,而ceph的数据因为拆分到整个集群,基本上说就是全军覆没了,这一点没有什么争议 一般来说,ceph都是配置的分布式文件系统,也就是数据以PG为组合,以对象为最小单元的形式分布到整个集群当中去,通过控制crush能够增加一定的可用概率,但是有没有办法实现真的丢盘的情况下,数据波及没有那么广,答案当然是有的,只是需要做一些更细微的控制,前端的使用的接口也需要做一定的改动,本篇将讲述这个如何去实现,以及前端可能需要的变动 方案实现 首先来一张示意图,来介绍大致的实现方式,下面再给出操作步骤 主要包括三步 横向划条带 创建对应规则 根据规则创建相关存储池 横向划条带 创建虚拟根 ceph osd crush add-bucket default-a rootceph osd crush add-bucket default-b rootceph osd crush add-bucket default-c rootceph osd crush add-bucket default-d root 创建虚拟主机 ceph osd crush add-bucket host1-a hostceph osd crush add-bucket host2-a hostceph osd crush add-bucket host3-a hostceph osd crush add-bucket host1-b …Read more

  • March 19, 2017
    How many objects will move when changing a crushmap ?

    After a crushmap is changed (e.g. addition/removal of devices, modification of weights or tunables), objects may move from one device to another. The crush compare command can be used to show what would happen for a given rule and replication count. In the following example, two new OSDs are added to the crushmap, causing 22% …Read more

  • March 16, 2017
    基于Docker UI 配置ceph集群

    前言 前一篇介绍了docker在命令行下面进行的ceph部署,本篇用docker的UI进行ceph的部署,目前来说市面上还没有一款能够比较简单就能直接在OS上面去部署Ceph的管理平台,这是因为OS的环境差异化太大,并且包的版本,以及各种软件的适配都可能造成失败,而docker比较固化环境,因此即使一个通用的UI也能很方便的部署出一个Cpeh集群 本篇就是对Docker UI部署集群做一个实践,对ceph了解,对docker了解,对dokcer的UI操作进行一定的了解的情况下,再做实践会比较好,总体上还是比较简单的 安装并运行portainer 安装软件 cd /optwget https://github.com/portainer/portainer/releases/download/1.12.1/portainer-1.12.1-linux-amd64.tar.gztar xvpfz portainer-1.12.1-linux-amd64.tar.gzcd portainer 运行软件 ./portainer -H unix:///var/run/docker.sock -p “:9999” 注意下这里-H是指定的docker的连接,也就是要控制哪个docker,这个支持本地的sock的方式,也支持远程的tcp的方式,这个进入ui界面后还可以添加更多的-p是指定的访问的接口 扩展知识 如何在centos7下面启用 remote api打开文件 /usr/lib/systemd/system/docker.service 在 $INSECURE_REGISTRY 后面添加 -H tcp://0.0.0.0:2376 -H unix:///var/run/docker.sock ExecStart=/usr/bin/dockerd-current –add-runtime docker-runc=/usr/libexec/docker/docker-runc-current –default-runtime=docker-runc –exec-opt native.cgroupdriver=systemd –userland-proxy-path=/usr/libexec/docker/docker-proxy-current $OPTIONS $DOCKER_STORAGE_OPTIONS $DOCKER_NETWORK_OPTIONS $ADD_REGISTRY $BLOCK_REGISTRY $INSECURE_REGISTRY -H tcp://0.0.0.0:2376 -H unix:///var/run/docker.sock 修改好了后 [root@lab8106 ~]#systemctl daemon-reload[root@lab8106 ~]#systemctl restart docker …Read more

  • March 15, 2017
    基于docker部署ceph以及修改docker image

    前言 容器和ceph的结合已经在一些生产环境当中做了尝试,容器的好处就是对运行环境的一个封装,传统的方式是集成为ISO,这个需要一定的维护量,而容器的相关操作会简单很多,也就有了一些尝试,个人觉得如果玩的转容器可以考虑,当然得懂ceph,不然两套系统在一起,问题都不知道是哪个的,就比较麻烦了 本篇是基于之前我的填坑群里面的牛鹏举的一个问题,他的环境出现了创建osd的时候权限问题,我这边没遇到,现在实践了一遍,感觉应该是之前目录提前创建了的问题 实践步骤 安装docker yum install docker 下载ceph镜像 这个镜像是sebastien维护的,他是redhat的ceph工程师,ceph-ansible的负责人,很多一线的资料都是来自他的分享,这个是一个集成好的镜像 docker pull ceph/daemon 准备好一些目录 mkdir -p /etc/cephmkdir -p /var/lib/ceph/ 注意只需要做这个两个目录,不要创建子目录,docker内部有相关的操作 创建一个mon sudo docker run -d –net=host –name=mon -v /etc/ceph:/etc/ceph -v /var/lib/ceph/:/var/lib/ceph -e MON_IP=192.168.8.106 -e CEPH_PUBLIC_NETWORK=192.168.0.0/16 ceph/daemon mon MON_IP就是宿主机的IP地址 执行完了后 [root@lab8106 ceph]# docker ps -lCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES86ed05173432 ceph/daemon “/entrypoint.sh mon” About …Read more

  • March 14, 2017
    Predicting which Ceph OSD will fill up first

    When a device is added to Ceph, it is assigned a weight that reflects its capacity. For instance if osd.1 is a 1TB disk, its weight will be 1.0 and if osd.2 is a 4TB disk, its weight will be 4.0. It is expected that osd.1 will receive exactly four times more objects than osd.2. …Read more

  • March 6, 2017
    在线动态修改ulimit

    前言 系统中有些地方会进行资源的限制,其中的一个就是open file的限制,操作系统默认限制的是1024,这个值可以通过各种方式修改,本篇主要讲的是如何在线修改,生产上是不可能随便重启进程的 实践 查看系统默认的限制 [root@lab8106 ~]# ulimit -a|grep openopen files (-n) 1024 默认的打开文件是1024 [root@lab8106 ~]# ps -ef|grep ceph-osdceph 28176 1 0 18:08 ? 00:00:00 /usr/bin/ceph-osd -f –cluster ceph –id 0 –setuser ceph –setgroup cephroot 28619 26901 0 18:10 pts/3 00:00:00 grep –color=auto ceph-osd[root@lab8106 ~]# cat /proc/28176/limits |grep openMax open files 1048576 1048576 files ceph …Read more

Careers