ceph
该布署基于 Jewel(2016年)版本的 ceph
mimic(2018年)的 ceph 默认 osd 使用 bluestore,在创建 OSD 的时候步骤有些不一样,而且该版本自带 UI 控制台,是以前版本所没有的。
准备工作
- 需要大于等于3台机器,每台机器大于等于2块数据盘
- 最新的 CentOS 7 操作系统,安装时使用 Basic Server 配置,对系统盘大小没有特殊要求,网络要用静态 IP 配好
- 集群里的所有机器装好 NTP 时间同步服务,如果连不了网,请找一台机器作时间服务器(因为 ceph 集群对时间一致性有依赖)
- 将所有数据盘使用 xfs 格式化(不需要分区),然后挂载到 /data/disk1、/data/disk2…,并通过 uuid 的方式写入到 /etc/fstab
- 关掉所有的防火墙(为了简单起见,否则需要单独开 6700~7300、80、443、22 端口)
- 关掉 SELinux
-
找其中一台机器作为操作机,通过 ssh-copy-id 让操作机可以免密码 SSH 登录集群里的所有机器(因为 ceph-deploy 依赖 ssh 来进行批量布署)
- 将 mon 节点的三台机器配置 hostname,并要求在操作机上可以通过 hostname 来访问
-
在所有机器上配置 ceph 的 yum 源和 epel 源(该布署基于线上的 163 yum源,如果纯内网环境布署,需要另想办法)
ceph-deploy 安装过程中会调用如下命令:
yum install -y https://download.ceph.com/rpm-jewel/el7/noarch/ceph-release-1-0.el7.noarch.rpm
yum install -y epel-release yum-plugin-priorities ceph ceph-radosgw
安装
在所有机器上安装 ceph 软件包
在操作机上运行 ceph-deploy 在所有节点上安装 ceph 包
ceph-deploy install 192.168.1.120 192.168.1.121 192.168.1.122
在这个过程中 ceph-deploy 会调用如下命令:
yum install -y epel-release
yum install -y yum-plugin-priorities
yum install -y https://download.ceph.com/rpm-jewel/el7/noarch/ceph-release-1-0.el7.noarch.rpm
所以,也可以这个环节,也可能不用 ceph-deploy,而是手工在所有机器上安装 ceph,ceph-radosgw
yum install -y ceph ceph-radosgw
配置
在操作机上创建个工作目录,用来存放集群配置等文件
cd
mkdir my-cluster
cd my-cluster
ceph-deploy new node0 node1 node2
其中 node0 node1 node2 是 mon 节点的 hostname,要求在操作机的 /etc/hosts 里配置这些 hostname 对 IP 的映射,以可以正常访问
ceph-deploy new 命令会通过 hostname 通过 ssh 连接这些节点,只是作验证是否能连接且验证 IP 是否与本地解析的一致,然后生成 ceph.conf ceph-deploy-ceph.log ceph.mon.keyring 这三个集群配置文件
修改 ceph.conf 中的参数,加入以下配置
# 使用 2 副本
osd pool default size = 2# 降低时钟敏感性
mon clock drift allowed = 2
mon clock drift warn backoff = 30
启动 mon 服务
ceph-deploy mon create-initial
ceph-deploy 会跟据 ~/my-cluster/ceph.conf 的配置,登录所有的 mon 节点,启动 ceph-mon 服务
运行完成后,会在 ~/my-cluster/ 目录下生成几点个 .keyring 文件
初始化 osd 目录
mkdir /data/disk1/osd0
chown ceph.ceph /data/disk1/osd0
# 对所有数据盘都重复这样的操作,osd0 命名不是必须的
然后填入 ceph osd 初始化数据
ceph-deploy osd prepare 192.168.1.120:/data/disk1/osd0 192.168.1.120:/data/disk2/osd1 192.168.1.121:/data/disk1/osd2 192.168.1.121:/data/disk2/osd3 192.168.1.122:/data/disk1/osd4 192.168.1.122:/data/disk2/osd5
启动 osd 服务
ceph-deploy osd activate 192.168.1.120:/data/disk1/osd0 192.168.1.120:/data/disk2/osd1 192.168.1.121:/data/disk1/osd2 192.168.1.121:/data/disk2/osd3 192.168.1.122:/data/disk1/osd4 192.168.1.122:/data/disk2/osd5
这个时候,可以在任意一个节点查看集群状态
ceph status
创建 pool
ceph osd pool create data 64 # 创建名称为 data 的 pool,PG数据为 64 个
ceph osd lspools # 查看有哪些 pool
读写Obj
echo "Hello, World." > /tmp/hello-world.txt
rados -p data put hello-world.txt ./hello-world.txt # 上传
rados -p data ls # 枚举
ceph osd map data hello-world.txt # 查看这个对象的物理副本位置
rados -p data get hello-world.txt /tmp/hello-world.txt.1 # 下载
rados -p data rm hello-world.txt # 删除
块设备操作
rbd -p rbd create rbd1 --size 10240 # 在名为 rbd 的 pool 里创建一个 10GB 的块
rbd -p rbd ls # 枚举一下所有块
rbd -p rbd --image rbd1 info # 查看该块属性和feature
rbd -p rbd feature disable rbd1 exclusive-lock object-map fast-diff deep-flatten # 关掉一些在 3.10 kernel 上不支持的 feature
rbd -p rbd map --image rbd1 # 挂载该块设备
rbd showmapped # 查看已载载的块设备
mkfs.xfs /dev/rbd0 # 可以开始使用了
# 以上操作要求安装 ceph 环境(即 yum install -y ceph ceph-radosgw 和 /etc/ceph/* 配置)
CephFS
建议使用 mimic 版本以上的 cephfs,这样更加稳定。
客户端没有特殊情况,建议使用 ceph-fuse,代价就只是一些小小的性能损失,功能完备。
如果使用 kernel ceph,要求内核需要非常高的版本才能与 2018 年的 mimic 服务端相匹配。
ceph osd pool create cephfs_data 64
ceph osd pool create cephfs_metadata 64
为 cephfs 创建两个 pool,一个用来放 mds 元数据,一个用来放文件数据块数据
ceph-deploy mds create node0
ceph-deploy mds create node1
ceph-deploy mds create node2
布署并启动 mds
ceph fs new awesomefs cephfs_metadata cephfs_data # 创建一个名为 awesomefs 的 cephfs
挂载
mkdir /mnt/cfs
ceph-fuse /mnt/cfs # ceph-fsue 会跟据 /etc/ceph/ceph.conf 去寻找 mon 节点,然后从 /etc/ceph/ 目录下寻找 key 去连接 ceph 服务端
ceph-fuse 的版本需要与 ceph 服务端集群的版本一致,否则有可能无法 mount(甚至 core dump crash)
增加 OSD 节点
本质上,没有增加 OSD 节点的说法,增加 OSD 节点,即是增加 OSD
1. 在新的 OSD 节点机器上安装 ceph 包
yum install -y ceph ceph-radosgw
2. 初始化 OSD 目录(ceph-deploy prepare 同以上操作方法)。ceph-deploy 同时会初始化新节点的 /etc/ceph 目录。
3. 启动 OSD(ceph-deploy active 同以上操作方法)
完成后,使用 ceph -w 观察集群状况
集群重启
关闭集群
- 关闭所有的客户端
- 整个集群需要是健康状态
- 设置 noout, norecover, norebalance, nobackfill, nodown and pause flags
ceph osd set noout
ceph osd set norecover
ceph osd set norebalance
ceph osd set nobackfill
ceph osd set nodown
ceph osd set pause - 一台一台关闭 osd
systemctl stop ceph-osd.target - 一台一台关闭 mon
systemctl stop ceph-mon.target - 一台一台关闭 mgr(如果有的话)
systemctl stop ceph-mgr.target
启动集群
- 一台一台启动 mon
systemctl start ceph-mon.target - 一台一台启动 mgr
systemctl start ceph-mgr.target - 一台一台启动 osd
systemctl start ceph-osd.target - 清除 noout, norecover, norebalance, nobackfill, nodown and pause flags
ceph osd unset noout
ceph osd unset norecover
ceph osd unset norebalance
ceph osd unset nobackfill
ceph osd unset nodown
ceph osd unset pause
升级
从 Jewel(2016年) 升级到 luminous(2017年):
- 将 /etc/yum.repos.d/ceph.repo 改成 luminous 的地址
- 在操作机上更新包 yum update ceph-deploy,在所有 ceph 节点上更新 ceph 包 yum update ceph ceph-radosgw
- 然后重启所有的 mon,再重启所有的 osd,请严格依照此文档执行:https://ceph.com/releases/v12-2-0-luminous-released/#upgrading
- ceph-mgr 是一个luminous的新东西,需要安装一个:ceph-deploy mgr create node0(在第一个 mon 节点上装一个即可)
- 最后可能需要将一些 pool 设置一下 tag,然后 ceph -w 会报节点不健康:https://ceph.com/community/new-luminous-pool-tags/
从 luminous(2017年)升级到 mimic(2018年):
有问题,更新后 mon 无法启动,说是 ceph osd require-osd-release luminous 未执行。该问题未解决。
常用操作
类型 | 命令 | 作用 |
---|---|---|
集群 | ceph df | 查看空间使用情况 |
ceph status | 集群状态概览 | |
ceph -w | 持续输出集群状态 | |
MON | ||
PG | ceph pg dump | 输出每个 PG 的信息和状态 |
OSD | ceph osd tree | 查看线上的所有 osd |
POOL |
ceph osd pool delete {pool-name} |
删除一个 pool ceph tell mon.\* injectargs '--mon-allow-pool-delete=true' |