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 |
系统初始化
systemctl stop firewalld && systemctl disable firewalld && sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config && setenforce 0 # 关闭防火墙hostnamectl set-hostname ceph1 # 配置主机名hostnamectl set-hostname ceph2 # 配置主机名hostnamectl set-hostname ceph3 # 配置主机名hostnamectl set-hostname ceph4-client # 配置主机名cat >> /etc/hosts << EOF192.168.218.134 ceph1192.168.218.135 ceph2192.168.218.136 ceph3192.168.218.137 ceph4EOF # 配置hosts[root@ceph1 ~]# ssh-keygen # 生成秘钥# 将秘钥分别复制到ceph1, ceph2, ceph3, ceph4上ssh-copy-id -i /root/.ssh/id_rsa.pub ceph1ssh-copy-id -i /root/.ssh/id_rsa.pub ceph2ssh-copy-id -i /root/.ssh/id_rsa.pub ceph3ssh-copy-id -i /root/.ssh/id_rsa.pub ceph4 # 记得验证免密效果curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo # 配置阿里yum源cat << EOF |tee /etc/yum.repos.d/ceph.repo # 配置ceph yum源[Ceph]name=Ceph packages for $basearchbaseurl=https://mirrors.aliyun.com/ceph/rpm-nautilus/el7/\$basearchenabled=1gpgcheck=1type=rpm-mdgpgkey=https://download.ceph.com/keys/release.ascpriority=1[Ceph-noarch]name=Ceph noarch packagesbaseurl=https://mirrors.aliyun.com/ceph/rpm-nautilus/el7/noarchenabled=1gpgcheck=1type=rpm-mdgpgkey=https://download.ceph.com/keys/release.ascpriority=1[Ceph-source]name=Ceph source packagesbaseurl=https://mirrors.aliyun.com/ceph/rpm-nautilus/el7/SRPMSenabled=1gpgcheck=1type=rpm-mdgpgkey=https://download.ceph.com/keys/release.ascEOFyum -y install epel-release yum-plugin-priorities yum-utils ntpdate python2-pip # 安装epel包和所需基础依赖包yum clean all && yum makecache fast # 生成yum源缓存yum -y install chrony # 安装配置时间服务器vi /etc/chrony.conf # 这是必须配置的 如果有网络可以绑定官方的时间同步服务器 也可以自己设置server ntp1.aliyun.com iburst # 阿里云的server ntp2.aliyun.com iburstserver ntp3.aliyun.com iburstallow 192.168.218.0/24local stratum 10# 重启时间同步systemctl start chronyd && systemctl enable chronyd# 其他服务器上vi /etc/chrony.confserver ceph_node1 iburstchronyc sources -v # 查看时间同步源chronyc -a makestep # 手动同步系统时钟
部署Ceph
部署控制节点
yum -y install ceph-deploy ceph ceph-radosgw snappy leveldb gdisk python-argparse gperftools-libs # 安装ceph-deploy和一些所需依赖包(ceph-deploy可以只在Ceph1节点上)cd /etc/cephceph-deploy new ceph1 ceph2 ceph3 # 创建一个新集群
执行完毕后,可以看到/etc/ceph目录中生成了三个文件,其中有一个ceph配置文件可以做各种参数优化。(注意,在osd进程生成并挂载使用后,想修改配置需要使用命令行工具,修改配置文件是无效的,所以需要提前规划好优化的参数。),一个是监视器秘钥环。
[root@ceph1 ceph]# lsceph.conf ceph-deploy-ceph.log ceph.mon.keyring rbdmap[root@ceph1 ceph-dash]# ceph -v # 查看版本ceph version 14.2.22 (ca74598065096e6fcbd8433c8779a2be0c889351) nautilus (stable)
在测试时,可以设置副本数
vim ceph.conf[global]fsid = 0bdeb616-3bca-4196-bc35-6e218425ae0emon_initial_members = cong11mon_host = 192.168.128.134auth_cluster_required = cephxauth_service_required = cephxauth_client_required = cephxosd_pool_default_size = 2 #最后添加这行
生成mod角色
monitor最少三个
ceph-deploy mon create-initial # 如果没指定 就把加进来的集群都设置monitor# 如果后面操作没问题 但是健康检查是WARN 可以输入该命令 禁用掉不安全的模式mon is allowing insecure global_id reclaimceph config set mon auth_allow_insecure_global_id_reclaim false
生成key秘钥
ceph-deploy gatherkeys ceph1 ceph2 ceph3# 生成的文件 ceph.client.admin.keyring 一定要保存好
部署mgr管理服务
ceph-deploy mgr create ceph1 ceph2 ceph3
部署osd服务
# 用下列命令擦净(删除分区表)磁盘,以用于 Ceph[root@ceph1 ceph]# cd /etc/ceph/[root@ceph1 ceph]# ceph-deploy disk zap ceph1 /dev/sdb[root@ceph1 ceph]# ceph-deploy disk zap ceph2 /dev/sdb[root@ceph1 ceph]# ceph-deploy disk zap ceph3 /dev/sdb# 添加osd节点[root@ceph1 ceph]# ceph-deploy osd create ceph1 --data /dev/sdb[root@ceph1 ceph]# ceph-deploy osd create ceph2 --data /dev/sdb[root@ceph1 ceph]# ceph-deploy osd create ceph3 --data /dev/sdb# 查看osd状态[root@ceph1 ceph]# ceph-deploy osd list ceph1 ceph2 ceph3# 各个节点添加权限chmod +r /etc/ceph/ceph.client.admin.keyring
部署MDS(cephfs)服务
ceph-deploy mds create ceph2 ceph3 # 安装ceph mds stat # 查看mds服务2 up:standby
查看集群状态
[root@ceph1 ceph]# ceph -scluster:id: 0bdeb616-3bca-4196-bc35-6e218425ae0ehealth: HEALTH_OKservices:mon: 1 daemons, quorum ceph1 (age 103m)mgr: ceph1(active, since 92m)mds: cephfs:1 {0=ceph1=up:active} 2 up:standbyosd: 3 osds: 3 up (since 93m), 3 in (since 93m)data:pools: 2 pools, 256 pgsobjects: 22 objects, 6.3 KiBusage: 3.0 GiB used, 57 GiB / 60 GiB availpgs: 256 active+clean[root@ceph1 ceph]# ceph osd status+----+-------+-------+-------+--------+---------+--------+---------+-----------+| id | host | used | avail | wr ops | wr data | rd ops | rd data | state |+----+-------+-------+-------+--------+---------+--------+---------+-----------+| 0 | ceph1 | 1027M | 18.9G | 0 | 0 | 0 | 0 | exists,up || 1 | ceph2 | 1027M | 18.9G | 0 | 0 | 0 | 0 | exists,up || 2 | ceph3 | 1027M | 18.9G | 0 | 0 | 0 | 0 | exists,up |+----+-------+-------+-------+--------+---------+--------+---------+-----------+
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 取值变得更加重要,因为它显著地影响着集群的行为、以及出错时的数据持久性(即灾难性事件导致数据丢失的概率)。
# 创建之前查看文件系统[root@ceph1 ceph]# ceph fs ls[root@ceph1 ceph]# ceph osd pool create cephfs_data 128[root@ceph1 ceph]# ceph osd pool create cephfs_metadata 128[root@ceph1 ceph]# ceph osd pool get mypool1 size # 查看副本数size: 3[root@ceph1 ceph]# ceph osd pool get cephfs_data pg_num # 查看pg_numpg_num: 128[root@ceph1 ceph]# ceph osd pool set cephfs_data pg_num 64 # 修改存储池参数
创建文件系统
创建好存储池后,你就可以用fs new 命令创建文件系统了
[root@ceph1 ceph]# ceph fs new cephfs cephfs_metadata cephfs_data # 给刚才创建的2个存储池创建文件系统
查看文件系统
[root@ceph1 ceph]# ceph fs ls[root@ceph1 ceph]# ceph mds stat # 查看MDS节点
挂载使用Ceph
方法①
[root@ceph4 ~]# mkdir /data/aa # 创建挂载点[root@ceph1 ~]# cat /etc/ceph/ceph.client.admin.keyring[client.admin]key = AQBDTMliBhD+NBAA6BqDuiFD3OcDyxoF3EP/bg==[root@ceph4 ~]# mount -t ceph 192.168.218.134:/ /data/aa -o name=admin,secret=AQBDTMliBhD+NBAA6BqDuiFD3OcDyxoF3EP/bg== # 使用秘钥挂载[root@ceph4 ~]# umount /data/aa # 取消挂载
方法②
[root@ceph4 ~]# mkdir /etc/ceph # 创建ceph文件[root@ceph4 ~]# vim /etc/ceph/admin.secret # 新建文件 并将key的秘钥值写入# adminn.secret文件中的秘钥即管理节点上/etc/ceph/ceph.client.admin.keyring的key对应的值。[root@ceph4 ~]# yum install -y ceph-common-* # 安装相同版本的ceph[root@ceph4 ~]# mount -t ceph 192.168.218.134:6789:/ /data/aa -o name=admin,secretfile=/etc/ceph/admin.secret
方法③ 永久挂载
[root@ceph4 ~]# yum install -y ceph-fuse[root@ceph1 ~]# cd /etc/ceph[root@ceph1 ceph]# scp ceph.client.admin.keyring ceph.conf cong14:/etc/ceph/[root@ceph4 ~]# ceph-fuse -m 192.168.218.134:6789 /data/aa
