Ceph 存储集群1-配置:硬盘和文件系统、配置 Ceph、网络选项、认证选项和监控器选项

时间:2023-03-10 04:37:59
Ceph 存储集群1-配置:硬盘和文件系统、配置 Ceph、网络选项、认证选项和监控器选项

所有 Ceph 部署都始于 Ceph 存储集群。基于 RADOS 的 Ceph 对象存储集群包括两类守护进程:

1.对象存储守护进程( OSD )把存储节点上的数据存储为对象;

2.Ceph 监视器( MON )维护集群运行图的主拷贝。一个 Ceph 集群可以包含数千个存储节点,最简系统至少需要一个监视器和两个 OSD 才能做到数据复制。

Ceph 文件系统、 Ceph 对象存储、和 Ceph 块设备从 Ceph 存储集群读出和写入数据

一、配置

Ceph 作为集群时可以包含数千个对象存储设备( OSD )。最简系统至少需要二个 OSD 做数据复制。要配置 OSD 集群,你得把配置写入配置文件。 Ceph 对很多选项提供了默认值,你可以在配置文件里覆盖它们;另外,你可以使用命令行工具修改运行时配置。

Ceph 启动时要激活三类守护进程:

ceph-mon (必备)
ceph-osd (必备)
ceph-mds ( cephfs 必备)

各进程、守护进程或工具都会读取配置文件。一个进程可能需要不止一个守护进程例程的信息(多个上下文);一个守护进程或工具只有关于单个守护进程例程的信息(单上下文)。

硬盘和文件系统

准备硬盘

Ceph 注重数据安全,就是说, Ceph 客户端收到数据已写入存储器的通知时,数据确实已写入硬盘。使用较老的内核(版本小于 2.6.33 )时,如果日志在原始硬盘上,就要禁用写缓存;较新的内核没问题。

hdparm 禁用硬盘的写缓冲功能。

sudo hdparm -W  /dev/hda 

在生产环境,我们建议操作系统和 Ceph OSD 守护进程数据分别放到不同的硬盘。如果必须把数据和系统放在同一硬盘里,最好给数据分配一个单独的分区。

文件系统

Ceph 的 OSD 依赖于底层文件系统的稳定性和性能。

OSD 守护进程有赖于底层文件系统的扩展属性( XATTR )存储各种内部对象状态和元数据。底层文件系统必须能为 XATTR 提供足够容量, btrfs 没有限制随文件的 xattr 元数据总量; xfs 的限制相对大( 64KB ),多数部署都不会有瓶颈; ext4 的则太小而不可用。

使用 ext4 文件系统时,一定要把下面的配置放于 ceph.conf 配置文件的 [osd] 段下;用 btrfsxfs 时可以选填

filestore xattr use omap = true

文件系统背景知识

XFSbtrfsext4比较 ext3 而言,在高伸缩性数据存储方面有几个优势。

XFSbtrfsext4 都是日志文件系统,这使得在崩溃、断电后恢复时更健壮,因为这些文件系统在写入数据前会先记录所有变更。

xfs 由 Silicon Graphics 开发,是一个成熟、稳定的文件系统。相反, btrfs 是相对年轻的文件系统,它致力于实现系统管理员梦寐以求的大规模数据存储基础,和其他 Linux 文件系统相比它有独一无二的功能和优势。

btrfs 是写时复制( copy-on-write , cow )文件系统,它支持文件创建时间戳和校验和(可校验元数据完整性)功能,所以它能探测到数据坏副本,并且用好副本修复。写时复制功能是说 btrfs 支持可写文件系统快照。 btrfs 也支持透明压缩和其他功能。

btrfs 也集成了多设备管理功能,据此可以在底层支持异质硬盘存储,和数据分配策略。未来开发社区还会提供 fsck 、拆分、数据加密功能,这些诱人的功能正是 Ceph 集群的理想选择。

配置 Ceph

你启动 Ceph 服务时,初始化进程会把一系列守护进程放到后台运行。 Ceph 存储集群运行两种守护进程:

Ceph 监视器 ( ceph-mon )
Ceph OSD 守护进程 ( ceph-osd )

要支持 Ceph 文件系统功能,它还需要运行至少一个 Ceph 元数据服务器ceph-mds );支持 Ceph 对象存储功能的集群还要运行网关守护进程( radosgw )。为方便起见,各类守护进程都有一系列默认值(很多由 ceph/src/common/config_opts.h 配置),你可以用 Ceph 配置文件覆盖这些默认值。

配置文件

启动 Ceph 存储集群时,各守护进程都从同一个配置文件(即默认的 ceph.conf )里查找它自己的配置。手动部署时,你需要创建此配置文件;用部署工具( ceph-deploychef 等)创建配置文件时可以参考下面的信息。配置文件定义了:

集群身份
认证配置
集群成员
主机名
主机 IP 地址
密钥环路径
日志路径
数据路径
其它运行时选项

默认的 Ceph 配置文件位置相继排列如下:

$CEPH_CONF (就是 $CEPH_CONF 环境变量所指示的路径);
-c path/path (就是 -c 命令行参数);
/etc/ceph/ceph.conf
~/.ceph/config
./ceph.conf (就是当前所在的工作路径。

Ceph 配置文件使用 ini 风格的语法,以分号 (;) 和井号 (#) 开始的行是注释,如下:

配置段落

Ceph 配置文件可用于配置存储集群内的所有守护进程、或者某一类型的所有守护进程。要配置一系列守护进程,这些配置必须位于能收到配置的段落之下,比如:

[global]
描述:    [global] 下的配置影响 Ceph 集群里的所有守护进程。
实例:    auth supported = cephx

[osd]
描述:    [osd] 下的配置影响存储集群里的所有 ceph-osd 进程,并且会覆盖 [global] 下的同一选项。
实例:    osd journal size = 

[mon]
描述:    [mon] 下的配置影响集群里的所有 ceph-mon 进程,并且会覆盖 [global] 下的同一选项。
实例:    mon addr = 

[mds]
描述:    [mds] 下的配置影响集群里的所有 ceph-mds 进程,并且会覆盖 [global] 下的同一选项。
实例:    host = myserver01

[client]
描述:    [client] 下的配置影响所有客户端(如挂载的 Ceph 文件系统、挂载的块设备等等)。
实例:    log file = /var/log/ceph/radosgw.log

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

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

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

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

[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 = 

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

[osd.]
# settings affect osd. 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
描述:    可展开为 mds 、 osd 、 mon 中的一个,有赖于当前守护进程的类型。
实例:    /var/lib/ceph/$type

$id
描述:    展开为守护进程标识符; osd. 应为  , mds.a 是 a 。
实例:    /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 ,除非你想手动部署;一定不能用于 chef 或 ceph-deploy ,这些工具会自动获取正确结果

监视器

典型的 Ceph 生产集群至少部署 3 个监视器来确保高可靠性,它允许一个监视器例程崩溃。奇数个监视器( 3 个)确保 PAXOS 算法能确定一批监视器里哪个版本的集群运行图是最新的。

一个 Ceph 集群可以只有一个监视器,但是如果它失败了,因没有监视器数据服务就会中断

Ceph 监视器默认监听 6789 端口,例如:

[mon.a]
host = hostName
mon addr = 

默认情况下, Ceph 会在下面的路径存储监视器数据:

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

你必须手动或通过部署工具(如 ceph-deploy )创建对应目录。前述元变量必须先全部展开,名为 “ceph” 的集群将展开为:

/var/lib/ceph/mon/ceph-a

认证

对于 v0.56 及后来版本,要在配置文件的 [global] 中明确启用或禁用认证。

auth cluster required = cephx
auth service required = cephx
auth client required = cephx

另外,你应该启用消息签名,详情见 Cephx 配置参考Cephx 认证

我们建议,升级时先明确地关闭认证,再进行升级。等升级完成后再重新启用认证

OSDs

通常, Ceph 生产集群在一个节点上只运行一个 Ceph OSD 守护进程,此守护进程在一个存储驱动器上只运行一个 filestore ;典型部署需指定日志尺寸。

例如:

[osd]
osd journal size = 

[osd.]
host = {hostname} #manual deployments only.

默认情况下, Ceph 认为你把 OSD 数据存储到了以下路径:

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

你必须手动或通过部署工具(如 ceph-deploy )创建对应目录,名为 “ceph” 的集群其元变量完全展开后,前述的目录将是:

/

你可以用 osd data 选项更改默认值,但我们不建议修改。用下面的命令在新 OSD 主机上创建默认目录:

ssh {osd-host}
sudo mkdir /var/lib/ceph/osd/ceph-{osd-number}

osd data 路径应该指向一个独立硬盘的挂载点,这个硬盘应该独立于操作系统和守护进程所在硬盘。按下列步骤准备好并挂载:

ssh {new-osd-host}
sudo mkfs -t {fstype} /dev/{disk}
sudo mount -o user_xattr /dev/{hdd} /var/lib/ceph/osd/ceph-{osd-number}

心跳

在运行时, OSD 守护进程会相互检查邻居 OSD 、并把结果报告给 Ceph 监视器,一般不需要更改默认配置。但如果你的网络延时比较大,也许需要更改某些选项。

运行时更改

Ceph 可以在运行时更改 ceph-osdceph-monceph-mds 守护进程的配置,此功能在增加/降低日志输出、启用/禁用调试设置、甚至是运行时优化的时候非常有用,下面是运行时配置方法:

ceph tell {daemon-type}.{id or *} injectargs --{name} {value} [--{name} {value}]

osdmonmds 中的一个替代 {daemon-type} ,你可以用星号( * )更改一类进程的所有例程配置、或者更改某一具体进程 ID (即数字或字母)的配置。例如提高名为 osd.0ceph-osd 进程之调试级别的命令如下:

ceph tell osd. injectargs --debug-osd  --debug-ms 

ceph.conf 文件里配置时用空格分隔关键词;但在命令行使用的时候要用下划线或连字符( _- )分隔,例如 debug osd 变成 debug-osd

查看运行时配置

如果你的 Ceph 存储集群在运行,而你想看一个在运行进程的配置,用下面的命令:

ceph daemon {daemon-type}.{id} config show | less

如果你现在位于 osd.0 所在的主机,命令将是:

ceph daemon osd. config show | less

运行多个集群

用 Ceph 可以实现在同一套硬件上运行多个集群,运行多个集群与同一集群内用 CRUSH 规则控制多个存储池相比提供了更高水平的隔离。独立的集群需配备独立的监视器、 OSD 和元数据服务器进程。默认配置下集群名字是 “ceph” ,这意味着你得把配置文件保存为 /etc/ceph 下的 ceph.conf

运行多个集群时,你必须为集群命名并用这个名字保存配置文件。例如,名为 openstack 的集群其配置文件将是 /etc/ceph 下的 openstack.conf

集群名字里只能包含字母 a-z 和数字 - 。

独立的集群意味着独立数据盘和日志,它们不能在集群间共享。根据前面的元变量$cluster 元变量对应集群名字(就是前面的 openstack )。多处设置都用到 $cluster 元变量,包括:

keyring
admin socket
log file
pid file
mon data
mon cluster log file
osd data
osd journal
mds data
rgw data

创建默认目录和文件时,路径里该用集群名的地方要注意,例如:

sudo mkdir /
sudo mkdir /var/lib/ceph/mon/openstack-a

在一台主机上运行多个监视器时,你得指定不同端口。监视器默认使用 6789 端口,如果它已经被占,其它集群得指定其它端口。

要调动一个名字不是 ceph 的集群,要给 ceph 命令加 -c {filename}.conf 选项,例如:

ceph -c {cluster-name}.conf health
ceph -c openstack.conf health

网络选项

网络配置对构建高性能 Ceph 存储集群来说相当重要。 Ceph 存储集群不会代表 Ceph 客户端执行请求路由或调度,相反, Ceph 客户端(如块设备、 CephFS 、 REST 网关)直接向 OSD 请求,然后OSD为客户端执行数据复制,也就是说复制和其它因素会额外增加集群网的负载。

我们的快速入门配置提供了一个简陋的 Ceph 配置文件,其中只设置了监视器 IP 地址和守护进程所在的主机名。如果没有配置集群网,那么 Ceph 假设你只有一个“公共网”。只用一个网可以运行 Ceph ,但是在大型集群里用单独的“集群”网可显著地提升性能。

我们建议用两个网络运营 Ceph 存储集群:一个公共网(前端)和一个集群网(后端)。为此,各节点得配备多个网卡

Ceph 存储集群1-配置:硬盘和文件系统、配置 Ceph、网络选项、认证选项和监控器选项

运营两个独立网络的考量主要有:

性能: OSD 为客户端处理数据复制,复制多份时 OSD 间的网络负载势必会影响到客户端和 Ceph 集群的通讯,包括延时增加、产生性能问题;恢复和重均衡也会显著增加公共网延时。关于 Ceph 如何复制参见伸缩性和高可用性;关于心跳流量参见监视器与 OSD 的交互。
安全: 大多数人都是良民,很少的一撮人喜欢折腾拒绝服务攻击( 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  -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 : -j ACCEPT

OSD 防火墙

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

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

Ceph 存储集群1-配置:硬盘和文件系统、配置 Ceph、网络选项、认证选项和监控器选项

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

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

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

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

Ceph 网络

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

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

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

公共网

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

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

集群网

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

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

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

Ceph 守护进程

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

注意:

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

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

[mon.a]

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

[osd.]
        host = {hostname}

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

[osd.]
        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 地址和掩码(如  ),置于 [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 地址及掩码(如  ),置于 [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 可绑定的最小端口号。
类型:    -bit Integer
默认值:
是否必需:    No

ms bind port max
描述:    OSD 或 MDS 可绑定的最大端口号。
类型:    -bit Integer
默认值:
是否必需:    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.] 。
类型:    String
是否必需:    Yes, for daemon instances.
默认值:    localhost

注意:

1.不要用 localhost 。在命令行下执行 hostname -s 获取主机名(到第一个点,不是全资域名),并用于配置文件。
2.用第三方部署工具时不要指定 host 选项,它会自行获取。

TCP

Ceph 默认禁用 TCP 缓冲。

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

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

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

认证选项

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

如果禁用了认证,就会有篡改客户端/服务器消息这样的中间人攻击风险,这会导致灾难性后果

启用和禁用 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 ,用此命令:

把监视器密钥环复制到 ceph.mon.keyring 文件,再把此文件复制到各监视器的 mon data 目录下。比如要把它复制给名为 ceph 集群的 mon.a ,用此命令:

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 集群

配置选项

启用事项

auth cluster required
描述:    如果启用了,集群守护进程(如 ceph-mon 、 ceph-osd 和 ceph-mds )间必须相互认证。可用选项有 cephx 或 none 。
类型:    String
是否必需:    No
默认值:    cephx.

auth service required
描述:    如果启用,客户端要访问 Ceph 服务的话,集群守护进程会要求它和集群认证。可用选项为 cephx 或 none 。
类型:    String
是否必需:    No
默认值:    cephx.

auth client required
描述:    如果启用,客户端会要求 Ceph 集群和它认证。可用选项为 cephx 或 none 。
类型:    String
是否必需:    No
默认值:    cephx.

密钥

如果你的集群启用了认证, 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

你可以用 key 选项把密钥写在配置文件里(别这样),或者用 keyfile 选项指定个路径。

keyring
描述:    密钥环文件的路径。
类型:    String
是否必需:    No
默认值:    /etc/ceph/$cluster.$name.keyring,/etc/ceph/$cluster.keyring,/etc/ceph/keyring,/etc/ceph/keyring.bin

keyfile
描述:    到密钥文件的路径,如一个只包含密钥的文件。
类型:    String
是否必需:    No
默认值:    None

key
描述:    密钥(密钥文本),最好别这样做。
类型:    String
是否必需:    No
默认值:    None

守护进程密钥环

管理员用户们或部署工具(如 ceph-deploy )生成守护进程密钥环与生成用户密钥环的方法一样。默认情况下,守护进程把密钥环保存在各自的数据目录下,默认密钥环位置、和守护进程发挥作用必需的能力展示如下:

ceph-mon
位置:    $mon_data/keyring
能力:    mon 'allow *'

ceph-osd
位置:    $osd_data/keyring
能力:    mon 'allow profile osd' osd 'allow *'

ceph-mds
位置:    $mds_data/keyring
能力:    mds 'allow' mon 'allow profile mds' osd 'allow rwx'

radosgw
位置:    $rgw_data/keyring
能力:    mon 'allow rwx' osd 'allow rwx'

监视器密钥环(即 mon. )包含一个密钥,但没有能力,且不是集群 auth 数据库的一部分

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

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

例如, osd.12 的目录会是:

/

你可以覆盖这些位置,但不推荐

签名

在 Bobtail 及后续版本中, Ceph 会用开始认证时生成的会话密钥认证所有在线实体。然而 Argonaut 及之前版本不知道如何认证在线消息,为保持向后兼容性(如在同一个集群里运行 Bobtail 和 Argonaut ),消息签名默认是关闭的。如果你只运行 Bobtail 和后续版本,可以让 Ceph 要求签名。

像 Ceph 认证的其他部分一样,客户端和集群间的消息签名也能做到细粒度控制;而且能启用或禁用 Ceph 守护进程间的签名。
cephx require signatures描述:	若设置为 true , Ceph 集群会要求客户端签名所有消息,包括集群内其他守护进程间的。类型:	Boolean是否必需:	No默认值:	false

cephx cluster require signatures描述:	若设置为 true , Ceph 要求集群内所有守护进程签名相互之间的消息。类型:	Boolean是否必需:	No默认值:	false

cephx service require signatures描述:	若设置为 true , Ceph 要求签名所有客户端和集群间的消息。类型:	Boolean是否必需:	No默认值:	false

cephx sign messages描述:	如果 Ceph 版本支持消息签名, Ceph 会签名所有消息以防欺骗。类型:	Boolean默认值:	true 

生存期

auth service ticket ttl
描述:    Ceph 存储集群发给客户端一个用于认证的票据时分配给这个票据的生存期。
类型:    Double
默认值:    *

向后兼容性

在 Ceph 0.48 及更早版本,启用 cephx 认证后, Ceph 仅认证客户端和守护进程间的最初通讯,不会认证后续相互发送的消息,这导致了安全隐患; Bobtail 及后续版本会用认证后生成的会话密钥来认证所有消息。

我们确定了一个向后兼容性问题,在 Argonaut v0.48 (及之前版本)和 Bobtail( 及后续版本)之间。测试发现,如果你混用 Argonaut (及更小版)和 Bobtail 的守护进程, Argonaut 的守护进程将对正在进行的消息不知所措,因为 Bobtail 进程坚持要求认证最初请求/响应之后的消息,导致二者无法交互。

我们已经提供了一种方法,解决了 Argonaut (及之前)和 Bobtail (及后续)系统间交互的潜在的问题。是这样解决的,默认情况下,较新系统不会再坚持要求较老系统的签名,只是简单地接收这些消息而不对其认证。这个默认行为使得两个不同版本可以交互,但我们不推荐作为长期方案。允许较新进程不认证正在进行的消息会导致安全问题,因为攻击者如果能控制你的机器、或访问你的网络,就可以宣称不能签署消息,从而禁用会话安全。

即使你没有使用旧版的 Ceph ,在默认配置下,攻击者也可以强制一些未签署消息被接受;虽然初始通讯认证通过了,但你失去了会话安全。

如果你确定不会使用旧版 Ceph 、或者新旧服务器不能交互无所谓,那就可以排除这个安全风险;如果你这样做了,任何支持会话认证、启用了 Cephx 的 Ceph 系统都会拒绝未签名的消息。要防止新服务器和旧服务器交互,在 Ceph 配置文件的 [global] 下添加下列这行,要加到启用 Cephx 之后.

cephx require signatures = true    ; everywhere possible

你也可以选择只对集群内部通讯要求签名,它和面向客户端的服务是分离的:

cephx cluster require signatures = true    ; for cluster-internal communication
cephx service require signatures = true    ; for client-facing service

客户端向集群要求签名的选项还没实现。

我们推荐把所有进程迁移到较新版本,并启用前述选项选项,以增强认证安全性

Ceph 内核模块还不支持签名

监控器选项

理解如何配置 Ceph 监视器是构建可靠的 Ceph 存储集群的重要方面,任何 Ceph 集群都需要至少一个监视器。一个监视器通常相当一致,但是你可以增加、删除、或替换集群中的监视器,详情见增加/删除监视器增加/删除监视器( ceph-deploy )

背景

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

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

Ceph 存储集群1-配置:硬盘和文件系统、配置 Ceph、网络选项、认证选项和监控器选项

在 0.58 及更早版本中, Ceph 监视器每个服务用一个 Paxos 例程,并把运行图存储为文件。

集群运行图

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

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

运营集群时,跟踪这些状态是系统管理任务的重要部分。

监视器法定人数

本文入门部分提供了一个简陋的 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 的更新是增量的,所以监视器们都有最新的一致版本,以及一系列之前版本。历史版本的存在允许一个落后的监视器跟上集群当前状态。

如果监视器通过配置文件而非 monmap 相互发现,这会引进其他风险,因为 Ceph 配置文件不是自动更新并分发的,监视器有可能不小心用了较老的配置文件,以致于不认识某监视器、放弃法定人数、或者产生一种 Paxos 不能确定当前系统状态的情形。

初始化监视器

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

文件系统标识符: fsid 是对象存储的唯一标识符。因为你可以在一套硬件上运行多个集群,所以在初始化监视器时必须指定对象存储的唯一标识符。部署工具通常可替你完成(如 ceph-deploy 会调用类似 uuidgen 的程序),但是你也可以手动指定 fsid 。
监视器标识符: 监视器标识符是分配给集群内各监视器的唯一 ID ,它是一个字母数字组合,为方便起见,标识符通常以字母顺序结尾(如 a 、 b 等等),可以设置于 Ceph 配置文件(如 [mon.a] 、 [mon.b] 等等)、部署工具、或 ceph 命令行工具。
密钥: 监视器必须有密钥。像 ceph-deploy 这样的部署工具通常会自动生成,也可以手动完成

监视器的配置

要把配置应用到整个集群,把它们放到 [global] 下;要用于所有监视器,置于 [mon] 下;要用于某监视器,指定监视器例程,如 [mon.a] )。按惯例,监视器例程用字母命名.

[global]

[mon]

[mon.a]

[mon.b]

[mon.c]

最小配置

Ceph 监视器的最简配置必须包括一主机名及其监视器地址,这些配置可置于 [mon] 下或某个监视器下

[mon]
        mon host = hostname1,hostname2,hostname3
        mon addr = ,,

[mon.a]
        host = hostname1
        mon addr = 

注意:这里的监视器最简配置假设部署工具会自动给你生成 fsidmon. 密钥

一旦部署了 Ceph 集群,监视器 IP 地址不应该更改。然而,如果你决意要改,必须严格按照更改监视器 IP 地址来改。

集群 ID

每个 Ceph 存储集群都有一个唯一标识符( fsid )。如果指定了,它应该出现在配置文件的 [global] 段下。部署工具通常会生成 fsid 并存于监视器图,所以不一定会写入配置文件, fsid 使得在一套硬件上运行多个集群成为可能。

fsid
描述:    集群 ID ,一集群一个。
类型:    UUID
是否必需:    Yes.
默认值:    无。若未指定,部署工具会生成。

注意:如果你用部署工具就不能设置。

初始成员

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

[mon]
        mon initial members = a,b,c
mon initial members
描述:    集群启动时初始监视器的 ID ,若指定, Ceph 需要奇数个监视器来确定最初法定人数(如  )。
类型:    String
默认值:    None

注意:集群内的大多数监视器必须能互通以建立法定人数,你可以用此选项减小初始监视器数量来形成

数据

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

在 Ceph 0.58 及更早版本中,监视器数据以文件保存,这样人们可以用 lscat 这些普通工具检查监视器数据,然而它不能提供健壮的一致性。

在 Ceph 0.59 及后续版本中,监视器以键/值对存储数据。监视器需要 ACID 事务,数据存储的使用可防止监视器用损坏的版本进行恢复,除此之外,它允许在一个原子批量操作中进行多个修改操作。

一般来说我们不建议更改默认数据位置,如果要改,我们建议所有监视器统一配置,加到配置文件的 [mon] 下。

mon data
描述:    监视器的数据位置。
类型:    String
默认值:    /var/lib/ceph/mon/$cluster-$id

存储容量

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

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

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

下图描述了一个简化的 Ceph 集群,它包含 33 个节点、每主机一个 OSD 、每 OSD 3TB 容量,所以这个小白鼠集群有 99TB 的实际容量,其 mon osd full ratio.95 。如果它只剩余 5TB 容量,集群就不允许客户端再读写数据,所以它的运行容量是 95TB ,而非 99TB。

Ceph 存储集群1-配置:硬盘和文件系统、配置 Ceph、网络选项、认证选项和监控器选项

在这样的集群里,坏一或两个 OSD 很平常;一种罕见但可能发生的情形是一个机架的路由器或电源挂了,这会导致多个 OSD 同时离线(如 OSD 7-12 ),在这种情况下,你仍要力争保持集群可运行并达到 active + clean 状态,即使这意味着你得在短期内额外增加一些 OSD 及主机。如果集群利用率太高,在解决故障域期间也许不会丢数据,但很可能牺牲数据可用性,因为利用率超过了 full ratio 。故此,我们建议至少要粗略地规划下容量。

找出你集群的两个数字:

OSD 数量
集群总容量

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

[global]

        mon osd full ratio = .
        mon osd nearfull ratio = .
mon osd full ratio
描述:    OSD 硬盘使用率达到多少就认为它 full 。
类型:    Float
默认值:    .

mon osd nearfull ratio
描述:    OSD 硬盘使用率达到多少就认为它 nearfull 。
类型:    Float
默认值:    .

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

心跳

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

监视器存储同步

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

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

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

Ceph 存储集群1-配置:硬盘和文件系统、配置 Ceph、网络选项、认证选项和监控器选项

新监视器加入集群时有必要进行同步。在运行中,监视器会不定时收到集群运行图的更新,这就意味着 leader 和 provider 角色可能在监视器间变幻。如果这事发生在同步期间(如 provider 落后于 leader ), provider 能终结和 requester 间的同步。

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

mon sync trim timeout
描述:
类型:    Double
默认值:    30.0

mon sync heartbeat timeout
描述:
类型:    Double
默认值:    30.0

mon sync heartbeat interval
描述:
类型:    Double
默认值:    5.0

mon sync backoff timeout
描述:
类型:    Double
默认值:    30.0

mon sync timeout
描述:
类型:    Double
默认值:    30.0

mon sync max retries
描述:
类型:    Integer
默认值:    

mon sync max payload size
描述:    同步载荷的最大尺寸。
类型:    -bit Integer
默认值:    

mon accept timeout
描述:    leader 等待 requester(s) 接受 PAXOS 更新的时间,出于同样的目的此值也用于 PAXOS 恢复阶段。
类型:    Float
默认值:    10.0

paxos propose interval
描述:    提议更新之前收集本时间段的更新。
类型:    Double
默认值:    1.0

paxos min wait
描述:    经过一段不活跃时间后,收集更新的最小等待时间。
类型:    Double
默认值:    0.05

paxos trim tolerance
描述:    修复前容忍的其他提议数量。
类型:    Integer
默认值:    

paxos trim disabled max versions
描述:    允许不修复就通过的最大版本数。
类型:    Integer
默认值:    

mon lease
描述:    监视器版本租期(秒)。
类型:    Float
默认值:    

mon lease renew interval
描述:    监视器 leader (头领)刷新其他监视器租期的间隔。
类型:    Float
默认值:    

mon lease ack timeout
描述:    leader 在等到 providers (随从)确认延长租期前等待的时间。
类型:    Float
默认值:    10.0

mon min osdmap epochs
描述:    一直保存的 OSD 图元素最小数量。
类型:    -bit Integer
默认值:    

mon max pgmap epochs
描述:    监视器应该一直保存的 PG 图元素最大数量。
类型:    -bit Integer
默认值:    

mon max log epochs
描述:    监视器应该保留的最大日志数量。
类型:    -bit Integer
默认值:    

Slurp

在 Ceph 0.58 及之前版本中,当 Paxos 服务偏差的版本数大于某值时,就会触发 slurp 机制,它会和法定人数 leader 建立一个连接并获取 leader 拥有的每个版本,以同步每个有偏差的服务。 Ceph 0.59 及后续版本的 slurp 机制取消了,因为所有服务共享一个 Paxos 例程。

paxos max join drift
描述:    在我们首次同步监视器数据存储前, Paxos 迭代的最大数量。
类型:    Integer
默认值:    

mon slurp timeout
描述:    监视器进程终止后、自举前,要等待多长时间才开始发出显式修复通告。
类型:    Double
默认值:    10.0

mon slurp bytes
描述:    显式修复消息尺寸限制。
类型:    -bit Integer
默认值:     * 

时钟

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

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

注意:你应该在所有监视器主机上安装 NTP 以确保监视器集群的时钟同步。

时钟漂移即使尚未造成损坏也能被 NTP 感知, Ceph 的时钟漂移或时钟偏差警告即使在 NTP 同步水平合理时也会被触发。提高时钟漂移值有时候尚可容忍,然而很多因素(像载荷、网络延时、覆盖默认超时值和监视器存储同步选项)都能在不降低 Paxos 保证级别的情况下影响可接受的时钟漂移水平。

Ceph 提供了下列这些可调选项,让你自己琢磨可接受的值。

clock offset
描述:    时钟可以漂移多少,详情见 Clock.cc 。
类型:    Double
默认值:    

Deprecated since version 0.58.

mon tick interval
描述:    监视器的心跳间隔,单位为秒。
类型:    -bit Integer
默认值:    

mon clock drift allowed
描述:    监视器间允许的时钟漂移量
类型:    Float
默认值:    .

mon clock drift warn backoff
描述:    时钟偏移警告的退避指数。
类型:    Float
默认值:    

mon timecheck interval
描述:    和 leader 的时间偏移检查(时钟漂移检查)。单位为秒。
类型:    Float
默认值:    300.0

客户端

mon client hung interval
描述:    客户端每 N 秒尝试一个新监视器,直到它建立连接。
类型:    Double
默认值:    3.0

mon client ping interval
描述:    客户端每 N 秒 ping 一次监视器。
类型:    Double
默认值:    10.0

mon client max log entries per message
描述:    某监视器为每客户端生成的最大日志条数。
类型:    Integer
默认值:    

mon client bytes
描述:    内存中允许存留的客户端消息数量(字节数)。
类型:    -bit Integer Unsigned
默认值:    

杂项

mon max osd
描述:    集群允许的最大 OSD 数量。
类型:    -bit Integer
默认值:    

mon globalid prealloc
描述:    为集群预分配的全局 ID 数量。
类型:    -bit Integer
默认值:    

mon sync fs threshold
描述:    数量达到设定值时和文件系统同步,  为禁用。
类型:    -bit Integer
默认值:    

mon subscribe interval
描述:    同步的刷新间隔(秒),同步机制允许获取集群运行图和日志信息。
类型:    Double
默认值:    

mon stat smooth intervals
描述:    Ceph 将平滑最后 N 个归置组图的统计信息。
类型:    Integer
默认值:    

mon probe timeout
描述:    监视器自举无效,搜寻节点前等待的时间。
类型:    Double
默认值:    2.0

mon daemon bytes
描述:    给元数据服务器和 OSD 的消息使用的内存空间(字节)。
类型:    -bit Integer Unsigned
默认值:    

mon max log entries per event
描述:    每个事件允许的最大日志条数。
类型:    Integer
默认值: