Ceph集群搭建(基于CentOS7.5)

引言:Ceph是目前炙手可热的一个统一分布式存储系统,具有优异的性能、可靠性、可扩展性。其可轻松扩展到数 PB 容量, 支持多种工作负载的高性能(每秒输入/输出操作[IOPS]和带宽),具有极其高的可靠性。Ceph对比HDFS优势在于易扩展,无单点。HDFS是专门为Hadoop这样的云计算而生,在离线批量处理大数据上有先天的优势,而Ceph是一个通用的实时存储系统,具有相当好的超大数量小文件处理能力,且现在Hadoop可以利用Ceph作为存储后端。Ceph最近加入到 Linux 中令人印象深刻的文件系统备选行列,能够在维护 POSIX 兼容性的同时加入了复制和容错功能,成为现在分布式系统的掌上明珠。
——摘自Ceph常见问题百科全书

当前Ceph版本和CentOS版本:

[root@ceph1 ceph]# ceph -v
ceph version 13.2.2 (02899bfda814146b021136e9d8e80eba494e1126) mimic (stable)
[root@ceph1 ceph]# cat /etc/redhat-release 
CentOS Linux release 7.5.1804 (Core)

前提条件:

共有三个节点:ceph1ceph2ceph3
①已经配置好三个节点的hosts文件,如:

[root@ceph1 ~]# cat /etc/hosts
10.0.86.246 ceph1
10.0.86.221 ceph2
10.0.86.253 ceph3
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6

②已经配置好三个节点之间的SSH免密登录
具体方法见:配置ceph集群节点间的SSH免密登录快速方法
由于虚机限制,此处仅搭了三个结点,少一个mon.node1节点,将该节点 Monitor功能迁移到admin-node节点上。即此处,ceph1结点即是admin-node节点又有监视器功能。 所以集群的结构图如下:

在这里插入图片描述

1.创建集群

以下在admin-node上的/etc/ceph/目录下操作。
当前管理节点/etc/ceph/目录下仅有一个rbdmap文件:

[root@ceph1 ~]# cd /etc/ceph/
[root@ceph1 ceph]# ls
rbdmap

①直接在三个节点上创建集群

此处按照官网执行的命令是ceph-deploy new ceph1,但后续官方文档还会再让添加ceph2和ceph3节点,所以不如一行命令一劳永逸~

[root@ceph1 ceph]# ceph-deploy new ceph{1,2,3}

此时,在/etc/ceph/目录下生成几个文件:

[root@ceph1 ceph]# ls
ceph.conf  ceph-deploy-ceph.log  ceph.mon.keyring  rbdmap

ceph.conf :ceph配置文件
ceph-deploy-ceph.log:ceph-deploy日志文件
ceph.mon.keyring:ceph monitor的密钥环。
如果有多个网卡,还应该在/etc/ceph/ceph.conf配置文件底部空白处中增加:

public network = 10.0.86.0/24

②在三个节点中安装Ceph软件包,即客户端(等待约5~6min)

[root@ceph1 ceph]# ceph-deploy install ceph{1,2,3}

③部署初始监视器并分发key

[root@ceph1 ceph]# ceph-deploy mon create-initial

如果ceph2ceph3两个结点的配置文件的内容于当前节点不一致则报如下错:

[ceph_deploy.mon][ERROR ] RuntimeError: config file /etc/ceph/ceph.conf exists with different content;

需要增加--overwrite-conf参数覆盖,具体解决方法见:ceph集群报错解决方案
成功后当前目录下会多出来几个密钥环:

ceph.bootstrap-mds.keyring  
ceph.bootstrap-rgw.keyring  
ceph.bootstrap-mgr.keyring  
ceph.client.admin.keyring   
ceph.bootstrap-osd.keyring  

此时,可以查看到当前集群状态是HEALTH_OK

[root@ceph1 ceph]# ceph -s
  cluster:
    id:     13430f9a-ce0d-4d17-a215-272890f47f28
    health: HEALTH_OK
 
  services:
    mon: 3 daemons, quorum ceph2,ceph1,ceph3
    mgr: no daemons active
    osd: 0 osds: 0 up, 0 in
 
  data:
    pools:   0 pools, 0 pgs
    objects: 0  objects, 0 B
    usage:   0 B used, 0 B / 0 B avail
    pgs: 

④复制当前管理节点上的配置文件和key到其他节点

(此处是ceph2,ceph3)

[root@ceph1 ceph]# ceph-deploy admin ceph{1,2,3}

成功后将在ceph2和ceph3的/etc/ceph/目录下看到复制过来的配置文件和密钥环。

[root@ceph2 ceph]# ls
ceph.client.admin.keyring  ceph.conf  rbdmap  tmp9MON_a

⑤增加三个OSDs

OSD是最终数据存储的地方,这里我分别在三个ceph节点上创建了三个OSD节点。
1)创建分区(使用parted工具用于对磁盘进行分区及管理)

[root@ceph1 ceph]# parted 
GNU Parted 3.1   #当前Parted版本是3.1
Using /dev/vda   #使用目录在/dev/vda
Welcome to GNU Parted! Type 'help' to view a list of commands.

输入print命令可以查看当前分区表(以下分区表是gpt,当前磁盘大小215GB):

(parted) print                                                            
Model: Virtio Block Device (virtblk)
Disk /dev/vda: 215GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags: 

Number  Start   End     Size    File system  Name        Flags
 1      17.4kB  2047kB  2030kB               bios_grub   bios_grub
 2      2048kB  51.2GB  51.2GB  xfs          rootfspart

创建分区,输入分区名字,文件系统类型和起始位置(起始位置不能和已存在分区重叠,否则会报overlapping错)。

(parted) mkpart 
Partition name?  []? c1                                                   
File system type?  [ext2]? ext4                                           
Start? 51.2GB                                                             
End? 140GB

再次输入print命令可以看到当前分区表多出来了刚才创建好的分区。

Number  Start   End     Size    File system  Name        Flags
 1      17.4kB  2047kB  2030kB               bios_grub   bios_grub
 2      2048kB  51.2GB  51.2GB  xfs          rootfspart
 3      51.2GB  140GB   88.8GB               c1

输入quit退出parted工具

(parted) quit  

退出后列出所有可用块设备信息也可看到多出了vda3

[root@ceph1 ceph]# lsblk                                                  
NAME   MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
vda    252:0    0  200G  0 disk 
├─vda1 252:1    0    2M  0 part 
├─vda2 252:2    0 47.7G  0 part /
└─vda3 252:3    0 82.7G  0 part

同理分别登录到ceph2,ceph3上执行以上创建分区操作,不再继续赘述,创建好三个节点的分区后退回到管理节点ceph1/etc/ceph/目录下。

  • 在ceph1上创建一个OSD(该命令必须在管理节点上,即ceph1中的/etc/ceph/目录下执行,因为需要ceph.bootstrap-osd.keyring密钥环,而另外两个节点上没有该密钥环)。
[root@ceph1 ceph]# ceph-deploy osd create --data /dev/vda3 ceph1

查看集群状态可发现出来一个osd守护进程。

[root@ceph1 ceph]# ceph -s
  cluster:
    id:     13430f9a-ce0d-4d17-a215-272890f47f28
    health: HEALTH_WARN
            no active mgr
 
  services:
    mon: 3 daemons, quorum ceph2,ceph1,ceph3
    mgr: no daemons active
    osd: 1 osds: 1 up, 1 in
 
  data:
    pools:   0 pools, 0 pgs
    objects: 0  objects, 0 B
    usage:   0 B used, 0 B / 0 B avail
    pgs:

列出所有可用块设备信息也发现在vda3下成功创建OSD

[root@ceph1 ceph]# lsblk 
NAME                                                MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
vda                                                 252:0    0  200G  0 disk 
├─vda1                                              252:1    0    2M  0 part 
├─vda2                                              252:2    0 47.7G  0 part /
└─vda3                                              252:3    0 82.7G  0 part 
  └─ceph--72a23f8f--b00a--474d--b51e--52393b9840d4-osd--block--de79c41d--8ce4--4473--b767--fe3e88ef2029
                                                    253:0    0 82.7G  0 lvm

同理,在当前目录下继续创建另外两个OSD。

[root@ceph1 ceph]# ceph-deploy osd create --data /dev/vda3 ceph2
[root@ceph1 ceph]# ceph-deploy osd create --data /dev/vda3 ceph3

成功后显示当前集群有三个OSD守护进程。

[root@ceph1 ceph]# ceph -s
  cluster:
    id:     13430f9a-ce0d-4d17-a215-272890f47f28
    health: HEALTH_WARN
            no active mgr
 
  services:
    mon: 3 daemons, quorum ceph2,ceph1,ceph3
    mgr: no daemons active
    osd: 3 osds: 3 up, 3 in
 
  data:
    pools:   0 pools, 0 pgs
    objects: 0  objects, 0 B
    usage:   0 B used, 0 B / 0 B avail
    pgs:     

:目前集群健康状态是HEALTH_WARN,原因是没有激活管理器mgr,先不用着急,后续会添加。

2.扩展集群

在上一步成功建立并运行了一个基本集群后,下一步就是需要提高可靠性和可用性而扩展集群。即向ceph1添加元数据服务器(mds),然后在ceph2ceph3中添加监视器(mon)和管理器(mgr)
2

①添加至少一个元数据服务器

(用以使用CephFS,此处在ceph1上添加)

[root@ceph1 ceph]# ceph-deploy mds create ceph1

②为另外两个节点ceph2和ceph3添加监视器Monitor

注:一个ceph集群至少需要一个Monitor和一个Manager,为高可用性,保证一个Monitor坏掉后集群还能正常运转,在三个节点上均添加上Monitor功能和Manager。

[root@ceph1 ceph]# ceph-deploy mon add ceph2
[root@ceph1 ceph]# ceph-deploy mon add ceph3

但细心的读者会发现前面添加Monitor时候我们把三个节点都添加了,所以这里可不用执行以上命令。
可以用ceph quorum_status --format json-pretty命令查看quorum状态。

[root@ceph1 ceph]# ceph quorum_status --format json-pretty
{
    "election_epoch": 10,
    "quorum": [
        0,
        1,
        2
    ],
    "quorum_names": [
        "ceph2",
        "ceph1",
        "ceph3"
    ],
    "quorum_leader_name": "ceph2",
    "monmap": {
        "epoch": 1,
        "fsid": "13430f9a-ce0d-4d17-a215-272890f47f28",
        "modified": "2018-11-19 10:42:55.478872",
        "created": "2018-11-19 10:42:55.478872",
        "features": {
            "persistent": [
                "kraken",
                "luminous",
                "mimic",
                "osdmap-prune"
            ],
            "optional": []
        },
        "mons": [
            {
                "rank": 0,
                "name": "ceph2",
                "addr": "10.0.86.221:6789/0",
                "public_addr": "10.0.86.221:6789/0"
            },
            {
                "rank": 1,
                "name": "ceph1",
                "addr": "10.0.86.246:6789/0",
                "public_addr": "10.0.86.246:6789/0"
            },
            {
                "rank": 2,
                "name": "ceph3",
                "addr": "10.0.86.253:6789/0",
                "public_addr": "10.0.86.253:6789/0"
            }
        ]
    }
}

③在三个节点上添加管理器Manager

[root@ceph1 ceph]# ceph-deploy mgr create ceph{1,2,3}

查看此时的集群状态发现三个节点均部署了Manager,集群状态HEALTH_OK也正常了。在usage中也能看到当前磁盘使用情况,3.0 GiB used显然表示目前已使用3.0 GiB, 245 GiB / 248 GiB avail表示剩余/总量

[root@ceph1 ceph]# ceph -s
  cluster:
    id:     13430f9a-ce0d-4d17-a215-272890f47f28
    health: HEALTH_OK
 
  services:
    mon: 3 daemons, quorum ceph2,ceph1,ceph3
    mgr: ceph1(active), standbys: ceph3, ceph2
    osd: 3 osds: 3 up, 3 in
 
  data:
    pools:   0 pools, 0 pgs
    objects: 0  objects, 0 B
    usage:   3.0 GiB used, 245 GiB / 248 GiB avail
    pgs: 

④为ceph1节点添加RGW实例

要使用Ceph Object Gateway(对象网关)组件,需要安装RGW实例。

[root@ceph1 ceph]# ceph-deploy rgw create ceph1

最后一条信息显示RGW在ceph1上默认监听端口是7480

[ceph_deploy.rgw][INFO  ] The Ceph Object Gateway (RGW) is now running on host ceph1 and default port 7480

如要修改默认端口为80端口,可以在ceph1节点的/etc/ceph/ceph.conf配置文件底部添加如下配置:

[client]
rgw frontends = civetweb port=80

如果立即查看当前ceph集群状态,会发现此时的PG正在创建creating+同步其他节点peering中。具体PG状态表及详解见:PG状态表

[root@ceph1 ceph]# ceph -s
  cluster:
    id:     13430f9a-ce0d-4d17-a215-272890f47f28
    health: HEALTH_WARN
            too few PGs per OSD (8 < min 30)
 
  services:
    mon: 3 daemons, quorum ceph2,ceph1,ceph3
    mgr: ceph1(active), standbys: ceph3, ceph2
    osd: 3 osds: 3 up, 3 in
 
  data:
    pools:   1 pools, 8 pgs
    objects: 0  objects, 0 B
    usage:   3.0 GiB used, 245 GiB / 248 GiB avail
    pgs:     100.000% pgs not active
             8 creating+peering

稍等片刻再查看最后状态如下,集群状态HEALTH_OK且PG状态active+clean,表示PG可以正常处理读写请求并无待修复对象

[root@ceph1 ceph]# ceph -s
  cluster:
    id:     13430f9a-ce0d-4d17-a215-272890f47f28
    health: HEALTH_OK
 
  services:
    mon: 3 daemons, quorum ceph2,ceph1,ceph3
    mgr: ceph1(active), standbys: ceph3, ceph2
    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, 245 GiB / 248 GiB avail
    pgs:     32 active+clean

3.在集群中存储或检索对象数据

要把对象存入Ceph存储集群,客户端需要:

  1. 指定对象名
  2. 指定存储池(pool)

①创建一个含有数据的测试文件

例如把Hello World字符串放入新建好的testfile.txt文本文件中。

[root@ceph1 ceph]# echo "Hello World" > testfile.txt
[root@ceph1 ceph]# cat testfile.txt 
Hello World      #可以看到文件中的内容正是Hello World

②创建一个含有8个PG的pool(名字是mytest)

[root@ceph1 ceph]# ceph osd pool create mytest 8
pool 'mytest' created

③使用rados put命令将数据存储到集群中

以下对象名是test-object-1,数据文件路径是testfile.txt,存储到名为mytest的存储池中。

[root@ceph1 ceph]# rados put test-object-1 testfile.txt --pool=mytest

以下确认该对象确实被存储到了集群中,如果没有则报错:

[root@ceph1 ceph]# rados -p mytest ls
test-object-1

通过ceph -s能看到当前集群中对象数增加了一个。

objects: 187  objects, 1.1 KiB #存入之前
objects: 188  objects, 1.1 KiB #存入之后

④定位对象

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

如果此时,查看集群状态是HEALTH_WARN application not enabled on 1 pool(s)

[root@ceph1 ceph]# ceph -s
  cluster:
    id:     13430f9a-ce0d-4d17-a215-272890f47f28
    health: HEALTH_WARN
            application not enabled on 1 pool(s)
[root@ceph1 ceph]# ceph health detail
HEALTH_WARN application not enabled on 1 pool(s)
POOL_APP_NOT_ENABLED application not enabled on 1 pool(s)
    application not enabled on pool 'mytest'
    use 'ceph osd pool application enable <pool-name> <app-name>', where <app-name> is 'cephfs', 'rbd', 'rgw', or freeform for custom applications.

运行ceph health detail命令发现是新加入的存储池mytest没有被应用程序标记,因为之前添加的是RGW实例,所以此处依提示将mytestrgw标记即可:

[root@ceph1 ceph]# ceph osd pool application enable mytest rgw
enabled application 'rgw' on pool 'mytest'

再次查看集群状态发现恢复正常

[root@ceph1 ceph]# ceph health
HEALTH_OK

⑤从集群中删除对象

删除mytest存储池中名字为test-object-1的对象。

[root@ceph1 ceph]# rados rm test-object-1 --pool=mytest

⑥从集群中删除指定存储池(pool)

删除mytest存储池。

[root@ceph1 ceph]# ceph osd pool rm mytest
[root@ceph1 ceph]# ceph osd pool rm mytest mytest --yes-i-really-really-mean-it

此处如果之前没有在/etc/ceph/ceph.conf配置文件中设置mon allow pool delete = true选项时删除存储池会报错。此处报错解决方案请见:ceph集群报错解决方案笔记[第4条]

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

SL_World

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值