Ceph 笔记(一)

Ceph 是一个符合POSIX、开源的分布式存储系统;其具有了极好的可靠性、统一性、鲁棒性;通过近几年的发展,Ceph 开辟了一个全新的数据存储途径。Ceph 具有了企业级存储的分布式、可大规模扩展、没有单点故障等特色,愈来愈受到人们青睐;如下记录了 Ceph 的相关学习笔记。
node

1、 Ceph Quick Start

1.一、安装前准备

本文以 Centos 7 3.10 内核为基础环境,节点为 4 台 Vagrant 虚拟机;Ceph 版本为 Jewel.算法

首先须要一台部署节点,这里使用的是宿主机;在部署节点上须要安装一些部署工具,以下docker

# 安装 EPEL 源yum install -y epel-release# 添加 ceph 官方源cat << EOF >> /etc/yum.repos.d/ceph.repo
[ceph-noarch]
name=Ceph noarch packages
baseurl=https://download.ceph.com/rpm-jewel/el7/noarch
enabled=1
gpgcheck=1
type=rpm-md
gpgkey=https://download.ceph.com/keys/release.asc
EOF# 安装部署工具yum update -y && yum install ceph-deploy -y

同时,ceph-deploy 工具须要使用 ssh 来自动化部署 Ceph 各个组件,所以须要保证部署节点可以免密码登陆待部署节点;最后,待部署节点最好加入到部署节点的 hosts 中,方便使用域名(某些地方强制)链接管理编程

1.二、校对时钟

因为 Ceph 采用 Paxos 算法保证数据一致性,因此安装前须要先保证各个节点时钟同步json

# 安装 ntp 工具yum install ntp ntpdate ntp-doc -y# 校对系统时钟ntpdate 0.cn.pool.ntp.org

1.三、建立集群配置

ceph-deploy 工具部署集群前须要建立一些集群配置信息,其保存在 ceph.conf 文件中,这个文件将来将会被复制到每一个节点的 /etc/ceph/ceph.confcentos

# 建立集群配置目录mkdir ceph-cluster && cd ceph-cluster# 建立 monitor-nodeceph-deploy new docker1# 追加 OSD 副本数量(测试虚拟机总共有3台)echo "osd pool default size = 3" >> ceph.conf

1.四、建立集群

建立集群使用 ceph-deploy 工具便可网络

# 安装 ceph
ceph-deploy install docker1 docker2 docker3
# 初始化 monitor node 和 秘钥文件
ceph-deploy mon create-initial
# 在两个 osd 节点建立一个目录做为 osd 存储
mkdir /data
chown -R ceph:ceph /data
# 初始化 osd
ceph-deploy osd prepare docker1:/data docker2:/data docker3:/data
# 激活 osd
ceph-deploy osd activate docker1:/data docker2:/data docker3:/data
# 部署 ceph cli 工具和秘钥文件
ceph-deploy admin docker1 docker2 docker3
# 确保秘钥有读取权限
chmod +r /etc/ceph/ceph.client.admin.keyring
# 检测集群状态
ceph health

执行 ceph health 命令后应当返回 HEALTH_OK;如出现 HEALTH_WARN clock skew detected on mon.docker2; Monitor clock skew detected,说明时钟不一样步,手动同步时钟稍等片刻后便可;其余错误能够经过以下命令重置集群从新部署session

ceph-deploy purge {ceph-node} [{ceph-node}]ceph-deploy purgedata {ceph-node} [{ceph-node}]ceph-deploy forgetkeys

更多细节,如防火墙、SELinux配置等请参考 官方文档架构

1.五、其余组件建立

# 建立 MDSceph-deploy mds create docker1# 建立 RGWceph-deploy rgw create docker1# 增长 monitorecho "public network = 192.168.1.0/24" >> ceph.conf
ceph-deploy --overwrite-conf mon create docker2 docker3# 查看仲裁信息ceph quorum_status --format json-pretty

2、Ceph 组件及测试

2.一、Ceph 架构图

如下图片(摘自网络)展现了基本的 Ceph 架构less

ceph 架构

  • OSD: Ceph 实际存储数据单元被称为 OSD,OSD 可使用某个物理机的目录、磁盘设备,甚至是 RAID 阵列;

  • MON: 在 OSD 之上则分布着多个 MON(monitor),Ceph 集群内组件的状态信息等被维护成一个个 map,而 MON 则负责维护集群全部组件 map 信息,各个集群内组件心跳请求 MON 以确保其 map 保持最新状态;当集群发生故障时,Ceph 将采用 Paxos 算法保证数据一致性,这其中仲裁等主要由 MON 完成,因此 MON 节点建议最少为 3 个,而且为奇数以防止脑裂状况的发生;

  • MDS: Ceph 自己使用对象形式存储数据,而对于外部文件系统访问支持则提供了上层的 CephFS 接口;CephFS 做为文件系统接口则须要一些元数据,这些原数据就存放在 MDS 中;目前 Ceph 只支持单个 MDS 工做,可是能够经过设置 MDS 副本,以保证 MDS 的可靠性

  • RADOS: RADOS 全称 Reliable Autonomic Distributed Object Store,便可靠分布式对象存储;其做为在整个 Ceph 集群核心基础设施,向外部提供基本的数据操做

  • librados: 为了支持私有云等程序调用,Ceph 提供了 C 实现的 API 库 librados,librados 能够支持主流编程语言直接调用,沟通 RADOS 完成数据存取等操做

  • RBD: RDB 我的理解是一个命令行工具,通常位于宿主机上,经过该工具能够直接跟 librados 交互,实现建立存储对象,格式化 Ceph 块设备等操做

  • RADOS GW: 从名字能够看出来,这个组件是一个代理网关,经过 RADOS GW 能够将 RADOS 响应转化为 HTTP 响应,一样能够将外部 HTTP 请求转化为 RADOS 调用;RADOS GW 主要提供了三大功能: 兼容 S3 接口、兼容 Swift 接口、提供管理 RestFul API

下图(摘自网络)从应用角度描述了 Ceph 架构

APP Ceph 架构

2.二、对象存储测试

此处直接上代码

# 建立测试文件dd if=/dev/zero of=test bs=1G count=1# 建立对象存储池rados mkpool data# 放入对象rados put test-file test --pool=data# 检查存储池rados -p data ls# 检查对象信息ceph osd map data test-file# 删除对象rados -p data rm test-file# 删除存储池(存储池写两遍而且加上确认)rados rmpool data data --yes-i-really-really-mean-it

2.三、块设备测试

官方文档中提示,使用 rdb 的客户端不建议与 OSD 等节点在同一台机器上

You may use a virtual machine for your ceph-client node, but do not execute the following procedures on the same physical node as your Ceph Storage Cluster nodes (unless you use a VM). See FAQ for details.

这里从第四台虚拟机上执行操做,首先安装所需客户端工具

# 部署节点上 ceph-cluster 目录下执行ceph-deploy install docker4
ceph-deploy admin docker4

而后建立块设备

# 块设备单位为 MBrbd create data --size 10240# 映射块设备map foo --name client.admin

在上面的 map 映射操做时,可能出现以下错误

RBD p_w_picpath feature set mismatch. You can disable features unsupported by the kernel with "rbd feature disable"

查看系统日志能够看到以下输出

  ~ dmesg | tail[-1127592253.530346] rbd: p_w_picpath data: p_w_picpath uses unsupported features: 0x38[-1127590337.563180] libceph: mon0 192.168.1.11:6789 session established[-1127590337.563741] libceph: client4200 fsid dd9fdfee-438a-47aa-be21-114372bc1f44

问题缘由: 在 Ceph 高版本进行 map p_w_picpath 时,默认 Ceph 在建立 p_w_picpath(上文 data)时会增长许多 features,这些 features 须要内核支持,在 Centos7 的内核上支持有限,因此须要手动关掉一些 features

首先使用 rbd info data 命令列出建立的 p_w_picpath 的 features

rbd p_w_picpath 'data':
        size 10240 MB in 2560 objects
        order 22 (4096 kB objects)
        block_name_prefix: rbd_data.37c6238e1f29
        format: 2
        features: layering, exclusive-lock, object-map, fast-diff, deep-flatten
        flags:

在 features 中咱们能够看到默认开启了不少:

  • layering: 支持分层

  • striping: 支持条带化 v2

  • exclusive-lock: 支持独占锁

  • object-map: 支持对象映射(依赖 exclusive-lock)

  • fast-diff: 快速计算差别(依赖 object-map)

  • deep-flatten: 支持快照扁平化操做

  • journaling: 支持记录 IO 操做(依赖独占锁)

而实际上 Centos 7 的 3.10 内核只支持 layering… 因此咱们要手动关闭一些 features,而后从新 map;若是想要一劳永逸,能够在 ceph.conf 中加入 rbd_default_features = 1 来设置默认 features(数值仅是 layering 对应的 bit 码所对应的整数值)。

# 关闭不支持特性rbd feature disable data exclusive-lock, object-map, fast-diff, deep-flatten# 从新映射rbd map data --name client.admin# 成功后返回设备位置/dev/rbd0

最后咱们即可以格式化正常挂载这个设备了

  ~ mkfs.xfs /dev/rbd0
meta-data=/dev/rbd0              isize=512    agcount=17, agsize=162816 blks         =                       sectsz=512   attr=2, projid32bit=1         =                       crc=1        finobt=0, sparse=0
data     =                       bsize=4096   blocks=2621440, imaxpct=25         =                       sunit=1024   swidth=1024 blks
naming   =version 2              bsize=4096   ascii-ci=0 ftype=1
log      =internal log           bsize=4096   blocks=2560, version=2         =                       sectsz=512   sunit=8 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0
  ~ mkdir test1
  ~ mount /dev/rbd0 test1# 写入测试  ~ dd if=/dev/zero of=test1/test-file bs=1G count=1
记录了1+0 的读入
记录了1+0 的写出
1073741824字节(1.1 GB)已复制,16.3689 秒,65.6 MB/秒
  ~ ls test1test-file

2.四、CephFS 测试

在测试 CephFS 以前须要先建立两个存储池和一个 fs,建立存储池要指定 PG 数量

ceph osd pool create cephfs_data 32
ceph osd pool create cephfs_metadata 32
ceph fs new testfs cephfs_metadata cephfs_data

PG 概念:

当 Ceph 集群接收到存储请求时,Ceph 会将其分散到各个 PG 中,PG 是一组对象的逻辑集合;根据 Ceph 存储池的复制级别,每一个 PG的数据会被复制并分发到集群的多个 OSD 上;通常来讲增长 PG 数量能下降 OSD 负载,通常每一个 OSD 大约分配 50 ~ 100 PG,关于 PG 数量通常遵循如下公式

  • 集群 PG 总数 = (OSD 总数 * 100) / 数据最大副本数

  • 单个存储池 PG 数 = (OSD 总数 * 100) / 数据最大副本数 /存储池数

注意,PG 最终结果应当为最接近以上计算公式的 2 的 N 次幂(向上取值);如个人虚拟机环境每一个存储池 PG 数 = 3(OSD) * 100 / 3(副本) / 5(大约 5 个存储池) = 20,向上取 2 的 N 次幂 为 32

挂载 CephFS 通常有两种方式,一种是使用内核驱动挂载,一种是使用 ceph-fuse 用户空间挂载;内核方式挂载须要提取 Ceph 管理 key,以下

# key 在 ceph.conf 中echo "AQB37CZZblBkDRAAUrIrRGsHj/NqdKmVlMQ7ww==" > ceph-key# 建立目录挂载mkdir test2
mount -t ceph 192.168.1.11:6789:/ /root/test2 -o name=admin,secretfile=ceph-key# 写入测试  ~ dd if=/dev/zero of=test2/testFs bs=1G count=1
记录了1+0 的读入
记录了1+0 的写出
1073741824字节(1.1 GB)已复制,6.83251 秒,157 MB/秒

使用 ceph-fuse 用户空间挂载方式比较简单,但须要先安装 ceph-fuse 软件包

# 安装 ceph-fuseyum install -y ceph-fuse# 挂载mkdir test3
ceph-fuse -m 192.168.1.11:6789 test3# 写入测试  ~ dd if=/dev/zero of=test3/testFs bs=1G count=1
记录了1+0 的读入
记录了1+0 的写出
1073741824字节(1.1 GB)已复制,8.18417 秒,131 MB/秒

2.五、对象网关测试

对象网关在 1.五、其余组件建立 部分已经作了建立(RGW),此时直接访问 http://ceph-node-ip:7480返回以下

<ListAllMyBucketsResult xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
    <Owner>
        <ID>anonymous</ID>
        <DisplayName/>
    </Owner>
    <Buckets/></ListAllMyBucketsResult>

这就说明网关已经 ok,因为手里没有能读写测试工具,这里暂不作过多说明

本文主要参考 Ceph 官方文档 Quick Start 部分,若有其它未说明到的细节可从官方文档获取

转载请注明出处,本文采用 CC4.0 协议受权


本文转自: https://mritd.me/2017/05/27/ceph-note-1/

相关文章
相关标签/搜索