参考文档:https://wiki.deimos.fr/Ceph_:_performance,_reliability_and_scalability_storage_solution

Ceph 版本选择

1. Ceph的版本发布周期

Ceph 当前的最新的LTS版本为 mimic 13.2.x 和 luminous12.2.x, 通过release信息可以查看到相关发布信息.在具体的版本中会说明是否是LTS版本。

每年大约会发布三到四个稳定版,每个稳定版都有个名字(如 ‘Firefly’ ),并且会一直提供缺陷修复,至少持续到下一个稳定版发布。

其它稳定版都是 LTS ( Long Term Stable ,长期稳定)的,而且会持续更新,直到发布了两个 LTS 。比如 Hammer 发布之后 Dumpling 才隐退, Jewel 发布之后 Firefly 才隐退,以此类推。基本原理就是,为了修复缺陷和移植某些重要功能,对 LTS (如 Dumpling )的移植会一直持续到下一个 LTS 发布( Firefly 就是 Dumpling 之后的一个 LTS )。下一个 LTS 发布后,还有可能移植缺陷修正,主要取决于这些问题是否会妨碍升级到下一个 LTS (这里有个实例, Firefly 发布后还在修复 Dumpling ,一直持续到 Hammer 发布,主要是确保 Dumpling 可以平滑地迁移到 Firefly )。

  • LTS (长期稳定):直到后续两个 LTS 发布
  • 稳定版:直到下一个稳定版发布
  • 开发、或测试版:不会给它移植

2. 版本约定

第一个 Ceph 版本是 0.1 ,要回溯到 2008 年 1 月。多年来,版本号方案一直没变,直到 2015 年 4 月 0.94.1 ( Hammer 的第一个修正版)发布后,为了避免 0.99 (以及 0.100 或 1.00 ?),我们制定了新策略。

  • x.0.z - 开发版(给早期测试者和勇士们)
  • x.1.z - 候选版(用于测试集群、高手们)
  • x.2.z - 稳定、修正版(给用户们)

x 将从 9 算起,它代表 Infernalis ( I 是第九个字母),这样我们第九个发布周期的第一个开发版就是 9.0.0 ;后续的开发版依次是 9.0.1 、 9.0.2 等等。

3. 硬件推荐和系统要求

具体介绍可以参考官方文档:
硬件需求说明: http://docs.ceph.com/docs/master/start/hardware-recommendations/
系统需求说明:http://docs.ceph.com/docs/master/start/os-recommendations/

4. 部署说明

Ceph有两种安装方式: 手动部署和使用 ceph-deploy工具部署。
手动部署比较繁琐,但是对于初学者而言更加容易理解。 ceph-deploy部署工具的方式适用于大规模集群的部署。
这里会分别演示两种部署方式。

ceph-12 luminous版本rpm包地址:https://download.ceph.com/rpm-luminous

ceph-13 mimic版本rpm包地址:https://download.ceph.com/rpm-mimic

使用ceph-deploy部署集群

官方文档

0. 部署前的准备

在部署之前需要准备好三台CentOS主机,我这里使用的是CentOS7.5,并将系统内核升级到4.x长期支持版本,相关的配置信息如下:

  1. 节点主机名和IP信息
local-node-1: 10.0.0.1
local-node-2: 10.0.0.2
local-node-3: 10.0.0.3
  1. 配置hosts解析三台节点的主机名,并将三台节点配置为无密码认证模式。

  2. 关闭防火墙和Selinux

  3. 每台主机节点至少添加一块磁盘用于ceph存储,在实际的生产中可以将多块盘做raid,ceph 在添加磁盘时会自动格式化,所以此处不需要格式化。

  4. ceph对节点之间时间的要求很高,需要安装ntp并做好时间同步,配置好epel源。

1. 所有节点安装依赖包

yum install snappy  leveldb gdisk python-argparse gperftools-libs  -y

添加yum 源,导入key,这里我使用最新的mimic版本:

rpm --import 'https://download.ceph.com/keys/release.asc'
su -c 'rpm -Uvh https://download.ceph.com/rpm-mimic/el7/noarch/ceph-release-1-0.el7.noarch.rpm'

由于国内的网络问题,这里可以选择使用阿里云的源,修改repo文件如下:

[Ceph]
name=Ceph packages for $basearch
baseurl=https://mirrors.aliyun.com/ceph/rpm-mimic/el7/$basearch
enabled=1
gpgcheck=1
type=rpm-md
gpgkey=https://download.ceph.com/keys/release.asc

[Ceph-noarch]
name=Ceph noarch packages
baseurl=https://mirrors.aliyun.com/ceph/rpm-mimic/el7/noarch
enabled=1
gpgcheck=1
type=rpm-md
gpgkey=https://download.ceph.com/keys/release.asc

[ceph-source]
name=Ceph source packages
baseurl=https://mirrors.aliyun.com/ceph/rpm-mimic/el7/SRPMS
enabled=1
gpgcheck=1
type=rpm-md
gpgkey=https://download.ceph.com/keys/release.asc

2. 仅在部署节点安装 ceph-deploy工具

yum install ceph-deploy -y

3. 使用ceph-deploy部署节点

1).创建存放ceph配置文件的目录:
mkdir /opt/ceph-cluster
2). 进入配置文件目录,初始化node-1节点:
[root@local-node-1 ~]# cd /opt/ceph-cluster/
[root@local-node-1 ceph-cluster]# ceph-deploy  new local-node-1

==提示==:如果在执行ceph-deploy命令时出现如下错误,则需要安装pyhon2-pip

# ceph-deploy new local-node-1

Traceback (most recent call last):
  File "/usr/bin/ceph-deploy", line 18, in <module>
    from ceph_deploy.cli import main
  File "/usr/lib/python2.7/site-packages/ceph_deploy/cli.py", line 1, in <module>
    import pkg_resources
ImportError: No module named pkg_resources

# 解决办法,安装python2-pip
yum install python2-pip* -y

命令执行成功后会在当前目录生成多个配置文件。

[root@local-node-1 ceph-cluster]# ll
total 12
-rw-r--r-- 1 root root  198 Feb 15 15:37 ceph.conf
-rw-r--r-- 1 root root 2993 Feb 15 15:37 ceph-deploy-ceph.log
-rw------- 1 root root   73 Feb 15 15:37 ceph.mon.keyring

如果有多个不同的网络接口(通常ceph集群会分公共网络为和集群网络,也称为public network和Cluster network),在生产环境中都会将这两个网络分开使用不同的网络接口,可以在ceph.conf配置文件的[global]区域添加如下参数:

public network = {ip-address}/{netmask}    # 公共网络,用于集群中访问ceph存储数据和ceph自身的监控和控制数据
cluster network = {cluster-network/netmask}  # 集群网络,用于ceph osd之间互相同步复制ceph集群数据

如果不进行配置,默认只会使用公共网络(public network),生产环境严禁这样做。

3). 安装ceph到各个节点,各个节点执行:
yum install ceph ceph-radosgw -y

在网络正常的情况下也可以使用ceph-deploy来批量部署,实际效果和上述yum安装软件一样:

ceph-deploy install --release mimic local-node-1 local-node-2 local-node-3

在国内网络不好的情况下,不推荐这么做,执行此命令之后,我们通过前台输出,可以发现这步操作做了如下工作:

  • 移除安装节点上已经存在的yum源
  • 更新主机节点上的yum源,这个源是官方源,由于网络原因有可能会造成安装不成功
  • 执行yum -y install ceph ceph-radosgw 命令安装ceph
4). 检查各个节点是否安装成功:
[root@local-node-1 ~]# ceph -v
ceph version 13.2.4 (b10be4d44915a4d78a8e06aa31919e74927b142e) mimic (stable)

查看节点状态发现属于不健康的状态:

[root@local-node-1 ~]# ceph status
2019-02-15 16:59:28.897 7f8a67b8c700 -1 auth: unable to find a keyring on /etc/ceph/ceph.client.admin.keyring,/etc/ceph/ceph.keyring,/etc/ceph/keyring,/etc/ceph/keyring.bin,: (2) No such file or directory
2019-02-15 16:59:28.897 7f8a67b8c700 -1 monclient: ERROR: missing keyring, cannot use cephx for authentication
[errno 2] error connecting to the cluster
5). 在node-1节点上创建monitor,会在当前目录生成几个key:
[root@local-node-1 ceph-cluster]# ceph-deploy  mon create-initial
6). 分发key
[root@local-node-1 ceph-cluster]# ceph-deploy admin local-node-1 local-node-2 local-node-3
7). 创建一个管理进程(只有在luminous+ 以上版本才有此功能 >= 12.x版本)
[root@local-node-1 ceph-cluster]# ceph-deploy mgr create local-node-1
8). 查看节点上的可用磁盘,排除系统盘
# ceph-deploy disk list local-node-1
...
[local-node-1][INFO  ] Disk /dev/sda: 10.7 GB, 10737418240 bytes, 20971520 sectors
[local-node-1][INFO  ] Disk /dev/sdb: 10.7 GB, 10737418240 bytes, 20971520 sectors
9).格式化node-1节点用于ceph存储的磁盘

使用disk zap命令会抹掉磁盘上的分区和数据

[root@local-node-1 ceph-cluster]# ceph-deploy disk zap local-node-1 /dev/sdb

创建OSD磁盘,添加三个节点的三个磁盘:

[root@local-node-1 ceph-cluster]# ceph-deploy osd create --data /dev/sdb local-node-1
[root@local-node-1 ceph-cluster]# ceph-deploy osd create --data /dev/sdb local-node-2
[root@local-node-1 ceph-cluster]# ceph-deploy osd create --data /dev/sdb local-node-3

==注意:== 如果使用LVM逻辑卷来添加OSD,应该使用参数 --data volume_group/lv_name 而不是直接使用逻辑卷的路径。

10). 查看集群状态是否正常
[root@local-node-1 ceph-cluster]# ceph health
HEALTH_OK

[root@local-node-1 ceph-cluster]# ceph -s
  cluster:
    id:     6a4812f7-83cb-43e5-abac-f2b8e37db127
    health: HEALTH_OK

  services:
    mon: 1 daemons, quorum local-node-1
    mgr: local-node-1(active)
    osd: 3 osds: 3 up, 3 in

  data:
    pools:   0 pools, 0 pgs
    objects: 0  objects, 0 B
    usage:   3.0 GiB used, 27 GiB / 30 GiB avail
    pgs:     

检查节点端口信息:

[root@local-node-1 ceph-cluster]# netstat -lntp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      859/sshd            
tcp        0      0 10.0.0.1:6789           0.0.0.0:*               LISTEN      2893/ceph-mon       
tcp        0      0 0.0.0.0:6800            0.0.0.0:*               LISTEN      3815/ceph-osd       
tcp        0      0 0.0.0.0:6801            0.0.0.0:*               LISTEN      3815/ceph-osd       
tcp        0      0 0.0.0.0:6802            0.0.0.0:*               LISTEN      3815/ceph-osd       
tcp        0      0 0.0.0.0:6803            0.0.0.0:*               LISTEN      3815/ceph-osd       
tcp        0      0 0.0.0.0:6804            0.0.0.0:*               LISTEN      4049/ceph-mgr       
tcp6       0      0 :::22                   :::*                    LISTEN      859/sshd         

[root@local-node-2 /]# netstat -lntp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      860/sshd            
tcp        0      0 0.0.0.0:6800            0.0.0.0:*               LISTEN      2439/ceph-osd       
tcp        0      0 0.0.0.0:6801            0.0.0.0:*               LISTEN      2439/ceph-osd       
tcp        0      0 0.0.0.0:6802            0.0.0.0:*               LISTEN      2439/ceph-osd       
tcp        0      0 0.0.0.0:6803            0.0.0.0:*               LISTEN      2439/ceph-osd       
tcp6       0      0 :::22                   :::*                    LISTEN      860/sshd 

[root@local-node-3 ~]# netstat -lntp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      861/sshd            
tcp        0      0 0.0.0.0:6800            0.0.0.0:*               LISTEN      2352/ceph-osd       
tcp        0      0 0.0.0.0:6801            0.0.0.0:*               LISTEN      2352/ceph-osd       
tcp        0      0 0.0.0.0:6802            0.0.0.0:*               LISTEN      2352/ceph-osd       
tcp        0      0 0.0.0.0:6803            0.0.0.0:*               LISTEN      2352/ceph-osd       
tcp6       0      0 :::22                   :::*                    LISTEN      861/sshd           

至此,ceph 基础存储集群部署完成。

http://docs.ceph.com/docs/master/start/quick-ceph-deploy/#

扩展集群

当我们有了以上基础的ceph集群后,可以通过ceph-deploy来扩展集群。
为了实现mon组件的高可用,我们可以在node2和node3上也部署上mon(monitor的数量必须为奇数个,1,3,5等,以便在节点出现故障时进行选举),同时,我们还需要在node1上添加Matedata Server(mds)组件。

image

1. 添加Metadata Server

要使用CephFS,我们就必须至少安装一个metadata sever,执行如下命令安装 metadata server:

[root@local-node-1 ceph-cluster]# ceph-deploy  mds create local-node-1

根据输出提示可以发现ceph-mds@local-node-1服务已经启动。

# netstat -lntp|grep mds
tcp        0      0 0.0.0.0:6805            0.0.0.0:*               LISTEN      4549/ceph-mds 

2. 添加Monitors

在添加第二个mon或者更多mon时,必须先修改admin节点和将要部署mon节点的ceph.conf的配置文件,修改mon_initial_members, mon_hostpublic_network的相关配置:

[root@local-node-1 ceph-cluster]# cat ceph.conf 

[global]
fsid = 6a4812f7-83cb-43e5-abac-f2b8e37db127
mon_initial_members = local-node-1,local-node-2,local-node-3
mon_host = 10.0.0.1,10.0.0.2,10.0.0.3
auth_cluster_required = cephx
auth_service_required = cephx
auth_client_required = cephx
public_network = 10.0.0.0/24

下发配置到集群中的所有节点:

[root@local-node-1 ceph-cluster]# ceph-deploy --overwrite-conf config push local-node-2  local-node-3

更新新的配置到所有的 monitor节点上:

ceph-deploy --overwrite-conf config push local-node-1 local-node-2  local-node-3

添加mon到local-node-2和local-node-3节点上:

ceph-deploy mon add local-node-2
ceph-deploy mon add local-node-3

新增 Monitor 后,Ceph 会自动开始同步并形成法定人数。你可以用下面的命令检查法定人数状态:

# ceph quorum_status --format json-pretty

{
    "election_epoch": 14,
    "quorum": [
        0,
        1,
        2
    ],
    "quorum_names": [
        "local-node-1",
        "local-node-2",
        "local-node-3"
    ],
    "quorum_leader_name": "local-node-1",
    "monmap": {
        "epoch": 3,
        "fsid": "6a4812f7-83cb-43e5-abac-f2b8e37db127",
        "modified": "2019-02-18 13:39:00.705952",
        "created": "2019-02-15 17:38:09.329589",
        "features": {
            "persistent": [
                "kraken",
                "luminous",
                "mimic",
                "osdmap-prune"
            ],
            "optional": []
        },
        "mons": [
            {
                "rank": 0,
                "name": "local-node-1",
                "addr": "10.0.0.1:6789/0",
                "public_addr": "10.0.0.1:6789/0"
            },
            {
                "rank": 1,
                "name": "local-node-2",
                "addr": "10.0.0.2:6789/0",
                "public_addr": "10.0.0.2:6789/0"
            },
            {
                "rank": 2,
                "name": "local-node-3",
                "addr": "10.0.0.3:6789/0",
                "public_addr": "10.0.0.3:6789/0"
            }
        ]
    }
}

==注意:== 当你的 Ceph 集群运行着多个 monitor 时,各 monitor 主机上都应该配置 NTP ,而且要确保这些 monitor 位于 NTP 服务的同一级。

3. 添加 Managers

Ceph Manager守护进程以活动/备用的模式运行。 部署其他管理器(Manager)守护程序可确保在一个守护程序或主机发生故障时,另一个守护程序或主机可以在不中断服务的情况下接管。

为 其它两台节点添加Manager:

[root@local-node-1 ceph-cluster]# ceph-deploy mgr create local-node-2 local-node-3

查看状态,已经添加了三个mgr:

[root@local-node-1 ceph-cluster]# ceph -s
  cluster:
    id:     6a4812f7-83cb-43e5-abac-f2b8e37db127
    health: HEALTH_OK

  services:
    mon: 3 daemons, quorum local-node-1,local-node-2,local-node-3
    mgr: local-node-1(active), standbys: local-node-2, local-node-3
    osd: 3 osds: 3 up, 3 in

  data:
    pools:   0 pools, 0 pgs
    objects: 0  objects, 0 B
    usage:   3.0 GiB used, 27 GiB / 30 GiB avail
    pgs:     

4. 添加RGW 实例

使用ceph的 Ceph Object Gateway,还需要部署一个RGW的实例,使用如下命令创建一个新的RGW实例:

[root@local-node-1 ceph-cluster]# ceph-deploy rgw create local-node-1

默认情况下RGW会监听7480端口,如果想修改此默认端口可以通过编辑运行RGW节点上的ceph.conf文件:

[client]
rgw frontends = civetweb port=80

使用IPv6的情况:

[client]
rgw frontends = civetweb port=[::]:80

使用浏览器访问此端口能获取到如下信息:

# curl 10.0.0.1:7480
<?xml version="1.0" encoding="UTF-8"?><ListAllMyBucketsResult xmlns="http://s3.amazonaws.com/doc/2006-03-01/"><Owner><ID>anonymous</ID><DisplayName></DisplayName></Owner><Buckets></Buckets></ListAllMyBucketsResult>

存储/检索对象数据

如果要存储对象数据到ceph集群中,ceph的客户必须满足以下条件:

  • 设置对象名称
  • 指定资源池

Ceph客户端检索最新的集群映射,CRUSH算法计算如何将对象映射到放置组,然后计算如何动态地将放置组分配给Ceph OSD守护进程。 要查找对象位置,您只需要对象名称和池名称。例如:

ceph osd map {poolname} {object-name}

练习: 定位某个对象

作为练习,我们创建一个对象,指定对象的名称,并指定一个文件路径,此文件包含了对象数据,并使用rados put 命令指定存储池名称:

echo {Test-data} > testfile.txt
ceph osd pool create mytest 8
rados put {object-name} {file-path} --pool=mytest

# 示例:
echo testdata > testfile.txt

# ceph osd pool create mytest 8
pool 'mytest' created

rados put test-object-1 testfile.txt --pool=mytest

验证ceph存储了此对象:

# rados -p mytest ls
test-object-1

定位对象:

ceph osd map {pool-name} {object-name}

# ceph osd map mytest test-object-1
osdmap e34 pool 'mytest' (5) object 'test-object-1' -> pg 5.74dc35e2 (5.2) -> up ([1,0,2], p1) acting ([1,0,2], p1)

删除对象和存储池

删除对象:

rados rm test-object-1 --pool=mytest

删除存储池:

ceph osd pool rm mytest

使用上面的删除命令会提示确认信息,正常删除使用如下命令:

# ceph osd pool rm mytest mytest --yes-i-really-really-mean-it 
Error EPERM: pool deletion is disabled; you must first set the mon_allow_pool_delete config option to true before you can destroy a pool

如果是上述报错需要修改ceph.conf配置文件,并重启mon服务:

[mon]
mon allow pool delete = true

重启ceph-mon:

systemctl restart ceph-mon.target

然后再执行删除,即可成功:

[root@local-node-1 ceph-cluster]# ceph osd pool rm mytest mytest --yes-i-really-really-mean-it 
pool 'mytest' removed

[root@local-node-1 ceph-cluster]# rados df
POOL_NAME              USED OBJECTS CLONES COPIES MISSING_ON_PRIMARY UNFOUND DEGRADED RD_OPS      RD WR_OPS    WR 
.rgw.root           1.1 KiB       4      0     12                  0       0        0     12   8 KiB      4 4 KiB 
default.rgw.control     0 B       8      0     24                  0       0        0      0     0 B      0   0 B 
default.rgw.log         0 B     175      0    525                  0       0        0  10251 9.8 MiB   6834   0 B 
default.rgw.meta        0 B       0      0      0                  0       0        0      0     0 B      0   0 B 

total_objects    187
total_used       3.0 GiB
total_avail      27 GiB
total_space      30 GiB

清除配置

如果在配置的过程中出现问题想要重新配置,可以执行下面的命令来清除配置和ceph软件:

// 清除节点ceph软件和数据,如果运行了purge命令,必须重新安装ceph
ceph-deploy purge {ceph-node} [{ceph-node}]
ceph-deploy purgedata {ceph-node} [{ceph-node}]

// 清除配置:
ceph-deploy forgetkeys

// 清除当前目录的配置文件
rm ceph.*

确认集群状态

如果集群是处于 active + clean 状态,则说明集群正常:

[root@local-node-1 ceph-cluster]# ceph -s
  cluster:
    id:     6a4812f7-83cb-43e5-abac-f2b8e37db127
    health: HEALTH_OK

  services:
    mon: 3 daemons, quorum local-node-1,local-node-2,local-node-3
    mgr: local-node-1(active), standbys: local-node-2, local-node-3
    osd: 3 osds: 3 up, 3 in
    rgw: 1 daemon active

  data:
    pools:   4 pools, 32 pgs
    objects: 187  objects, 1.1 KiB
    usage:   3.0 GiB used, 27 GiB / 30 GiB avail
    pgs:     32 active+clean