Ceph是一个开源的分布式存储系统,同时支持对象存储、块设备、文件系统。
ceph是一个对象(object)式存储系统,这个对象指的是数据。每个待管理的数据流(文件等数据)切分成一到多个固定大小(默认4MB)的对象数据。对象数据的底层存储服务是由多个存储主机(host)组成的存储集群, 该集群也被称之为 RADOS(reliable automatic distributed object store)存储集群,即可靠的、自动化的、分布 式的对象存储系统。 librados 是 RADOS 存储集群的 API,支持 C/C++/JAVA/python/ruby/php/go 等编程语言客户端。

  ceph存储系统的逻辑存储结构如下图所示:

ceph组件功能介绍以及集群部署_ceph功能介绍

ceph 的设计思想:

ceph的设计思想:
每一组件皆可扩展
无单点故障
基于软件(而非专业设备)并且开源(无供应商锁定)
在现有的廉价硬件上运行
尽可能自动管理,减少用户干预

ceph版本:
第一个版本是0.1,发布时间2008年1月,直到2015年4月0.941发布之后,为了避免0.99,命名规定如下:
x.0.z 开发版(给早期测试者和勇士们)
x.1.z 候选版(用于测试集群,高手们)
x.2.z 稳定,修正版(给用户们)

ceph核心组件以及概念介绍

  • MonitorsCeph Monitor ( ceph-mon) 维护集群状态的映射,包括监视器映射、管理器映射、OSD 映射、MDS 映射和 CRUSH 映射。这些映射是 Ceph 守护进程相互协调所需的关键集群状态。监视器还负责管理守护进程和客户端之间的身份验证。通常至少需要三个监视器才能实现冗余和高可用性。

  • ManagersCeph 管理器守护进程 ( ceph-mgr) 负责跟踪运行时指标和 Ceph 集群的当前状态,包括存储利用率、当前性能指标和系统负载。Ceph 管理器守护进程还托管基于 Python 的模块来管理和公开 Ceph 集群信息,包括基于 Web 的Ceph 仪表板和 REST API高可用性通常至少需要两个管理器。

  • Ceph OSDCeph OSD(对象存储守护进程 ceph-osd)存储数据,处理数据复制、恢复、重新平衡,并通过检查其他 Ceph OSD 守护进程的心跳来向 Ceph 监视器和管理器提供一些监控信息。通常至少需要 3 个 Ceph OSD 来实现冗余和高可用性。

  • MDSCeph 元数据服务器(MDS,ceph-mds)代表Ceph 文件系统存储元数据(即 Ceph 块设备和 Ceph 对象存储不使用 MDS)。Ceph的元数据服务器允许POSIX文件系统的用户来执行基本的命令(如 lsfind没有放置在一个Ceph存储集群的巨大负担,等等)。

  • Libradio:Librados是Rados提供库,因为RADOS是协议很难直接访问,因此上层的RBD、RGW和CephFS都是通过librados访问的,目前提供PHP、Ruby、Java、Python、C和C++支持。
  • CRUSH:CRUSH是Ceph使用的数据分布算法,类似一致性哈希,让数据分配到预期的地方。
  • RBD:RBD全称RADOS block device,是Ceph对外提供的块设备服务。
  • PG:PG全称PlacementGrouops,是一个逻辑的概念,一个PG包含多个OSD。引入PG这一层其实是为了更好的分配数据和定位数据。
  • RADOS cluster:由多台 host 存储服务器组成的 ceph 集群。
  • Object:Ceph最底层的存储单元是Object对象,每个Object包含元数据和原始数据。
  • Ceph 将数据作为对象存储在逻辑存储池中。使用 CRUSH算法,Ceph 计算出哪个归置组应该包含该对象,并进一步计算出哪个 Ceph OSD Daemon 应该存储该归置组。CRUSH 算法使 Ceph 存储集群能够动态扩展、重新平衡和恢复。

ceph的管理节点:
  1.ceph的常用管理接口是一组命令行工具程序,例如rados,ceph,rdb等命令,ceph管理员可以从某个特定的ceph-mon节点执行管理操作。
  2.推荐使用部署专用的管理节点对ceph进行配置管理,升级与后期维护,方便后期权限管理,管理节点的权限只对管理人员开放,可以避免一些不必要的误操作的发生。

逻辑组织架构:

Pool:存储池、分区,存储池的大小取决于底层的存储空间。 PG(placement group):一个 pool 内部可以有多个 PG 存在,pool 和 PG 都是抽象的逻辑概 念,一个 pool 中有多少个 PG 可以通过公式计算。 OSD(Object Storage Daemon,对象存储设备):每一块磁盘都是一个 osd,一个主机由一个或 多个 osd 组成.

ceph 集群部署好之后,要先创建存储池才能向 ceph 写入数据,文件在向 ceph 保存之前要 先进行一致性 hash 计算,计算后会把文件保存在某个对应的 PG 的,此文件一定属于某个 pool 的一个 PG,在通过 PG 保存在 OSD 上。 数据对象在写到主 OSD 之后再同步对从 OSD 以实现数据的高可用。

ceph的数据读写流程:
 
1. 正常IO流程图:
ceph组件功能介绍以及集群部署_ceph集群部署_02
 

步骤:

  1. client 创建cluster handler。
  2. client 读取配置文件。
  3. client 连接上monitor,获取集群map信息。
  4. client 读写io 根据crshmap 算法请求对应的主osd数据节点。
  5. 主osd数据节点同时写入另外两个副本节点数据。
  6. 等待主节点以及另外两个副本节点写完数据状态。
  7. 主节点及副本节点写入状态都成功后,返回给client,io写入完成。

2. 新主IO流程图:

说明:如果新加入的OSD1取代了原有的 OSD4成为 Primary OSD, 由于 OSD1 上未创建 PG , 不存在数据,那么 PG 上的 I/O 无法进行,怎样工作的呢?

ceph组件功能介绍以及集群部署_ceph组件_03

步骤:

  1. client连接monitor获取集群map信息。
  2. 同时新主osd1由于没有pg数据会主动上报monitor告知让osd2临时接替为主。
  3. 临时主osd2会把数据全量同步给新主osd1。
  4. client IO读写直接连接临时主osd2进行读写。
  5. osd2收到读写io,同时写入另外两副本节点。
  6. 等待osd2以及另外两副本写入成功。
  7. osd2三份数据都写入成功返回给client, 此时client io读写完毕。
  8. 如果osd1数据同步完毕,临时主osd2会交出主角色。
  9. osd1成为主节点,osd2变成副本。
 
Ceph IO算法流程:

ceph组件功能介绍以及集群部署_ceph功能介绍_04

注:存储文件过程:

第一步: 计算文件到对象的映射:
计算文件到对象的映射,假如 file 为客户端要读写的文件,得到 oid(object id) = ino + ono
ino:inode number (INO),File 的元数据序列号,File 的唯一 id。
ono:object number (ONO),File 切分产生的某个 object 的序号,默认以 4M 切分一个块大小。

第二步:通过hash算法计算出文件对应的pool中的PG:
通过一致性HASH计算Object 到 PG,Object->PG映射 hash(oid) & mask-> pgid

第三步: 通过CRUSH把对象映射到 PG 中的 OSD
通过 CRUSH 算法计算 PG 到 OSD,PG -> OSD 映射: [CRUSH(pgid)->(osd1,osd2,osd3)]
第四步:PG 中的主 OSD 将对象写入到硬盘 第五步: 主 OSD 将数据同步给备份 OSD,并等待备份 OSD 返回确认 第六步: 主 OSD 将写入完成返回给客户端

 
使用ceph-deploy安装一个最少三个节点的ceph集群
 
3台机器:
系统版本: Ubuntu 18.04.5 LTS
机器配置: 1核CPU 2G内存 系统盘40G + 3块50G数据磁盘
IP地址以及角色规划:
公网:121.41.15.24      内网:172.16.13.194    ceph-deploy   ceph-node1   ceph-mon1   ceph-mgr1
公网:121.41.109.168  内网:172.16.13.195    ceph-node2   ceph-mgr2
公网:   121.41.104.188  内网:172.16.13.196    ceph-node3  ceph-mon3
公网:120.26.52.237   内网:172.16.13.197    client
 

1. 添加同步服务器时间计划任务,三台机器都需要操作。

*/5 * * * * /usr/sbin/ntpdate time1.aliyun.com &> /dev/null & hwclock -w &> /dev/null

 2.修改三台主机主机名

修改主机名,三台主机都操作:
root@ceph_node1:~# hostname
ceph_node1

root@ceph-node2:~# hostname
ceph-node2

root@ceph-node3:~# hostname
ceph-node3

3.三台机器添加内网主机hosts文件

root@ceph-node1:~# cat /etc/hosts|grep ceph
172.16.13.194    ceph-node1    ceph-node1
172.16.13.195 ceph-node2
172.16.13.196 ceph-node3

root@ceph-node2:~# cat /etc/hosts|grep ceph
172.16.13.194    ceph-node1
172.16.13.196    ceph-node3
172.16.13.195    ceph-node2

root@ceph-node3:~# cat /etc/hosts|grep ceph
172.16.13.194 ceph-node1
172.16.13.195 ceph-node2
172.16.13.196 ceph-node3

4. 修改下载源,三台机器上都操作:
wget -q -O- 'https://mirror.tuna.tsinghua.edu.cn/ceph/keys/release.asc' | sudo apt-key add -

sudo echo "deb https://mirrors.tuna.tsinghua.edu.cn/ceph/debian-pacific bionic main" >>/etc/apt/sources.list
然后,执行一下更新:
apt update

5. 创建ceph用户,三个机器都操作:
groupadd -r -g 2022 ceph && useradd -r -m -s /bin/bash -u 2022 -g 2022 ceph && echo ceph:123456 | chpasswd

6. 三个node节点允许ceph用户以sudo执行特权命令:

echo "ceph    ALL=(ALL)    NOPASSWD:ALL" >>/etc/sudoers

7. ceph-node1机器上,生成秘钥 # 只需在ceph-node1 172.16.13.194 这台机器上操作

# 切换到ecph,生成秘钥
root@ceph-node1:~# su - ceph
ceph@ceph-node1:~$ ssh-keygen

8. 配置免秘钥登录,只需要在 ceph-node1 172.16.13.194 上操作
在 ceph-deploy 节点配置允许以非交互的方式登录到各 ceph node/mon/mgr 节点, 即在 ceph-deploy 节点生成秘钥对,然后分发公钥到各被管理节点:

ceph@ceph-node1:~$ ssh-copy-id ceph@192.168.3.73
ceph@ceph-node1:~$ ssh-copy-id ceph@192.168.3.74

9.  ceph-node1机器上,安装ceph部署工具:
在 ceph 部署服务器安装部署工具 ceph-deploy

ceph@ceph-node1:~$ sudo apt install ceph-deploy

10. 初始化mon节点,在管理节点初始化mon节点
ceph@ceph-node1:~$ mkdir ceph-cluster && cd ceph-cluster  # 保存当前集群的初始化配置信息

11. 初始化 mon 节点过程如下: 

# 所有Ubuntu节点机器上都需要单独安装Python2 ,root下安装

apt install python2.7 -y
做软连接, # 如果存在python2,会提示已存在
ln -sv /usr/bin/python2.7 /usr/bin/python2

12. 创建mon配置文件: # ceph-node1 其实就是 ceph-mon1
ceph@ceph-node1:~/ceph-cluster$ ceph-deploy new ceph-node1

验证初始化:# 因为我的机器是阿里云,外网是弹性IP,只有一个没网网卡,两个网络我都写成了内网

ceph-deploy new --cluster-network 172.16.0.0/20 --public-network 172.16.0.0/20 ceph-node1

ceph@ceph-node1:~/ceph-cluster$ ls -ll
total 12
-rw-rw-r-- 1 ceph ceph  264 Aug 19 00:47 ceph.conf                           #  自动生成的配置文件
-rw-rw-r-- 1 ceph ceph 3164 Aug 19 00:47 ceph-deploy-ceph.log     # 初始化日志
-rw------- 1 ceph ceph   73 Aug 19 00:47 ceph.mon.keyring                # 用于ceph mon 节点内部通讯认证的秘钥环文件

ceph@ceph-node1:~/ceph-cluster$ cat ceph.conf
[global]
fsid = 4bd4da72-7b67-4c26-a0da-c72670a09457
public_network = 172.16.0.0/20
cluster_network = 172.16.0.0/20
mon_initial_members = ceph-node1
mon_host = 172.16.13.194
auth_cluster_required = cephx
auth_service_required = cephx
auth_client_required = cephx

13. 到mon-1节点服务器上,装一个ceph-mon的包

ceph@ceph-node1:~/ceph-cluster$ sudo apt install ceph-mon

 

报错:
Processing triggers for libc-bin (2.27-3ubuntu1.4) ...
Errors were encountered while processing:
 ceph-common
 ceph-base
 ceph-mds
 ceph-mon
E: Sub-process /usr/bin/dpkg returned an error code (1)

解决办法:
mv /var/lib/dpkg/info /var/lib/dpkg/info_old
mkdir /var/lib/dpkg/info
apt update;apt -f install
mv /var/lib/dpkg/info/* /var/lib/dpkg/info_old
rm -rf /var/lib/dpkg/info
mv /var/lib/dpkg/info_old /var/lib/dpkg/info

重新安装 ceph-mon 即可
apt install ceph-mon

 

14. 初始化mon节点:
ceph@ceph-node1:/home/ceph/ceph-cluster$ cd /home/ceph/ceph-cluster/
ceph@ceph-node1:/home/ceph/ceph-cluster$ ceph-deploy mon create-initial

 

15. 初始化mon服务器

ssh root@localhost
apt install ceph-common

16. 把配置文件重新拷贝一下

mkdir /var/lib/ceph/ceph-cluster
ceph@ceph-node1:~$ cd /home/ceph/ceph-cluster
ceph@ceph-node1:/home/ceph/ceph-cluster$ cp * /var/lib/ceph/ceph-cluster/

17. 推送/etc/ceph/ceph.client.admin.keyring文件到node1上;
ceph@ceph-node1:~/ceph-cluster$ ceph-deploy admin ceph-node1
ceph@ceph-node1:~$ sudo setfacl -m u:ceph:rw /etc/ceph/ceph.client.admin.keyring
sudo: setfacl: command not found

sudo apt-get install acl
重新推送配置文件到ceph-node1机器上;
ceph@ceph-node1:~/ceph-cluster$ ceph-deploy admin ceph-node1

18. 在node1上安装ceph-mgr服务
root@ceph-node1:~# apt install ceph-mgr

ceph@ceph-node1:~$ cd /var/lib/ceph/ceph-cluster/
ceph@ceph-node1:~/ceph-cluster$ ceph-deploy mgr create ceph-node1

检查mgr服务是否启动,默认是开机自启动
ceph@ceph-node1:~$ ps -ef|grep mgr|grep -v grep
ceph        7801       1  4 00:17 ?        00:00:04 /usr/bin/ceph-mgr -f --cluster ceph --id ceph-node1 --setuser ceph --setgroup ceph

 

19. 初始化ceph存储节点:

在添加 osd之前,对node节点安装基本环境:
ceph@ceph-node1:~$ cd /var/lib/ceph/ceph-cluster/

ceph@ceph-node1:~/ceph-cluster$ ceph-deploy install --no-adjust-repos --nogpgcheck ceph-node1
ceph@ceph-node1:~/ceph-cluster$ ceph-deploy install --no-adjust-repos --nogpgcheck ceph-node2
ceph@ceph-node1:~/ceph-cluster$ ceph-deploy install --no-adjust-repos --nogpgcheck ceph-node3

20. 禁用不安全模式:

ceph config set mon auth_allow_insecure_global_id_reclaim false

ceph@ceph-node1:~/ceph-cluster$ ceph -s
  cluster:
    id:     e94b9ad8-3d47-40d9-8d49-c1667abbfeda
    health: HEALTH_WARN
            OSD count 0 < osd_pool_default_size 3

  services:
    mon: 1 daemons, quorum ceph-node1 (age 61m)
    mgr: ceph-node1(active, since 14m)
    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:

 

21. 准备OSD节点
osd节点安装运行环境:
ceph@ceph-node1:~/ceph-cluster$ ceph-deploy install --release pacific ceph-node1
ceph@ceph-node1:~/ceph-cluster$ ceph-deploy install --release pacific ceph-node2
ceph@ceph-node1:~/ceph-cluster$ ceph-deploy install --release pacific ceph-node3

22. 列出ceph node节点磁盘:
ceph-deploy disk list ceph-node1

23. 擦除磁盘:
ceph@ceph-node1:~/ceph-cluster$ ceph-deploy disk zap ceph-node1 /dev/vdb
ceph@ceph-node1:~/ceph-cluster$ ceph-deploy disk zap ceph-node1 /dev/vdc
ceph@ceph-node1:~/ceph-cluster$ ceph-deploy disk zap ceph-node1 /dev/vdd

ceph@ceph-node1:~/ceph-cluster$ ceph-deploy disk zap ceph-node2 /dev/vdb
ceph@ceph-node1:~/ceph-cluster$ ceph-deploy disk zap ceph-node2 /dev/vdc
ceph@ceph-node1:~/ceph-cluster$ ceph-deploy disk zap ceph-node2 /dev/vdd

ceph@ceph-node1:~/ceph-cluster$ ceph-deploy disk zap ceph-node3 /dev/vdb
ceph@ceph-node1:~/ceph-cluster$ ceph-deploy disk zap ceph-node3 /dev/vdc
ceph@ceph-node1:~/ceph-cluster$ ceph-deploy disk zap ceph-node3 /dev/vdd

 

24.  添加主机的磁盘
ceph@ceph-node1:~/ceph-cluster$ sudo ceph-deploy osd create ceph-node1 --data /dev/vdb
ceph@ceph-node1:~/ceph-cluster$ sudo ceph-deploy osd create ceph-node1 --data /dev/vdc
ceph@ceph-node1:~/ceph-cluster$ sudo ceph-deploy osd create ceph-node1 --data /dev/vdd

ceph@ceph-node1:~/ceph-cluster$ sudo ceph-deploy osd create ceph-node2 --data /dev/vdb
ceph@ceph-node1:~/ceph-cluster$ sudo ceph-deploy osd create ceph-node2 --data /dev/vdc
ceph@ceph-node1:~/ceph-cluster$ sudo ceph-deploy osd create ceph-node2 --data /dev/vdd

ceph@ceph-node1:~/ceph-cluster$ sudo ceph-deploy osd create ceph-node3 --data /dev/vdb
ceph@ceph-node1:~/ceph-cluster$ sudo ceph-deploy osd create ceph-node3 --data /dev/vdc
ceph@ceph-node1:~/ceph-cluster$ sudo ceph-deploy osd create ceph-node3 --data /dev/vdd

25. 检查node1上的osd
ceph@ceph-node1:~/ceph-cluster$ ps -ef|grep osd|grep -v grep
ceph       11099       1  0 00:42 ?        00:00:01 /usr/bin/ceph-osd -f --cluster ceph --id 0 --setuser ceph --setgroup ceph
ceph       12596       1  0 00:42 ?        00:00:01 /usr/bin/ceph-osd -f --cluster ceph --id 1 --setuser ceph --setgroup ceph
ceph       14092       1  0 00:42 ?        00:00:01 /usr/bin/ceph-osd -f --cluster ceph --id 2 --setuser ceph --setgroup ceph

 

26. 设置开机自启动

root@ceph-node1:~# systemctl enable ceph-osd@0 ceph-osd@1 ceph-osd@2 ceph-osd@3 ceph-osd@4 ceph-osd@5 ceph-osd@6 ceph-osd@7 ceph-osd@8

ceph@ceph-node1:~/ceph-cluster$ ceph -s
  cluster:
    id:     e94b9ad8-3d47-40d9-8d49-c1667abbfeda
    health: HEALTH_OK

  services:
    mon: 1 daemons, quorum ceph-node1 (age 8h)
    mgr: ceph-node1(active, since 7h)
    osd: 9 osds: 9 up (since 6h), 9 in (since 6h)

  data:
    pools:   1 pools, 1 pgs
    objects: 0 objects, 0 B
    usage:   52 MiB used, 450 GiB / 450 GiB avail
    pgs:     1 active+clean

 

27. 从RADOS移除OSD:

停用设备: # ceph osd out {osd-num}
ceph osd out 0  

停止进程:sudo systemctl stop ceph-osd@{osd-num}
sudo systemctl stop ceph-osd@0 

移除设备:# ceph osd purge {id} --yes-i-really-mean-it
ceph osd purge 0 --yes-i-really-mean-it

操作:
ceph@ceph-node1:~/ceph-cluster$ ceph osd out 0
marked out osd.0.
ceph@ceph-node1:~/ceph-cluster$ sudo systemctl stop ceph-osd@0
ceph@ceph-node1:~/ceph-cluster$ ceph osd purge 0 --yes-i-really-mean-it
purged osd.0
ceph@ceph-node1:~/ceph-cluster$ ceph -s
  cluster:
    id:     e94b9ad8-3d47-40d9-8d49-c1667abbfeda
    health: HEALTH_OK

  services:
    mon: 1 daemons, quorum ceph-node1 (age 8h)
    mgr: ceph-node1(active, since 7h)
    osd: 8 osds: 8 up (since 10s), 8 in (since 23s)

  data:
    pools:   1 pools, 1 pgs
    objects: 0 objects, 0 B
    usage:   46 MiB used, 400 GiB / 400 GiB avail
    pgs:     1 active+clean

 

28. 测试上传于下载数据:

ceph@ceph-node1:~/ceph-cluster$ ceph osd pool create mypool 32 32

pool 'mypool' created

ceph@ceph-node1:~/ceph-cluster$ ceph pg ls-by-pool mypool  | awk '{print $1,$2,$15}'
PG OBJECTS ACTING
2.0 0 [3,6,1]p3
2.1 0 [3,1,6]p3
2.2 0 [5,1,8]p5
2.3 0 [5,7,1]p5
2.4 0 [1,3,7]p1
2.5 0 [8,2,4]p8
2.6 0 [1,6,3]p1
2.7 0 [3,7,2]p3
2.8 0 [3,7,1]p3
2.9 0 [1,4,8]p1
2.a 0 [6,1,5]p6
2.b 0 [8,5,2]p8
2.c 0 [6,1,5]p6
2.d 0 [6,3,2]p6
2.e 0 [2,8,3]p2
2.f 0 [8,4,2]p8
2.10 0 [8,1,5]p8
2.11 0 [4,1,8]p4
2.12 0 [7,1,3]p7
2.13 0 [7,4,1]p7
2.14 0 [3,7,1]p3
2.15 0 [7,1,3]p7
2.16 0 [5,7,1]p5
2.17 0 [5,6,2]p5
2.18 0 [8,4,2]p8
2.19 0 [2,4,7]p2
2.1a 0 [3,8,2]p3
2.1b 0 [6,5,2]p6
2.1c 0 [8,4,1]p8
2.1d 0 [7,3,2]p7
2.1e 0 [2,7,5]p2
2.1f 0 [2,3,8]p2

ceph@ceph-node1:~/ceph-cluster$ ceph osd tree
ID  CLASS  WEIGHT   TYPE NAME            STATUS  REWEIGHT  PRI-AFF
-1         0.39038  root default
-3         0.09760      host ceph-node1
 1    hdd  0.04880          osd.1            up   1.00000  1.00000
 2    hdd  0.04880          osd.2            up   1.00000  1.00000
-5         0.14639      host ceph-node2
 3    hdd  0.04880          osd.3            up   1.00000  1.00000
 4    hdd  0.04880          osd.4            up   1.00000  1.00000
 5    hdd  0.04880          osd.5            up   1.00000  1.00000
-7         0.14639      host ceph-node3
 6    hdd  0.04880          osd.6            up   1.00000  1.00000
 7    hdd  0.04880          osd.7            up   1.00000  1.00000
 8    hdd  0.04880          osd.8            up   1.00000  1.00000

 

29. 查看存储池数量
ceph@ceph-node1:~/ceph-cluster$ ceph osd pool ls
device_health_metrics
mypool

rados lspools    # 底层命令,也可以查看存储池数量
device_health_metrics
32
mypool

ceph@ceph-node1:/var/log/ceph$ sudo rados put message /var/log/ceph/ceph-mon.ceph-node1.log --pool=mypool
ceph@ceph-node1:/var/log/ceph$ rados ls --pool=mypool
message

# 拆分了2个文件
ceph@ceph-node1:/var/log/ceph$ ceph osd map mypool message
osdmap e57 pool 'mypool' (2) object 'message' -> pg 2.9de550b3 (2.13) -> up ([7,4,1], p7) acting ([7,4,1], p7)

 

30.  上传文件:
ceph@ceph-node1:/var/log/ceph$ sudo rados put msg1 /etc/passwd --pool=mypool
 

31. 下载文件:
ceph@ceph-node1:/var/log/ceph$ sudo rados get msg1 --pool=mypool /opt/password.txt

32. 查看文件:
ceph@ceph-node1:/var/log/ceph$ tail -n 3 /opt/password.txt
sshd:x:107:65534::/run/sshd:/usr/sbin/nologin
_chrony:x:108:117:Chrony daemon,,,:/var/lib/chrony:/usr/sbin/nologin
ceph:x:2022:2022:Ceph storage service:/var/lib/ceph:/bin/bash

 

33. 删除文件:
ceph@ceph-node1:/var/log/ceph$ rados ls --pool=mypool
msg1
message
ceph@ceph-node1:/var/log/ceph$ sudo rados rm msg1 --pool=mypool
ceph@ceph-node1:/var/log/ceph$ rados ls --pool=mypool
message
ceph@ceph-node1:/var/log/ceph$ sudo rados rm message --pool=mypool
ceph@ceph-node1:/var/log/ceph$ rados ls --pool=mypool


34. mon高可用:# 在ceph-node3机器上操作

root@ceph-node3:~# apt install ceph-mon

ceph-deploy mon add ceph-node3

35. 查看mon服务器:
ceph@ceph-node1:~/ceph-cluster$ ceph -s
  cluster:
    id:     e94b9ad8-3d47-40d9-8d49-c1667abbfeda
    health: HEALTH_OK

  services:
    mon: 2 daemons, quorum ceph-node1,ceph-node3 (age 5m)
    mgr: ceph-node1(active, since 8h)
    osd: 8 osds: 8 up (since 54m), 8 in (since 55m)

  data:
    pools:   2 pools, 33 pgs
    objects: 8 objects, 0 B
    usage:   70 MiB used, 400 GiB / 400 GiB avail
    pgs:     33 active+clean

 

36. 添加mgr节点,在ceph-node2上部署ceph-mgr
ceph@ceph-node2:~$ sudo apt install ceph-mgr

ceph@ceph-node1:~/ceph-cluster$ ceph-deploy mgr create ceph-node2
ceph@ceph-node1:~/ceph-cluster$ ceph-deploy admin ceph-node2

查看mgr个数:
ceph@ceph-node1:~/ceph-cluster$ ceph -s
  cluster:
    id:     e94b9ad8-3d47-40d9-8d49-c1667abbfeda
    health: HEALTH_OK

  services:
    mon: 2 daemons, quorum ceph-node1,ceph-node3 (age 4h)
    mgr: ceph-node1(active, since 13h), standbys: ceph-node2
    osd: 8 osds: 8 up (since 5h), 8 in (since 5h)

  data:
    pools:   2 pools, 33 pgs
    objects: 8 objects, 0 B
    usage:   70 MiB used, 400 GiB / 400 GiB avail
    pgs:     33 active+clean

备注:mgr active是主节点,standbys是备用节点

 

块设备RBD:
RDB是块存储的一种,RBD通过librbd库于OSD进行交互,RBD为KVM
等虚拟化技术和服务提供高性能和无限可扩展性的存储后端,这些系统
依赖于libvirt和QEMU使用程序与RBD进行集成,客户端基于librbd
库即可将RADOS存储集群用作块设备,不过,用于rbd的存储池需要事先
启用rbd功能并进行初始化,例如下面的命令创建一个名为myrbd1的存储
池,并在启用rbd功能后对其进行初始化:

1. 创建RBD:
# 创建存储池,指定pg和pgp的数量,pgp是对存在于PG的数据进行组合存储,pgp通常等于pg的值
ceph@ceph-node1:~$ ceph osd pool create myrbd1 64 64
pool 'myrbd1' created

2. 对存储池启用RBD功能
ceph@ceph-node1:~$ ceph osd pool application enable myrbd1 rbd
enabled application 'rbd' on pool 'myrbd1'

 

3. 通过RBD命令对存储池初始化
ceph@ceph-node1:~$ rbd pool init -p myrbd1

4. 创建并验证img:
ceph@ceph-node1:~$ rbd create myimg1 --size 5G --pool myrbd1
ceph@ceph-node1:~$ rbd create myimg2 --size 3G --pool myrbd1 --image-format 2 --image-feature layering

ceph@ceph-node1:~$ rbd ls --pool myrbd1
myimg1
myimg2

ceph@ceph-node1:~$ rbd --image myimg1 --pool myrbd1 info
rbd image 'myimg1':
    size 5 GiB in 1280 objects
    order 22 (4 MiB objects)
    snapshot_count: 0
    id: 8544c968696b
    block_name_prefix: rbd_data.8544c968696b
    format: 2
    features: layering, exclusive-lock, object-map, fast-diff, deep-flatten
    op_features:
    flags:
    create_timestamp: Fri Aug 20 13:59:10 2021
    access_timestamp: Fri Aug 20 13:59:10 2021
    modify_timestamp: Fri Aug 20 13:59:10 2021

 

5. 查看ceph资源的使用情况

ceph@ceph-node1:~$ ceph df
--- RAW STORAGE ---
CLASS     SIZE    AVAIL    USED  RAW USED  %RAW USED
hdd    400 GiB  400 GiB  68 MiB    68 MiB       0.02
TOTAL  400 GiB  400 GiB  68 MiB    68 MiB       0.02

--- POOLS ---
POOL                   ID  PGS  STORED  OBJECTS    USED  %USED  MAX AVAIL
device_health_metrics   1    1     0 B        8     0 B      0    127 GiB
mypool                  2   32     0 B        0     0 B      0    127 GiB
myrbd1                  3   64   405 B        7  48 KiB      0    127 GiB

 

6. 客户端访问块设备

在centos7.8客户端安装软件  # yum install epel-release

[root@ceph-client ~]# wget https://mirror.tuna.tsinghua.edu.cn/ceph/rpm-15.2.9/el7/noarch/ceph-release-1-1.el7.noarch.rpm 

[root@ceph-client ~]# rpm -ivh ceph-release-1-1.el7.noarch.rpm

[root@ceph-client ~]# yum install -y ceph-common

7. 从部署服务器同步认证文件到客户端
ceph@ceph-node1:~/ceph-cluster$ scp ceph.conf ceph.client.admin.keyring root@172.16.13.197:/etc/ceph/

只要有key文件,客户端也可以管理ceph。
[root@ceph-client ~]# ceph -s
  cluster:
    id:     e94b9ad8-3d47-40d9-8d49-c1667abbfeda
    health: HEALTH_OK

  services:
    mon: 2 daemons, quorum ceph-node1,ceph-node3 (age 6h)
    mgr: ceph-node1(active, since 20h), standbys: ceph-node2
    osd: 8 osds: 8 up (since 12h), 8 in (since 12h)

  data:
    pools:   3 pools, 97 pgs
    objects: 15 objects, 405 B
    usage:   68 MiB used, 400 GiB / 400 GiB avail
    pgs:     97 active+clean

 

8. 客户端映射img:
[root@ceph-client ~]# lsblk
NAME   MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
vda    253:0    0  40G  0 disk
└─vda1 253:1    0  40G  0 part /
[root@ceph-client ~]# rbd
rbd              rbdmap           rbd-replay       rbd-replay-many  rbd-replay-prep
[root@ceph-client ~]# rbd -p myrbd1 map myimg2
/dev/rbd0
[root@ceph-client ~]# lsblk
NAME   MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
vda    253:0    0  40G  0 disk
└─vda1 253:1    0  40G  0 part /
rbd0   252:0    0   3G  0 disk

 

特性太多了,但是内核版本太低,不支持映射myimg1,报错如下所示:

[root@ceph-client ~]# rbd -p myrbd1 map myimg1
rbd: sysfs write failed
RBD image feature set mismatch. You can disable features unsupported by the kernel with "rbd feature disable myrbd1/myimg1 object-map fast-diff deep-flatten".
In some cases useful info is found in syslog - try "dmesg | tail".
rbd: map failed: (6) No such device or address

9. 按照提示关闭特性:
[root@ceph-client ~]# rbd feature disable myrbd1/myimg1 object-map fast-diff deep-flatten

10. 关完之后再映射:
[root@ceph-client ~]# rbd -p myrbd1 map myimg1
/dev/rbd1

11. 然后再查看,会有两个映射:
[root@ceph-client ~]# lsblk
NAME   MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
vda    253:0    0  40G  0 disk
└─vda1 253:1    0  40G  0 part /
rbd0   252:0    0   3G  0 disk
rbd1   252:16   0   5G  0 disk

 

12. 查看一下磁盘

[root@ceph-client ~]# fdisk -l

磁盘 /dev/vda:42.9 GB, 42949672960 字节,83886080 个扇区
Units = 扇区 of 1 * 512 = 512 bytes
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
磁盘标签类型:dos
磁盘标识符:0x000bb9c1

   设备 Boot      Start         End      Blocks   Id  System
/dev/vda1   *        2048    83886046    41941999+  83  Linux

磁盘 /dev/rbd0:3221 MB, 3221225472 字节,6291456 个扇区
Units = 扇区 of 1 * 512 = 512 bytes
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):4194304 字节 / 4194304 字节


磁盘 /dev/rbd1:5368 MB, 5368709120 字节,10485760 个扇区
Units = 扇区 of 1 * 512 = 512 bytes
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):4194304 字节 / 4194304 字节

 

13. 格式化磁盘:
[root@ceph-client ~]# mkfs.ext4 /dev/rbd0
[root@ceph-client ~]# mkfs.xfs /dev/rbd1

[root@ceph-client ~]# mount /dev/rbd0 /mnt
[root@ceph-client ~]# mkdir /data/mysql -p
[root@ceph-client ~]# mount /dev/rbd1 /data/mysql
[root@ceph-client ~]# df -Th
文件系统       类型      容量  已用  可用 已用% 挂载点
devtmpfs       devtmpfs  909M     0  909M    0% /dev
tmpfs          tmpfs     919M     0  919M    0% /dev/shm
tmpfs          tmpfs     919M  456K  919M    1% /run
tmpfs          tmpfs     919M     0  919M    0% /sys/fs/cgroup
/dev/vda1      ext4       40G  2.2G   36G    6% /
tmpfs          tmpfs     184M     0  184M    0% /run/user/0
/dev/rbd0      ext4      2.9G  9.0M  2.8G    1% /mnt
/dev/rbd1      xfs       5.0G   33M  5.0G    1% /data/mysql

 

14. 检查ceph的磁盘空间

ceph@ceph-node1:~/ceph-cluster$ ceph df
--- RAW STORAGE ---
CLASS     SIZE    AVAIL     USED  RAW USED  %RAW USED
hdd    400 GiB  399 GiB  535 MiB   535 MiB       0.13
TOTAL  400 GiB  399 GiB  535 MiB   535 MiB       0.13

--- POOLS ---
POOL                   ID  PGS  STORED  OBJECTS     USED  %USED  MAX AVAIL
device_health_metrics   1    1     0 B        8      0 B      0    126 GiB
mypool                  2   32     0 B        0      0 B      0    126 GiB
myrbd1                  3   64  76 MiB       43  228 MiB   0.06    126 GiB