Ceph 存储集群第一部分:配置和部署
内容来源于官方,经过个人实践操作整理,官方地址:http://docs.ceph.org.cn/rados/
所有 Ceph 部署都始于 Ceph 存储集群。
基于 RADOS 的 Ceph 对象存储集群包括两类守护进程:term:对象存储守护进程( OSD )把存储节点上的数据存储为对象; term:Ceph 监视器( MON )维护集群运行图的主拷贝。
一个 Ceph 集群可以包含数千个存储节点,最简系统至少需要一个监视器和两个 OSD 才能做到数据复制。
Ceph 文件系统、 Ceph 对象存储、和 Ceph 块设备从 Ceph 存储集群读出和写入数据。
Ceph 存储集群的某些配置选项是必要的,但大多数都有默认值。典型部署是通过部署工具定义集群、并启动监视器的,关于 ceph-deploy 的详情见部署(http://docs.ceph.org.cn/rados/deployment/)。
配置
Ceph 作为集群时可以包含数千个对象存储设备(OSD)。最简系统至少需要二个 OSD 做数据复制。要配置 OSD 集群,你得把配置写入配置文件。 Ceph 对很多选项提供了默认值,你可以在配置文件里覆盖它们;另外,你可以使用命令行工具修改运行时配置。
Ceph 启动时要激活三类守护进程:
- ceph-mon (必备)
- ceph-osd (必备)
- ceph-mds (cephfs必备)
各进程、守护进程或工具都会读取配置文件。一个进程可能需要不止一个守护进程例程的信息(即多个上下文);一个守护进程或工具只有关于单个守护进程例程的信息(单上下文)。
硬盘和文件系统
1.准备硬盘
Ceph 注重数据安全,就是说, Ceph 客户端收到数据已写入存储器的通知时,数据确实已写入硬盘。使用较老的内核(版本小于 2.6.33 )时,如果日志在原始硬盘上,就要禁用写缓存;较新的内核没问题。
用 hdparm 禁用硬盘的写缓冲功能。
sudo hdparm -W 0 /dev/hda 0
在生产环境,我们建议操作系统和 Ceph OSD 守护进程数据分别放到不同的硬盘。如果必须把数据和系统放在同一硬盘里,最好给数据分配一个单独的分区。
2.文件系统
Ceph 的 OSD 依赖于底层文件系统的稳定性和性能。
当前,我们推荐部署生产系统时使用 xfs 文件系统;推荐用 btrfs 做测试、开发和其他不太要紧的部署。我们相信,长远来看 btrfs 适合 Ceph 的功能需求和发展方向,但是 xfs 和 ext4 能提供当前部署所必需的稳定性。
OSD 守护进程有赖于底层文件系统的扩展属性( XATTR )存储各种内部对象状态和元数据。底层文件系统必须能为 XATTR 提供足够容量, btrfs 没有限制随文件的 xattr 元数据总量; xfs 的限制相对大( 64KB ),多数部署都不会有瓶颈; ext4 的则太小而不可用。
使用 ext4 文件系统时,一定要把下面的配置放于 ceph.conf 配置文件的 [osd] 段下;用 btrfs 和 xfs 时可以选填。
filestore xattr use omap = true
配置 Ceph
启动 Ceph 服务时,初始化进程会把一系列守护进程放到后台运行。 Ceph 存储集群运行两种守护进程:
- Ceph 监视器 ( ceph-mon )
- Ceph OSD 守护进程 ( ceph-osd )
要支持 Ceph 文件系统功能,它还需要运行至少一个 Ceph 元数据服务器( ceph-mds );支持 Ceph 对象存储功能的集群还要运行网关守护进程( radosgw )。为方便起见,各类守护进程都有一系列默认值(很多由 ceph/src/common/config_opts.h 配置),你可以用 Ceph 配置文件覆盖这些默认值。
1.配置文件
启动 Ceph 存储集群时,各守护进程都从同一个配置文件(即默认的 ceph.conf )里查找它自己的配置。手动部署时,你需要创建此配置文件;用部署工具(如 ceph-deploy 、 chef 等)创建配置文件时可以参考下面的信息。配置文件定义了:
- 集群身份
- 认证配置
- 集群成员
- 主机名
- 主机 IP 地址
- 密钥环路径
- 日志路径
- 数据路径
- 其它运行时选项
默认的 Ceph 配置文件位置相继排列如下:
$CEPH_CONF
(就是 $CEPH_CONF 环境变量所指示的路径);-c path/path
(就是 -c 命令行参数);/etc/ceph/ceph.conf
~/.ceph/config
./ceph.con
f (就是当前所在的工作路径)。
Ceph 配置文件使用 ini 风格的语法,以分号 (😉 和井号 (#) 开始的行是注释,如下:
# <--A number (#) sign precedes a comment.
; A comment may be anything.
# Comments always follow a semi-colon (;) or a pound (#) on each line.
# The end of the line terminates a comment.
# We recommend that you provide comments in your configuration file(s).
2.配置段落
Ceph 配置文件可用于配置存储集群内的所有守护进程、或者某一类型的所有守护进程。要配置一系列守护进程,这些配置必须位于能收到配置的段落之下,比如:
[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]
设置:
- 在 [osd] 、 [mon] 、 [mds] 下更改某一类进程的配置。
- 更改特定进程的设置,如 [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.
3.元变量
元变量大大简化了集群配置。 Ceph 会把配置的元变量展开为具体值;元变量功能很强大,可以用在配置文件的 [global] 、 [osd] 、 [mon] 、 [mds] 段里,类似于 Bash 的 shell 扩展。
Ceph 支持下列元变量:
$cluster
描述: 展开为存储集群名字,在同一套硬件上运行多个集群时有用。
实例: /etc/ceph/$cluster.keyring
默认值: ceph
$type
描述: 可展开为 mds 、 osd 、 mon 中的一个,有赖于当前守护进程的类型。
实例: /var/lib/ceph/$type
$id
描述: 展开为守护进程标识符; osd.0 应为 0 , mds.a 是 a 。
实例: /var/lib/ceph/$type/$cluster-$id
$host
描述: 展开为当前守护进程的主机名。
$name
描述: 展开为 $type.$id 。
实例: /var/run/ceph/$cluster-$name.asok
4.共有选项
硬件推荐段提供了一些配置 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 存储集群来说相当重要。 Ceph 存储集群不会代表 Ceph 客户端执行请求路由或调度,相反, Ceph 客户端(如块设备、 CephFS 、 REST 网关)直接向 OSD 请求,然后OSD为客户端执行数据复制,也就是说复制和其它因素会额外增加集群网的负载。
我们的快速入门配置提供了一个简陋的 Ceph 配置文件,其中只设置了监视器 IP 地址和守护进程所在的主机名。如果没有配置集群网,那么 Ceph 假设你只有一个“公共网”。只用一个网可以运行 Ceph ,但是在大型集群里用单独的“集群”网可显著地提升性能。
我们建议用两个网络运营 Ceph 存储集群:一个公共网(前端)和一个集群网(后端)。为此,各节点得配备多个网卡.
运营两个独立网络的考量主要有:
- 性能: OSD 为客户端处理数据复制,复制多份时 OSD 间的网络负载势必会影响到客户端和 Ceph 集群的通讯,包括延时增加、产生性能问题;恢复和重均衡也会显著增加公共网延时。
- 安全: 大多数人都是良民,很少的一撮人喜欢折腾拒绝服务攻击( DoS )。当 OSD 间的流量失控时,归置组再也不能达到 active + clean 状态,这样用户就不能读写数据了。挫败此类攻击的一种好方法是维护一个完全独立的集群网,使之不能直连互联网
1.防火墙
守护进程默认会绑定到 6800:7300 间的端口,你可以更改此范围。
1.1 监视器防火墙
监视器默认监听 6789 端口,而且监视器总是运行在公共网。按下例增加规则时,要把 {iface}
替换为公共网接口(如 eth0 、 eth1 等等)、 {ip-address}
替换为公共网 IP 、{netmask}
替换为公共网掩码。
sudo iptables -A INPUT -i {iface} -p tcp -s {ip-address}/{netmask} --dport 6789 -j ACCEPT
1.2 MDS 防火墙
元数据服务器会监听公共网 6800 以上的第一个可用端口。需要注意的是,这种行为是不确定的,所以如果你在同一主机上运行多个 OSD 或 MDS 、或者在很短的时间内重启了多个守护进程,它们会绑定更高的端口号;所以说你应该预先打开整个 6800-7300 端口区间。按下例增加规则时,要把 {iface}
替换为公共网接口(如 eth0 、 eth1 等等)、 {ip-address}
替换为公共网 IP 、 {netmask}
替换为公共网掩码。
sudo iptables -A INPUT -i {iface} -m multiport -p tcp -s {ip-address}/{netmask} --dports 6800:7300 -j ACCEPT
1.3 OSD 防火墙
OSD 守护进程默认绑定 从 6800 起的第一个可用端口,需要注意的是,这种行为是不确定的,所以如果你在同一主机上运行多个 OSD 或 MDS 、或者在很短的时间内重启了多个守护进程,它们会绑定更高的端口号。一主机上的各个 OSD 最多会用到 4 个端口:
1 一个用于和客户端、监视器通讯;
2 一个用于发送数据到其他 OSD ;
3 两个用于各个网卡上的心跳;
当某个守护进程失败并重启时没释放端口,重启后的进程就会监听新端口。你应该打开整个 6800-7300 端口区间,以应对这种可能性。
如果你分开了公共网和集群网,必须分别为之设置防火墙,因为客户端会通过公共网连接、而其他 OSD 会通过集群网连接。按下例增加规则时,要把 {iface}
替换为网口(如 eth0 、 eth1 等等)、 {ip-address}
替换为公共网或集群网 IP 、 {netmask}
替换为公共网或集群网掩码。例如:
sudo iptables -A INPUT -i {iface} -m multiport -p tcp -s {ip-address}/{netmask} --dports 6800:7300 -j ACCEPT
如果你的元数据服务器和 OSD 在同一节点上,可以合并公共网配置。
2.Ceph 网络
Ceph 的网络配置要放到 [global] 段下。前述的 5 分钟快速入门提供了一个简陋的 Ceph 配置文件,它假设服务器和客户端都位于同一网段, Ceph 可以很好地适应这种情形。然而 Ceph 允许配置更精细的公共网,包括多 IP 和多掩码;也能用单独的集群网处理 OSD 心跳、对象复制、和恢复流量。不要混淆你配置的 IP 地址和客户端用来访问存储服务的公共网地址。典型的内网常常是 192.168.0.0 或 10.0.0.0 。
如果你给公共网或集群网配置了多个 IP 地址及子网掩码,这些子网必须能互通。另外要确保在防火墙上为各 IP 和子网开放了必要的端口。
Ceph 用 CIDR 法表示子网,如 10.0.0.0/24 。
配置完几个网络后,可以重启集群或挨个重启守护进程。 Ceph 守护进程动态地绑定端口,所以更改网络配置后无需重启整个集群。
公共网
要配置一个公共网,把下列选项加到配置文件的 [global] 段下。
[global]
...
public network = {public-network/netmask}
集群网
如果你声明了集群网, OSD 将把心跳、对象复制和恢复流量路由到集群网,与单个网络相比这会提升性能。要配置集群网,把下列选项加进配置文件的 [global] 段。
[global]
...
cluster network = {cluster-network/netmask}
为安全起见,从公共网或互联网到集群网应该是不可达的。
3.Ceph 守护进程
有一个网络配置是所有守护进程都要配的:各个守护进程都必须指定 host , Ceph 也要求指定监视器 IP 地址及端口。
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 号。另外,公共网和集群网必须互通,考虑到安全因素我们不建议这样做。
4.网络配置选项
网络配置选项不是必需的, 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 获取主机名(到第一个点,不是全资域名),并用于配置文件。
用第三方部署工具时不要指定 host 选项,它会自行获取。
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.
监视器
典型的 Ceph 生产集群至少部署 3 个监视器来确保高可靠性,它允许一个监视器例程崩溃。奇数个监视器( 3 个)确保 PAXOS 算法能确定一批监视器里哪个版本的集群运行图是最新的。
一个 Ceph 集群可以只有一个监视器,但是如果它失败了,因没有监视器数据服务就会中断。
Ceph 监视器默认监听 6789 端口,例如:
[mon.a]
host = hostName
mon addr = 150.140.130.120:6789
默认情况下, Ceph 会在下面的路径存储监视器数据:
/var/lib/ceph/mon/$cluster-$id
你必须手动或通过部署工具(如 ceph-deploy )创建对应目录。前述元变量必须先全部展开,名为 “ceph” 的集群将展开为:
/var/lib/ceph/mon/ceph-a
认证
对于 v0.56 及后来版本,要在配置文件的 [global] 中明确启用或禁用认证。
[global]
auth cluster required = cephx
auth service required = cephx
auth client required = cephx
另外,你应该启用消息签名,详情见 Cephx 配置参考和 Cephx 认证。
建议,升级时先明确地关闭认证,再进行升级。等升级完成后再重新启用认证。
OSDs
通常, Ceph 生产集群在一个节点上只运行一个 Ceph OSD 守护进程,此守护进程在一个存储驱动器上只运行一个 filestore ;典型部署需指定日志尺寸。例如:
[osd]
osd journal size = 10000
[osd.0]
host = {hostname} #manual deployments only.
默认情况下, Ceph 认为你把 OSD 数据存储到了以下路径:
/var/lib/ceph/osd/$cluster-$id
你必须手动或通过部署工具(如 ceph-deploy )创建对应目录,名为 “ceph” 的集群其元变量完全展开后,前述的目录将是:
/var/lib/ceph/osd/ceph-0
你可以用 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}
我们推荐用 xfs 或 btrfs 文件系统,命令是 :command:mkfs 。
配置详细步骤见 OSD 配置参考。
心跳
在运行时, OSD 守护进程会相互检查邻居 OSD 、并把结果报告给 Ceph 监视器,一般不需要更改默认配置。但如果你的网络延时比较大,也许需要更改某些选项。
其它细节部分见监视器与 OSD 交互的配置。
日志、调试
有时候你可能遇到一些麻烦,需要修改日志或调试选项,请参考调试和日志记录。