「高级部署」Ceph手动配置集群部署&编译源码

TODO: 最近一次更新 : 2020/11/26 21:11

当前最流行的分布式存储系统——Ceph尝鲜

首先介绍一些使用的网站备查,建议保存到chrome收藏夹!

Ceph中国社区:包括中文文档(非最新),以及新闻等。

最新的英文文档:最新的英文文档,包括nautilus和Octopus版本,你一定不想错过!

API文档

快速安装入门:适合新手,包括基础的配置等。

Ceph源码:喜欢git的筒子可以看这儿,包括编译步骤。

官方的问题tracker

官方的roadmap(版本问题)

你在寻找。。。

源码编译可以直接去 这儿

Logo

版本问题

  • x.0.z - 开发版(给早期测试者和勇士们)
  • x.1.z - 候选版(用于测试集群、高手们)
  • x.2.z - 稳定、修正版(给用户们)
版本名称 发行时间/EOL 建议的部署工具
Argonaut  0.48版本(LTS) 2012年6月3日
Bobtail   0.56版本(LTS) 2013年1月1日
Cuttlefish 0.61版本 2013年5月7日
Dumpling 0.67版本(LTS) 2013年8月14日
Emperor   0.72版本 2013年11月9日
Firefly    0.80版本(LTS) 2014年5月
Giant   Stable October 2014 - April 2015
Hammer LTS April 2015 - November 2016
Infernalis Stable November 2015 - June 2016
Jewel 10 2016年4月 ceph-deploy
Kraken 11 2017年10月 ceph-deploy
Luminous 12 2017年10月 ceph-deploy
mimic 13 2018年5月 ceph-deploy
Nautilus 14.2.12 2019年3月 /2021年6月 Rook (Kubernetes-preferred,fully integrated with new orchestration API, docker-dependent)
Octopus 15.2.5 2020年3月 /2022年6月 Cephadm(fully integrated with new orchestration API, docker-dependent)
Pacific 16

获取最新版本信息,详见

https://docs.ceph.com/en/latest/releases/general/

如果你遇到问题,No problem,这儿有一个庞大的社区来协助你:


硬件支持问题

Ceph硬件要求

Ceph 为普通硬件设计,这可使构建、维护 PB 级数据集群的费用相对低廉。规划集群硬件时,需要均衡几方面的因素,包括区域失效和潜在的性能问题。硬件规划要包含把使用 Ceph 集群的 Ceph 守护进程和其他进程恰当分布。通常,我们推荐在一台机器上只运行一种类型的守护进程。我们推荐把使用数据集群的进程(如 OpenStack 、 CloudStack 等)安装在别的机器上。

关于 Ceph 的高品质博客文章也值得参考,比如 Ceph Write Throughput 1Ceph Write Throughput 2Argonaut v. Bobtail Performance PreviewBobtail Performance - I/O Scheduler Comparison

CPU

Ceph 元数据服务器对 CPU 敏感,它会动态地重分布它们的负载,所以你的元数据服务器应该有足够的处理能力(如 4 核或更强悍的 CPU )。 Ceph 的 OSD 运行着 RADOS 服务、用 CRUSH 计算数据存放位置、复制数据、维护它自己的集群运行图副本,因此 OSD 需要一定的处理能力(如双核 CPU )。监视器只简单地维护着集群运行图的副本,因此对 CPU 不敏感;但必须考虑机器以后是否还会运行 Ceph 监视器以外的 CPU 密集型任务。例如,如果服务器以后要运行用于计算的虚拟机(如 OpenStack Nova ),你就要确保给 Ceph 进程保留了足够的处理能力,所以我们推荐在其他机器上运行 CPU 密集型任务。

RAM内存

元数据服务器和监视器必须可以尽快地提供它们的数据,所以他们应该有足够的内存,至少每进程 1GB 。 OSD 的日常运行不需要那么多内存(如每进程 500MB )差不多了;然而在恢复期间它们占用内存比较大(如每进程每 TB 数据需要约 1GB 内存)。通常内存越多越好。

元数据服务器和监视器必须可以尽快地提供它们的数据,所以他们应该有足够的内存,至少每进程 1GB 。 OSD 的日常运行不需要那么多内存(如每进程 500MB )差不多了;然而在恢复期间它们占用内存比较大(如每进程每 TB 数据需要约 1GB 内存)。通常内存越多越好。

因为 Ceph 发送 ACK 前必须把所有数据写入日志(至少对 xfs 和 ext4 来说是),因此均衡日志和 OSD 性能相当重要。

硬盘驱动器

OSD 应该有足够的空间用于存储对象数据。考虑到大硬盘的每 GB 成本,我们建议用容量大于 1TB 的硬盘。

  • 不顾分区而在单个硬盘上运行多个OSD,这样不明智

  • 不顾分区而在运行了OSD的硬盘上同时运行监视器或元数据服务器也不明智

存储驱动器受限于寻道时间、访问时间、读写时间、还有总吞吐量,这些物理局限性影响着整体系统性能,尤其在系统恢复期间。因此我们推荐独立的驱动器用于安装操作系统和软件,另外每个 OSD 守护进程占用一个驱动器。大多数 “slow OSD”问题的起因都是在相同的硬盘上运行了操作系统、多个 OSD 、和/或多个日志文件。鉴于解决性能问题的成本差不多会超过另外增加磁盘驱动器,你应该在设计时就避免增加 OSD 存储驱动器的负担来提升性能。

Ceph 允许你在每块硬盘驱动器上运行多个 OSD ,但这会导致资源竞争并降低总体吞吐量; Ceph 也允许把日志和对象数据存储在相同驱动器上,但这会增加记录写日志并回应客户端的延时,因为 Ceph 必须先写入日志才会回应确认了写动作。 btrfs 文件系统能同时写入日志数据和对象数据, xfs 和 ext4 却不能。

SSD总体性能优于HDD

  • 写密集语义: 记日志涉及写密集语义,所以你要确保选用的 SSD 写入性能和硬盘相当或好于硬盘。廉价 SSD 可能在加速访问的同时引入写延时,有时候高性能硬盘的写入速度可以和便宜 SSD 相媲美。
  • 顺序写入: 在一个 SSD 上为多个 OSD 存储多个日志时也必须考虑 SSD 的顺序写入极限,因为它们要同时处理多个 OSD 日志的写入请求。
  • 分区对齐: 采用了 SSD 的一个常见问题是人们喜欢分区,却常常忽略了分区对齐,这会导致 SSD 的数据传输速率慢很多,所以请确保分区对齐了。

SSD 用于对象存储太昂贵了,但是把 OSD 的日志存到 SSD 、把对象数据存储到独立的硬盘可以明显提升性能。 osd journal 选项的默认值是 /var/lib/ceph/osd/$cluster-$id/journal ,你可以把它挂载到一个 SSD 或 SSD 分区,这样它就不再是和对象数据一样存储在同一个硬盘上的文件了。

提升 CephFS 文件系统性能的一种方法是从 CephFS 文件内容里分离出元数据。 Ceph 提供了默认的 metadata 存储池来存储 CephFS 元数据,所以你不需要给 CephFS 元数据创建存储池,但是可以给它创建一个仅指向某主机 SSD 的 CRUSH 运行图。详情见给存储池指定 OSD

你可以在同一主机上运行多个 OSD ,但要确保 OSD 硬盘总吞吐量不超过为客户端提供读写服务所需的网络带宽;还要考虑集群在每台主机上所存储的数据占总体的百分比,如果一台主机所占百分比太大而它挂了,就可能导致诸如超过 full ratio 的问题,此问题会使 Ceph 中止运作以防数据丢失。

如果每台主机运行多个 OSD ,也得保证内核是最新的。参阅操作系统推荐里关于 glibcsyncfs(2) 的部分,确保硬件性能可达期望值。

OSD 数量较多(如 20 个以上)的主机会派生出大量线程,尤其是在恢复和重均衡期间。很多 Linux 内核默认的最大线程数较小(如 32k 个),如果您遇到了这类问题,可以把 kernel.pid_max 值调高些。理论最大值是 4194303 。例如把下列这行加入 /etc/sysctl.conf 文件:

kernel.pid_max = 4194303

网络

​ 建议每台机器最少两个千兆网卡,现在大多数机械硬盘都能达到大概 100MB/s 的吞吐量,网卡应该能处理所有 OSD 硬盘总吞吐量,所以推荐最少两个千兆网卡,分别用于公网(前端)和集群网络(后端)。集群网络(最好别连接到国际互联网)用于处理由数据复制产生的额外负载,而且可防止拒绝服务攻击,拒绝服务攻击会干扰数据归置组,使之在 OSD 数据复制时不能回到 active + clean 状态。请考虑部署万兆网卡。通过 1Gbps 网络复制 1TB 数据耗时 3 小时,而 3TB (典型配置)需要 9 小时,相比之下,如果使用 10Gbps 复制时间可分别缩减到 20 分钟和 1 小时。在一个 PB 级集群中, OSD 磁盘失败是常态,而非异常;在性价比合理的的前提下,系统管理员想让 PG 尽快从 degraded (降级)状态恢复到 active + clean 状态。另外,一些部署工具(如 Dell 的 Crowbar )部署了 5 个不同的网络,但使用了 VLAN 以提高网络和硬件可管理性。 VLAN 使用 802.1q 协议,还需要采用支持 VLAN 功能的网卡和交换机,增加的硬件成本可用节省的运营(网络安装、维护)成本抵消。使用 VLAN 来处理集群和计算栈(如 OpenStack 、 CloudStack 等等)之间的 VM 流量时,采用 10G 网卡仍然值得。每个网络的机架路由器到核心路由器应该有更大的带宽,如 40Gbps 到 100Gbps 。

​ 服务器应配置底板管理控制器( Baseboard Management Controller, BMC ),管理和部署工具也应该大规模使用 BMC ,所以请考虑带外网络管理的成本/效益平衡,此程序管理着 SSH 访问、 VM 映像上传、操作系统安装、端口管理、等等,会徒增网络负载。运营 3 个网络有点过分,但是每条流量路径都指示了部署一个大型数据集群前要仔细考虑的潜能力、吞吐量、性能瓶颈。

Ceph 可以运行在廉价的普通硬件上,小型生产集群和开发集群可以在一般的硬件上。

如果在只有一块硬盘的机器上运行 OSD ,要把数据和操作系统分别放到不同分区;一般来说,我们推荐操作系统和数据分别使用不同的硬盘。

最低硬件要求

进程 条件 最低建议
ceph-osd Processor 1x 64-bit AMD-641x 32-bit ARM dual-core or better1x i386 dual-core
RAM ~1GB for 1TB of storage per daemon
Volume Storage 1x storage drive per daemon
Journal 1x SSD partition per daemon (optional)
Network 2x 1GB Ethernet NICs
ceph-mon Processor 1x 64-bit AMD-64/i3861x 32-bit ARM dual-core or better1x i386 dual-core
RAM 1 GB per daemon
Disk Space 10 GB per daemon
Network 2x 1GB Ethernet NICs
ceph-mds Processor 1x 64-bit AMD-64 quad-core1x 32-bit ARM quad-core1x i386 quad-core
RAM 1 GB minimum per daemon
Disk Space 1 MB per daemon
Network 2x 1GB Ethernet NICs

生产实例

Configuration Criteria Minimum Recommended
Dell PE R510 Processor 2x 64-bit quad-core Xeon CPUs
RAM 16 GB
Volume Storage 8x 2TB drives. 1 OS, 7 Storage
Client Network 2x 1GB Ethernet NICs
OSD Network 2x 1GB Ethernet NICs
Mgmt. Network 2x 1GB Ethernet NICs
Dell PE R515 Processor 1x hex-core Opteron CPU
RAM 16 GB
Volume Storage 12x 3TB drives. Storage
OS Storage 1x 500GB drive. Operating System.
Client Network 2x 1GB Ethernet NICs
OSD Network 2x 1GB Ethernet NICs
Mgmt. Network 2x 1GB Ethernet NICs

当然如果你想更加细致的开发ceph,建议进行手动部署

A. Manual Deploymeny手动部署💪

1. 部署ceph-mon

安装完成之后在/etc/ceph目录下新建文件ceph.conf,内容大致如下,根据实际情况进行修改即可:

[global]
fsid = {cluster-id}
mon initial members = {hostname}[, {hostname}]
mon host = {ip-address}[, {ip-address}]
public network = {network}[, {network}]
cluster network = {network}[, {network}]
auth cluster required = cephx
auth service required = cephx
auth client required = cephx
osd journal size = {n}
osd pool default size = {n}  # Write an object n times.
osd pool default min size = {n} # Allow writing n copies in a degraded state.
osd pool default pg num = {n}
osd pool default pgp num = {n}
osd crush chooseleaf type = {n}

为监控节点创建密钥:

ceph-authtool --create-keyring /etc/ceph/ceph.mon.keyring --gen-key -n mon. --cap mon 'allow *'

创建client.admin用户并创建密钥:

ceph-authtool --create-keyring /etc/ceph/ceph.client.admin.keyring --gen-key -n client.admin --cap mon 'allow *' --cap osd 'allow *' --cap mds 'allow *' --cap mgr 'allow *'

创建client.bootstrap-osd用户并创建密钥:

ceph-authtool --create-keyring /var/lib/ceph/bootstrap-osd/ceph.keyring --gen-key -n client.bootstrap-osd --cap mon 'profile bootstrap-osd'

将刚才生成的两个密钥加入ceph.mon.keyring中:

ceph-authtool /etc/ceph/ceph.mon.keyring --import-keyring /etc/ceph/ceph.client.admin.keyring
ceph-authtool /etc/ceph/ceph.mon.keyring --import-keyring /var/lib/ceph/bootstrap-osd/ceph.keyring

此时ceph.mon.keyring中应有如下密钥:

[mon.]
	key = AQBWAa1f8zAHJBAAf0cyxMAZjsZeL7+x+czsLw==
	caps mon = "allow *"
[client.admin]
	key = AQDPAa1fxm0VMRAAXMJ+QU7sA9knr5ZWsluLxg==
	caps mds = "allow *"
	caps mgr = "allow *"
	caps mon = "allow *"
	caps osd = "allow *"
[client.bootstrap-osd]
	key = AQAWAq1fATC1ChAAb2wMiO+k/hwlMEmddDLAcg==
	caps mgr = "allow r"
	caps mon = "profile bootstrap-osd"

生成监控映射:

monmaptool --create --add {hostname} {ip-address} --fsid {uuid} /etc/ceph/monmap

创建默认的数据目录,其中目录名是{cluster-name}-{hostname}格式:

sudo mkdir /var/lib/ceph/mon/{cluster-name}-{hostname}

创建守护进程:

sudo ceph-mon [--cluster {cluster-name}] --mkfs -i {hostname} --monmap /etc/ceph/monmap --keyring /etc/ceph/ceph.mon.keyring

启动mon:

ceph-mon -i {hostname} -c /etc/ceph/ceph.conf --cluster ceph

这儿不能根据官方推荐的systemctl。

之后我们用

ceph -s

查看集群

这里笔者遇到问题:

[errno 2] RADOS object not found (error connecting to the cluster)

提示RADOS对象没有找到,但是我还没有到那一步呢!

原来是没有加sudo

sudo ceph -s
cluster:
  id:     250a1431-6cf3-4d0b-a964-361cd8d10dad
  health: HEALTH_WARN
          1 monitors have not enabled msgr2
 
services:
  mon: 1 daemons, quorum ceph-master (age 25m)
  mgr: no daemons active
  osd: 0 osds: 0 up, 0 in
 
data:
  pools:   0 pools, 0 pgs
  objects: 0 objects, 0 B
  usage:   0 B used, 0 B / 0 B avail
  pgs:

这是最基本的集群,所以只有一个monitor,马上我们就进行必要的扩展!

这儿有一个 HEALTH_WARN大家应该注意到了,这是因为 msgr 没有enable。

sudo ceph health detail #详细查看健康状况

2. 部署ceph-mgr

前面我们说每一个mon节点最好加一个mgr守护进程。名字叫open-stack

新建用户

创建用户 openstack 用于 MGR 监控

ceph auth get-or-create mgr.openstack mon 'allow *' osd 'allow *' mds 'allow *' [mgr.openstack] key = AQBqhxNaKcVpLhAA/P1GVlu3yRugvXkLfgauLA==

修改用户

假如用户已经存在, 用过下面方法进行权限修改

ceph auth caps mgr.openstack mon 'allow *' osd 'allow *' mds 'allow *'
[mgr.openstack]
        key = AQBqhxNaKcVpLhAA/P1GVlu3yRugvXkLfgauLA==

删除用户

提示一下删除用户方法

ceph auth del mgr.openstack

导出密钥

需要吧之前创建的用户密码存放至对应位置

mkdir /var/lib/ceph/mgr/ceph-openstack
ceph auth get mgr.openstack -o /var/lib/ceph/mgr/ceph-openstack/keyring
exported keyring for mgr.openstack

启动 mgr

ceph-mgr -i openstack

然后部署完成之后状态如下:

3.部署ceph-osd

修改/etc/ceph/ceph.conf

[osd]
run_dir = /data0/$name 
osd data = /data0/$name
osd journal = /data0/$name/journal
osd max object name len = 256
osd max object namespace len = 64

笔者这里未专门分配磁盘,/data0/$name写的是/var/lib/ceph/osd/ceph-0,为了确保体验,建议专门为osd和journal分区,最好是xfs系统。

官方给了short-form和long form两种方式,我们选择long form。我们先切换到root权限:

因为下面是脚本模式,$\$var$相当于环境变量。注意,bash的等号两端不能有空格!

sudo bash # 运行运行bash脚本
UUID=$(uuidgen) #和集群ID一样,OSD也要生成唯一ID 
OSD_SECRET=$(ceph-authtool --gen-print-key) #生成密匙
sudo cp /var/lib/ceph/bootstrap-osd/ceph.keyring /etc/ceph/
ID=$(echo "{\"cephx_secret\": \"$OSD_SECRET\"}" | \
   ceph osd new $UUID -i - \
   -n client.bootstrap-osd -k /var/lib/ceph/bootstrap-osd/ceph.keyring) #生成OSD-ID,从0开始
   
 mkdir /var/lib/ceph/osd/ceph-$ID

sudo su , sudo su-, sudo bash 均可进入root,区别是 sudo bash更全面,可以运行脚本,开头的命令头是绿字,sudo su- 允许一定场合不用输入密码,而sudo su是进入一般的root模式。

挂载osd的路径应该与运行操作系统的路径分开。并建议采用xfs文件系统,而不是brtfs或者ext4.

我们建议额外分配一定空间专门用作osd存储,以及日志存储,并且将其挂载到/var/lib/ceph/osd/ceph-{osd_num}

sudo mkfs.xfs /dev/{DEV}
sudo mount /dev/{DEV} /var/lib/ceph/osd/ceph-$ID

如果你像笔者一样粗心,忘了将osd存储和os分开,那么只能进行如下操作

sudo mount /dev/sda1 /var/lib/ceph/osd/ceph-0
ceph-authtool --create-keyring /var/lib/ceph/osd/ceph-$ID/keyring \
     --name osd.$ID --add-key $OSD_SECRET 
ceph-osd -i $ID --mkfs --osd-uuid $UUID #初始化OSD初始目录
chown -R ceph:ceph /var/lib/ceph/osd/ceph-$ID #目录拥有者,谨慎执行,否则sudo容易挂

启动osd

systemctl enable ceph-osd@$ID
systemctl start ceph-osd@$ID

​ 检查osd是否启动 ceph -s

cluster:
  id:     250a1431-6cf3-4d0b-a964-361cd8d10dad
  health: HEALTH_WARN
          no active mgr
          1 monitors have not enabled msgr2
 
services:
  mon: 1 daemons, quorum ceph-master (age 72m)
  mgr: no daemons active
  osd: 1 osds: 0 up, 0 in
 
data:
  pools:   0 pools, 0 pgs
  objects: 0 objects, 0 B
  usage:   0 B used, 0 B / 0 B avail
  pgs:

这就说明我们搭建了一个osd。


B. Build &Make:编译源码

您到站了!

版本14.2.12:Nautilus

版本15.2.5:Octopus √ (最新版)

参考:

Nautilus版本部署

Octopus版本部署

硬件配置

  • Ubuntu18.04 LTS(Bionic Beaver)

装完虚拟机,你应该1. 设置共享文件夹 2. 改变镜像为清华源并update 3. 下载中文输入法vim,chrome等 4. 快照保存 【由于从官网和github下载ceph源码和tarball很慢,我放在我的网盘上】

如果你,发现硬盘分配小了,想扩容,又不想重新装系统,看这里。以及磁盘清理技巧

  • 运存16g+硬盘80g 四核(根据实际情况)

(官网要求最少60g空间:A debug build of Ceph may take around 40 gigabytes. If you want to build Ceph in a virtual machine (VM) please make sure total disk space on the VM is at least 60 gigabytes.)

(初始4g+20g出现硬盘不足问题,一怒之下。。)

安装步骤:

下载源码有两种方式:

  1. GitHub
git clone --recursive git://github.com/ceph/ceph #recursive是保证下载所有子模块,大小应该有100多M
  1. tarball

【Github下载太慢?baidu网盘】:链接:https://pan.baidu.com/s/1siz1Bag4Y4XduMLaqc21TQ
提取码:xahe

如果是虚拟机的话:需要支持共享文件夹。

tar -zxvf {文件名} #解压
cd {文件名}
git submodule update --init --recursive #检查有没有模块缺失,试了一下没啥卵用
sudo ./install-deps.sh #安装所有依赖,需要大量时间,建议网好的时候进行
sudo ./do_cmake.sh -DCMAKE_BUILD_TYPE=RelWithDebInfo -DWITH_SEASTAR=ON -DWITH_MGR_DASHBOARD_FRONTEND=OFF -DWITH_PYTHON2=OFF -DWITH_PYTHON3=ON -DMGR_PYTHON_VERSION=3 #这一步 如果这部报错就试试 sudo ./run-make-check.sh 只要最后build文件夹有makefile就可以了,我们不需要调试信息,需要seastar,不需要前端,采用python3
cd build
sudo make -j4 vstart# 保证能运行test cluster就行,这里-j4是线程数,根据实际情况设定
sudo make -j4 all #编译所有组件,需要很多空间,根据需要进行
sudo make install #别忘了进行安装

缺啥补啥 (lib+XX+-dev格式)

比如笔者装了以下库

sudo apt install libhwloc-dev
sudo apt install libsctp-dev
sudo apt install libyaml-cpp-dev
sudo apt install ragel

编译可能要5-8小时。建议开个top窗口,看看cc1plus这个进程在不在,如果不在,而且内存没怎么占用,说明程序死了。ctrl+c终止再重新编译。


按照官方的测试cluster只用编译到vstart就行了

sudo make -j4 vstart

如果你遇到问题,请对症下药!

P1:未与github远程库建立联系

CMake Error at src/CMakeFiles/git-data/grabRef.cmake:48 (file):
  file failed to open for reading (No such file or directory):

    /home/ceph/Sharing Hub/ceph-master/src/CMakeFiles/git-data/head-ref
Call Stack (most recent call first):
  cmake/modules/GetGitRevisionDescription.cmake:75 (include)
  src/CMakeLists.txt:216 (get_git_head_revision)


CMake Error at src/CMakeFiles/git-data/grabRef.cmake:48 (file):
  file failed to open for reading (No such file or directory):

    /home/ceph/Sharing Hub/ceph-master/src/CMakeFiles/git-data/head-ref
Call Stack (most recent call first):
  cmake/modules/GetGitRevisionDescription.cmake:75 (include)
  cmake/modules/GetGitRevisionDescription.cmake:85 (get_git_head_revision)
  src/CMakeLists.txt:217 (git_describe)


CMake Error at src/CMakeLists.txt:221 (if):
  if given arguments:

    "STREQUAL" "GITDIR-NOTFOUND"

  Unknown arguments specified


-- Configuring incomplete, errors occurred!
See also "/home/ceph/Sharing Hub/ceph-master/CMakeFiles/CMakeOutput.log".
See also "/home/ceph/Sharing Hub/ceph-master/CMakeFiles/CMakeError.log".

注意:千万不要运行make_deb.sh否则所有文件都会被删除

原因:未与远程库建立联系:

解决:在主目录下依次执行

git init
git remote add origin https://github.com/ceph/ceph.git
git add .
git commit -m "123"

P2: Python和Ceph使用了不同的OpenSSL库

CMake Error at src/pybind/CMakeLists.txt:67 (message):
  Python and Ceph link to different OpenSSL versions: 1.1.1

   vs 1.0.2n

字面意思。Python和Ceph使用了不同的OpenSSL库。

参考:https://github.com/ceph/ceph/pull/22659,https://tracker.ceph.com/issues/36425

问题:默认pyth2链接到openssl1.0.2n(早期版本)

现在的ceph是通过python3编译。python3直接连接到openssl1.1.1,所以我们通过以下参数强制用python3编译。

-DWITH_PYTHON2=OFF -DWITH_PYTHON3=ON -DMGR_PYTHON_VERSION=3

只要开始编译就可以停下来了,因为这是单线程很慢,但是基本的makefile已经有了。

sudo make -j4

这里-j4表示使用4线程编译,会比单线程快很多。

技巧:build过程随时查看Makefile,检查编译进度。如果某个target有问题,我们只需要单独build这个target即可,比如

sudo make -j4 {挂掉的target,在makefile最后可以找到}

p3:内存不足

c++: fatal error: Killed signal terminated program cc1plus

这是因为内存不够了。这里有个方法:

sudo sh -c 'echo 1 > /proc/sys/vm/drop_caches'
sudo sh -c 'echo 2 > /proc/sys/vm/drop_caches'
sudo sh -c 'echo 3 > /proc/sys/vm/drop_caches'

利用上述命令清理缓存区的内存。

p4:npm问题,不build MGR_DASHBOARD_FRONTEND就没有问题

Environment variables have been set
sh: 1: ng: not found
npm ERR! file sh
npm ERR! code ELIFECYCLE
npm ERR! errno ENOENT
npm ERR! syscall spawn
npm ERR! ceph-dashboard@0.0.0 build: `npm run env_build && ng build "--progress=false"`
npm ERR! spawn ENOENT
npm ERR! 
npm ERR! Failed at the ceph-dashboard@0.0.0 build script.
npm ERR! This is probably not a problem with npm. There is likely additional logging output above.

npm ERR! A complete log of this run can be found in:
npm ERR!     /home/ceph/.npm/_logs/2020-10-24T05_33_57_314Z-debug.log
src/pybind/mgr/dashboard/CMakeFiles/mgr-dashboard-frontend-build.dir/build.make:3072: recipe for target '../src/pybind/mgr/dashboard/frontend/dist' failed
make[2]: *** [../src/pybind/mgr/dashboard/frontend/dist] Error 1
CMakeFiles/Makefile2:4897: recipe for target 'src/pybind/mgr/dashboard/CMakeFiles/mgr-dashboard-frontend-build.dir/all' failed
make[1]: *** [src/pybind/mgr/dashboard/CMakeFiles/mgr-dashboard-frontend-build.dir/all] Error 2
make[1]: *** Waiting for unfinished jobs....

注意:built target xxx表示这个任务已经成功编译完了。

进行到50%提示没有找到ng这个命令,查了一下,是因为没有下npm包的原因,解决办法,如果遇到找不到依赖情况可以根据提示找缺失依赖,逐级寻找:

In case others come here with this issue as I have, here is how I solved it system-wide on MacOS. Hope this helps.

Verify node is installed:

$ node -v
v11.2.0

Verify npm is installed:

$ npm -v
6.4.1

Verify your npm global install file path is configured (known as prefix). Mine is under ~/.npm-packages:

$ npm config ls -l | grep prefix
prefix = "/Users/christiangroleau/.npm-packages"

If not, you can place it into your ~/.npmrc file:

echo prefix=~/.npm-packages >> ~/.npmrc

Verify that your prefix path is listed in your system PATH:

$ echo $PATH
/Users/christiangroleau/.npm-packages/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin

If not, invoke the following:

export PATH="$HOME/.npm-packages/bin:$PATH"

Finally, you can reinstall angular-cli (in my case I needed to install it globally):

$ npm install -g @angular/cli

Verify installation:

$ ng -v
Mg++ version:
	Mg++ 1.5beta1 (formerly MicroGnuEmacs Adv.)

p5: npm被锁

Environment variables have been set
panic: aborting due to terminal initialize failure
Aborted (core dumped)
npm ERR! code ELIFECYCLE
npm ERR! errno 134
npm ERR! ceph-dashboard@0.0.0 build: `npm run env_build && ng build "--progress=false"`
npm ERR! Exit status 134
npm ERR! 
npm ERR! Failed at the ceph-dashboard@0.0.0 build script.
npm ERR! This is probably not a problem with npm. There is likely additional logging output above.

npm ERR! A complete log of this run can be found in:
npm ERR!     /home/ceph/.npm/_logs/2020-10-24T12_17_18_469Z-debug.log
src/pybind/mgr/dashboard/CMakeFiles/mgr-dashboard-frontend-build.dir/build.make:3072: recipe for target '../src/pybind/mgr/dashboard/frontend/dist' failed
make[2]: *** [../src/pybind/mgr/dashboard/frontend/dist] Error 134
CMakeFiles/Makefile2:4897: recipe for target 'src/pybind/mgr/dashboard/CMakeFiles/mgr-dashboard-frontend-build.dir/all' failed
make[1]: *** [src/pybind/mgr/dashboard/CMakeFiles/mgr-dashboard-frontend-build.dir/all] Error 2
make[1]: *** Waiting for unfinished jobs....
[ 40%] Built target os
[ 46%] Built target rbd_internal
[ 51%] Built target rgw_common
Makefile:140: recipe for target 'all' failed
make: *** [all] Error 2

这个问题很恶心,花了我很久时间。

首先下载npm

$sudo apt install npm

然后,找到/ceph-14.2.4/build/src/pybind/mgr/dashboard/node-env/lib下的node-modules

  • sudo npm cache clean --force
  • delete node_modules folder, use rm -r
  • delete package-lock.json file
  • sudo npm install

注意注意注意!,慎用rm -rf,后果自负!

p6: git文件没版本号

/home/ceph/ceph-15.2.5/build/src/include/ceph_ver.h:4:26: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘/’ token
    4 | #define CEPH_GIT_VER refs/heads/master
      |                          ^
/home/ceph/ceph-15.2.5/src/ceph_ver.c:6:34: note: in expansion of macro ‘CONCAT_VER_SYMBOL’
    6 | #define DEFINE_VER_SYMBOL(x) int CONCAT_VER_SYMBOL(x)
      |                                  ^~~~~~~~~~~~~~~~~
/home/ceph/ceph-15.2.5/src/ceph_ver.c:8:1: note: in expansion of macro ‘DEFINE_VER_SYMBOL’
    8 | DEFINE_VER_SYMBOL(CEPH_GIT_VER);
      | ^~~~~~~~~~~~~~~~~
/home/ceph/ceph-15.2.5/src/ceph_ver.c:8:19: note: in expansion of macro ‘CEPH_GIT_VER’
    8 | DEFINE_VER_SYMBOL(CEPH_GIT_VER);
      |                   ^~~~~~~~~~~~
src/CMakeFiles/common-objs.dir/build.make:63: recipe for target 'src/CMakeFiles/common-objs.dir/ceph_ver.c.o' failed
make[3]: *** [src/CMakeFiles/common-objs.dir/ceph_ver.c.o] Error 1
CMakeFiles/Makefile2:727: recipe for target 'src/CMakeFiles/common-objs.dir/all' failed
make[2]: *** [src/CMakeFiles/common-objs.dir/all] Error 2
make[2]: *** Waiting for unfinished jobs....

找到/home/ceph/ceph-15.2.5/build/src/include/ceph_ver.h文件

#define CEPH_GIT_VER refs/heads/master

改为

#define CEPH_GIT_VER 150205

这是不得已之举,必须改成整数版本号,可以解决就将就一下。

p7: undefined reference to `HMAC_CTX_new’

running build
running build_ext
[100%] Built target cython_rados
../lib/libcommon.a(Crypto.cc.o): In function `ceph::crypto::ssl::HMAC::HMAC(evp_md_st const*, unsigned char const*, unsigned long)':
/home/ceph/ceph-14.2.4/src/common/ceph_crypto.h:284: undefined reference to `HMAC_CTX_new'
../lib/libcommon.a(Crypto.cc.o): In function `ceph::crypto::ssl::HMAC::~HMAC()':
/home/ceph/ceph-14.2.4/src/common/ceph_crypto.h:291: undefined reference to `HMAC_CTX_free'
../lib/libcommon.a(ceph_crypto.cc.o): In function `ceph::crypto::ssl::OpenSSLDigest::OpenSSLDigest(evp_md_st const*)':
/home/ceph/ceph-14.2.4/src/common/ceph_crypto.cc:94: undefined reference to `EVP_MD_CTX_new'
../lib/libcommon.a(ceph_crypto.cc.o): In function `ceph::crypto::ssl::OpenSSLDigest::~OpenSSLDigest()':
/home/ceph/ceph-14.2.4/src/common/ceph_crypto.cc:100: undefined reference to `EVP_MD_CTX_free'
collect2: error: ld returned 1 exit status
src/CMakeFiles/ceph-osd.dir/build.make:145: recipe for target 'bin/ceph-osd' failed
make[3]: *** [bin/ceph-osd] Error 1
CMakeFiles/Makefile2:1256: recipe for target 'src/CMakeFiles/ceph-osd.dir/all' failed
make[2]: *** [src/CMakeFiles/ceph-osd.dir/all] Error 2
CMakeFiles/Makefile2:804: recipe for target 'src/CMakeFiles/vstart-base.dir/rule' failed
make[1]: *** [src/CMakeFiles/vstart-base.dir/rule] Error 2
Makefile:318: recipe for target 'vstart-base' failed
make: *** [vstart-base] Error 2

解决方法

sudo apt-get install libssl-dev

p8: 缺失curl库

/home/ceph/ceph-14.2.4/src/rgw/rgw_http_client_curl.cc:7:10: fatal error: curl/curl.h: No such file or directory
    7 | #include <curl/curl.h>
      |          ^~~~~~~~~~~~~
compilation terminated.
sudo apt install libcurl4-gnutls

p9: 缺失yaml库

Best match: PyYAML 5.3.1
Processing PyYAML-5.3.1.tar.gz
Writing /tmp/easy_install-_fQ46U/PyYAML-5.3.1/setup.cfg
Running PyYAML-5.3.1/setup.py -q bdist_egg --dist-dir /tmp/easy_install-_fQ46U/PyYAML-5.3.1/egg-dist-tmp-ZSDHMj
In file included from ext/_yaml.c:596:
ext/_yaml.h:2:10: fatal error: yaml.h: No such file or directory
    2 | #include <yaml.h>
      |          ^~~~~~~~
sudo apt-get install libyaml-cpp-dev

p10. 缺失sdt库

sys/sdt.h: No such file or directory   
111 | #include <sys/sdt.h>
sudo apt install systemtap-sdt-dev

p11:undefined reference to symbol ‘HMAC_CTX_new@@OPENSSL_1_1_0’,用python2编译会出现这个问题

/usr/bin/ld: warning: libcrypto.so.1.1, needed by /usr/lib/x86_64-linux-gnu/librabbitmq.so, may conflict with libcrypto.so.1.0.0
/usr/bin/ld: ../../lib/librgw_a.a(rgw_common.cc.o): undefined reference to symbol 'HMAC_CTX_new@@OPENSSL_1_1_0'
//usr/lib/x86_64-linux-gnu/libcrypto.so.1.1: error adding symbols: DSO missing from command line
collect2: error: ld returned 1 exit status

OPENSSL有两个版本的库,1.1和1.0.0,很显然我系统安装的是1.1.1 导致冲突了,

Makefile 选项 CFLAGS 、LDFLAGS 、LIBS
CFLAGS 表示用于C编译器的选项
CXXFLAGS 表示用于C++编译器的选项
这两个变量实际上涵盖了编译和汇编的两个步骤

CFLAGS:指定头文件(.h)的路径,如:CFLAGS=-I/usr/include -I/path/include 。

相同地,安装一个包时会在安装路径下建立一个include文件夹,当安装过程中出现故障时,试着把曾经安装的包的include文件夹增加到该变量中来。

LDFLAGS:gcc 等编译器会用到的一些优化參数,也能够在里面指定库文件的位置。

使用方法:LDFLAGS=-L/usr/lib -L/path/to/your/lib。每安装一个包都差点儿一定的会在安装文件夹里建立一个lib文件夹。假设明明安装了某个包,而安装还有一个包时,它愣是说找不到,能够抒那个包的lib路径增加的LDFALGS中试一下。

LIBS:告诉链接器要链接哪些库文件。如LIBS = -lpthread -liconv

简单地说,LDFLAGS是告诉链接器从哪里寻找库文件,而LIBS是告诉链接器要链接哪些库文件。

有时候LDFLAGS指定-L尽管能让链接器找到库进行链接。可是运行时链接器却找不到这个库。假设要让软件运行时库文件的路径也得到扩展,那么我们须要增加这两个库给”-Wl,R”:

LDFLAGS = -L/var/xxx/lib -L/opt/mysql/lib -Wl,R/var/xxx/lib -Wl,R/opt/mysql/lib
假设在运行./configure曾经环境变量设置export LDFLAGS=”-L/var/xxx/lib -L/opt/mysql/lib -Wl,R/var/xxx/lib -Wl,R/opt/mysql/lib” ,注意环境变量设置等号两边不能够有空格,并且要加上引號(shell的使用方法)。那么运行configure以后。Makefile将会设置这个选项。链接时会有这个參数,编译出来的可运行程序的库文件搜索路径就得到扩展了。

什么是软链接,硬链接

linux .so .o .a文件区别

​ .o,是目标文件,相当于windows中的.obj文件

 .so 为共享库,是shared object,用于动态连接的,相当于windows下的dll

 .a为静态库,是好多个.o合在一起,用于静态连接

sudo ll {文件名} 查看所有链接

$sudo unlink libcrypto.so解链接, so表示

$sudo ln -s libcrypto.so.1.1 libcrypto.so 添加链接

如何查看openssl版本?

openssl version -a

ubuntu默认安装1.1.1,没事别卸载,否则很多功能会失效,比如chrome

p12. Make all 出现ELF section name out of range

/usr/bin/ld: warning: CMakeFiles/unittest_rbd_mirror.dir/test_mock_ImageReplayer.cc.o has a corrupt string table index - ignoring
/usr/bin/ld: error: CMakeFiles/unittest_rbd_mirror.dir/test_mock_ImageReplayer.cc.o: ELF section name out of range
collect2: error: ld returned 1 exit status
src/test/rbd_mirror/CMakeFiles/unittest_rbd_mirror.dir/build.make:951: recipe for target 'bin/unittest_rbd_mirror' failed
make[2]: *** [bin/unittest_rbd_mirror] Error 1
CMakeFiles/Makefile2:26032: recipe for target 'src/test/rbd_mirror/CMakeFiles/unittest_rbd_mirror.dir/all' failed
make[1]: *** [src/test/rbd_mirror/CMakeFiles/unittest_rbd_mirror.dir/all] Error 2

直接重新make就好了,玄学问题

P13:internal compiler error: Segmentation fault

/home/ceph-server/ceph-15.2.5/src/osd/ECBackend.cc: In member function ‘void ECBackend::filter_read_op(const OSDMapRef&, ECBackend::ReadOp&)’:
/home/ceph-server/ceph-15.2.5/src/osd/ECBackend.cc:1398:1: internal compiler error: Segmentation fault
 1398 | }
      | ^
Please submit a full bug report,
with preprocessed source if appropriate.

重新编译


C. Way to development…

好的在这里假设你编译源码成功了!

先不要庆祝

好戏才刚刚开始!

测试集群

../src/vstart.sh --debug --new -x --localhost --bluestore # 启动本地集群 采用bluestore对象存储
./bin/ceph -s #返回集群状态

注:./bin文件,前面只有一个点,你所有能运行的脚本都在这,大部分都无法直接修改!

笔者运行没有遇到问题,有一些问题可以在这儿找到答案。

如果没有问题,笔者得到的输出应该如下,你的也应该类似:

*** DEVELOPER MODE: setting PATH, PYTHONPATH and LD_LIBRARY_PATH ***
2020-10-31T09:50:54.832+0800 7f1160a3b700 -1 WARNING: all dangerous and experimental features are enabled.
2020-10-31T09:50:54.844+0800 7f1160a3b700 -1 WARNING: all dangerous and experimental features are enabled.
  cluster:
    id:     773a0719-3ed0-49fa-a168-88bd2ddc2d00
    health: HEALTH_OK
 
  services:
    mon: 3 daemons, quorum a,b,c (age 99s)
    mgr: x(active, since 91s)
    mds: a:1 {0=c=up:active} 2 up:standby
    osd: 3 osds: 3 up (since 66s), 3 in (since 66s)
 
  task status:
    scrub status:
        mds.c: idle
 
  data:
    pools:   3 pools, 65 pgs
    objects: 22 objects, 2.2 KiB
    usage:   6.0 GiB used, 297 GiB / 303 GiB avail
    pgs:     65 active+clean

image-20201031225553280

可以看到mds和osd和mon进程,说明ceph cluster已经运行起来了。

./bin/rados -p rbd bench 30 write
./bin/rbd create foo --size 1000

关闭一个cluster用:

../src/stop.sh

启动和停止单独的守护进程,sysvinit脚本可以这样用:

./bin/init-ceph restart osd.0
./bin/init-ceph stop

如果要build并且进行所有测试

需要全部build,这是极其耗费时间和磁盘的(保守估计要100G以上)。

sudo make -j8 
sudo ctest -j8

如果有错误,会在CLI打印出来:

95% tests passed, 9 tests failed out of 192

Total Test time (real) = 579.44 sec

The following tests FAILED:
	111 - readable.sh (Failed)
	177 - unittest_rgw_dmclock_scheduler (Failed)
	184 - unittest_rbd_mirror (Not Run)
	186 - unittest_seastar_denc (Not Run)
	187 - unittest_seastar_socket (Not Run)
	188 - unittest_seastar_messenger (Not Run)
	189 - unittest_seastar_thread_pool (Not Run)
	190 - unittest_seastar_perfcounters (Not Run)
	191 - unittest_seastar_lru (Not Run)
Errors while running CTest

如果想进行单个测试,在/bin文件夹运行对应文件,比如:

sudo ./bin/unittest_rbd_mirror

如果没有问题,应该是我这样的:

99% tests passed, 2 tests failed out of 192

Total Test time (real) = 488.16 sec

The following tests FAILED:
	111 - readable.sh (Failed)
	177 - unittest_rgw_dmclock_scheduler (Failed)
Errors while running CTest

上面报错,是因为它们是trivial的,dmclock的api甚至还没开发出来。emoji~


调试集群,添加日志

我们可以在配置文件针对特定模块生成调试日志。但这可能产生超过1GB的日志文件。调试会影响集群的性能。

所以必须保证你磁盘有足够的空间。

实时显示

如果你希望看到实时调试信息,你必须登录到一台主机上执行:

ceph daemon {daemon-name} config show | less

例如

ceph daemon osd.0 config show | less

为了激活调试输出,使用ceph tell:

ceph tell {daemon-type}.{daemon id or *} config set {name} {value}

daemon-type为mds,mon,osd之一。该命令通过监视器。如果您无法绑定到监视器,则仍然可以通过使用来登录要更改其配置的守护程序的主机,以进行更改。

例如

ceph tell osd.0 config set debug_osd 0/5

启动时调试

可以在global设置设定

[global]
        debug ms = 1/5

[mon]
        debug mon = 20
        debug paxos = 1/5
        debug auth = 2

[osd]
        debug osd = 1/5
        debug filestore = 1/5
        debug journal = 1
        debug monc = 5/20

[mds]
        debug mds = 1
        debug mds balancer = 1

加速日志选择

如果您的操作系统磁盘相对较满,则可以通过在处修改Ceph日志轮换文件来加速日志轮换/etc/logrotate.d/ceph。如果日志超过大小设置,请在旋转频率之后添加大小设置以加速日志旋转(通过cronjob)。例如,默认设置如下所示:

rotate 7
weekly
compress
sharedscripts

通过添加size设置进行修改。

rotate 7
weekly
size 500M
compress
sharedscripts

然后,为您的用户空间启动crontab编辑器。

crontab -e

最后,添加一个条目以检查etc/logrotate.d/ceph文件。

30 * * * * /usr/sbin/logrotate /etc/logrotate.d/ceph >/dev/null 2>&1

前面的示例etc/logrotate.d/ceph每30分钟检查一次文件。

Valgrind

调试可能还需要您跟踪内存和线程问题。您可以使用Valgrind运行单个守护程序,一种守护程序或整个集群。您仅应在开发或调试Ceph时使用Valgrind。Valgrind在计算上很昂贵,否则会降低您的系统速度。Valgrind消息已记录到stderr

子系统,日志和调试设置

每个子系统都有其输出日志和内存中日志的日志记录级别。通过为调试日志记录设置日志文件级别和内存级别,可以为每个子系统设置不同的值。Ceph的日志记录级别以1到20,1最为简洁,20最为冗余。

调试日志记录设置可以为日志级别和内存级别采用单个值,这会将它们设置为相同的值。例如,如果您指定,则Ceph会将其视为日志级别和内存级别。您也可以单独指定它们。第一个设置是日志级别,第二个设置是内存级别。您必须使用正斜杠(/)分隔它们。例如,如果要将子系统的调试日志记录级别设置为,将其内存级别设置为,则可以将其指定为。例如:debug ms = 1/5

debug {subsystem} = {log-level}/{memory-level}
#for example
debug mds balancer = 1/20
Subsystem Log Level Memory Level
default 0 5
lockdep 0 1
context 0 1
crush 1 1
mds 1 5
mds balancer 1 5
mds locker 1 5
mds log 1 5
mds log expire 1 5
mds migrator 1 5
buffer 0 1
timer 0 1
filer 0 1
striper 0 1
objecter 0 1
rados 0 5
rbd 0 5
rbd mirror 0 5
rbd replay 0 5
journaler 0 5
objectcacher 0 5
client 0 5
osd 1 5
optracker 0 5
objclass 0 5
filestore 1 3
journal 1 3
ms 0 5
mon 1 5
monc 0 10
paxos 1 5
tp 0 5
auth 1 5
crypto 1 5
finisher 1 1
reserver 1 1
heartbeatmap 1 5
perfcounter 1 5
rgw 1 5
rgw sync 1 5
civetweb 1 10
javaclient 1 5
asok 1 5
throttle 1 1
refs 0 0
compressor 1 5
bluestore 1 5
bluefs 1 5
bdev 1 3
kstore 1 5
rocksdb 4 5
leveldb 4 5
memdb 4 5
fuse 1 5
mgr 1 5
mgrc 1 5
dpdk 1 5
eventtrace 1 5

操作集群的三种方法

1.Systemd.(推荐)

Systemd 是 Linux 系统工具,用来启动守护进程,已成为大多数发行版的标准配置。包括启动,检查,列举systemd,以及停止。

sudo systemctl start ceph.target       # start all daemons

sudo systemctl status ceph-osd@12      # check status of osd.12

sudo systemctl status ceph\*.service ceph\*.target # list the Ceph systemd units on a node
sudo systemctl stop ceph\*.service ceph\*.target #stop all the daemons

如果要启动一个节点上所有特定类型的守护进程。执行下面一个即可:

sudo systemctl start ceph-osd.target
sudo systemctl start ceph-mon.target
sudo systemctl start ceph-mds.target

2.Upstart

启动守护进程

要在Ceph节点上启动特定的守护程序实例,请执行以下操作之一:

sudo start ceph-all
sudo start ceph-osd id={id}
sudo start ceph-mon id={hostname}
sudo start ceph-mds id={hostname}
sudo start ceph-osd-all
sudo start ceph-mon-all
sudo start ceph-mds-all

停止守护程序

要在Ceph节点上停止特定的守护程序实例,请执行以下操作之一:

sudo stop ceph-all
sudo stop ceph-osd id={id}
sudo stop ceph-mon id={hostname}
sudo stop ceph-mds id={hostname}
sudo stop ceph-osd-all
sudo stop ceph-mon-all
sudo stop ceph-mds-all

3.Sysvinit

每次启动重新启动停止Ceph守护程序(或整个集群)时,都必须至少指定一个选项和一个命令。您也可以指定守护程序类型或守护程序实例。

{commandline} [options] [commands] [daemons]

ceph选项包括:

选项 捷径 描述
--verbose -v 使用详细日志记录。
--valgrind N/A (仅限Dev和QA)使用Valgrind调试。
--allhosts -a ceph.conf. 否则的所有节点上执行,否则仅在上执行localhost
--restart N/A 如果核心转储,则自动重新启动守护程序。
--norestart N/A 如果守护程序发生核心转储,请不要重新启动它。
--conf -c 使用备用配置文件。

这些ceph命令包括:

命令 描述
start 启动守护程序。
stop 停止守护程序。
forcestop 强制守护程序停止。与…一样kill -9
killall 杀死所有特定类型的守护程序。
cleanlogs 清除日志目录。
cleanalllogs 清除日志目录中的所有内容

对于子系统操作,ceph服务可以通过为[daemons]选项添加特定的守护程序类型来定位特定的守护程序类型。守护程序类型包括:

  • mon
  • osd
  • mds

了解ceph的健康状况

Monitor

状态 定义 建议
MON_DOWN 当前有一个或多个监视守护程序已关闭。该群集需要大多数(超过1/2)的监视器才能正常运行。当一个或多个监视器关闭时,客户端可能很难与群集建立初始连接,因为它们可能需要尝试更多地址才能到达运行中的监视器。 通常,应该尽快重新启动关闭监视器的守护程序,以减少子监视器失败导致服务中断的风险。
MON_CLOCK_SKEW 运行ceph-mon监视器守护程序的主机上的时钟同步不够充分。如果群集检测到时钟偏差大于,则会发出此健康警报mon_clock_drift_allowed 最好使用诸如ntpd或的工具同步时钟来解决 chrony
MON_MSGR2_NOT_ENABLED ms_bind_msgr2选项已启用,但未将一个或多个监视器配置为绑定到群集monmap中的v2端口。这意味着特定于msgr2协议的功能(例如,加密)在某些或所有连接上不可用。 ceph mon enable-msgr2该命令将更改为旧的默认端口6789配置的任何监视器,以继续侦听6789上的v1连接,并继续侦听新的默认3300端口上的v2连接。
MON_DISK_LOW \MON_DISK_CRIT 一台或多台监视器的磁盘空间不足。如果存储监视器数据库的文件系统上的可用空间(通常/var/lib/ceph/mon为百分比)降低至以下百分比mon_data_avail_warn(默认值:30%), 则将触发此警报。 请通过诸如清理日志文件的方式来增加空间,或者进行扩容。
MON_DISK_BIG 如果监视器数据库的大小大于mon_data_size_warn(默认值:15 GiB),则会触发此警报 。

Manager

状态 定义 建议
MGR_DOWN 当前所有管理器守护程序都已关闭。 应尽快重新启动停机管理器守护程序,以确保可以监视群集。
MGR_MODULE_DEPENDENCY 已启用的管理器模块未能通过依赖关系检查。此运行状况检查应随附来自模块的有关该问题的解释性消息
MGR_MODULE_ERROR 管理器模块遇到意外错误。

OSD

状态 定义 解决
OSD_DOWN 标记了一个或多个OSD。ceph-osd守护程序可能已停止,或者对等OSD可能无法通过网络访问OSD。
OSD_ _DOWN
OSD_ORPHAN OSD在CRUSH映射层次结构中被引用,但不存在。 可以使用以下方法从CRUSH层次结构中删除OSD:ceph osd crush rm osd
OSD_OUT_OF_ORDER_FULL Nearfull,backfillfull,full和/或failsafe_full的利用率阈值并非升序
OSD_FULL 一个或多个OSD超出了整个阈值,并正在阻止群集为写入提供服务。
OSD_BACKFILLFULL
OSD_NEARFULL
OSDMAP_FLAGS 已设置一个或多个感兴趣的群集标志。这些标志包括:
OSD_FLAGS 一个或多个OSD或CRUSH {nodes,device classes}已设置了关注标记
POOL_FULL 一个或多个池已达到其配额,并且不再允许写入。

BlueStore

BLUEFS_SPILLOVER 已经为使用BlueStore后端的一个或多个OSD分配了 db分区(用于元数据的存储空间,通常在较快的设备上),但是该空间已满,因此元数据已“溢出”到正常的慢速设备上。
BLUEFS_AVAILABLE_SPACE
BLUEFS_LOW_SPACE
BLUESTORE_FRAGMENTATION
BLUESTORE_LEGACY_STATFS
BLUESTORE_NO_PER_POOL_OMAP 从Octopus版本开始,BlueStore按池跟踪omap空间利用率,并且一个或多个OSD具有在Octopus之前创建的卷。
BLUESTORE_DISK_SIZE_MISMATCH 使用BlueStore的一个或多个OSD在物理设备的大小和跟踪其大小的元数据之间存在内部不一致。将来可能导致OSD崩溃

OSDMAP_FLAGS

  • full-群集被标记为已满,无法处理写入
  • pauserdpausewr-暂停的读取或写入
  • noup -OSD不允许启动
  • nodown -OSD故障报告被忽略,因此监视器不会将OSD标记为故障
  • noin-以前标记屏上显示出来,不会标示后面的,当他们开始
  • noout-在配置的间隔后,不会自动将向下的OSD标记出来
  • nobackfillnorecovernorebalance-恢复或数据重新平衡已暂停
  • noscrubnodeep_scrub-禁用清理
  • notieragent-缓存分层活动已暂停

full之外,可以使用以下方式设置或清除这些标志:

ceph osd set <flag>
ceph osd unset <flag>

OSD_FLAGS

一个或多个OSD或CRUSH {nodes,device classes}已设置了关注标记。这些标志包括:

  • noup:这些OSD不允许启动
  • nodown:这些OSD的故障报告将被忽略
  • noin:如果以前在故障后自动将这些OSD标记出来,则它们在启动时将不会被标记
  • noout:如果这些OSD处于关闭状态,则在配置的间隔后它们不会自动被标记 出来

可以批量设置和清除这些标志:

ceph osd set-group <flags> <who>
ceph osd unset-group <flags> <who>

可以按以下方式检查池利用率:

ceph df

当前定义的满比率可以通过以下方式看到:

ceph osd dump | grep full_ratio

可以通过以下方式查看池配额和利用率:

ceph df detail

您可以使用以下方法提高池配额:

ceph osd pool set-quota <poolname> max_objects <num-objects>
ceph osd pool set-quota <poolname> max_bytes <num-bytes>

或删除一些现有数据以降低利用率。

要检查BlueFS有多少可用空间,请执行以下操作:

ceph daemon osd.123 bluestore bluefs available

要模拟分配单位不同时的可用空间,请执行以下操作:

ceph daemon osd.123 bluestore bluefs available <alloc-unit-size>

要检查BlueStore碎片,可以执行以下操作:

ceph daemon osd.123 bluestore allocator score block

如果需要详细的免费碎片报告,请执行以下操作:

ceph daemon osd.123 bluestore allocator dump block

如果处理未运行的OSD进程时可以使用ceph-bluestore-tool检查碎片。获取碎片分数:

ceph-bluestore-tool --path /var/lib/ceph/osd/ceph-123 --allocator block free-score

并转储详细的免费块:

ceph-bluestore-tool --path /var/lib/ceph/osd/ceph-123 --allocator block free-dump

通过停止每个OSD,运行修复操作并重新启动它,可以将旧的OSD更新为按池跟踪。例如,如果osd.123需要更新,则 :

systemctl stop ceph-osd@123
ceph-bluestore-tool repair --path /var/lib/ceph/osd/ceph-123
systemctl start ceph-osd@123

使用BlueStore的一个或多个OSD在物理设备的大小和跟踪其大小的元数据之间存在内部不一致。将来可能导致OSD崩溃。

相关的OSD应该销毁并重新配置。应当小心地一次执行一个OSD,并且这种方式不会使任何数据受到威胁。例如,如果osd$N出现错误,则:

ceph osd out osd.$N
while ! ceph osd safe-to-destroy osd.$N ; do sleep 1m ; done
ceph osd destroy osd.$N
ceph-volume lvm zap /path/to/device
ceph-volume lvm create --osd-id $N --data /path/to/device

可以使用以下方法检查设备的运行状况:

ceph device info <device-id>

设备预期寿命是由mgr或外部工具通过以下命令运行的预测模型设置的:

ceph device set-life-expectancy <device-id> <from> <to>

您可以手动更改存储的预期寿命,但这通常无法完成任何操作,因为最初设置的任何工具都可能会对其进行重新设置,并且更改存储的值不会影响硬件设备的实际运行状况。


手动配置

所有 Ceph 集群都需要至少一个监视器、且 OSD 数量不小于副本数。自举引导初始监视器是部署 Ceph 存储集群的第一步,监视器的部署也为整个集群奠定了重要框架,如存储池副本数、每个 OSD 拥有的归置组数量(PG)、心跳周期、是否需认证等,其中大多数选项都有默认值,但是建设生产集群时仍需要您熟知它们。

img


ceph monitor配置

  1. 登录到初始监视器节点:
ssh {hostname}

如:

ssh node1
  1. 确保保存 Ceph 配置文件的目录存在, Ceph 默认使用 /etc/ceph 。安装 ceph 软件时,安装器也会自动创建 /etc/ceph/ 目录。
ls /etc/ceph
  1. 创建 Ceph 配置文件, Ceph 默认使用 ceph.conf ,其中的 ceph 是集群名字。
sudo vim /etc/ceph/ceph.conf
  1. 给集群分配惟一 ID (即 fsid )。
uuidgen
  1. 把此 ID 写入 Ceph 配置文件。
fsid = {UUID}

例如:

fsid = a7f64266-0894-4f1e-a635-d0aeaca0e993
  1. 把初始监视器写入 Ceph 配置文件。
mon initial members = {hostname}[,{hostname}]

例如:

mon initial members = node1
  1. 把初始监视器的 IP 地址写入 Ceph 配置文件、并保存。
mon host = {ip-address}[,{ip-address}]

例如:

mon host = 192.168.0.1

注意: 你也可以写 IPv6 地址,但是必须设置 ms bind ipv6 = true 。详情见网络配置参考

  1. 为此集群创建密钥环、并生成监视器密钥。
ceph-authtool --create-keyring /tmp/ceph.mon.keyring --gen-key -n mon. --cap mon 'allow *'
  1. 生成管理员密钥环,生成 client.admin 用户并加入密钥环。
ceph-authtool --create-keyring /etc/ceph/ceph.client.admin.keyring --gen-key -n client.admin --set-uid=0 --cap mon 'allow *' --cap osd 'allow *' --cap mds 'allow'

10.把 client.admin 密钥加入 ceph.mon.keyring

ceph-authtool /tmp/ceph.mon.keyring --import-keyring /etc/ceph/ceph.client.admin.keyring
  1. 用规划好的主机名、对应 IP 地址、和 FSID 生成一个监视器图,并保存为 /tmp/monmap

    monmaptool --create --add {hostname} {ip-address} --fsid {uuid} /tmp/monmap
  2. 在监视器主机上分别创建数据目录。

详情见监视器配置参考——数据

sudo mkdir /var/lib/ceph/mon/{cluster-name}-{hostname}
  1. 用监视器图和密钥环组装守护进程所需的初始数据。
ceph-mon [--cluster {cluster-name}] --mkfs -i {hostname} --monmap /tmp/monmap --keyring /tmp/ceph.mon.keyring

例如:

ceph-mon --mkfs -i node1 --monmap /tmp/monmap --keyring /tmp/ceph.mon.keyring
  1. 建一个空文件 done ,表示监视器已创建、可以启动了:
sudo touch /var/lib/ceph/mon/ceph-node1/done

15.启动监视器。

在 Ubuntu 上用 Upstart :

sudo start ceph-mon id=node1 [cluster={cluster-name}]
  1. 要使此守护进程开机自启,需要创建两个空文件,像这样:
sudo touch /var/lib/ceph/mon/{cluster-name}-{hostname}/upstart

例如:

sudo touch /var/lib/ceph/mon/ceph-node1/upstart
  1. 验证下 Ceph 已经创建了默认存储池。
ceph osd lspools

你应该会看到这样的输出:

0 data,1 metadata,2 rbd,
  1. 确认下集群在运行。
ceph -s

你应该从输出里看到刚刚启动的监视器在正常运行,并且应该会看到一个健康错误:它表明归置组卡在了 stuck inactive 状态。输出大致如此:

cluster a7f64266-0894-4f1e-a635-d0aeaca0e993
  health HEALTH_ERR 192 pgs stuck inactive; 192 pgs stuck unclean; no osds
  monmap e1: 1 mons at {node1=192.168.0.1:6789/0}, election epoch 1, quorum 0 node1
  osdmap e1: 0 osds: 0 up, 0 in
  pgmap v2: 192 pgs, 3 pools, 0 bytes data, 0 objects
     0 kB used, 0 kB / 0 kB avail
     192 creating

更详细的介绍可以参考MONITOR


ceph OSD配置

Ceph 配置文件添加 OSD

你的初始监视器可以正常运行后就可以添加 OSD 了。要想让集群达到 active + clean 状态,必须安装足够多的 OSD 来处理对象副本(如 osd pool default size = 2 需要至少 2 个 OSD )。在完成监视器自举引导后,集群就有了默认的 CRUSH 图,但现在此图还是空的,里面没有任何 OSD 映射到 Ceph 节点。

精简型

Ceph 软件包提供了 ceph-disk 工具,用于准备硬盘:可以是分区或用于 Ceph 的目录。 ceph-disk 可通过递增索引来创建 OSD ID ;还能把 OSD 加入 CRUSH 图。 ceph-disk 的详细用法可参考 ceph-disk -h ,此工具把后面将提到的精简型里面的步骤都自动化了。为按照精简型创建前两个 OSD ,在 node2node3 上执行下列命令:

  1. 准备OSD。

    ssh {node-name}
    sudo ceph-disk prepare --cluster {cluster-name} --cluster-uuid {uuid} --fs-type {ext4|xfs|btrfs} {data-path} [{journal-path}]

    例如:

    ssh node1
    sudo ceph-disk prepare --cluster ceph --cluster-uuid a7f64266-0894-4f1e-a635-d0aeaca0e993 --fs-type ext4 /dev/hdd1
  2. 激活 OSD:

    sudo ceph-disk activate {data-path} [--activate-key {path}]

    例如:

    sudo ceph-disk activate /dev/hdd1

    注: 如果你的 Ceph 节点上没有 /var/lib/ceph/bootstrap-osd/{cluster}.keyring ,那么应该外加 --activate-key 参数。

细致型

要是不想借助任何辅助工具,可按下列步骤创建 OSD 、将之加入集群和 CRUSH 图。按下列详细步骤可在 node2node3 上增加前 2 个 OSD :

  1. 登录到OSD主机。

    ssh {node-name}
  2. 给 OSD 分配 UUID 。

    uuidgen
  3. 创建 OSD 。如果没有指定 UUID ,将会在 OSD 首次启动时分配一个。下列命令执行完成后将输出 OSD 号,在后续步骤里还会用到这个号。

    ceph osd create [{uuid} [{id}]]
  4. 在新 OSD 主机上创建默认目录。

    ssh {new-osd-host}
    sudo mkdir /var/lib/ceph/osd/{cluster-name}-{osd-number}
  5. 如果要把 OSD 装到非系统盘的独立硬盘上,先创建文件系统、然后挂载到刚创建的目录下:

    ssh {new-osd-host}
    sudo mkfs -t {fstype} /dev/{hdd}
    sudo mount -o user_xattr /dev/{hdd} /var/lib/ceph/osd/{cluster-name}-{osd-number}
  6. 初始化 OSD 数据目录:

    ssh {new-osd-host}
    sudo ceph-osd -i {osd-num} --mkfs --mkkey --osd-uuid [{uuid}]

    --mkkey 选项运行 ceph-osd 之前,此目录必须是空的;另外,如果集群名字不是默认值,还要给 ceph-osd 指定 --cluster 选项。

  7. 注册此 OSD 的密钥。路径内 ceph-{osd-num} 里的 ceph 其含义为 $cluster-$id ,如果你的集群名字不是 ceph ,请指定自己的集群名:

    sudo ceph auth add osd.{osd-num} osd 'allow *' mon 'allow profile osd' -i /var/lib/ceph/osd/{cluster-name}-{osd-num}/keyring
  8. 把此节点加入 CRUSH 图。

    ceph [--cluster {cluster-name}] osd crush add-bucket {hostname} host

    例如:

    ceph osd crush add-bucket node1 host
  9. 把此 Ceph 节点放入 default 根下。

    ceph osd crush move node1 root=default
  10. 把此 OSD 加入 CRUSH 图之后,它就能接收数据了。你也可以反编译 CRUSH 图、把此 OSD 加入设备列表、对应主机作为桶加入(如果它还不在 CRUSH 图里)、然后此设备作为主机的一个条目、分配权重、重新编译、注入集群。

    ceph [--cluster {cluster-name}] osd crush add {id-or-name} {weight} [{bucket-type}={bucket-name} ...]

    例如:

    ceph osd crush add osd.0 1.0 host=node1
  11. 把 OSD 加入 Ceph 后, OSD 已经在配置里了。但它还没开始运行,这时处于 downin 状态,要启动进程才能收数据。

    在 Ubuntu 系统上用 Upstart 启动:

    sudo start ceph-osd id={osd-num} [cluster={cluster-name}]

    例如:

    sudo start ceph-osd id=0
    sudo start ceph-osd id=1

    在 Debian/CentOS/RHEL 上用 sysvinit 启动:

    sudo /etc/init.d/ceph start osd.{osd-num} [--cluster {cluster-name}]

    例如:

    sudo /etc/init.d/ceph start osd.0
    sudo /etc/init.d/ceph start osd.1

    要让守护进程开机自启,必须创建一个空文件:

    sudo touch /var/lib/ceph/osd/{cluster-name}-{osd-num}/sysvinit

    例如:

    sudo touch /var/lib/ceph/osd/ceph-0/sysvinit
    sudo touch /var/lib/ceph/osd/ceph-1/sysvinit

    OSD 启动后,它应该处于 upin 状态。

总结

监视器和两个 OSD 开始正常运行后,你就可以通过下列命令观察归置组互联过程了:

ceph -w

执行下列命令查看 OSD树:

ceph osd tree

你应该会看到类似如下的输出:

# id    weight  type name       up/down reweight
-1      2       root default
-2      2               host node1
0       1                       osd.0   up      1
-3      1               host node2
1       1                       osd.1   up      1

要增加(或删除)额外监视器,参见增加/删除监视器。要增加(或删除)额外 OSD ,参见增加/删除 OSD 。可用于配置存储集群内的所有守护进程、或者某一类型的所有守护进程。要配置一系列守护进程,这些配置必须位于能收到配置的段落之下,比如:

[global]
描述: [global] 下的配置影响 Ceph 集群里的所有守护进程。
实例: auth supported = cephx
[osd]
描述: [osd] 下的配置影响存储集群里的所有 ceph-osd 进程,并且会覆盖 [global] 下的同一选项。
实例: osd journal size = 1000
[mon]
描述: [mon] 下的配置影响集群里的所有 ceph-mon 进程,并且会覆盖 [global] 下的同一选项。
实例: mon addr = 10.0.0.101:6789
[mds]
描述: [mds] 下的配置影响集群里的所有 ceph-mds 进程,并且会覆盖 [global] 下的同一选项。
实例: host = myserver01
[client]
描述: [client] 下的配置影响所有客户端(如挂载的 Ceph 文件系统、挂载的块设备等等)。
实例: log file = /var/log/ceph/radosgw.log

全局设置影响集群内所有守护进程的例程,所以 [global] 可用于设置适用所有守护进程的选项。但可以用这些覆盖 [global] 设置:

  1. [osd][mon][mds] 下更改某一类进程的配置。
  2. 更改特定进程的设置,如 [osd.1]

覆盖全局设置会影响所有子进程,明确剔除的例外。

典型的全局设置包括激活认证,例如:

[global]
#Enable authentication between hosts within the cluster.
#v 0.54 and earlier
auth supported = cephx

#v 0.55 and after
auth cluster required = cephx
auth service required = cephx
auth client required = cephx

你可以统一配置一类守护进程。配置写到 [osd][mon][mds] 下时,无须再指定某个特定例程,即可分别影响所有 OSD 、监视器、元数据进程。

典型的类范畴配置包括日志尺寸、 filestore 选项等,如:

[osd]
osd journal size = 1000

你也可以配置某个特定例程。一个例程由类型和及其例程 ID 确定, OSD 的例程 ID 只能是数字,但监视器和元数据服务器的 ID 可包含字母和数字。

[osd.1]
# settings affect osd.1 only.

[mon.a]
# settings affect mon.a only.

[mds.b]
# settings affect mds.b only.

如果你想配置某个 Ceph 网关客户端,可以用点( . )分隔的守护进程和例程来指定,例如:

[client.radosgw.instance-name]
# settings affect client.radosgw.instance-name only.

元变量

元变量大大简化了集群配置。 Ceph 会把配置的元变量展开为具体值;元变量功能很强大,可以用在配置文件的 [global][osd][mon][mds] 段里,类似于 Bash 的 shell 扩展。

Ceph 支持下列元变量:

$cluster
描述: 展开为存储集群名字,在同一套硬件上运行多个集群时有用。
实例: /etc/ceph/$cluster.keyring
默认值: ceph
$type
描述: 可展开为 mdsosdmon 中的一个,有赖于当前守护进程的类型。
实例: /var/lib/ceph/$type
$id
描述: 展开为守护进程标识符; osd.0 应为 0mds.aa
实例: /var/lib/ceph/$type/$cluster-$id
$host
描述: 展开为当前守护进程的主机名。
$name
描述: 展开为 $type.$id
实例: /var/run/ceph/$cluster-$name.asok

共有选项

硬件推荐段提供了一些配置 Ceph 存储集群的硬件指导。一个 Ceph 节点可以运行多个进程,例如一个节点有多个硬盘,可以为每个硬盘配置一个 ceph-osd 守护进程。理想情况下一台主机应该只运行一类进程,例如:一台主机运行着 ceph-osd 进程,另一台主机运行着 ceph-mds 进程, ceph-mon 进程又在另外一台主机上。

各节点都用 host 选项指定主机名字,监视器还需要用 addr 选项指定网络地址和端口(即域名或 IP 地址)。基本配置文件可以只指定最小配置。例如:

[global]
mon_initial_members = ceph1
mon_host = 10.0.0.1

host 选项是此节点的短名字,不是全资域名( FQDN ),也不是 IP 地址;执行 hostname -s 即可得到短名字。不要给初始监视器之外的例程设置 host ,除非你想手动部署;一定不能用于 chefceph-deploy ,这些工具会自动获取正确结果。

网络配置

img

  1. 性能: OSD 为客户端处理数据复制,复制多份时 OSD 间的网络负载势必会影响到客户端和 Ceph 集群的通讯,包括延时增加、产生性能问题;恢复和重均衡也会显著增加公共网延时。关于 Ceph 如何复制参见伸缩性和高可用性;关于心跳流量参见监视器与 OSD 的交互
  2. 安全: 大多数人都是良民,很少的一撮人喜欢折腾拒绝服务攻击( DoS )。当 OSD 间的流量失控时,归置组再也不能达到 active + clean 状态,这样用户就不能读写数据了。挫败此类攻击的一种好方法是维护一个完全独立的集群网,使之不能直连互联网;另外,请考虑用消息签名防止欺骗攻击。

防火墙

守护进程默认会绑定6800:7300 间的端口,你可以更改此范围。更改防火墙配置前先检查下 iptables 配置。

sudo iptables -L

一些 Linux 发行版的规则拒绝除 SSH 之外的所有网卡的所有入栈连接,例如:

REJECT all -- anywhere anywhere reject-with icmp-host-prohibited

你得先删掉公共网和集群网对应的这些规则,然后再增加安全保护规则。

监视器防火墙

监视器默认监听 6789 端口,而且监视器总是运行在公共网。按下例增加规则时,要把 {iface} 替换为公共网接口(如 eth0eth1 等等)、 {ip-address} 替换为公共网 IP 、 {netmask} 替换为公共网掩码。

sudo iptables -A INPUT -i {iface} -p tcp -s {ip-address}/{netmask} --dport 6789 -j ACCEPT

MDS 防火墙

元数据服务器会监听公共网 6800 以上的第一个可用端口。需要注意的是,这种行为是不确定的,所以如果你在同一主机上运行多个 OSD 或 MDS 、或者在很短的时间内重启了多个守护进程,它们会绑定更高的端口号;所以说你应该预先打开整个 6800-7300 端口区间。按下例增加规则时,要把 {iface} 替换为公共网接口(如 eth0eth1 等等)、 {ip-address} 替换为公共网 IP 、 {netmask} 替换为公共网掩码。

例如:

sudo iptables -A INPUT -i {iface} -m multiport -p tcp -s {ip-address}/{netmask} --dports 6800:7300 -j ACCEPT

OSD 防火墙

OSD 守护进程默认绑定 从 6800 起的第一个可用端口,需要注意的是,这种行为是不确定的,所以如果你在同一主机上运行多个 OSD 或 MDS 、或者在很短的时间内重启了多个守护进程,它们会绑定更高的端口号。一主机上的各个 OSD 最多会用到 4 个端口:

  1. 一个用于和客户端、监视器通讯;
  2. 一个用于发送数据到其他 OSD ;
  3. 两个用于各个网卡上的心跳;

img

当某个守护进程失败并重启时没释放端口,重启后的进程就会监听新端口。你应该打开整个 6800-7300 端口区间,以应对这种可能性。

如果你分开了公共网和集群网,必须分别为之设置防火墙,因为客户端会通过公共网连接、而其他 OSD 会通过集群网连接。按下例增加规则时,要把 {iface} 替换为网口(如 eth0eth1 等等)、 {ip-address} 替换为公共网或集群网 IP 、 {netmask} 替换为公共网或集群网掩码。例如:

sudo iptables -A INPUT -i {iface}  -m multiport -p tcp -s {ip-address}/{netmask} --dports 6800:7300 -j ACCEPT

如果你的元数据服务器和 OSD 在同一节点上,可以合并公共网配置。

CEPH 网络

Ceph 的网络配置要放到 [global] 段下。前述的 5 分钟快速入门提供了一个简陋的 Ceph 配置文件,它假设服务器和客户端都位于同一网段, Ceph 可以很好地适应这种情形。然而 Ceph 允许配置更精细的公共网,包括多 IP 和多掩码;也能用单独的集群网处理 OSD 心跳、对象复制、和恢复流量。不要混淆你配置的 IP 地址和客户端用来访问存储服务的公共网地址。典型的内网常常是 192.168.0.010.0.0.0

如果你给公共网或集群网配置了多个 IP 地址及子网掩码,这些子网必须能互通。另外要确保在防火墙上为各 IP 和子网开放了必要的端口。

Ceph 用 CIDR 法表示子网(IP地址/网络ID的位数),如 10.0.0.0/24

配置完几个网络后,可以重启集群或挨个重启守护进程。 Ceph 守护进程动态地绑定端口,所以更改网络配置后无需重启整个集群。

公共网

要配置一个公共网,把下列选项加到配置文件的 [global] 段下。

[global]
        ...
        public network = {public-network/netmask}

集群网

如果你声明了集群网, OSD 将把心跳、对象复制和恢复流量路由到集群网,与单个网络相比这会提升性能。要配置集群网,把下列选项加进配置文件的 [global] 段。

[global]
        ...
        cluster network = {cluster-network/netmask}

为安全起见,从公共网或互联网到集群网应该是不可达的。

CEPH 守护进程

有一个网络配置是所有守护进程都要配的:各个守护进程都必须指定 host , Ceph 也要求指定监视器 IP 地址及端口。

一些部署工具(如 ceph-deploy 、 Chef )会给你创建配置文件,如果它能胜任那就别设置这些值。

host 选项是主机的短名,不是全资域名 FQDN ,也不是 IP 地址。在命令行下输入 hostname -s 获取主机名。

[mon.a]

        host = {hostname}
        mon addr = {ip-address}:6789

[osd.0]
        host = {hostname}

并非一定要给守护进程设置 IP 地址。如果你有一个静态配置,且分离了公共网和集群网, Ceph 允许你在配置文件里指定主机的 IP 地址。要给守护进程设置静态 IP ,可把下列选项加到 ceph.conf

[osd.0]
        public addr = {host-public-ip-address}
        cluster addr = {host-cluster-ip-address}

单网卡OSD、双网络集群

一般来说,我们不建议用单网卡 OSD 主机部署两个网络。然而这事可以实现,把 public addr 选项配在 [osd.n] 段下即可强制 OSD 主机运行在公共网,其中 n 是其 OSD 号。另外,公共网和集群网必须互通,考虑到安全因素我们不建议这样做。

网络配置选项

网络配置选项不是必需的, Ceph 假设所有主机都运行于公共网,除非你特意配置了一个集群网。

公共网

公共网配置用于明确地为公共网定义 IP 地址和子网。你可以分配静态 IP 或用 public addr 覆盖 public network 选项。

public network

描述: 公共网(前端)的 IP 地址和掩码(如 192.168.0.0/24 ),置于 [global] 下。多个子网用逗号分隔。
类型: {ip-address}/{netmask} [, {ip-address}/{netmask}]
是否必需: No
默认值: N/A

public addr

描述: 用于公共网(前端)的 IP 地址。适用于各守护进程。
类型: IP 地址
是否必需: No
默认值: N/A

集群网

集群网配置用来声明一个集群网,并明确地定义其 IP 地址和子网。你可以配置静态 IP 或为某 OSD 守护进程配置 cluster addr 以覆盖 cluster network 选项。

cluster network

描述: 集群网(后端)的 IP 地址及掩码(如 10.0.0.0/24 ),置于 [global] 下。多个子网用逗号分隔。
类型: {ip-address}/{netmask} [, {ip-address}/{netmask}]
是否必需: No
默认值: N/A

cluster addr

描述: 集群网(后端) IP 地址。置于各守护进程下。
类型: Address
是否必需: No
默认值: N/A

绑定

绑定选项用于设置 OSD 和 MDS 默认使用的端口范围,默认范围是 6800:7300 。确保防火墙开放了对应端口范围。

你也可以让 Ceph 守护进程绑定到 IPv6 地址。

ms bind port min

描述: OSD 或 MDS 可绑定的最小端口号。
类型: 32-bit Integer
默认值: 6800
是否必需: No

ms bind port max

描述: OSD 或 MDS 可绑定的最大端口号。
类型: 32-bit Integer
默认值: 7300
是否必需: No.

ms bind ipv6

描述: 允许 Ceph 守护进程绑定 IPv6 地址。
类型: Boolean
默认值: false
是否必需: No

主机

Ceph 配置文件里至少要写一个监视器、且每个监视器下都要配置 mon addr 选项;每个监视器、元数据服务器和 OSD 下都要配 host 选项。

mon addr

描述: {hostname}:{port} 条目列表,用以让客户端连接 Ceph 监视器。如果未设置, Ceph 查找 [mon.*] 段。
类型: String
是否必需: No
默认值: N/A

host

描述: 主机名。此选项用于特定守护进程,如 [osd.0]
类型: String
是否必需: Yes, for daemon instances.
默认值: localhost

不要用 localhost 。在命令行下执行 hostname -s 获取主机名(到第一个点,不是全资域名),并用于配置文件。

TCP

Ceph 默认禁用 TCP 缓冲。

ms tcp nodelay

描述: Ceph 用 ms tcp nodelay 使系统尽快(不缓冲)发送每个请求。禁用 Nagle 算法可增加吞吐量,但会引进延时。如果你遇到大量小包,可以禁用 ms tcp nodelay 试试。
类型: Boolean
是否必需: No
默认值: true

ms tcp rcvbuf

描述: 网络套接字接收缓冲尺寸,默认禁用。
类型: 32-bit Integer
是否必需: No
默认值: 0

ms tcp read timeout

描述: 如果一客户端或守护进程发送请求到另一个 Ceph 守护进程,且没有断开不再使用的连接,在 ms tcp read timeout 指定的秒数之后它将被标记为空闲。
类型: Unsigned 64-bit Integer
是否必需: No
默认值: 900 15 minutes.

认证选项

cephx 协议已默认开启。加密认证要耗费一定计算资源,但通常很低。如果您的客户端和服务器网络环境相当安全,而且认证的负面效应更大,你可以关闭它,通常不推荐您这么做

使用ceph-deploy会自动创建认证信息:

auth_cluster_required = cephx
auth_service_required = cephx
auth_client_required = cephx

当执行ceph-deploy mon create-initial,ceph会引导初始监视器,返回一个ceph.client.admin.keyring文件。

当执行 ceph-deploy admin {node-name},你相当于把ceph.client.admin.keyring文件放在节点的/etc/ceph目录下。

启用 CEPHX

启用 cephx 后, Ceph 将在默认搜索路径(包括 /etc/ceph/ceph.$name.keyring )里查找密钥环。你可以在 Ceph 配置文件的 [global] 段里添加 keyring 选项来修改,但不推荐。

在禁用了 cephx 的集群上执行下面的步骤来启用它,如果你(或者部署工具)已经生成了密钥,你可以跳过相关步骤。

  1. 创建 client.admin 密钥,并为客户端保存此密钥的副本:

    ceph auth get-or-create client.admin mon 'allow *' mds 'allow *' osd 'allow *' -o /etc/ceph/ceph.client.admin.keyring

    警告: 此命令会覆盖任何存在的 /etc/ceph/client.admin.keyring 文件,如果部署工具已经完成此步骤,千万别再执行此命令。多加小心!

  2. 创建监视器集群所需的密钥环、并给它们生成密钥。

    ceph-authtool --create-keyring /tmp/ceph.mon.keyring --gen-key -n mon. --cap mon 'allow *'
  3. 把监视器密钥环复制到 ceph.mon.keyring 文件,再把此文件复制到各监视器的 mon data 目录下。比如要把它复制给名为 ceph 集群的 mon.a ,用此命令:

    cp /tmp/ceph.mon.keyring /var/lib/ceph/mon/ceph-a/keyring
  4. 为每个 OSD 生成密钥, {$id} 是 OSD 编号:

    ceph auth get-or-create osd.{$id} mon 'allow rwx' osd 'allow *' -o /var/lib/ceph/osd/ceph-{$id}/keyring
  5. 为每个 MDS 生成密钥, {$id} 是 MDS 的标识字母:

    ceph auth get-or-create mds.{$id} mon 'allow rwx' osd 'allow *' mds 'allow *' -o /var/lib/ceph/mds/ceph-{$id}/keyring
  6. 把以下配置加入 Ceph 配置文件的 [global] 段下以启用 cephx 认证:

    auth cluster required = cephx
    auth service required = cephx
    auth client required = cephx
  7. 启动或重启 Ceph 集群,详情见操纵集群

禁用 CEPHX

下述步骤描述了如何禁用 Cephx 。如果你的集群环境相对安全,你可以减免认证耗费的计算资源,然而我们不推荐。但是临时禁用认证会使安装、和/或排障更简单。

  1. 把下列配置加入 Ceph 配置文件的 [global] 段下即可禁用 cephx 认证:

    auth cluster required = none
    auth service required = none
    auth client required = none
  2. 启动或重启 Ceph 集群,具体参考操纵集群

密钥

如果你的集群启用了认证, ceph 管理命令和客户端得有密钥才能访问集群。

ceph 管理命令和客户端提供密钥的最常用方法就是把密钥环放到 /etc/ceph ,通过 ceph-deploy 部署的 Cuttlefish 及更高版本,其文件名通常是 ceph.client.admin.keyring (或 $cluster.client.admin.keyring )。如果你的密钥环位于 /etc/ceph 下,就不需要在 Ceph 配置文件里指定 keyring 选项了。

我们建议把集群的密钥环复制到你执行管理命令的节点,它包含 client.admin 密钥。

你可以用 ceph-deploy admin 命令做此事,详情见’部署管理主机’_,手动复制可执行此命令:

sudo scp {user}@{ceph-cluster-host}:/etc/ceph/ceph.client.admin.keyring /etc/ceph/ceph.client.admin.keyring

确保给客户端上的 ceph.keyring 设置合理的权限位(如 chmod 644

守护进程数据目录位置默认格式如下:

/var/lib/ceph/$type/$cluster-$id

MONITOR 配置

这儿

监视器们维护着集群运行图的“主副本”,就是说客户端连到一个监视器并获取当前运行图就能确定所有监视器、 OSD 和元数据服务器的位置。 Ceph 客户端读写 OSD 或元数据服务器前,必须先连到一个监视器,靠当前集群运行图的副本和 CRUSH 算法,客户端能计算出任何对象的位置,故此客户端有能力直接连到 OSD ,这对 Ceph 的高伸缩性、高性能来说非常重要。更多信息见伸缩性和高可用性

监视器的主要角色是维护集群运行图的主副本,它也提供认证日志记录服务。 Ceph 监视器们把监视器服务的所有更改写入一个单独的 Paxos 例程,然后 Paxos 以键/值方式存储所有变更以实现高度一致性。同步期间, Ceph 监视器能查询集群运行图的近期版本,它们通过操作键/值存储快照和迭代器(用 leveldb )来进行存储级同步。

img

集群运行图

集群运行图是多个图的组合,包括监视器图、 OSD 图、归置组图和元数据服务器图。集群运行图追踪几个重要事件:哪些进程在集群里( in );哪些进程在集群里( in )是 up 且在运行、或 down ;归置组状态是 activeinactiveclean 或其他状态;和其他反映当前集群状态的信息,像总存储容量、和使用量。

当集群状态有明显变更时,如一 OSD 挂了、一归置组降级了等等,集群运行图会被更新以反映集群当前状态。另外,监视器也维护着集群的主要状态历史。监视器图、 OSD 图、归置组图和元数据服务器图各自维护着它们的运行图版本。我们把各图的版本称为一个 epoch 。

运营集群时,跟踪这些状态是系统管理任务的重要部分。详情见监控集群监控 OSD 和归置组

监视器法定人数(Quorum)

简单的Ceph-deploy只会配置一台monitor,而这很容易造成单点故障。Ceph采用Paxos来保证集群运行一致性。这里的一致要求大多数监视器都在运行且够成法定人数(如 1 个、 3 之 2 在运行、 5 之 3 、 6 之 4 等等)。

一致性

你把监视器加进 Ceph 配置文件时,得注意一些架构问题, Ceph 发现集群内的其他监视器时对其有着严格的一致性要求。尽管如此, Ceph 客户端和其他 Ceph 守护进程用配置文件发现监视器,监视器却用监视器图( monmap )相互发现而非配置文件。

一个监视器发现集群内的其他监视器时总是参考 monmap 的本地副本,用 monmap 而非 Ceph 配置文件避免了可能损坏集群的错误(如 ceph.conf 中指定地址或端口的拼写错误)。正因为监视器把 monmap 用于发现、并共享于客户端和其他 Ceph 守护进程间, monmap可严格地保证监视器的一致性是可靠的

严格的一致性也适用于 monmap 的更新,因为关于监视器的任何更新、关于 monmap 的变更都是通过称为 Paxos) 的分布式一致性算法传递的。监视器们必须就 monmap 的每次更新达成一致,以确保法定人数里的每个监视器 monmap 版本相同,如增加、删除一个监视器。 monmap 的更新是增量的,所以监视器们都有最新的一致版本,以及一系列之前版本。历史版本的存在允许一个落后的监视器跟上集群当前状态。

初始化监视器

在大多数配置和部署案例中,部署 Ceph 的工具可以帮你生成一个监视器图来初始化监视器(如 ceph-deploy 等),一个监视器需要 若干个选项:

惟一标识符: fsid 是集群的惟一标识,它是 Ceph 作为文件系统时的文件系统标识符。现在, Ceph 还支持原生接口、块设备、和对象存储网关接口,所以 fsid 有点名不符实了。

集群名称: 每个 Ceph 集群都有自己的名字,它是个不含空格的字符串。默认名字是 ceph 、但你可以更改;尤其是运营着多个集群时,需要用名字来区分要操作哪一个。比如,当你以联盟架构运营多个集群时,集群名字(如 us-westus-east )将作为标识符出现在 CLI 界面上。注意:要在命令行下指定某个集群,可以指定以集群名为前缀的配置文件(如 ceph.confus-west.confus-east.conf 等);也可以参考 CLI 用法( ceph --cluster {cluster-name} )。

监视器名字: 同一集群内的各监视器例程都有惟一的名字,通常都用主机名作为监视器名字(我们建议每台主机只运行一个监视器、并且不要与 OSD 主机复用。短主机名可以用 hostname -s 获取。

监视器图: 自举引导初始监视器需要生成监视器图,为此,需要有 fsid 、集群名(或用默认)、至少一个主机名及其 IP 。

监视器密钥环: 监视器之间通过密钥通讯,所以你必须把监视器密钥加入密钥环,并在自举引导时提供。

管理密钥环: 要使用 ceph 这个命令行工具,你必须有 client.admin 用户,所以你要创建此用户及其密钥,并把他们加入密钥环。

关于初始化的具体信息见初始化监视器

[mon]
        mon host = hostname1,hostname2,hostname3
        mon addr = 10.0.0.10:6789,10.0.0.11:6789,10.0.0.12:6789

初始成员

我们建议在生产环境下最少部署 3 个监视器,以确保高可用性。运行多个监视器时,你可以指定为形成法定人数成员所需的初始监视器,这能减小集群上线时间。

[mon]
        mon initial members = a,b,c

Ceph 需要奇数个监视器来确定最初法定人数(如 3 )。

数据

Ceph 监视器有存储数据的默认路径,生产集群为实现更高性能可把监视器部署到非 OSD 节点的独立主机上。因为监视器会频繁 fsync() ,这可能影响 OSD 。

存储容量

Ceph 存储集群利用率接近最大容量时(即 mon osd full ratio ),作为防止数据丢失的安全措施,它会阻止你读写 OSD 。因此,让生产集群用满可不是好事,因为牺牲了高可用性。 full ratio 默认值是 .95 或容量的 95% 。对小型测试集群来说这是非常激进的设置。

监控集群时,要警惕和 nearfull 相关的警告。这意味着一些 OSD 的失败会导致临时服务中断,应该增加一些 OSD 来扩展存储容量。

在测试集群时,一个常见场景是:系统管理员从集群删除一个 OSD 、接着观察重均衡;然后继续删除其他 OSD ,直到集群达到占满率并锁死。我们建议,即使在测试集群里也要规划一点空闲容量用于保证高可用性。理想情况下,要做好这样的预案:一系列 OSD 失败后,短时间内不更换它们仍能恢复到 active + clean 状态。你也可以在 active + degraded 状态运行集群,但对正常使用来说并不好。找出你集群的两个数字:

  1. OSD 数量。
  2. 集群总容量

用集群里 OSD 总数除以集群总容量,就能得到 OSD 平均容量;如果按预计的 OSD 数乘以这个值所得的结果计算(偏小),实际应用时将出错;最后再用集群容量乘以占满率能得到最大运行容量,然后扣除预估的 OSD 失败率;用较高的失败率(如整机架的 OSD )重复前述过程看是否接近占满率。

[global]
		# 在OSDconsidered full之前的磁盘空间使用率
		mon osd full ratio = .80
	    # OSD 硬盘使用率达到多少就认为它 full 。
        mon osd full ratio = .80
        #	OSD 硬盘使用率达到多少就认为它 nearfull 。
        mon osd nearfull ratio = .70

如果一些 OSD 快满了,但其他的仍有足够空间,你可能配错 CRUSH 权重了。

心跳

Ceph 监视器要求各 OSD 向它报告、并接收 OSD 们的邻居状态报告,以此来掌握集群。 Ceph 提供了监视器与 OSD 交互的合理默认值,然而你可以按需修改,详情见监视器与 OSD 的交互

监视器存储同步

当你用多个监视器支撑一个生产集群时,各监视器都要检查邻居是否有集群运行图的最新版本(如,邻居监视器的图有一或多个 epoch 版本高于当前监视器的最高版 epoch ),过一段时间,集群里的某个监视器可能落后于其它监视器太多而不得不离开法定人数,然后同步到集群当前状态,并重回法定人数。为了同步,监视器可能承担三种中的一种角色:

  1. Leader: Leader 是实现最新 Paxos 版本的第一个监视器。
  2. Provider: Provider 有最新集群运行图的监视器,但不是第一个实现最新版。
  3. Requester: Requester 落后于 leader ,重回法定人数前,必须同步以获取关于集群的最新信息。

有了这些角色区分, leader就 可以给 provider 委派同步任务,这会避免同步请求压垮 leader 、影响性能。在下面的图示中, requester 已经知道它落后于其它监视器,然后向 leader 请求同步, leader 让它去和 provider 同步。


img

一旦同步完成, Ceph 需要修复整个集群,使归置组回到 active + clean 状态。

Parameters Descrip. Type Default
mon sync timeout Number of seconds the monitor will wait for the next update message from its sync provider before it gives up and bootstrap again. Double 60.0
mon sync max payload size The maximum size for a sync payload (in bytes). 32-bit Integer 1048576
paxos max join drift The maximum Paxos iterations before we must first sync the monitor data stores. When a monitor finds that its peer is too far ahead of it, it will first sync with data stores before moving on. Integer 10
paxos stash full interval How often (in commits) to stash a full copy of the PaxosService state. Current this setting only affects mds, mon, auth and mgr PaxosServices. Integer 25
paxos propose interval Gather updates for this time interval before proposing a map update. Double 1.0
paxos min The minimum number of paxos states to keep around Integer 500
paxos min wait The minimum amount of time to gather updates after a period of inactivity. Double 0.05
paxos trim min Number of extra proposals tolerated before trimming Integer 250
paxos trim max The maximum number of extra proposals to trim at a time Integer 500
paxos service trim min The minimum amount of versions to trigger a trim (0 disables it) Integer 250
paxos service trim max The maximum amount of versions to trim during a single proposal (0 disables it) Integer 500
mon mds force trim to Force monitor to trim mdsmaps to this point (0 disables it. dangerous, use with care) Integer 0
mon osd force trim to Force monitor to trim osdmaps to this point, even if there is PGs not clean at the specified epoch (0 disables it. dangerous, use with care) Integer 0
mon osd cache size The size of osdmaps cache, not to rely on underlying store’s cache Integer 500
mon election timeout On election proposer, maximum waiting time for all ACKs in seconds. Float 5.00
mon lease The length (in seconds) of the lease on the monitor’s versions. Float 5.00
mon lease renew interval factor mon lease * mon lease renew interval factor will be the interval for the Leader to renew the other monitor’s leases. The factor should be less than 1.0. Float 0.60
mon lease ack timeout factor The Leader will wait mon lease * mon lease ack timeout factor for the Providers to acknowledge the lease extension. Float 2.00
mon accept timeout factor The Leader will wait mon lease * mon accept timeout factor for the Requester(s) to accept a Paxos update. It is also used during the Paxos recovery phase for similar purposes. Float 2.00
mon min osdmap epochs Minimum number of OSD map epochs to keep at all times. 32-bit Integer 500
mon max log epochs Maximum number of Log epochs the monitor should keep. 32-bit Integer 500

时钟

Ceph 的守护进程会相互传递关键消息,这些消息必须在达到超时阀值前处理掉。如果 Ceph 监视器时钟不同步,就可能出现多种异常情况。例如:

  • 守护进程忽略了收到的消息(如时间戳过时了)
  • 消息未及时收到时,超时触发得太快或太晚。

详情见监视器存储同步Slurp

为了避免实际漂移建议安装NTP

Parameters Descrip. Type Default
mon tick interval A monitor’s tick interval in seconds. 32-bit Integer 5
mon clock drift allowed The clock drift in seconds allowed between monitors. Float 0.05
mon clock drift warn backoff Exponential backoff for clock drift warnings Float 5.00
mon timecheck interval The time check interval (clock drift check) in seconds for the Leader. Float 300.0
mon timecheck skew interval The time check interval (clock drift check) in seconds when in presence of a skew in seconds for the Leader. Float 30.0
  • Client

Parameters Descrip. Type Default
mon client hunt interval The client will try a new monitor every N seconds until it establishes a connection. Double 3.00
mon client ping interval The client will ping the monitor every N seconds. Double 10.00
mon client max log entries per message The maximum number of log entries a monitor will generate per client message. Integer 1000
mon client bytes The amount of client message data allowed in memory (in bytes). 64-bit Integer Unsigned 100ul << 20

Pool Settings

Parameters Descrip. Type Default
mon allow pool delete If the monitors should allow pools to be removed. Regardless of what the pool flags say. Boolean false
osd pool default ec fast read Whether to turn on fast read on the pool or not. It will be used as the default setting of newly created erasure coded pools if fast_read is not specified at create time. Boolean false
osd pool default flag hashpspool Set the hashpspool flag on new pools Boolean true
osd pool default flag nodelete Set the nodelete flag on new pools. Prevents allow pool removal with this flag in any way. Boolean false
osd pool default flag nopgchange Set the nopgchange flag on new pools. Does not allow the number of PGs to be changed for a pool. Boolean false
osd pool default flag nosizechange Set the nosizechange flag on new pools. Does not allow the size to be changed of pool. Boolean false

For more information about the pool flags see Pool values.


Miscellaneous

Please click… the link icon.

文档编译

安装和使用

sudo apt-get install cat doc_deps.deb.txt
admin/build-doc

加速本地编译

https://docs.ceph.com/en/latest/dev/developer_guide/essentials/#using-ccache-to-speed-up-local-builds

为ceph社区做出自己的贡献

Mailing list

The dev@ceph.io list is for discussion about the development of Ceph, its interoperability with other technology, and the operations of the project itself. Subscribe by sending a message to dev-request@ceph.io with the line:

subscribe ceph-devel

in the body of the message.

The ceph-devel@vger.kernel.org list is for discussion and patch review for the Linux kernel Ceph client component. Subscribe by sending a message to majordomo@vger.kernel.org with the line:

subscribe ceph-devel

in the body of the message.


Trouble Shooting: Runtime

  1. 2015-11-23 13:23:47.856064 7f4a5a36a7a0 -1 accepter.accepter.bind unable to bind to 101.67.163.20:6789: (99) Cannot assign requested address
    2015-11-23 13:23:47.856085 7f4a5a36a7a0 -1 accepter.accepter.bind was unable to bind. Trying again in 5 seconds
    2015-11-23 13:23:52.856281 7f4a5a36a7a0 -1 accepter.accepter.bind unable to bind to 101.67.163.20:6789: (99) Cannot assign requested address
    2015-11-23 13:23:52.856319 7f4a5a36a7a0 -1 accepter.accepter.bind was unable to bind. Trying again in 5 seconds
    2015-11-23 13:23:57.856622 7f4a5a36a7a0 -1 accepter.accepter.bind unable to bind to 101.67.163.20:6789: (99) Cannot assign requested address
    2015-11-23 13:23:57.856657 7f4a5a36a7a0 -1 accepter.accepter.bind was unable to bind after 3 attempts: (99) Cannot assign requested address
    2015-11-23 13:23:57.856670 7f4a5a36a7a0 -1 unable to bind monitor to 101.67.163.20:6789/0
    failed: 'ssh ceph-10 ulimit -n 32768;  /usr/bin/ceph-mon -i a --pid-file /var/run/ceph/mon.a.pid -c /etc/ceph/ceph.conf --cluster ceph '
    

这是由于ip地址更换的原因,检查一下。

2.

sudo 执行很慢,可以改/etc/hosts

https://www.cnblogs.com/mouseleo/p/9302301.html


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!