Ceph

参考链接

中文文档: 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。

ceph
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存储集群启动大量节点,它们之间靠相互通讯来复制数据、并动态地重分布数据。

ceph

1.3 Ceph存取数据流程

存储流程

客户端把对象写入目标PG的主OSD,然后这个主OSD再用它的CRUSH图副本找出用于放对象副本的第二、第三个 OSD,并把数据复制到适当的PG所对应的第二、第三 OSD(要多少副本就有多少 OSD ),最终,确认数据成功存储后反馈给客户端。

存储池

Ceph存储系统支持"池"概念,它是存储对象的逻辑分区

PG映射到OSD

每个存储池都有很多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 存储集群,客户端必须做到:

  1. 指定对象名
  2. 指定存储池

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及其之后的版 本来说,停止和移除命令的格式分别如下所示:

  1. 停用设备:ceph osd out {osd-num}
  2. 停止进程:sudo systemctl stop ceph-osd@{osd-num}
  3. 移除设备: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交互。

RDB

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

你可能感兴趣的:(Ceph)