ceph学习

网络:

ceph必须要有公共网络和集群网络:

public network:负责客户端交互以及osd与mon之间的通讯

cluster network:负责osd之间的复制,均衡,回填,数据恢复等操作。

主机上的各个 OSD 最多会用到 4 个端口:

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

OSD 守护进程默认绑定 从 6800 起的第一个可用端口,当某个守护进程失败并重启时没释放端口,重启后的进程就会监听新端口。你应该防火墙打开整个 6800-7300 端口区间,以应对这种可能性。

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

典型的 Ceph 生产集群至少部署 3 个mon确保高可靠性,它允许一个监视器例程崩溃。奇数个监视器( 3 个)确保 PAXOS 算法能确定一批监视器里哪个版本的集群运行图是最新的,一个 Ceph 集群可以只有一个监视器,但是如果它失败了,因没有监视器数据服务就会中断。

 ceph有两种保证数据安全的措施:

1.副本(默认3份)

2.纠错码(类似raid5)

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

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

查看运行时配置:

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

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

ceph daemon osd.0 config show | less

修改运行时配置:

ceph tell {daemon-type}.{id or *} injectargs --{name} {value} [--{name} {value}]
eg:
ceph tell osd.0 injectargs --debug-osd 20 --debug-ms 1


用 Ceph 可以实现在同一套硬件上运行多个集群,不同的集群使用不同的配置文件,独立的集群意味着独立数据盘和日志,它们不能在集群间共享,在一台主机上运行多个监视器时,你得指定不同端口。监视器默认使用 6789 端口,如果它已经被占,其它集群得指定其它端口。

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

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

启用 CEPHX

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

禁用 CEPHX

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

把以下配置加入 Ceph 配置文件的 [global] 段下以启用 cephx 认证:

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

把下列配置加入 Ceph 配置文件的 [global] 段下即可禁用 cephx 认证:
auth cluster required = none
auth service required = none
auth client required = none

Mon:

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

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

我们建议在生产环境下最少部署 3 个监视器,以确保高可用性。

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

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

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

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

mon data  

默认值:/var/lib/ceph/mon/$cluster-$id

注意:Ceph 存储集群利用率接近最大容量时(即 mon osd full ratio ),作为防止数据丢失的安全措施,它会阻止你读写 OSD 。 full ratio 默认值是 .95 或容量的 95% 。对小型测试集群来说这是非常激进的设置。

[global]

        mon osd full ratio = .80
        mon osd nearfull ratio = .70
各 OSD 每 6 秒会与其他 OSD 进行心跳检查,用 [osd] 下的 osd heartbeat interval 可更改此间隔、或运行时更改。如果一个 OSD 20 秒都没有心跳,集群就认为它 down 了,用 [osd] 下的 osd heartbeatgrace 可更改宽限期、或者运行时更改。 OSD 守护进程每 120 秒会向监视器报告其状态,不论是否有值得报告的事件。在 [osd] 段下设置 osd mon reportinterval max 可更改OSD报告间隔,或运行时更改。

journal:

默认情况下, Ceph 会把 OSD 日志存储于下列路径:/var/lib/ceph/osd/$cluster-$id/journal,生产环境中为了提高性能,会用机械硬盘存储osd数据,用ssd盘存储journal.

osd journal size 默认值是 0 ,所以你得在 ceph.conf 里设置。日志尺寸应该是 filestore max sync interval 与期望吞吐量的乘积再乘以 2 。

osd journal size = {2 * (expected throughput * filestore max sync interval)}

scrub:

除了为对象复制多个副本外, Ceph 还要洗刷归置组以确保数据完整性。这种洗刷类似对象存储层的 fsck ,对每个归置组, Ceph 生成一个所有对象的目录,并比对每个主对象及其副本以确保没有对象丢失或错配。轻微洗刷(每天)检查对象尺寸和属性,深层洗刷(每周)会读出数据并用校验和方法确认数据完整性

osd scrub begin hour:    开始scrub的时间

osd scrub end hour停止scrub的时间
上面两个时间决定了能进行scrub操作的时间段

ceph故障域:

CRUSH 要把归置组分配到 OSD 时,它先查询这个存储池的副本数设置,再把归置组分配到 OSD ,这样就把各副本分配到了不同 OSD 。比如,如果存储池要求归置组有 3 个副本, CRUSH 可能把它们分别分配到 osd.1 osd.2 、 osd.3 。考虑到你设置于 CRUSH map中的故障域,实际上 CRUSH 找出的是伪随机位置,所以在大型集群中,你很少能看到归置组被分配到了相邻的 OSD 。我们把涉及某个特定归置组副本的一组 OSD 称为 acting set 。同一个object的存放副本 的osd有一个主osd,如果主osd挂了,另外的会副本会接替主osd的工作。客户端像ceph写入数据时Ceph 不会向客户端确认写操作,直到 acting set 里的所有 OSD 都完成了写操作。这样处理保证了从上次成功互联起, acting set 中至少有一个成员确认了每个写操作就行,不用全部成员确认。

 

PG:

当你创建存储池并给它设置归置组数量时,如果你没指定 Ceph 就用默认值。我们建议更改某些默认值,特别是存储池的副本数和默认归置组数量,可以在运行 pool 命令的时候设置这些值。你也可以把配置写入 Ceph 配置文件的 [global] 段来覆盖默认值。要设置某存储池的归置组数量,你必须在创建它时就指定好,一存储池的归置组数量设置好之后,还可以增加(但不可以减少)

PG总数=OSD的总数乘以100除以复制副本数:

osd pool default pg num = 200
osd pool default pgp num = 200

ceph osd pool get {pool-name} pg_num   #获取指定pool的pg数

ceph pg scrub {pg-id}   #手动清洗数据

获取卡住的归置组统计信息

要获取所有卡在某状态的归置组统计信息,执行命令:

ceph pg dump_stuck inactive|unclean|stale|undersized|degraded [--format <format>] [-t|--threshold <seconds>]

Inactive (不活跃)归置组不能处理读写,因为它们在等待一个有最新数据的 OSD 复活且进入集群。

Unclean (不干净)归置组含有复制数未达到期望数量的对象,它们应该在恢复中。

Stale (不新鲜)归置组处于未知状态:存储它们的 OSD 有段时间没向监视器报告了(由 mon_osd_report_timeout 配置)。

可用格式有 plain (默认)和 json 。阀值定义的是,归置组被认为卡住前等待的最小时间(默认 300 秒)。

ceph认证:

ceph auth list:              #列出所有用户信息
ceph auth get client.cinder #列出指定用户信息
ceph auth add client.john mon 'allow r' osd 'allow rw pool=liverpool'                                     #创建用户
ceph auth get-or-create client.paul mon 'allow r' osd 'allow rw pool=liverpool'                    #创建用户,并返回用户名和Key,如果存在就忽略,-o 参数可以将返回内容写到文件
ceph auth get-or-create-key client.ringo mon 'allow r' osd 'allow rw pool=liverpool' -o ringo.key  #创建用户,并返回Key,如果存在就忽略,-o 参数可以将返回内容写到文件
ceph auth caps client.test2 mon 'allow *' osd 'allow * pool=vms' #修改用户权限
ceph auth del client.test #删除用户
ceph auth print-key client.test2 #查看用户密钥
ceph auth import -i /etc/ceph/ceph.keyring #从密钥导入用户
cephx 协议已默认开启。加密认证要耗费一定计算资源,但通常很低。如果您的客户端和服务器网络环境相当安全,而且认证的负面效应更大,你可以关闭它,通常不推荐您这么做
eg:
mount -t ceph serverhost:/ mountpoint -o name=client.user,secret=`ceph auth print-key client.user`



存储池(pool):

ceph osd lspools    #列出存储池

ceph osd pool create {pool-name} {pg-num} [{pgp-num}] [replicated]  [crush-ruleset-name] [expected-num-objects]    #创建存储池

ceph osd pool set-quota data max_objects 10000                                                      #设置配额

rados df                                                                                            #统计存储池使用信息

ceph osd pool delete <poolname><poolname> --yes-i-really-really-mean-it                             #删除pool

缓存:

  • 回写模式: 管理员把缓存层配置为 writeback 模式时, Ceph 客户端们会把数据写入缓存层、并收到缓存层发来的 ACK ;写入缓存层的数据会被迁移到存储层、然后从缓存层刷掉。直观地看,缓存层位于后端存储层的“前面”,当 Ceph 客户端要读取的数据位于存储层时,缓存层代理会把这些数据迁移到缓存层,然后再发往 Ceph 客户端。从此, Ceph 客户端将与缓存层进行 I/O 操作,直到数据不再被读写。此模式对于易变数据来说较理想(如照片/视频编辑、事务数据等)。
  • 只读模式: 管理员把缓存层配置为 readonly 模式时, Ceph 直接把数据写入后端。读取时, Ceph 把相应对象从后端复制到缓存层,根据已定义策略、脏对象会被缓存层踢出。此模式适合不变数据(如社交网络上展示的图片/视频、 DNA 数据、 X-Ray 照片等),因为从缓存层读出的数据可能包含过期数据,即一致性较差。对易变数据不要用 readonly 模式。

设置后端存储池通常会遇到两种场景:

  • 标准存储: 此时,Ceph存储集群内的存储池保存了一对象的多个副本;
  • 纠删存储池: 此时,存储池用纠删码高效地存储数据,性能稍有损失。

某云计算平台稳定运行的ceph配置文件实例:

cat /etc/ceph/ceph.conf

[global]
fsid = 5b0e3d77-94c6-4dce-be5a-cc45e6d6e221
mon_initial_members = region3mon1, region3mon2, region3mon3
mon_host = 172.18.74.67,172.18.74.68,172.18.74.69
auth_cluster_required = cephx
auth_service_required = cephx
auth_client_required = cephx
filestore_xattr_use_omap = true
mon_clock_drift_allowed = 5
mon_clock_drift_warn_backoff = 30

public_network = 172.18.74.0/24
cluster_network = 172.18.70.0/24
osd_pool_default_min_size = 2
osd_pool_default_pg_num = 1024
osd_pool_default_pgp_num = 1024

osd_scrub_begin_hour = 22
osd_scrub_end_hour = 6
osd_backfill_scan_min = 4
osd_backfill_scan_max = 16
osd_backfill_full_ratio = 0.85
osd_recovery_op_priority = 2


osd_max_backfills=1
osd_recovery_max_active=1
mon_osd_down_out_interval = 12960

原文地址:https://www.cnblogs.com/dufeixiang/p/10594501.html