• 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.conf (就是当前所在的工作路径)。

    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 交互的配置。

    日志、调试

    有时候你可能遇到一些麻烦,需要修改日志或调试选项,请参考调试和日志记录。

  • 相关阅读:
    NLog 在NetCore中实现多实例注入DI, 实现多租户模式
    Linux命令入门篇(二)
    Linux命令入门篇(一)
    uni-app初探之幸运轮盘
    uni-app初探之天气预报小例子
    iOS 底层原理之—dyld 与 objc 的关联
    QT OpenGLWidget高分屏适配时出现的问题
    基于React.js网页版弹窗|react pc端自定义对话框组件RLayer
    面向对象的六大原则
    android混淆日记
  • 原文地址:https://www.cnblogs.com/sanduzxcvbnm/p/15636703.html
Copyright © 2020-2023  润新知