Planet Ceph

Aggregated news from external sources

  • 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

  • March 3, 2017
    Dealing With Some Osd Timeouts

    In some cases, some operations may take a little longer to be processed by the osd. And the operation may fail, or even make the OSD to suicide. There are many parameters for these timeouts. Some examples : Thread suicide timed out 1 2 3 heartbeat_map is_healthy ‘OSD::osd_op_tp thread 0x7f1ee3ca7700’ had suicide timed out after …Read more

  • March 3, 2017
    Speaking at the Vault 2017

    For your information, I’ll be talking about Ceph and storage management with openATTIC on Wednesday, March 22th at 12:00 EST (19:00 UTC) at the Vault 2017. Vault brings together the leading developers and users in file systems and storage in the Linux kernel and related projects to forge a path to continued innovation and education. …Read more

  • February 28, 2017
    python执行rados命令例子

    前言 我们以前的管理平台在python平台下面做的,内部做的一些操作采用的是命令执行,然后解析的方式去做的,ceph自身有python的rados接口,可以直接调用原生接口,然后直接解析json的方式,这样更靠近底层在看ceph-dash内部的实现的时候,发现里面的获取集群信息的代码可以留存备用 代码实例 #!/usr/bin/env python# -*- coding: UTF-8 -*-import jsonfrom rados import Radosfrom rados import Error as RadosErrorclass CephClusterCommand(dict): “”” Issue a ceph command on the given cluster and provide the returned json “”” def __init__(self, cluster, **kwargs): dict.__init__(self) ret, buf, err = cluster.mon_command(json.dumps(kwargs), ”, timeout=5) if ret != 0: self[‘err’] = err else: self.update(json.loads(buf))config={’conffile’: …Read more

  • February 27, 2017
    Containerize Ceph: store config options in monitor KV store

    During the last CDM (Ceph Developer Monthly), I presented a blueprint that will help Ceph playing nicely when it’s being containerized. I. Containerized Ceph: generating Ceph config file While running a containerized version of Ceph in Kubernetes, generating the ceph.conf is complex but crucial since containers have to be as self-sufficient as possible. We can …Read more

  • February 24, 2017
    记最近一次ceph故障修复

    前言 所谓吃一堑长一智,每次面对问题才是最好的学习机会,在面对问题的时候,尽量是能够自己去解决,或者去尝试能够最接近答案,确实无法解决再去寻求他人帮助,这样成长的会更快一些,在学校读书做题的时候,老师也是经常告诉我们要忍住,不要去直接翻答案,在当今的互联网飞速的发展下,在google的帮助下,基本上90%的问题都能找到正确的答案,而我们其实真正需要锻炼的是实践能力和甄别的能力去年一年给不少的生产环境解决过问题,在相互交流几次以后,解决问题的过程,基本也熟悉了,一般解决问题的大致流程都是: 告之我环境的当前状况,需要实现的情况 准备好远程的环境 告之对方可能出现的情况,是否可操作,然后解决问题 交流问题的出现原因以及解决的办法 目前来看,基本都解决了,对于我来说是一次处理故障经验的累积,对对方来说是环境的恢复,以及下次在出现相同故障的时候,自己能够处理好类似问题 本次恢复对于我来说也是刷新了的认识,进展只到了解决问题的地方,就结束了,那么我就记录下这次解决问题当中的收获 处理过程 故障的发生应该是在一次掉电后触发的,整个集群在重新启动以后,出现了多块磁盘故障的问题,也有主机无法启动的情况,整个集群的PG状态处于一个混乱的状态,stale和incomplete以及peering状态的都很多 告之对方,需要把相关的osd节点全部都启动起来,然后再看是否有恢复的可能,常规来说,如果三台机器同时出现磁盘损坏,那么这个集群的数据必然会丢失,并且丢失的数据基本将是覆盖所有数据 在将近一周的时间以后,集群环境磁盘都能挂载,环境可以进行处理了 出现pg状态一直是peering状态的情况 用ceph -s 检查集群的状态,集群的状态所有的osd都是正常的up in状态,但是pg状态就是peering状态无法恢复,然后查看都是来自其中的某一个osd,登陆上机器后查看osd的日志,显示无法获取心跳,但是网络明明是好的,并且还能登陆到其他机器上,这就奇怪了,这里先讲下这个地方对方环境埋下的一个坑 hosts文件里面是这种组合 10.10.10.101 node1192.168.10.1 node110.10.10.102 node2192.168.10.2 node210.10.10.103 node3192.168.10.3 node3 也就是一个主机名映射了两个IP,这个对方说没问题,我也就不多说了,只是我的环境是不会允许这么配置,正是因为这个配置,也就间接隐藏了一个错误的配置,这个错误就是居然在环境当中配置两台主机相同的IP,这也就是为什么出现相同的IP我还能登陆机器 环境配置成了 10.10.10.102 node3192.168.10.3 node3 也就是node3和node2的集群IP冲突了,所以我在ssh node3的时候能正确登陆node3 ssh node2也能正确登陆node2,只是集群用的IP冲突了,而两台机器之间网络又可以通过其他的网段通信,集群的osd状态是正常,只是pg异常了 IP冲突在生产环境中是大忌,可能会毁掉整个集群的状态,这个有多大影响?你可以试下配置好一个集群,然后把两个节点的IP配置成一样,然后检查集群的状态和你的上面运行的存储的状态,这个环境因为是在不提供服务状态下,所以带来的影响没有那么大 在排查到这个错误的时候,已经是晚上快11点了,对方也要回家了,作为运维比较苦逼的就是很多时候,需要待在公司到晚上很晚才能离开,所以问了下是否能留远程给我,得到了许可,可以继续操作,因为这个环境状态来看我觉得还在我的可控范围内,所以想继续尝试,对方也是问过几次,这个环境是否可恢复,我给出的回答也是尽量,IP冲突的问题解决后,重新启动OSD,集群基本快正常了,还是有一些异常的PG需要处理 出现osd无法启动 verify_reply couldn’t decrypt with error: error decoding block for decryption 这个错误之前有处理经验,时间偏移过大引起认证不通过,登陆上osd对应的机器,检查发现时间偏移了几个小时,引起错误,检查发现ntp配置文件使用的是默认配置文件,至少这台没配置ntp,调整好时间,重启osd解决无法启动问题 出现PG incomplete的状态 这个状态一般是环境出现过特别的异常状况,PG无法完成状态的更新,这个只要没有OSD被踢出去或者损坏掉,就好办,这个环境的多个PG的数据是一致的,只是状态不对,这个就把PG对应的OSD全部停掉,然后用ceph-object-tool 进行mark complete,然后重启osd,一般来说这个都是能解决了,没出意外,这个环境用工具进行了修复,当然8个这样的PG操作起来还是要比较长的时间,一个个的确认状态,还好都解决了,这个工具是jewel上面集成的,所以在老版本出现这个问题,可以通过升级后进行处理,之前有个别人的生产环境这么处理过这个问题 出现PG inconsistent状态的 …Read more

  • February 23, 2017
    Catastrophe Hits Your Datacenter – But Users Don’t Notice

    Many large, network-dependent organizations are deploying OpenStack together with Red Hat Ceph Storage because they are inherently highly available solutions. What if you lost your datacenter completely in a catastrophe, but your users hardly noticed? Sounds like a mirage, but it’s absolutely possible, and major datacenters with high demand for full availability are already accomplishing …Read more

Careers