参考链接
中文文档: http://docs.ceph.org.cn/ (相对较老)
英文文档: https://docs.ceph.com/en/latest/
仓库源:
https://mirrors.aliyun.com/ceph/ #阿里云镜像仓库
http://mirrors.163.com/ceph/ #网易镜像仓库
https://mirrors.tuna.tsinghua.edu.cn/ceph/ #清华大学镜像源
一、Ceph 简介
Ceph是一个开源的分布式存储系统。
Ceph提供对象存储/块设备/文件存储类型。
1.1 Ceph 组件
Ceph存储集群至少需要一个Ceph Monitor、Ceph Manager和Ceph OSD(Object Storage Daemon)。运行Ceph文件系统客户端时也需要Ceph Metadata Server。
Monitors: Ceph Monitor(ceph-mon)维护集群状态的图表,包括监控器图、管理器图、OSD图、MDS图和CRUSH图。这些是重要的集群状态,Ceph守护进程相互协调所需的图表。Monitors还负责管理守护进程和客户机之间的身份验证。为了实现冗余和高可用性,通常至少需要三个Monitors。
Managers: Ceph Manager守护进程(ceph-mgr)负责跟踪运行时指标和Ceph集群的当前状态,包括存储利用率、当前性能指标和系统负载。Ceph Manager守护进程还承载基于python的模块,用于管理和公开Ceph集群信息,包括基于web的Ceph Dashboard和REST API。对于高可用性,通常至少需要两个Managers。
Ceph OSDs: Ceph OSD(ceph-osd)用于存储数据,处理数据复制/恢复/再均衡等操作,并通过检测其他Ceph OSD守护进程的心跳,向Ceph Monitors和Managers提供一些监控信息。为了实现冗余和高可用性,一般至少需要3个Ceph OSDs。
MDSs: Ceph Metadata Server(MDS, ceph-mds)为Ceph文件系统存储元数据(Ceph块设备和 Ceph对象存储不使用MDS)。Ceph Metadata Servers允许POSIX文件系统的用户执行基本命令(如ls、find等),而不会给Ceph存储集群带来巨大的负担。
Ceph将数据作为对象(objects) 存储在逻辑存储池中。Ceph使用CRUSH算法计算出哪个PG应该包含该对象,并进一步计算出哪个osd应该存储该PG。CRUSH算法使Ceph存储集群能够动态伸缩、重新均衡和恢复。
1.2 Ceph集群结构
Ceph存储集群提供了对象、块和文件存储功能,它可靠性高、管理简便、并且是开源软件。Ceph可提供极大的伸缩性——供成千用户访问PB乃至EB级的数据。Ceph节点以普通硬件和智能守护进程作为支撑点,Ceph存储集群启动大量节点,它们之间靠相互通讯来复制数据、并动态地重分布数据。
1.3 Ceph存取数据流程
客户端把对象写入目标PG的主OSD,然后这个主OSD再用它的CRUSH图副本找出用于放对象副本的第二、第三个 OSD,并把数据复制到适当的PG所对应的第二、第三 OSD(要多少副本就有多少 OSD ),最终,确认数据成功存储后反馈给客户端。
Ceph存储系统支持"池"概念,它是存储对象的逻辑分区
每个存储池都有很多PG,CRUSH动态的把它们映射到OSD 。Ceph客户端要存对象时,CRUSH将把各对象映射到某个PG。
存储流程:
1.计算文件到对象的映射 oid:
计算文件到对象的映射,假如file为客户端要读写的文件,得到oid(objectid)=ino+ono
ino: inode number(INO),File的元数据序列号,File的唯一id。
ono: object number(ONO),File切分产生的某个object的序号,默认以4M切分一个块大小。
2. 通过hash算法计算出文件对应的pool中的PG
通过一致性HASH计算Object到PG,Object->PG映射hash(oid)&mask->pgid
3. 通过CRUSH把对象映射到PG中的OSD
通过CRUSH算法计算PG到OSD,PG->OSD映射:[CRUSH(pgid)->(osd1,osd2,osd3)]
4. PG中的主OSD将对象写入到硬盘
5. 主OSD将数据同步给备份OSD,并等待备份OSD返回确认
6. 主OSD将写入完成返回给客户端
二、通过ceph-deploy快速安装部署ceph集群存储
ceph-deploy是一种仅依靠SSH访问服务器、sudo和一些Python来部署Ceph的方法。它不需要服务器、数据库或任何类似的东西。
ceph推荐使用2块万兆网卡(2个网络),public网络用于客户端访问,cluster网络用于集群管理及数据同步.
注: 本实验简单采用一块网卡(public和cluster共用)。阿里云ECS,镜像已经经过一些优化(镜像源/时间同步/openssh/允许root登录等).
集群服务器采用ubuntu18系统,如下:
1. 一台ceph-deploy服务器,用于部署ceph集群
172.26.128.89/172.26.128.89
2. 三台服务器Monitor服务器,用于ceph集群ceph-mon监视服务器
172.26.128.90/172.26.128.90
172.26.128.91/172.26.128.91
172.26.128.92/172.26.128.92
3. 两个Manager服务器,用于ceph-mgr管理服务器
172.26.128.93/172.26.128.93
172.26.128.94/172.26.128.94
4. 四台OSD服务器,用于ceph集群ceph-osd存储服务器,每台2块或以上的磁盘
172.26.128.95/172.26.128.95
172.26.128.96/172.26.128.96
172.26.128.97/172.26.128.97
172.26.128.98/172.26.128.98
各存储服务器磁盘划分: /dev/vdb /dev/vdc #20G
5. 2台客户端测试服务器ceph-client(centos和ubuntu各一台)
172.26.128.99/172.26.128.99
172.26.128.100/172.26.128.100
2.1 基础环境配置
基础环境配置:
1. 时间同步(服务器时间必须同步,阿里云ecs自有时间同步,本实验忽略)
2. 关闭selinux和防火墙(线上根据实际情况选择是否关闭,阿里云ubuntu镜像默认关闭selinux和防火墙,本实验忽略)
3. 更改主机名
4. 配置域名解析(实验通过绑定host,线上需配置dns解析)
5. 设置仓库源
6. 添加普通用户并设置sudo权限
2.1.1 更改主机名
IP: 172.26.128.89 HostName: ceph-deploy
IP: 172.26.128.90 HostName: ceph-mon1
IP: 172.26.128.91 HostName: ceph-mon2
IP: 172.26.128.92 HostName: ceph-mon3
IP: 172.26.128.93 HostName: ceph-mgr1
IP: 172.26.128.94 HostName: ceph-mgr2
IP: 172.26.128.95 HostName: ceph-node1
IP: 172.26.128.96 HostName: ceph-node2
IP: 172.26.128.97 HostName: ceph-node3
IP: 172.26.128.98 HostName: ceph-node4
按照上述ip和主机名对应关系更改,命令如下如下:
hostname ceph-deploy
echo ceph-deploy > /etc/hostname
2.1.2 添加域名解析
本实验通过host方式,线上要通过域名解析
cat >> /etc/hosts<< EOF
# ceph host
172.26.128.89 ceph-deploy
172.26.128.90 ceph-mon1
172.26.128.91 ceph-mon2
172.26.128.92 ceph-mon3
172.26.128.93 ceph-mgr1
172.26.128.94 ceph-mgr2
172.26.128.95 ceph-node1
172.26.128.96 ceph-node2
172.26.128.97 ceph-node3
172.26.128.98 ceph-node4
# ceph host
EOF
2.1.3 设置仓库源
所有服务器设置ceph仓库源(阿里云镜像源)
wget -q -O- 'https://mirrors.aliyun.com/ceph/keys/release.asc' | sudo apt-key add -
ceph_stable_release=pacific
echo deb https://mirrors.aliyun.com/ceph/debian-$ceph_stable_release/ $(lsb_release -sc) main | sudo tee /etc/apt/sources.list.d/ceph.list
sudo apt update -y
2.1.4 添加部署ceph的普通用户(cephyd)
较新版的ceph-deploy支持用--username选项提供可无密码使用sudo的用户名(包括root,不建议这样做)。使用 ceph-deploy --username {username} 命令时,指定的用户必须能够通过无密码SSH连接到Ceph节点,因为ceph-deploy中途不会提示输入密码。
推荐在集群内的所有Ceph节点上给ceph-deploy创建一个特定的用户(比如cephuser、cephadmin 这样的用户去管理ceph集群。
注:不要用"ceph"这个名字。从Infernalis版起,用户名"ceph"保留给了Ceph守护进程。如果Ceph节点上已经有了"ceph"用户,升级前必须先删掉这个用户。
本实验在包含ceph-deploy节点、ceph-osd节点、ceph-mon节点和ceph-mgr节点等创建cephyd用户)。
1. 在各ceph节点创建新用户。
groupadd -r -g 2022 cephyd && useradd -r -m -s /bin/bash -u 2022 -g 2022 cephyd && echo cephyd:7QR59*TAI | chpasswd
2. 确保各ceph节点上新创建的用户都有sudo权限
echo "cephyd ALL = (root) NOPASSWD:ALL" | sudo tee /etc/sudoers.d/cephyd
sudo chmod 0440 /etc/sudoers.d/cephyd
2.1.5 配置允许ceph-deploy服务器无密码SSH登录至ceph集群各节点
因为ceph-deploy不支持输入密码,所以必须在ceph-deploy节点上生成SSH密钥并把其公钥分发到ceph集群各节点
。 ceph-deploy会尝试给初始monitors生成SSH密钥对。
生成SSH密钥对,不要用sudo或root用户。提示"Enter passphrase"时,直接回车,口令即为空:
在ceph-deploy服务器上操作:
1. 切换至cephyd用户
root@ceph-deploy:~# su - cephyd
2. 生成密钥对
cephyd@ceph-deploy:~$ ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/home/cephyd/.ssh/id_rsa):
Created directory '/home/cephyd/.ssh'.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/cephyd/.ssh/id_rsa.
Your public key has been saved in /home/cephyd/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:t+nL8wT6ndIiEsQDPZIPlxjL/1vCXA1oHhs49F03svM cephyd@ceph-deploy
The key's randomart image is:
+---[RSA 2048]----+
| .=.. o o |
| .*o=o o . + . |
| oBo.* o o |
| .=+ + o o |
| ...S + . E |
| .+ + + |
| .* +.. |
| . .B+o.. |
| ...=*+ |
+----[SHA256]-----+
3. 分发公钥到各被管理节点:
cephyd@ceph-deploy:~$ ssh-copy-id [email protected]
cephyd@ceph-deploy:~$ ssh-copy-id [email protected]
cephyd@ceph-deploy:~$ ssh-copy-id [email protected]
cephyd@ceph-deploy:~$ ssh-copy-id [email protected]
cephyd@ceph-deploy:~$ ssh-copy-id [email protected]
cephyd@ceph-deploy:~$ ssh-copy-id [email protected]
cephyd@ceph-deploy:~$ ssh-copy-id [email protected]
cephyd@ceph-deploy:~$ ssh-copy-id [email protected]
cephyd@ceph-deploy:~$ ssh-copy-id [email protected]
cephyd@ceph-deploy:~$ ssh-copy-id [email protected]
4. 修改ceph-deploy管理节点上的~/.ssh/config文件,这样ceph-deploy就能用你所建的用户名登录ceph节点了,而无需每次执行ceph-deploy都要指定--username {username} 。这样做同时也简化了ssh和scp的用法。把 {username} 替换成你创建的用户名。
cephyd@ceph-deploy:~$ cat >> ~/.ssh/config<< EOF
######## ceph #######
HOST ceph-deploy
HostName 172.26.128.89
User cephyd
PORT 22
HOST ceph-mon1
HostName 172.26.128.90
User cephyd
PORT 22
HOST ceph-mon2
HostName 172.26.128.91
User cephyd
PORT 22
HOST ceph-mon3
HostName 172.26.128.92
User cephyd
PORT 22
HOST ceph-mgr1
HostName 172.26.128.93
User cephyd
PORT 22
HOST ceph-mgr2
HostName 172.26.128.94
User cephyd
PORT 22
HOST ceph-node1
HostName 172.26.128.95
User cephyd
PORT 22
HOST ceph-node2
HostName 172.26.128.96
User cephyd
PORT 22
HOST ceph-node3
HostName 172.26.128.97
User cephyd
PORT 22
HOST ceph-node4
HostName 172.26.128.98
User cephyd
PORT 22
HOST ceph-client1
HostName 172.26.128.99
User cephyd
PORT 22
HOST ceph-client2
HostName 172.26.128.100
User cephyd
PORT 22
######## ceph #######
EOF
5. 测试免密登录
cephyd@ceph-deploy:~$ ssh ceph-mon1 'date'
Sun Aug 15 16:14:29 CST 2021
cephyd@ceph-deploy:~$ ssh cephyd@ceph-mon1 'date'
Sun Aug 15 16:14:40 CST 2021
2.2 集群部署
通过ceph-deploy从集群管理节点建立一个Ceph存储集群。
它包含一个Monitor、一个Manager和四个OSD守护进程。一旦集群达到active+clean状态,再扩展它:增加第五个OSD、增加元数据服务器和两个Ceph Monitors。
先在管理节点上创建一个目录(ceph-cluster),用于保存ceph-deploy生成的配置文件和密钥对。
cephyd@ceph-deploy:~$ mkdir ceph-cluster
cephyd@ceph-deploy:~$ cd ceph-cluster/
cephyd@ceph-deploy:~/ceph-cluster$ pwd
/home/cephyd/ceph-cluster
2.2.1 创建集群
1. 安装CEPH部署工具
sudo apt-get install ceph-deploy
2. 创建集群
cephyd@ceph-deploy:~/ceph-cluster$ ceph-deploy new --cluster-network 172.26.128.0/20 --public-network 172.26.128.0/20 ceph-mon1
3. 查看验证
应该有一个ceph配置文件、一个monitor密钥和一个日志文件
cephyd@ceph-deploy:~/ceph-cluster$ ls
ceph.conf ceph-deploy-ceph.log ceph.mon.keyring
cephyd@ceph-deploy:~/ceph-cluster$ cat ceph.conf
[global]
fsid = 003cb89b-8812-4172-a327-6a774c687c6c
public_network = 172.26.128.0/20
cluster_network = 172.26.128.0/20
mon_initial_members = ceph-mon1
mon_host = 172.26.128.90
auth_cluster_required = cephx
auth_service_required = cephx
auth_client_required = cephx
4. 安装ceph
cephyd@ceph-deploy:~/ceph-cluster$ ceph-deploy install --no-adjust-repos --nogpgcheck ceph-deploy ceph-mon1 ceph-mon2 ceph-mon3 ceph-mgr1 ceph-mgr2 ceph-node1 ceph-node2 ceph-node3 ceph-node4
5. 配置初始 monitor(s)、并收集所有密钥:
cephyd@ceph-deploy:~/ceph-cluster$ ceph-deploy mon create-initial
6. 验证
在mon定节点已经自动安装并启动了ceph-mon服务,并且后期在ceph-deploy节点初始化目录会生成一些ceph.bootstrap-mds/mgr/osd/rgw等服务的keyring认证文件,这些初始化文件拥有对ceph集群的最高权限,所以一定要保存好。
cephyd@ceph-deploy:~/ceph-cluster$ ls
ceph.bootstrap-mds.keyring ceph.bootstrap-osd.keyring ceph.client.admin.keyring ceph-deploy-ceph.log
ceph.bootstrap-mgr.keyring ceph.bootstrap-rgw.keyring ceph.conf ceph.mon.keyring
cephyd@ceph-deploy:~/ceph-cluster$ ssh ceph-mon1 'ps auxf | grep ceph-mon | grep -v grep'
ceph 27405 0.0 1.0 480388 40024 ? Ssl 17:01 0:00 /usr/bin/ceph-mon -f --cluster ceph --id ceph-mon1 --setuser ceph --setgroup ceph
7. 分发admin密钥
在ceph-deploy节点把配置文件和admin密钥拷贝至Ceph集群需要执行ceph管理命令的节点,从而不需要后期通过 ceph命令对ceph集群进行管理配置的时候每次都需要指定ceph-mon节点地址和ceph.client.admin.keyring文件,另外各ceph-mon节点也需要同步ceph的集群配置文件与认证文件。
cephyd@ceph-deploy:~/ceph-cluster$ ceph-deploy admin ceph-deploy ceph-node1 ceph-node2 ceph-node3 ceph-node4
8. 验证密钥
cephyd@ceph-deploy:~/ceph-cluster$ ssh ceph-node1 'ls -l /etc/ceph/'
total 12
-rw------- 1 root root 151 Aug 15 17:12 ceph.client.admin.keyring
-rw-r--r-- 1 root root 267 Aug 15 17:12 ceph.conf
-rw-r--r-- 1 root root 92 Jul 8 22:17 rbdmap
-rw------- 1 root root 0 Aug 15 17:10 tmpkzzYdt
9. 认证文件的属主和属组为了安全考虑,默认设置为了root用户和root组,如果需要ceph用户也能执行ceph命令,那么就需要对ceph用户进行授权,
cephyd@ceph-deploy:~/ceph-cluster$ ssh ceph-node1 'sudo apt install acl -y && sudo setfacl -m u:ceph:rw /etc/ceph/ceph.client.admin.keyring'
cephyd@ceph-deploy:~/ceph-cluster$ ssh ceph-node2 'sudo apt install acl -y && sudo setfacl -m u:ceph:rw /etc/ceph/ceph.client.admin.keyring'
cephyd@ceph-deploy:~/ceph-cluster$ ssh ceph-node3 'sudo apt install acl -y && sudo setfacl -m u:ceph:rw /etc/ceph/ceph.client.admin.keyring'
cephyd@ceph-deploy:~/ceph-cluster$ ssh ceph-node4 'sudo apt install acl -y && sudo setfacl -m u:ceph:rw /etc/ceph/ceph.client.admin.keyring'
10. 创建Manger服务器
cephyd@ceph-deploy:~/ceph-cluster$ ceph-deploy mgr create ceph-mgr1
cephyd@ceph-deploy:~/ceph-cluster$ sudo ceph -s
cluster:
id: 003cb89b-8812-4172-a327-6a774c687c6c
health: HEALTH_WARN
mon is allowing insecure global_id reclaim
OSD count 0 < osd_pool_default_size 3
services:
mon: 1 daemons, quorum ceph-mon1 (age 49m)
mgr: ceph-mgr1(active, since 8m)
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:
11. 解决HEALTH_WARN报警
cephyd@ceph-deploy:~/ceph-cluster$ sudo ceph config set mon auth_allow_insecure_global_id_reclaim false
cephyd@ceph-deploy:~/ceph-cluster$ sudo ceph -s
cluster:
id: 003cb89b-8812-4172-a327-6a774c687c6c
health: HEALTH_WARN
OSD count 0 < osd_pool_default_size 3
services:
mon: 1 daemons, quorum ceph-mon1 (age 51m)
mgr: ceph-mgr1(active, since 10m)
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:
12. 列出node节点磁盘
cephyd@ceph-deploy:~/ceph-cluster$ ceph-deploy disk list ceph-node1
cephyd@ceph-deploy:~/ceph-cluster$ ceph-deploy disk list ceph-node2
cephyd@ceph-deploy:~/ceph-cluster$ ceph-deploy disk list ceph-node3
cephyd@ceph-deploy:~/ceph-cluster$ ceph-deploy disk list ceph-node4
13. 擦除磁盘
cephyd@ceph-deploy:~/ceph-cluster$ ceph-deploy disk zap ceph-node1 /dev/vdb /dev/vdc
cephyd@ceph-deploy:~/ceph-cluster$ ceph-deploy disk zap ceph-node2 /dev/vdb /dev/vdc
cephyd@ceph-deploy:~/ceph-cluster$ ceph-deploy disk zap ceph-node3 /dev/vdb /dev/vdc
cephyd@ceph-deploy:~/ceph-cluster$ ceph-deploy disk zap ceph-node4 /dev/vdb /dev/vdc
14. 添加osd
cephyd@ceph-deploy:~/ceph-cluster$ ceph-deploy osd create ceph-node1 --data /dev/vdb
cephyd@ceph-deploy:~/ceph-cluster$ ceph-deploy osd create ceph-node1 --data /dev/vdc
cephyd@ceph-deploy:~/ceph-cluster$ ceph-deploy osd create ceph-node2 --data /dev/vdb
cephyd@ceph-deploy:~/ceph-cluster$ ceph-deploy osd create ceph-node2 --data /dev/vdc
cephyd@ceph-deploy:~/ceph-cluster$ ceph-deploy osd create ceph-node3 --data /dev/vdb
cephyd@ceph-deploy:~/ceph-cluster$ ceph-deploy osd create ceph-node3 --data /dev/vdc
cephyd@ceph-deploy:~/ceph-cluster$ ceph-deploy osd create ceph-node4 --data /dev/vdb
cephyd@ceph-deploy:~/ceph-cluster$ ceph-deploy osd create ceph-node4 --data /dev/vdc
15. 验证
cephyd@ceph-deploy:~/ceph-cluster$ sudo ceph health
HEALTH_OK
cephyd@ceph-deploy:~/ceph-cluster$ sudo ceph -s
cluster:
id: 003cb89b-8812-4172-a327-6a774c687c6c
health: HEALTH_OK
services:
mon: 1 daemons, quorum ceph-mon1 (age 3h)
mgr: ceph-mgr1(active, since 3h)
osd: 6 osds: 6 up (since 74s), 6 in (since 82s)
data:
pools: 1 pools, 1 pgs
objects: 0 objects, 0 B
usage: 32 MiB used, 120 GiB / 120 GiB avail
pgs: 1 active+clean
cephyd@ceph-deploy:~/ceph-cluster$ ssh ceph-node1 'ps auxf | grep ceph-osd | grep -v grep'
ceph 31901 0.2 1.5 1032196 59156 ? Ssl 20:32 0:01 /usr/bin/ceph-osd -f --cluster ceph --id 0 --setuser ceph --setgroup ceph
ceph 33478 0.2 1.5 1030084 58904 ? Ssl 20:36 0:00 /usr/bin/ceph-osd -f --cluster ceph --id 1 --setuser ceph --setgroup ceph
cephyd@ceph-deploy:~/ceph-cluster$ ssh ceph-node2 'ps auxf | grep ceph-osd | grep -v grep'
ceph 31364 0.3 1.4 1030080 57068 ? Ssl 20:40 0:00 /usr/bin/ceph-osd -f --cluster ceph --id 2 --setuser ceph --setgroup ceph
ceph 32955 0.3 1.5 1030084 58716 ? Ssl 20:41 0:00 /usr/bin/ceph-osd -f --cluster ceph --id 3 --setuser ceph --setgroup ceph
cephyd@ceph-deploy:~/ceph-cluster$ ssh ceph-node3 'ps auxf | grep ceph-osd | grep -v grep'
ceph 31417 0.3 1.4 1030088 57200 ? Ssl 20:41 0:00 /usr/bin/ceph-osd -f --cluster ceph --id 4 --setuser ceph --setgroup ceph
ceph 33012 0.3 1.4 998340 56368 ? Ssl 20:41 0:00 /usr/bin/ceph-osd -f --cluster ceph --id 5 --setuser ceph --setgroup ceph
2.2.2 测试集群
要把对象存入 Ceph 存储集群,客户端必须做到:
- 指定对象名
- 指定存储池
Ceph客户端查出最新集群运行图,用CRUSH算法计算出如何把对象映射到PG,然后动态地计算如何把PG分配到OSD。要定位对象,只需要对象名和存储池名字即可,例如:
ceph osd map {poolname} {object-name}
为了测试集群的数据存取功能,这里首先创建一个用于测试的存储池ydpool,并设定其PG数量为32个。
cephyd@ceph-deploy:~$ sudo ceph osd pool create ydpool 32 32
pool 'ydpool' created
cephyd@ceph-deploy:~$ sudo ceph pg ls-by-pool ydpool | awk '{print $1,$2,$15}'
cephyd@ceph-deploy:~$ sudo ceph osd pool ls
device_health_metrics
ydpool
cephyd@ceph-deploy:~$ sudo rados lspools
device_health_metrics
ydpool
目前ceph环境还没部署使用块设备和文件系统,也没有使用对象存储的客户端,但是ceph的rados命令可以实现访问 ceph对象存储的功能:
2.2.2.1 上传文件
1. 上传文件
把lastlog文件上传到 mypool 并指定对象 id 为 msg1
cephyd@ceph-deploy:~$ sudo rados put msg1 lastlog --pool=ydpool
2. 列出文件
cephyd@ceph-deploy:~$ sudo rados ls --pool=ydpool
msg1
cephyd@ceph-deploy:~$ sudo rados -p ydpool ls
msg1
3. 查看文件信息
ceph osd map 命令可以获取到存储池中数据对象的具体位置信息:
cephyd@ceph-deploy:~$ sudo ceph osd map ydpool msg1
osdmap e48 pool 'ydpool' (2) object 'msg1' -> pg 2.c833d430 (2.10) -> up ([7,4,0], p7) acting ([7,4,0], p7)
表示文件放在了存储池id为2的c833d430的PG上,10为当前PG的id,2.10表示数据是在id为2的存储池当中id为10的 PG中存储,在线的OSD编号7,4,0,主OSD为7, 活动的OSD7,4,0,三个OSD表示数据放一共3个副本,PG中的OSD是 ceph的crush算法计算出三份数据保存在哪些OSD。
2.2.2.2 下载文件
cephyd@ceph-deploy:~$ sudo rados get msg1 --pool=ydpool /tmp/yd.txt
cephyd@ceph-deploy:~$ ll -h /tmp/yd.txt
-rw-r--r-- 1 root root 18M Aug 15 21:21 /tmp/yd.txt
2.2.2.3 修改文件
cephyd@ceph-deploy:~$ sudo rados put msg1 lastlog --pool=ydpool
cephyd@ceph-deploy:~$ sudo rados get msg1 --pool=ydpool /tmp/yd2.txt
2.2.2.4 删除文件
cephyd@ceph-deploy:~$ sudo rados rm msg1 --pool=ydpool
2.3 扩展ceph集群实现高可用
主要是扩展ceph集群的Monitor节点以及Manager节点,以实现集群高可用。
2.3.1 扩展ceph-mon节点
ceph-mon是原生具备自选举以实现高可用机制的ceph服务,节点数量通常是奇数。
添加节点:
cephyd@ceph-deploy:~/ceph-cluster$ ceph-deploy mon add ceph-mon2
cephyd@ceph-deploy:~/ceph-cluster$ ceph-deploy mon add ceph-mon3
验证
cephyd@ceph-deploy:~/ceph-cluster$ sudo ceph -s
cluster:
id: 003cb89b-8812-4172-a327-6a774c687c6c
health: HEALTH_OK
services:
mon: 3 daemons, quorum ceph-mon1,ceph-mon2,ceph-mon3 (age 7s)
mgr: ceph-mgr1(active, since 4h)
osd: 8 osds: 8 up (since 65m), 8 in (since 65m)
data:
pools: 2 pools, 33 pgs
objects: 0 objects, 0 B
usage: 251 MiB used, 160 GiB / 160 GiB avail
pgs: 33 active+clean
cephyd@ceph-deploy:~/ceph-cluster$ sudo ceph quorum_status
cephyd@ceph-deploy:~/ceph-cluster$ sudo ceph quorum_status --format json-pretty
2.3.2 扩展ceph-mgr节点
cephyd@ceph-deploy:~/ceph-cluster$ ceph-deploy mgr create ceph-mgr2
cephyd@ceph-deploy:~/ceph-cluster$ ceph-deploy admin ceph-mgr2
验证
cephyd@ceph-deploy:~/ceph-cluster$ sudo ceph -s
cluster:
id: 003cb89b-8812-4172-a327-6a774c687c6c
health: HEALTH_OK
services:
mon: 3 daemons, quorum ceph-mon1,ceph-mon2,ceph-mon3 (age 5m)
mgr: ceph-mgr1(active, since 4h), standbys: ceph-mgr2
osd: 8 osds: 8 up (since 71m), 8 in (since 71m)
data:
pools: 2 pools, 33 pgs
objects: 0 objects, 0 B
usage: 251 MiB used, 160 GiB / 160 GiB avail
pgs: 33 active+clean
2.3.2 从RADOS移除OSD
Ceph集群中的一个OSD是一个ceph-osd节点的服务进程且对应于一个物理磁盘设备,是一个专用的守护进程。在OSD设备出现故障,或管理员出于管理之需确实要移除特定的OSD设备时,需要先停止相关的守护进程,而后再进行移除操作。
对于Luminous及其之后的版 本来说,停止和移除命令的格式分别如下所示:
- 停用设备:ceph osd out {osd-num}
- 停止进程:sudo systemctl stop ceph-osd@{osd-num}
- 移除设备:ceph osd purge {id} --yes-i-really-mean-it
实战:
1. 查看osd
cephyd@ceph-deploy:~/ceph-cluster$ sudo ceph osd ls
0
1
2
3
4
5
6
7
2. 查看msg文件信息
cephyd@ceph-deploy:~/ceph-cluster$ sudo ceph osd map ydpool msg1
osdmap e48 pool 'ydpool' (2) object 'msg1' -> pg 2.c833d430 (2.10) -> up ([7,4,0], p7) acting ([7,4,0], p7)`
3. 移除osd 7后msg1会转移并保持3副本
cephyd@ceph-deploy:~/ceph-cluster$ sudo ceph osd out 7
marked out osd.7.
cephyd@ceph-deploy:~/ceph-cluster$ ssh ceph-node4 'sudo systemctl stop ceph-osd@7'
cephyd@ceph-deploy:~/ceph-cluster$ sudo ceph osd purge 7 --yes-i-really-mean-it
purged osd.7
cephyd@ceph-deploy:~/ceph-cluster$ sudo ceph osd ls
0
1
2
3
4
5
6
cephyd@ceph-deploy:~/ceph-cluster$ sudo ceph osd map ydpool msg1
osdmap e53 pool 'ydpool' (2) object 'msg1' -> pg 2.c833d430 (2.10) -> up ([6,1,4], p6) acting ([6,1,4], p6)
2.4 初步使用rbd块设备
块是一个字节序列(例如,一个512字节的数据块)。
Ceph块设备是精简配置的、大小可调且将数据条带化存储到集群内的多个OSD。Ceph块设备利用RADOS的多种能力,如快照、复制和一致性。Ceph的RADOS块设备(RBD)使用内核模块或librbd库与OSD交互。
RBD(RADOS Block Devices)即为块存储的一种,RBD通过librbd库与OSD进行交互,RBD为KVM等虚拟化技术和云服务(如OpenStack和CloudStack)提供高性能和无限可扩展性的存储后端,这些系统依赖于libvirt和QEMU实用程序与RBD进行集成,客户端基于librbd库即可将RADOS存储集群用作块设备,不过,用于rbd的存储池需要事先启用rbd功能并进行初始化。
2.4.1 创建RBD
创建一个名为ydrbd1的存储池,并在启用rbd功能后对其进行初始化:
1.创建存储池
cephyd@ceph-deploy:~/ceph-cluster$ sudo ceph osd pool create ydrbd1 64 64
pool 'ydrbd1' created
2. 开启rbd功能
cephyd@ceph-deploy:~/ceph-cluster$ sudo ceph osd pool application enable ydrbd1 rbd
enabled application 'rbd' on pool 'ydrbd1'
3. 初始化
cephyd@ceph-deploy:~/ceph-cluster$ sudo rbd pool init -p ydrbd1
2.4.2 创建img
rbd存储池不能直接用于块设备,需要事先在其中按需创建映像(image),并把映像文件作为块设备使用,rbd命令可用于创建、查看及删除块设备上在的映像(image),以及克隆映像、创建快照、将映像回滚到快照和查看快照等管理操作。
创建名为ydimg1和ydimg2的映像:
1. 创建
cephyd@ceph-deploy:~/ceph-cluster$ sudo rbd create ydimg1 --size 5G --pool ydrbd1
cephyd@ceph-deploy:~/ceph-cluster$ sudo rbd create ydimg2 --size 3G --pool ydrbd1 --image-format 2 --image-feature layering
cephyd@ceph-deploy:~/ceph-cluster$ sudo rbd ls --pool ydrbd1
ydimg1
ydimg2
# 后续步骤会使用ydimg2 ,由于centos系统内核较低无法挂载使用,因此只开启部分特性。除了layering其他特性需要高版本内核支持
2. 查看信息
cephyd@ceph-deploy:~/ceph-cluster$ sudo rbd --image ydimg1 --pool ydrbd1 info
rbd image 'ydimg1':
size 5 GiB in 1280 objects
order 22 (4 MiB objects)
snapshot_count: 0
id: 12d8b31313b9
block_name_prefix: rbd_data.12d8b31313b9
format: 2
features: layering, exclusive-lock, object-map, fast-diff, deep-flatten
op_features:
flags:
create_timestamp: Mon Aug 16 12:19:41 2021
access_timestamp: Mon Aug 16 12:19:41 2021
modify_timestamp: Mon Aug 16 12:19:41 2021
cephyd@ceph-deploy:~/ceph-cluster$ sudo rbd --image ydimg2 --pool ydrbd1 info
rbd image 'ydimg2':
size 3 GiB in 768 objects
order 22 (4 MiB objects)
snapshot_count: 0
id: 37b4e008baeb
block_name_prefix: rbd_data.37b4e008baeb
format: 2
features: layering
op_features:
flags:
create_timestamp: Mon Aug 16 12:20:15 2021
access_timestamp: Mon Aug 16 12:20:15 2021
modify_timestamp: Mon Aug 16 12:20:15 2021
2.4.3 客户端使用块存储
1. 查看cep状态
cephyd@ceph-deploy:~/ceph-cluster$ sudo ceph df
--- RAW STORAGE ---
CLASS SIZE AVAIL USED RAW USED %RAW USED
hdd 120 GiB 120 GiB 192 MiB 192 MiB 0.16
TOTAL 120 GiB 120 GiB 192 MiB 192 MiB 0.16
--- POOLS ---
POOL ID PGS STORED OBJECTS USED %USED MAX AVAIL
device_health_metrics 1 1 0 B 8 0 B 0 38 GiB
ydpool 2 32 11 MiB 1 34 MiB 0.03 38 GiB
ydrbd1 3 64 405 B 7 48 KiB 0 38 GiB
2, 安装ceph并同步认证信息
cephyd@ceph-deploy:~/ceph-cluster$ ceph-deploy install --no-adjust-repos --nogpgcheck ceph-client1
cephyd@ceph-deploy:~/ceph-cluster$ ceph-deploy admin ceph-client1
cephyd@ceph-deploy:~/ceph-cluster$ ssh ceph-client1 'sudo apt install acl -y && sudo setfacl -m u:ceph:rw /etc/ceph/ceph.client.admin.keyring'
3. 客户端映射
cephyd@ceph-deploy:~/ceph-cluster$ ssh ceph-client1
cephyd@ceph-client1:~$ sudo rbd -p ydrbd1 map ydimg2
/dev/rbd0
cephyd@ceph-client1:~$ lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
rbd0 251:0 0 3G 0 disk
rbd1 251:16 0 3G 0 disk
vda 252:0 0 40G 0 disk
└─vda1 252:1 0 40G 0 part /
cephyd@ceph-client1:~$ sudo fdisk -l /dev/rbd0
4. 格式化并挂载
cephyd@ceph-client1:~$ sudo mkfs.ext4 -m0 /dev/rbd0
cephyd@ceph-client1:~$ sudo mkdir /data
cephyd@ceph-client1:~$ sudo mount /dev/rbd0 /data/
cephyd@ceph-client1:~$ sudo cp /var/log/lastlog /data
cephyd@ceph-client1:~$ sudo df -h
Filesystem Size Used Avail Use% Mounted on
udev 922M 0 922M 0% /dev
tmpfs 189M 2.9M 187M 2% /run
/dev/vda1 40G 4.2G 34G 12% /
tmpfs 945M 0 945M 0% /dev/shm
tmpfs 5.0M 0 5.0M 0% /run/lock
tmpfs 945M 0 945M 0% /sys/fs/cgroup
tmpfs 189M 0 189M 0% /run/user/2022
/dev/rbd0 2.9G 9.1M 2.9G 1% /data
5. 验证
cephyd@ceph-client1:~$ sudo dd if=/dev/zero of=/data/ceph-test-file bs=1MB count=300
300+0 records in
300+0 records out
300000000 bytes (300 MB, 286 MiB) copied, 0.492302 s, 609 MB/s
cephyd@ceph-client1:~$ df -h
cephyd@ceph-client1:~$ ll -h /data/
total 287M
drwxr-xr-x 3 root root 4.0K Aug 16 12:43 ./
drwxr-xr-x 23 root root 4.0K Aug 16 12:41 ../
-rw-r--r-- 1 root root 287M Aug 16 12:43 ceph-test-file
-rw-r--r-- 1 root root 18M Aug 16 12:41 lastlog
drwx------ 2 root root 16K Aug 16 12:40 lost+found/
cephyd@ceph-client1:~$ sudo ceph df
--- RAW STORAGE ---
CLASS SIZE AVAIL USED RAW USED %RAW USED
hdd 120 GiB 118 GiB 2.4 GiB 2.4 GiB 2.01
TOTAL 120 GiB 118 GiB 2.4 GiB 2.4 GiB 2.01
--- POOLS ---
POOL ID PGS STORED OBJECTS USED %USED MAX AVAIL
device_health_metrics 1 1 0 B 8 0 B 0 37 GiB
ydpool 2 32 11 MiB 1 34 MiB 0.03 37 GiB
ydrbd1 3 64 352 MiB 104 1.0 GiB 0.92 37 GiB