Ceph介绍

Ceph基础

Ceph是一个可靠地、自动重均衡、自动恢复的分布式存储系统,根据场景划分可以将Ceph分为三大块,分别是对象存储(rgw)、块设备存储( rbd)和文件系统服务(cephfs)。Ceph相比其它存储的优势点在于它不单单是存储,同时还充分利用了存储节点上的计算能力,在存储每一个数据时,都会通过计算得出该数据存储的位置,尽量将数据分布均衡,同时由于Ceph的良好设计,采用了CRUSH算法、HASH环等方法,使得它不存在传统的单点故障的问题,且随着规模的扩大性能并不会受到影响。

Ceph核心组件

Ceph的核心组件包括Ceph OSD、Ceph Monitor和Ceph MDS。

Ceph OSD

OSD的英文全称是Object Storage Device,它的主要功能是存储数据、复制数据、平衡数据、恢复数据等,与其它OSD间进行心跳检查等,并将一些变化情况上报给Ceph Monitor。一般情况下一块硬盘对应一个OSD,由OSD来对硬盘存储进行管理,当然一个分区也可以成为一个OSD。
Ceph OSD的架构实现由物理磁盘驱动器、Linux文件系统和Ceph OSD服务组成,对于Ceph OSD Deamon而言,Linux文件系统显性的支持了其拓展性,一般Linux文件系统有好几种,比如有BTRFS、XFS、Ext4等,BTRFS虽然有很多优点特性,但现在还没达到生产环境所需的稳定性,一般比较推荐使用XFS。
伴随OSD的还有一个概念叫做Journal盘,一般写数据到Ceph集群时,都是先将数据写入到Journal盘中,然后每隔一段时间比如5秒再将Journal盘中的数据刷新到文件系统中。一般为了使读写时延更小,Journal盘都是采用SSD,一般分配10G以上,当然分配多点那是更好,Ceph中引入Journal盘的概念是因为Journal允许Ceph OSD功能很快做小的写操作;一个随机写入首先写入在上一个连续类型的journal,然后刷新到文件系统,这给了文件系统足够的时间来合并写入磁盘,一般情况下使用SSD作为OSD的journal可以有效缓冲突发负载。

Ceph Monitor

由该英文名字我们可以知道它是一个监视器,负责监视Ceph集群,维护Ceph集群的健康状态,同时维护着Ceph集群中的各种Map图,比如OSD Map、Monitor Map、PG Map和CRUSH Map,这些Map统称为Cluster Map,Cluster Map是RADOS的关键数据结构,管理集群中的所有成员、关系、属性等信息以及数据的分发,比如当用户需要存储数据到Ceph集群时,OSD需要先通过Monitor获取最新的Map图,然后根据Map图和object id等计算出数据最终存储的位置。

Ceph MDS

全称是Ceph MetaData Server,主要保存的文件系统服务的元数据,但对象存储和块存储设备是不需要使用该服务的。

搭建

准备三台机器,并且有两块以上硬盘。

主机名 IP地址 角色 配置
ceph1 192.168.218.134/24 控制节点、mon,mgr,osd 2+块10+GB硬盘
ceph2 192.168.218.135/24 mon, mgr, osd 2+块10+GB硬盘
ceph3 192.168.218.136/24 mon, mgr, osd 2+块10+GB硬盘
ceph4-client 192.168.218.137/24 mon, mgr, osd

系统初始化

  1. systemctl stop firewalld && systemctl disable firewalld && sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config && setenforce 0 # 关闭防火墙
  2. hostnamectl set-hostname ceph1 # 配置主机名
  3. hostnamectl set-hostname ceph2 # 配置主机名
  4. hostnamectl set-hostname ceph3 # 配置主机名
  5. hostnamectl set-hostname ceph4-client # 配置主机名
  6. cat >> /etc/hosts << EOF
  7. 192.168.218.134 ceph1
  8. 192.168.218.135 ceph2
  9. 192.168.218.136 ceph3
  10. 192.168.218.137 ceph4
  11. EOF # 配置hosts
  12. [root@ceph1 ~]# ssh-keygen # 生成秘钥
  13. # 将秘钥分别复制到ceph1, ceph2, ceph3, ceph4上
  14. ssh-copy-id -i /root/.ssh/id_rsa.pub ceph1
  15. ssh-copy-id -i /root/.ssh/id_rsa.pub ceph2
  16. ssh-copy-id -i /root/.ssh/id_rsa.pub ceph3
  17. ssh-copy-id -i /root/.ssh/id_rsa.pub ceph4 # 记得验证免密效果
  18. curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo # 配置阿里yum源
  19. cat << EOF |tee /etc/yum.repos.d/ceph.repo # 配置ceph yum源
  20. [Ceph]
  21. name=Ceph packages for $basearch
  22. baseurl=https://mirrors.aliyun.com/ceph/rpm-nautilus/el7/\$basearch
  23. enabled=1
  24. gpgcheck=1
  25. type=rpm-md
  26. gpgkey=https://download.ceph.com/keys/release.asc
  27. priority=1
  28. [Ceph-noarch]
  29. name=Ceph noarch packages
  30. baseurl=https://mirrors.aliyun.com/ceph/rpm-nautilus/el7/noarch
  31. enabled=1
  32. gpgcheck=1
  33. type=rpm-md
  34. gpgkey=https://download.ceph.com/keys/release.asc
  35. priority=1
  36. [Ceph-source]
  37. name=Ceph source packages
  38. baseurl=https://mirrors.aliyun.com/ceph/rpm-nautilus/el7/SRPMS
  39. enabled=1
  40. gpgcheck=1
  41. type=rpm-md
  42. gpgkey=https://download.ceph.com/keys/release.asc
  43. EOF
  44. yum -y install epel-release yum-plugin-priorities yum-utils ntpdate python2-pip # 安装epel包和所需基础依赖包
  45. yum clean all && yum makecache fast # 生成yum源缓存
  46. yum -y install chrony # 安装配置时间服务器
  47. vi /etc/chrony.conf # 这是必须配置的 如果有网络可以绑定官方的时间同步服务器 也可以自己设置
  48. server ntp1.aliyun.com iburst # 阿里云的
  49. server ntp2.aliyun.com iburst
  50. server ntp3.aliyun.com iburst
  51. allow 192.168.218.0/24
  52. local stratum 10
  53. # 重启时间同步
  54. systemctl start chronyd && systemctl enable chronyd
  55. # 其他服务器上
  56. vi /etc/chrony.conf
  57. server ceph_node1 iburst
  58. chronyc sources -v # 查看时间同步源
  59. chronyc -a makestep # 手动同步系统时钟

部署Ceph

部署控制节点

  1. yum -y install ceph-deploy ceph ceph-radosgw snappy leveldb gdisk python-argparse gperftools-libs # 安装ceph-deploy和一些所需依赖包(ceph-deploy可以只在Ceph1节点上)
  2. cd /etc/ceph
  3. ceph-deploy new ceph1 ceph2 ceph3 # 创建一个新集群

执行完毕后,可以看到/etc/ceph目录中生成了三个文件,其中有一个ceph配置文件可以做各种参数优化。(注意,在osd进程生成并挂载使用后,想修改配置需要使用命令行工具,修改配置文件是无效的,所以需要提前规划好优化的参数。),一个是监视器秘钥环。

  1. [root@ceph1 ceph]# ls
  2. ceph.conf ceph-deploy-ceph.log ceph.mon.keyring rbdmap
  3. [root@ceph1 ceph-dash]# ceph -v # 查看版本
  4. ceph version 14.2.22 (ca74598065096e6fcbd8433c8779a2be0c889351) nautilus (stable)

在测试时,可以设置副本数

  1. vim ceph.conf
  2. [global]
  3. fsid = 0bdeb616-3bca-4196-bc35-6e218425ae0e
  4. mon_initial_members = cong11
  5. mon_host = 192.168.128.134
  6. auth_cluster_required = cephx
  7. auth_service_required = cephx
  8. auth_client_required = cephx
  9. osd_pool_default_size = 2 #最后添加这行

生成mod角色

monitor最少三个

  1. ceph-deploy mon create-initial # 如果没指定 就把加进来的集群都设置monitor
  2. # 如果后面操作没问题 但是健康检查是WARN 可以输入该命令 禁用掉不安全的模式
  3. mon is allowing insecure global_id reclaim
  4. ceph config set mon auth_allow_insecure_global_id_reclaim false

生成key秘钥

  1. ceph-deploy gatherkeys ceph1 ceph2 ceph3
  2. # 生成的文件 ceph.client.admin.keyring 一定要保存好

部署mgr管理服务

  1. ceph-deploy mgr create ceph1 ceph2 ceph3

部署osd服务

  1. # 用下列命令擦净(删除分区表)磁盘,以用于 Ceph
  2. [root@ceph1 ceph]# cd /etc/ceph/
  3. [root@ceph1 ceph]# ceph-deploy disk zap ceph1 /dev/sdb
  4. [root@ceph1 ceph]# ceph-deploy disk zap ceph2 /dev/sdb
  5. [root@ceph1 ceph]# ceph-deploy disk zap ceph3 /dev/sdb
  6. # 添加osd节点
  7. [root@ceph1 ceph]# ceph-deploy osd create ceph1 --data /dev/sdb
  8. [root@ceph1 ceph]# ceph-deploy osd create ceph2 --data /dev/sdb
  9. [root@ceph1 ceph]# ceph-deploy osd create ceph3 --data /dev/sdb
  10. # 查看osd状态
  11. [root@ceph1 ceph]# ceph-deploy osd list ceph1 ceph2 ceph3
  12. # 各个节点添加权限
  13. chmod +r /etc/ceph/ceph.client.admin.keyring

部署MDS(cephfs)服务

  1. ceph-deploy mds create ceph2 ceph3 # 安装
  2. ceph mds stat # 查看mds服务
  3. 2 up:standby

查看集群状态

  1. [root@ceph1 ceph]# ceph -s
  2. cluster:
  3. id: 0bdeb616-3bca-4196-bc35-6e218425ae0e
  4. health: HEALTH_OK
  5. services:
  6. mon: 1 daemons, quorum ceph1 (age 103m)
  7. mgr: ceph1(active, since 92m)
  8. mds: cephfs:1 {0=ceph1=up:active} 2 up:standby
  9. osd: 3 osds: 3 up (since 93m), 3 in (since 93m)
  10. data:
  11. pools: 2 pools, 256 pgs
  12. objects: 22 objects, 6.3 KiB
  13. usage: 3.0 GiB used, 57 GiB / 60 GiB avail
  14. pgs: 256 active+clean
  15. [root@ceph1 ceph]# ceph osd status
  16. +----+-------+-------+-------+--------+---------+--------+---------+-----------+
  17. | id | host | used | avail | wr ops | wr data | rd ops | rd data | state |
  18. +----+-------+-------+-------+--------+---------+--------+---------+-----------+
  19. | 0 | ceph1 | 1027M | 18.9G | 0 | 0 | 0 | 0 | exists,up |
  20. | 1 | ceph2 | 1027M | 18.9G | 0 | 0 | 0 | 0 | exists,up |
  21. | 2 | ceph3 | 1027M | 18.9G | 0 | 0 | 0 | 0 | exists,up |
  22. +----+-------+-------+-------+--------+---------+--------+---------+-----------+

Ceph操作

创建存储池

关于创建存储池
确定pg_num 取值是强制性的,因为不能自动计算。下面是几个常用的值:
少于 5 个 OSD 时可把 pg_num 设置为 128
OSD 数量在 5 到 10 个时,可把 pg_num 设置为 512
OSD 数量在 10 到 50 个时,可把 pg_num 设置为 4096
OSD 数量大于 50 时,你得理解权衡方法、以及如何自己计算 pg_num 取值
*自己计算 pg_num 取值时可借助 pgcalc 工具
https://ceph.com/pgcalc/

随着OSD 数量的增加,正确的 pg_num 取值变得更加重要,因为它显著地影响着集群的行为、以及出错时的数据持久性(即灾难性事件导致数据丢失的概率)。

  1. # 创建之前查看文件系统
  2. [root@ceph1 ceph]# ceph fs ls
  3. [root@ceph1 ceph]# ceph osd pool create cephfs_data 128
  4. [root@ceph1 ceph]# ceph osd pool create cephfs_metadata 128
  5. [root@ceph1 ceph]# ceph osd pool get mypool1 size # 查看副本数
  6. size: 3
  7. [root@ceph1 ceph]# ceph osd pool get cephfs_data pg_num # 查看pg_num
  8. pg_num: 128
  9. [root@ceph1 ceph]# ceph osd pool set cephfs_data pg_num 64 # 修改存储池参数

创建文件系统

创建好存储池后,你就可以用fs new 命令创建文件系统了

  1. [root@ceph1 ceph]# ceph fs new cephfs cephfs_metadata cephfs_data # 给刚才创建的2个存储池创建文件系统

查看文件系统

  1. [root@ceph1 ceph]# ceph fs ls
  2. [root@ceph1 ceph]# ceph mds stat # 查看MDS节点

挂载使用Ceph

方法①

  1. [root@ceph4 ~]# mkdir /data/aa # 创建挂载点
  2. [root@ceph1 ~]# cat /etc/ceph/ceph.client.admin.keyring
  3. [client.admin]
  4. key = AQBDTMliBhD+NBAA6BqDuiFD3OcDyxoF3EP/bg==
  5. [root@ceph4 ~]# mount -t ceph 192.168.218.134:/ /data/aa -o name=admin,secret=AQBDTMliBhD+NBAA6BqDuiFD3OcDyxoF3EP/bg== # 使用秘钥挂载
  6. [root@ceph4 ~]# umount /data/aa # 取消挂载

方法②

  1. [root@ceph4 ~]# mkdir /etc/ceph # 创建ceph文件
  2. [root@ceph4 ~]# vim /etc/ceph/admin.secret # 新建文件 并将key的秘钥值写入
  3. # adminn.secret文件中的秘钥即管理节点上/etc/ceph/ceph.client.admin.keyring的key对应的值。
  4. [root@ceph4 ~]# yum install -y ceph-common-* # 安装相同版本的ceph
  5. [root@ceph4 ~]# mount -t ceph 192.168.218.134:6789:/ /data/aa -o name=admin,secretfile=/etc/ceph/admin.secret

方法③ 永久挂载

  1. [root@ceph4 ~]# yum install -y ceph-fuse
  2. [root@ceph1 ~]# cd /etc/ceph
  3. [root@ceph1 ceph]# scp ceph.client.admin.keyring ceph.conf cong14:/etc/ceph/
  4. [root@ceph4 ~]# ceph-fuse -m 192.168.218.134:6789 /data/aa