阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

Ceph分布式存储部署基础教程

193次阅读
没有评论

共计 16437 个字符,预计需要花费 42 分钟才能阅读完成。

背景

Ceph 简介

Ceph 是一个分布式存储,可以提供对象存储、块存储和文件存储,其中对象存储和块存储可以很好地和各大云平台集成。一个 Ceph 集群中有 Monitor 节点、MDS 节点(可选,用于文件存储)、至少两个 OSD 守护进程。
Ceph OSD:OSD 守护进程,用于存储数据、处理数据拷贝、恢复、回滚、均衡,并通过心跳程序向 Monitor 提供部分监控信息。一个 Ceph 集群中至少需要两个 OSD 守护进程。
Monitor:维护集群的状态映射信息,包括 monitor、OSD、Placement Group(PG)。还维护了 Monitor、OSD 和 PG 的状态改变历史信息。
MDS:存储 Ceph 文件系统的元数据。

环境规划

4 台服务器:1 台作为 Monitor,1 台作为 OSD RGW,还有两台作为 OSD。ps:我们不搭建 CephFS。
所有服务器都安装 Ubuntu 16.04。

环境准备:

编辑 hosts 文件及 hostname

分别将 Monitor 节点定义为 node1,两台 OSD 节点定义为 node2、node3,RGW 节点定义为 node4。
打开 Monitor 节点的 /etc/hostname 文件,内容修改为 node1,保存退出。但该文件需 OS 重启后才能生效,因此需再手动执行命令让其立刻生效,命令为:

# hostname node1

再分别打开各节点的 /etc/hosts 文件,加入这四个节点 ip 与名称的对应关系,类似如下:

127.0.0.1   localhost
127.0.1.1   node1
192.168.1.100   node1
192.168.1.101   node2
192.168.1.102   node3
192.168.1.103   node4

# The following lines are desirable for IPv6 capable hosts
::1     localhost ip6-localhost ip6-loopback
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters

搭建 NTP 环境

使用 Monitor 服务器作为 NTP server,另外 3 台作为 NTP client。

NTP server

需安装 NTP 服务,执行命令:apt-get install ntp。
完成后,修改配置文件 /etc/ntp.conf。因为环境不通外网,无法访问 Ubuntu 时间源。并且,这个环境也没有其他的 NTP 时间源,因此,在这里,我们使用 Monitor 服务器作为 NTP server 的本地时间源。在文件末尾添加如下内容:

server  127.127.1.0     # 如果有其他的 NTP 源,可以更换这里的 ip 地址。fudge   127.127.1.0 stratum 10
并注销掉以 Ubuntu 时间源的部分。#pool 0.ubuntu.pool.ntp.org iburst
#pool 1.ubuntu.pool.ntp.org iburst
#pool 2.ubuntu.pool.ntp.org iburst
#pool 3.ubuntu.pool.ntp.org iburst
#pool ntp.ubuntu.com

修改完成后,保存退出。并重启 ntp 服务,执行命令:service ntp restart。
注意:NTP 服务刚重启时,需要一定的时间来同步时间源,不能立刻提供服务,需一定时间后才能正常工作(一般 5 分钟左右)。可在 NTP server 端执行明令 ntpq - p 来查看服务状态。

NTP client

需安装 ntpdate,执行命令:apt install ntpdate。
安装后,执行命令 ntpdate [-d] {serverIp}来同步时间。- d 表示打开调试信息,可不打开。例如:

# ntpdate 109.105.115.67

成功时会出现类似提示:ntpdate[39600]: step time server 109.105.115.67 offset -46797.696033 sec。如果出现:ntpdate[28489]: no server suitable for synchronization found。可能是因为 server 还未能正常提供服务,等待一段时间后再次尝试。
同步成功后,还需要将时间写入硬件时钟,防止 OS 重启后时间恢复至原样。执行命令 hwclock –w。

安装 SSH SERVER

在所有的节点上都安装 SSH server 服务。

# apt-get install openssh-server

因为我们搭建的 Ceph 直接使用 root 用户,所以需要修改 ssh 配置文件 /etc/ssh/sshd_config,搜索 PermitRootLogin 选项,将其参数改为 yes。保存退出文件,并重启 SSH 服务,执行命令:service ssh restart。

使用 SSH 免密码登录

生成 SSH keys,不要设置 passphrase,所有的输入选项都直接回车。

# ssh-keygen 

Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa): 
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.

拷贝这个 key 到所有的节点。

# ssh-copy-id node1
# ssh-copy-id node2
# ssh-copy-id node3
# ssh-copy-id node4

设置网络代理(可选)

如果整个内网环境需要设置网络代理才能使用 apt-get 安装程序,那么需要在配置文件 /etc/environment 中添加,如:

http_proxy="http://[proxy-ip]:[proxy-port]"
https_proxy=https://[proxy-ip]:[proxy-port]

设置完成后,执行命令:export http_proxy=”http://[proxy-ip]:[proxy-port]”; export https_proxy=https://[proxy-ip]:[proxy-port],使得配置立即生效。
注意 :一定要在 /etc/environment 中配置,而不能在诸如 /etc/profile、~/.profile 等类似文件配置。因为,安装 ceph 时,会使用 ssh 来连接远程节点并 apt-get 安装程序,但 ssh 只能识别 /etc/environment 中的环境变量,设置在其他文件中会导致网络访问失败。
注意二:所有节点都需要设置。

部署 Ceph 存储

这里,我们直接在 Monitor 节点 node1 上安装 ceph-deploy,然后通过 ceph-deploy 在 node1 上部署 Monitor,在 node2 和 node3 节点上部署 OSD,最后,在 node4 上部署 Ceph 网关 rgw。
在 node1 上创建一个目录,用来维护 ceph-deploy 生成的配置信息。ceph-deploy 命令会在当前目录生成输出文件,确保执行该命令时位于对应的目录。

mkdir my-cluster
cd my-cluster

安装 ceph-deploy

更新镜像仓库,并安装 ceph-deploy。

apt-get update && sudo apt-get install ceph-deploy

重新开始部署 Ceph

在安装过程中如果遇到了问题,想重新开始安装,执行以下命令来清空配置。

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

如果还想清空 Ceph 包,需执行:

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

注意:在实际的操作中,如果直接执行 ceph-deploy purgedata,总是会报错,提示 Ceph 还安装在该节点上,拒绝执行清空操作。因此我都是先执行 ceph-deploy purge,再执行 ceph-deploy purgedata 和 ceph-deploy forgetkeys。

部署 Ceph

创建集群

ceph-deploy new {initial-monitor-node(s)}

如:

ceph-deploy new node1

在当前目录下使用 ls 和 cat 命令检查 ceph-deploy 输出结果,可以看到一个 ceph 配置文件,一个密钥环以及为新集群创建的日志文件。

修改 osd 参数

因为我们环境中只有两个 OSD,而 Ceph 模式的副本个数为 3,因此我们需要修改配置文件 Ceph.conf,在 [global] 部分增加如下配置:

osd pool default size = 2

如果 OSD 存储数据分区的文件系统类型不是 xfs,则需要设置一些 osd 变量,否则 OSD 不能正常启动,报错为“ERROR: osd init failed: (36) File name too long”。同样,在 Ceph.conf 文件,[global]部分增加如下配置:

osd max object name len = 256
osd max object namespace len = 64

配置 Ceph 网络参数

如果环境中有多种网络,那么需要在 Ceph.conf 的 [global] 部分下增加如下配置。

public network = {ip-address}/{netmask}

如果环境中只有一种网络,则不需要此配置。关于网络配置更多信息,可参考:http://docs.ceph.com/docs/master/rados/configuration/network-config-ref/

安装 Ceph

ceph-deploy install {ceph-node}[{ceph-node} ...]

例如:

ceph-deploy install node1 node2 node3 node4

执行命令后,会在每个节点上都安装 Ceph。注意:如果执行过 ceph-deploy purge 命令,则需要重新安装 Ceph。

安装 Monitor

安装并初始化 Monitor,收集 keys:

# ceph-deploy mon create-initial

执行完命令后,当前目录会生成如下 keyring:
• {cluster-name}.client.admin.keyring
• {cluster-name}.bootstrap-osd.keyring
• {cluster-name}.bootstrap-mds.keyring
• {cluster-name}.bootstrap-rgw.keyring

创建 OSD 数据目录

OSD 的数据目录可以使用单独的分区,也可以只使用已有分区的目录。这里我们是直接使用目录的方式。如果需要使用单独数据分区和日志分区,可参考:http://docs.ceph.com/docs/master/rados/deployment/ceph-deploy-osd/。
添加两个 OSD。

# ssh node2
# sudo mkdir /var/local/osd0
# chown ceph:ceph /var/local/osd0
# exit

# ssh node3
# sudo mkdir /var/local/osd1
# chown ceph:ceph /var/local/osd1
# exit

准备 OSD

ceph-deploy osd prepare {ceph-node}:/path/to/directory

如:

# ceph-deploy osd prepare node2:/var/local/osd0 node3:/var/local/osd1

激活 OSD

ceph-deploy osd prepare {ceph-node}:/path/to/directory

如:

# ceph-deploy osd prepare node2:/var/local/osd0 node3:/var/local/osd1

拷贝配置文件和管理 key

ceph-deploy admin {admin-node} {ceph-node}

如:

# ceph-deploy admin node1 node2 node3

确保 ceph.client.admin.keyring 的权限正确,在每个节点上执行:

chmod +r /etc/ceph/ceph.client.admin.keyring

检查集群状态

# ceph –s

集群应该返回 health HEALTH_OK,并且所有 pg 都是 active+clean 的状态,这样部署就完全没问题了。

部署 rgw 网关

如果要使用 Ceph 的对象存储,就需要部署 rgw 网关。执行以下步骤创建一个新的 rgw 实例:

ceph-deploy rgw create {gateway-node}

如:

# ceph-deploy rgw create node4

验证 Ceph

当显示状态健康时,可写入数据并查看数据。
创建一个普通文本文件 testfile.txt,并向其写入数据。
创建一个 pool。格式为:rados mkpool {pool-name},执行:

# rados mkpool data

将文件写入 pool。格式为:rados put {object-name} {file-path} –pool={pool-name},执行:

# rados put test-object-1 testfile.txt --pool=data

如果文件不大,应该很快就写完并成功了。如果卡主较长时间,则可能是出错了,需要排查问题。
查看文件是否存在于 pool 中,格式为:rados -p {pool-name} ls,执行:

# rados -p data ls

确定文件的位置。格式为:ceph osd map {pool-name} {object-name},执行:

# ceph osd map data test-object-1

从 pool 中读取文件。格式为:rados get {object-name} –pool={pool-name} {file-path},执行:

# rados get test-object-1 --pool=data myfile

可比对读出的文件 myfile 和原文件 testfile.txt 是否相同,执行命令:diff myfile testfile.txt。
从 pool 中删除文件。格式为:rados rm {object-name} –pool={pool-name},执行:

# rados rm test-object-1 --pool=data

更多详情见请继续阅读下一页的精彩内容:http://www.linuxidc.com/Linux/2017-03/141583p2.htm

背景

Ceph RGW 简介

Ceph RGW 基于 librados,是为应用提供 RESTful 类型的对象存储接口。RGW 提供两种类型的接口:
1) S3:兼容 Amazon S3RESTful API;
2) Swift:兼容 OpenStack Swift API。

S3 和 Swift API 共享同一个命名空间,所以可以使用两种 API 访问相同的数据。

环境规划

如上篇文章《Ceph 部署(一)集群搭建》所述:4 台服务器:1 台作为 Monitor,1 台作为 OSD RGW,还有两台作为 OSD。ps:我们不搭建 CephFS。
所有服务器都安装 Ubuntu 16.04。

部署 Ceph RGW

进入上文所述的 my-cluster 目录。

$ cd my-cluster

修改默认端口(可选的)

RGW 默认使用 Civetweb 作为其 Web Sevice,而 Civetweb 默认使用端口 7480 提供服务,如果想修改端口(如 80 端口),就需要修改 Ceph 的配置文件。在配置文件中增加一个 section[client.rgw.

[client.rgw.node4]
rgw_frontends = "civetweb port=80"

然后再将配置文件推送到 RGW 节点。

$ ceph-deploy --overwrite-conf config push node4

安装 CEPH OBJECT GATEWAY

格式为:

$ ceph-deploy install --rgw <gateway-node1> [<gateway-node2> ...]

由于我们环境中只有一个 RGW,所以执行命令:

$ ceph-deploy install –-rgw node4

管理 RGW 节点

Ceph CLI 工具需要在管理员模式下运行,因此需要执行以下命令:

$ ceph-deploy admin node4

安装 RGW 实例

执行命令:

$ ceph-deploy rgw create node4

一旦 RGW 开始运行,我们就可以通过端口 7480(如果没有修改的话)来访问。如:

http://node4:7480

如果 RGW 运行正常,它应该返回类似的信息:

<ListAllMyBucketsResult>
  <Owner>
    <ID>anonymous</ID>
    <DisplayName/>
  </Owner>
  <Buckets/>
</ListAllMyBucketsResult>

注意:剩下的创建用户的步骤都应该在 RGW 节点上运行。

创建 S3 用户

想正常的访问 RGW,需要创建相应的 RGW 用户,并赋予相应的权限,radosgw-admin 命令实现了这些功能。
执行下面命令,来创建一个名为 testuser 的用户:

$ radosgw-admin user create --uid="testuser" --display-name="First User"

命令的输出大致如下:

{"user_id": "testuser",
    "display_name": "First User",
    "email": "","suspended": 0,"max_buckets": 1000,"auid": 0,"subusers": [],"keys": [{"user": "testuser","access_key": "I0PJDPCIYZ665MW88W9R","secret_key": "dxaXZ8U90SXydYzyS5ivamEP20hkLSUViiaR+ZDA"
    }],
    "swift_keys": [],
    "caps": [],
    "op_mask": "read, write, delete",
    "default_placement": "","placement_tags": [],"bucket_quota": {"enabled": false,"max_size_kb": -1,"max_objects": -1
    },
    "user_quota": {"enabled": false,
        "max_size_kb": -1,
        "max_objects": -1
    },
    "temp_url_keys": []}

注意:需要记住返回结果中 keys->access_key 和 keys->secret_key 的值,用于 S3 接口访问确认。

创建 Swift 用户

Swift 用户是作为子用户 subuser 被创建的,执行以下命令:

$ radosgw-admin subuser create --uid=testuser --subuser=testuser:swift --access=full

输出结果大致如下:

    "user_id": "testuser",
    "display_name": "First User",
    "email": "",
    "suspended": 0,
    "max_buckets": 1000,
    "auid": 0,
    "subusers": [{"id": "testuser:swift",
        "permissions": "full-control"
    }],
    "keys": [{"user": "testuser:swift",
        "access_key": "3Y1LNW4Q6X0Y53A52DET",
        "secret_key": ""
    }, {"user": "testuser",
        "access_key": "I0PJDPCIYZ665MW88W9R",
        "secret_key": "dxaXZ8U90SXydYzyS5ivamEP20hkLSUViiaR+ZDA"
    }],
    "swift_keys": [{"user": "testuser:swift",
        "secret_key": "244+fz2gSqoHwR3lYtSbIyomyPHf3i7rgSJrF\/IA"
    }],
    "caps": [],
    "op_mask": "read, write, delete",
    "default_placement": "",
    "placement_tags": [],
    "bucket_quota": {"enabled": false,
        "max_size_kb": -1,
        "max_objects": -1
    },
    "user_quota": {"enabled": false,
        "max_size_kb": -1,
        "max_objects": -1
    },
    "temp_url_keys": []

注意:需要记住返回结果中 swift_keys->secret_key 的值,用于 Swift 接口访问确认。

测试 S3 接口

需要创建一个 Python 测试脚本来测试 S3 访问。该脚本会连接 RGW,创建一个 bucket 并列出所有的 bucket。其中,变量 access_key 和 secret_access 的值,来自于创建 S3 用户命令时,radosgw-admin 命令返回的 keys->access_key 和 keys->secret_key。
执行以下步骤,首先安装 python-boto 库,该库用于连接 S3:

$ apt-get install python-boto

创建并编辑 Python 脚本:

$ vi s3test.py

import boto.s3.connection

access_key = 'I0PJDPCIYZ665MW88W9R'
secret_key = 'dxaXZ8U90SXydYzyS5ivamEP20hkLSUViiaR+ZDA'
conn = boto.connect_s3(
        aws_access_key_id=access_key,
        aws_secret_access_key=secret_key,
        host='{hostname}', port={port},
        is_secure=False, calling_format=boto.s3.connection.OrdinaryCallingFormat(),)

bucket = conn.create_bucket('my-new-bucket')
for bucket in conn.get_all_buckets():
    print "{name} {created}".format(
        name=bucket.name,
        created=bucket.creation_date,
    )

替换 {hostname}、{port} 为真实环境的 hostname(或者 ip)和 RGW 的端口。执行命令进行测试:

$ python s3test.py

输出应该类似如下:

my-new-bucket-2 2017-02-19T04:34:17.530Z

5.4.8 测试 Swift 接口

Swfit 的访问可以通过命令行。首先安装相关软件包:

$ apt-get install python-setuptools
$ apt-get install python-swiftclient

执行下列命令,范文 Swift 接口:

$ swift -A http://{IP ADDRESS}:{port}/auth/1.0 -U testuser:swift -K '{swift_secret_key}' list

替换 {IP ADDRESS}、{port}、{swift_secret_key} 等相关参数,其中 {swift_secret_key} 为创建 Swift 用户时,radosgw-admin 命令返回的 swift_keys->secret_key 的值。正常的输出应该为:

my-new-bucket

小结

通过 ceph-deploy 命令,已经大大地简化了对 Ceph 集群和 RGW 的安装和配置。但如果想挑战下自己,或者想让自己了解更多,试试完全的手动部署 Ceph 吧 Ceph 手动部署。

在 CentOS 7.1 上安装分布式存储系统 Ceph  http://www.linuxidc.com/Linux/2015-08/120990.htm

Ceph 环境配置文档 PDF http://www.linuxidc.com/Linux/2013-05/85212.htm 

CentOS7 下部署 Ceph 集群(版本 10.2.2)http://www.linuxidc.com/Linux/2017-02/140728.htm

Ceph 的安装过程 http://www.linuxidc.com/Linux/2013-05/85210.htm 

如何升级 Ceph 版本及注意事项  http://www.linuxidc.com/Linux/2017-02/140631.htm

HOWTO Install Ceph On FC12, FC 上安装 Ceph 分布式文件系统 http://www.linuxidc.com/Linux/2013-05/85209.htm 

实验环境 Ceph 9.2.1 部署笔记 http://www.linuxidc.com/Linux/2016-11/137094.htm

Ubuntu 16.04 快速安装 Ceph 集群  http://www.linuxidc.com/Linux/2016-09/135261.htm

Ceph 的详细介绍:请点这里
Ceph 的下载地址:请点这里

本文永久更新链接地址:http://www.linuxidc.com/Linux/2017-03/141583.htm

背景

Ceph 简介

Ceph 是一个分布式存储,可以提供对象存储、块存储和文件存储,其中对象存储和块存储可以很好地和各大云平台集成。一个 Ceph 集群中有 Monitor 节点、MDS 节点(可选,用于文件存储)、至少两个 OSD 守护进程。
Ceph OSD:OSD 守护进程,用于存储数据、处理数据拷贝、恢复、回滚、均衡,并通过心跳程序向 Monitor 提供部分监控信息。一个 Ceph 集群中至少需要两个 OSD 守护进程。
Monitor:维护集群的状态映射信息,包括 monitor、OSD、Placement Group(PG)。还维护了 Monitor、OSD 和 PG 的状态改变历史信息。
MDS:存储 Ceph 文件系统的元数据。

环境规划

4 台服务器:1 台作为 Monitor,1 台作为 OSD RGW,还有两台作为 OSD。ps:我们不搭建 CephFS。
所有服务器都安装 Ubuntu 16.04。

环境准备:

编辑 hosts 文件及 hostname

分别将 Monitor 节点定义为 node1,两台 OSD 节点定义为 node2、node3,RGW 节点定义为 node4。
打开 Monitor 节点的 /etc/hostname 文件,内容修改为 node1,保存退出。但该文件需 OS 重启后才能生效,因此需再手动执行命令让其立刻生效,命令为:

# hostname node1

再分别打开各节点的 /etc/hosts 文件,加入这四个节点 ip 与名称的对应关系,类似如下:

127.0.0.1   localhost
127.0.1.1   node1
192.168.1.100   node1
192.168.1.101   node2
192.168.1.102   node3
192.168.1.103   node4

# The following lines are desirable for IPv6 capable hosts
::1     localhost ip6-localhost ip6-loopback
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters

搭建 NTP 环境

使用 Monitor 服务器作为 NTP server,另外 3 台作为 NTP client。

NTP server

需安装 NTP 服务,执行命令:apt-get install ntp。
完成后,修改配置文件 /etc/ntp.conf。因为环境不通外网,无法访问 Ubuntu 时间源。并且,这个环境也没有其他的 NTP 时间源,因此,在这里,我们使用 Monitor 服务器作为 NTP server 的本地时间源。在文件末尾添加如下内容:

server  127.127.1.0     # 如果有其他的 NTP 源,可以更换这里的 ip 地址。fudge   127.127.1.0 stratum 10
并注销掉以 Ubuntu 时间源的部分。#pool 0.ubuntu.pool.ntp.org iburst
#pool 1.ubuntu.pool.ntp.org iburst
#pool 2.ubuntu.pool.ntp.org iburst
#pool 3.ubuntu.pool.ntp.org iburst
#pool ntp.ubuntu.com

修改完成后,保存退出。并重启 ntp 服务,执行命令:service ntp restart。
注意:NTP 服务刚重启时,需要一定的时间来同步时间源,不能立刻提供服务,需一定时间后才能正常工作(一般 5 分钟左右)。可在 NTP server 端执行明令 ntpq - p 来查看服务状态。

NTP client

需安装 ntpdate,执行命令:apt install ntpdate。
安装后,执行命令 ntpdate [-d] {serverIp}来同步时间。- d 表示打开调试信息,可不打开。例如:

# ntpdate 109.105.115.67

成功时会出现类似提示:ntpdate[39600]: step time server 109.105.115.67 offset -46797.696033 sec。如果出现:ntpdate[28489]: no server suitable for synchronization found。可能是因为 server 还未能正常提供服务,等待一段时间后再次尝试。
同步成功后,还需要将时间写入硬件时钟,防止 OS 重启后时间恢复至原样。执行命令 hwclock –w。

安装 SSH SERVER

在所有的节点上都安装 SSH server 服务。

# apt-get install openssh-server

因为我们搭建的 Ceph 直接使用 root 用户,所以需要修改 ssh 配置文件 /etc/ssh/sshd_config,搜索 PermitRootLogin 选项,将其参数改为 yes。保存退出文件,并重启 SSH 服务,执行命令:service ssh restart。

使用 SSH 免密码登录

生成 SSH keys,不要设置 passphrase,所有的输入选项都直接回车。

# ssh-keygen 

Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa): 
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.

拷贝这个 key 到所有的节点。

# ssh-copy-id node1
# ssh-copy-id node2
# ssh-copy-id node3
# ssh-copy-id node4

设置网络代理(可选)

如果整个内网环境需要设置网络代理才能使用 apt-get 安装程序,那么需要在配置文件 /etc/environment 中添加,如:

http_proxy="http://[proxy-ip]:[proxy-port]"
https_proxy=https://[proxy-ip]:[proxy-port]

设置完成后,执行命令:export http_proxy=”http://[proxy-ip]:[proxy-port]”; export https_proxy=https://[proxy-ip]:[proxy-port],使得配置立即生效。
注意 :一定要在 /etc/environment 中配置,而不能在诸如 /etc/profile、~/.profile 等类似文件配置。因为,安装 ceph 时,会使用 ssh 来连接远程节点并 apt-get 安装程序,但 ssh 只能识别 /etc/environment 中的环境变量,设置在其他文件中会导致网络访问失败。
注意二:所有节点都需要设置。

部署 Ceph 存储

这里,我们直接在 Monitor 节点 node1 上安装 ceph-deploy,然后通过 ceph-deploy 在 node1 上部署 Monitor,在 node2 和 node3 节点上部署 OSD,最后,在 node4 上部署 Ceph 网关 rgw。
在 node1 上创建一个目录,用来维护 ceph-deploy 生成的配置信息。ceph-deploy 命令会在当前目录生成输出文件,确保执行该命令时位于对应的目录。

mkdir my-cluster
cd my-cluster

安装 ceph-deploy

更新镜像仓库,并安装 ceph-deploy。

apt-get update && sudo apt-get install ceph-deploy

重新开始部署 Ceph

在安装过程中如果遇到了问题,想重新开始安装,执行以下命令来清空配置。

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

如果还想清空 Ceph 包,需执行:

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

注意:在实际的操作中,如果直接执行 ceph-deploy purgedata,总是会报错,提示 Ceph 还安装在该节点上,拒绝执行清空操作。因此我都是先执行 ceph-deploy purge,再执行 ceph-deploy purgedata 和 ceph-deploy forgetkeys。

部署 Ceph

创建集群

ceph-deploy new {initial-monitor-node(s)}

如:

ceph-deploy new node1

在当前目录下使用 ls 和 cat 命令检查 ceph-deploy 输出结果,可以看到一个 ceph 配置文件,一个密钥环以及为新集群创建的日志文件。

修改 osd 参数

因为我们环境中只有两个 OSD,而 Ceph 模式的副本个数为 3,因此我们需要修改配置文件 Ceph.conf,在 [global] 部分增加如下配置:

osd pool default size = 2

如果 OSD 存储数据分区的文件系统类型不是 xfs,则需要设置一些 osd 变量,否则 OSD 不能正常启动,报错为“ERROR: osd init failed: (36) File name too long”。同样,在 Ceph.conf 文件,[global]部分增加如下配置:

osd max object name len = 256
osd max object namespace len = 64

配置 Ceph 网络参数

如果环境中有多种网络,那么需要在 Ceph.conf 的 [global] 部分下增加如下配置。

public network = {ip-address}/{netmask}

如果环境中只有一种网络,则不需要此配置。关于网络配置更多信息,可参考:http://docs.ceph.com/docs/master/rados/configuration/network-config-ref/

安装 Ceph

ceph-deploy install {ceph-node}[{ceph-node} ...]

例如:

ceph-deploy install node1 node2 node3 node4

执行命令后,会在每个节点上都安装 Ceph。注意:如果执行过 ceph-deploy purge 命令,则需要重新安装 Ceph。

安装 Monitor

安装并初始化 Monitor,收集 keys:

# ceph-deploy mon create-initial

执行完命令后,当前目录会生成如下 keyring:
• {cluster-name}.client.admin.keyring
• {cluster-name}.bootstrap-osd.keyring
• {cluster-name}.bootstrap-mds.keyring
• {cluster-name}.bootstrap-rgw.keyring

创建 OSD 数据目录

OSD 的数据目录可以使用单独的分区,也可以只使用已有分区的目录。这里我们是直接使用目录的方式。如果需要使用单独数据分区和日志分区,可参考:http://docs.ceph.com/docs/master/rados/deployment/ceph-deploy-osd/。
添加两个 OSD。

# ssh node2
# sudo mkdir /var/local/osd0
# chown ceph:ceph /var/local/osd0
# exit

# ssh node3
# sudo mkdir /var/local/osd1
# chown ceph:ceph /var/local/osd1
# exit

准备 OSD

ceph-deploy osd prepare {ceph-node}:/path/to/directory

如:

# ceph-deploy osd prepare node2:/var/local/osd0 node3:/var/local/osd1

激活 OSD

ceph-deploy osd prepare {ceph-node}:/path/to/directory

如:

# ceph-deploy osd prepare node2:/var/local/osd0 node3:/var/local/osd1

拷贝配置文件和管理 key

ceph-deploy admin {admin-node} {ceph-node}

如:

# ceph-deploy admin node1 node2 node3

确保 ceph.client.admin.keyring 的权限正确,在每个节点上执行:

chmod +r /etc/ceph/ceph.client.admin.keyring

检查集群状态

# ceph –s

集群应该返回 health HEALTH_OK,并且所有 pg 都是 active+clean 的状态,这样部署就完全没问题了。

部署 rgw 网关

如果要使用 Ceph 的对象存储,就需要部署 rgw 网关。执行以下步骤创建一个新的 rgw 实例:

ceph-deploy rgw create {gateway-node}

如:

# ceph-deploy rgw create node4

验证 Ceph

当显示状态健康时,可写入数据并查看数据。
创建一个普通文本文件 testfile.txt,并向其写入数据。
创建一个 pool。格式为:rados mkpool {pool-name},执行:

# rados mkpool data

将文件写入 pool。格式为:rados put {object-name} {file-path} –pool={pool-name},执行:

# rados put test-object-1 testfile.txt --pool=data

如果文件不大,应该很快就写完并成功了。如果卡主较长时间,则可能是出错了,需要排查问题。
查看文件是否存在于 pool 中,格式为:rados -p {pool-name} ls,执行:

# rados -p data ls

确定文件的位置。格式为:ceph osd map {pool-name} {object-name},执行:

# ceph osd map data test-object-1

从 pool 中读取文件。格式为:rados get {object-name} –pool={pool-name} {file-path},执行:

# rados get test-object-1 --pool=data myfile

可比对读出的文件 myfile 和原文件 testfile.txt 是否相同,执行命令:diff myfile testfile.txt。
从 pool 中删除文件。格式为:rados rm {object-name} –pool={pool-name},执行:

# rados rm test-object-1 --pool=data

更多详情见请继续阅读下一页的精彩内容:http://www.linuxidc.com/Linux/2017-03/141583p2.htm

正文完
星哥说事-微信公众号
post-qrcode
 0
星锅
版权声明:本站原创文章,由 星锅 于2022-01-21发表,共计16437字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中