1、集群部署工具
1.1、ceph-deploy
ceph原生部署工具,借助于SSH工作,无法处理客户端的配置。可用来安装或清理Ceph集群。本次使用ceph-deploy部署。
1.2、ceph-ansible
redhat推荐部署方式,由redhat维护,通过ansible playbooks实现。
https://github.com/ceph/ceph-ansible
1.2、ceph-chef
Ceph的chef部署工具
https://github.com/ceph/ceph-chef
2、集群拓扑规划
Ceph集群拓扑推荐必要组件节点双网卡。
- 一块用于集群内部网络Cluster Network(可选),用于处理集群内部事务。
- 另外一块用于客户端访问网络Public Network,用于处理客户端请求。
本次部署版本为nautilus版。
| 角色 | 主机名 | Cluster Network | Public Network | OSD |
|---|---|---|---|---|
| admin、client | ceph-admin.yull.cc | 10.37.129.14 | 10.211.55.100 | |
| mon、osd、mgr、mds | ceph-mon1.yull.cc | 10.37.129.12 | 10.211.55.101 | sdb、sdc |
| mon、osd、mgr、rgw | ceph-mon2.yull.cc | 10.37.129.11 | 10.211.55.102 | sdb、sdc |
| mon、osd、rgw | ceph-mon3.yull.cc | 10.37.129.13 | 10.211.55.103 | sdb、sdc |
3、基础环境设置
各节点需要进行一下系统环境设置:
- NTP时间同步;
- DNS或者hosts文件进行主机名解析;
- 关闭各节点firewalld和iptables;
- 各节点禁用SELinux;
- 创建ceph管理用户,并添加sudo权限;
- 各节点直接需要配置ssh免密认证;
-
3.1、NTP时间同步
添加NTP时间同步Crontab或者安装启用chronyd服务。
# 启用crontab]$ */1 * * * * /usr/sbin/ntpdate cn.pool.ntp.org# 或者安装chronyd]$ yum -y install chrony]$ systemctl start chronyd.service]$ systemctl enable chronyd.service
3.2、主机名解析
]$ cat /etc/hosts10.211.55.101 ceph-mon1.yull.cc ceph-mon1 ceph-stor1.yull.cc ceph-stor110.211.55.102 ceph-mon2.yull.cc ceph-mon2 ceph-stor2.yull.cc ceph-stor210.211.55.103 ceph-mon3.yull.cc ceph-mon3 ceph-stor3.yull.cc ceph-stor3
3.3、关闭防火墙及禁用SELinux
Centos7上,默认使用firewalld。
]$ systemctl stop firewalld.service # 停止防火墙]$ systemctl disable firewalld.service # 禁用启动]$ sed -i 's@^\(SELINUX=\).*@\1disabled@' /etc/sysconfig/selinux # 永久关闭]$ setenforce 0 # 临时关闭
3.4、创建Ceph管理用户及sudo权限
ceph-deploy建议以普通用户操作各节点,也可以使用”ceph-deploy —username {username}”指定用户,因此需要在各节点创建用于ceph集群管理和启动的用户,例如cephadm,并设置密码。
]$ useradd cephadm && echo "1234qwer" | passwd --stdin cephadm]$ echo "cephadm ALL = (root) NOPASSWD:ALL" | sudo tee /etc/sudoers.d/cephadm]$ chmod 0440 /etc/sudoers.d/cephadm
3.5、修改主机名
]$ hostnamectl set-hostname ceph-admin.yull.cc # cpeh-admin执行]$ hostnamectl set-hostname ceph-mon1.yull.cc # ceph-mon1]$ hostnamectl set-hostname ceph-mon2.yull.cc # ceph-mon2]$ hostnamectl set-hostname ceph-mon3.yull.cc # ceph-mon3
3.6、配置SSH免密认证
ceph-deploy部署不支持交互式密码输入,因此必须在管理节点配置SSH免密登录。以cephadm用户生成SSH秘钥对并拷贝到各节点。
]$ ssh-keygen -t rsa]$ ssh-copy-id -i .ssh/id_rsa.pub cephadm@ceph-mon1.magedu.com]$ ssh-copy-id -i .ssh/id_rsa.pub cephadm@ceph-mon2.magedu.com]$ ssh-copy-id -i .ssh/id_rsa.pub cephadm@ceph-mon3.magedu.com
4、部署Ceph集群
4.1、准备yum仓库
Ceph官方仓库路径为http://download.ceph.com/,但因为网络问题,本次使用阿里云仓库。主流版本一般在仓库的noarch目录下。
在ceph-admin节点上,安装nautilus版本yum仓库配置。]$ rpm -ivh https://mirrors.aliyun.com/ceph/rpm-nautilus/el7/noarch/ceph-release-1-1.el7.noarch.rpm
4.2、在管理节点安装ceph-deploy
ceph集群部署的全程可以在管理节点通过ceph-deploy进行
]$ yum -y install ceph-deploy python-setuptools python2-subprocess32
4.3、部署RADOS存储集群
4.3.1、初始化RADOS集群
在管理节点上创建集群相关配置文件和秘钥存储目录。集群创建过程中生成的所有文件均保存在此目录,因此创建后一定要cd到此目录,且后续操作均在此目录下完成。
]$ mkdir ceph-cluster]$ cd ceph-cluster
检查各节点环境,初始化命令格式为”ceph-deploy new {initial-monitor-node(s)}”。此操作会在指定节点检查连接状态、检查sudo权限并生成配置文件和秘钥环。
]$ ceph-deploy new --cluster-network 10.37.129.0/24 --public-network 10.211.55.0/24 ceph-mon{1..3}
检查完成后,会在ceph-cluster目录生成三个文件: ```bash ]$ ll -rw-rw-r— 1 cephadm cephadm 315 Aug 14 22:43 ceph.conf # ceph配置文件 -rw-rw-r— 1 cephadm cephadm 7571 Aug 14 22:43 ceph-deploy-ceph.log -rw———- 1 cephadm cephadm 73 Aug 14 22:43 ceph.mon.keyring # ceph-mon秘钥环文件 ]$ cat ceph.conf [global] fsid = 817bb5ff-1b92-4734-baa8-f21ede4cb9c2 # 自动生成fsid public_network = 10.211.55.0/24 # public网络 cluster_network = 10.37.129.0/24 # cluster网络 mon_initial_members = ceph-mon1, ceph-mon2, ceph-mon3 mon_host = 10.211.55.101,10.211.55.102,10.211.55.103 # 指定public网络后,mon会自动使用public网络作为mon监听地址 auth_cluster_required = cephx # 集群认证协议 auth_service_required = cephx auth_client_required = cephx
- 安装mon节点```bash]$ ceph-deploy install ceph-mon{1..3}
注意:运行此命令后,会在mon节点自动安装yum仓库配置文件,安装需要的程序包,此过程耗时很久,因此可以手动在mon节点通过yum安装程序包。
]$ rpm -ivh https://mirrors.aliyun.com/ceph/rpm-nautilus/el7/noarch/ceph-release-1-1.el7.noarch.rpm]$ yum install ceph ceph-radosgw
注意:安装后再次运行install时,默认ceph-deploy会重新安装程序包,因此需要使用—no-adjust-repos指定不调整yum配置文件安装集群。
]$ ceph-deploy install --no-adjust-repos ceph-mon{1..3}
- 初始化MON节点,并收集所有秘钥
初始化完成后,会在各mon节点启动ceph-mon进程,并在管理节点的ceph-cluster目录下生成keyring秘钥环文件。 ```bash ]$ ps -ef |grep ceph-mon # 任意mon节点 ceph 2229 1 0 23:02 ? 00:00:00 /usr/bin/ceph-mon -f —cluster ceph —id ceph-mon1 —setuser ceph —setgroup ceph]$ ceph-deploy mon create-initial
]$ ll # 管理节点执行 total 156 -rw———- 1 cephadm cephadm 113 Aug 14 23:03 ceph.bootstrap-mds.keyring -rw———- 1 cephadm cephadm 113 Aug 14 23:03 ceph.bootstrap-mgr.keyring -rw———- 1 cephadm cephadm 113 Aug 14 23:03 ceph.bootstrap-osd.keyring -rw———- 1 cephadm cephadm 113 Aug 14 23:03 ceph.bootstrap-rgw.keyring -rw———- 1 cephadm cephadm 151 Aug 14 23:03 ceph.client.admin.keyring
后续如需要重启mon进程,可使用以下命令:```bash]$ sudo systemctl start ceph-mon@ceph-mon3
推送配置文件和admin秘钥拷贝到Ceph集群各节点,以免在各节点执行ceph命令时必须要指定mon节点地址和ceph.client.admin.keyring,同时需要在各节点配置允许普通用户读取keyring文件。
]$ ceph-deploy admin ceph-mon{1..3}]$ cd /etc/ceph]$ sudo chown cephadm:root ceph.client.admin.keyring
后续如果修改了配置文件,也可以只推送配置文件到各节点
ceph-deploy --overwrite-conf config push ceph-mon{1,2,3}
配置MGR节点,启动MGR进程
]$ ceph-deploy mgr create ceph-mon1 ceph-mon2]$ ps -ef |grep ceph-mgr # 查看进程是否启动ceph 2647 1 19 23:13 ? 00:00:02 /usr/bin/ceph-mgr -f --cluster ceph --id ceph-mon1 --setuser ceph --setgroup ceph
后续如果需要重启mgr,可使用以下命令
]$ sudo systemctl start ceph-mgr@ceph-mon2
查看集群状态
至此一个ceph集群的基本环境就安装好了,可以通过ceph -s查看集群状态
]$ yum -y install ceph-common # 管理节点需安装]$ ceph-deploy admin ceph-admin # 将keyring文件推送到管理节点]$ sudo chown cephadm:root ceph.client.admin.keyring]$ ceph -s # 查看集群状态cluster:id: 817bb5ff-1b92-4734-baa8-f21ede4cb9c2 # 集群IDhealth: HEALTH_WARN # 集群运行状态OSD count 0 < osd_pool_default_size 3mons are allowing insecure global_id reclaimservices:mon: 3 daemons, quorum ceph-mon1,ceph-mon2,ceph-mon3 (age 17m) # 监视器仲裁状态mgr: ceph-mon1(active, since 7m), standbys: ceph-mon2 # mgr管理器运行状态osd: 0 osds: 0 up, 0 in # OSD状态data:pools: 0 pools, 0 pgs # 存储池状态objects: 0 objects, 0 Busage: 0 B used, 0 B / 0 B avail # 存储池的数量和使用量pgs: # PG的数量
注意health警告信息:mons are allowing insecure global_id reclaim,解决办法为禁用不安全模式
]$ ceph config set mon auth_allow_insecure_global_id_reclaim false
4.4、向RADOS集群添加OSD
检查列出OSD节点可用的磁盘信息
]$ ceph-deploy disk list ceph-stor{1..3}[ceph-stor1][INFO ] Disk /dev/sdb: 68.7 GB, 68719476736 bytes, 134217728 sectors[ceph-stor1][INFO ] Disk /dev/sdc: 68.7 GB, 68719476736 bytes, 134217728 sectors
在管理节点擦除计划用于OSD磁盘上的分区表和数据。
]$ ceph-deploy disk zap ceph-stor1 /dev/sdb]$ ceph-deploy disk zap ceph-stor1 /dev/sdc]$ ceph-deploy disk zap ceph-stor2 /dev/sdb]$ ceph-deploy disk zap ceph-stor2 /dev/sdc]$ ceph-deploy disk zap ceph-stor3 /dev/sdb]$ ceph-deploy disk zap ceph-stor3 /dev/sdc
添加OSD,默认使用的存储引擎为bluestor
]$ ceph-deploy osd create ceph-stor1 --data /dev/sdb]$ ceph-deploy osd create ceph-stor2 --data /dev/sdb]$ ceph-deploy osd create ceph-stor3 --data /dev/sdb]$ ceph-deploy osd create ceph-stor1 --data /dev/sdc]$ ceph-deploy osd create ceph-stor2 --data /dev/sdc]$ ceph-deploy osd create ceph-stor3 --data /dev/sdc
使用BlueStor时,如果有不同设备存放不同数据,可以使用—data指定数据存放磁盘,—block-db指定rocksdb存放的位置,—block-wal指定rocksdb日志存放的位置。
]$ ceph-deploy osd create {node} --data /path/to/data --block-db /path/to/db-device --block-wal /path/to/wal-device
如果使用FileStor时,仅支持—data指定数据存放目录,—journal指定日志存放目录。
]$ ceph-deploy osd create {node} --filestore --data /path/to/data --journal /path/to/journal
查看OSD相关信息
# 列出指定节点上的OSD]$ ceph-deploy osd list ceph-stor1# 查看你OSD信息]$ ceph osd stat# 查看OSD dump信息]$ ceph osd dump# 查看OSD编号]$ ceph osd ls
4.5、从RADOS集群中移除OSD
Ceph集群中一个OSD通常对应一块硬盘,运行专用的守护进程,如果某OSD故障,可能需要移除特定的OSD,需要先停止守护进程,再进行移除。
- 停用设备:ceph osd out {osd-num}
- 停止进程:sudo systemctl stop ceph-osd@{osd-num}
- 移除设备:
- ceph osd crush remove osd.{osd-num}
- ceph auth del osd.{osd-num}
- ceph osd rm osd.{osd-num}
- 卸载磁盘
umount /var/lib/ceph/osd/ceph-{osd-num}
4.6、测试上传/下载数据对象
存取数据时,客户端必须先连接至RADOS集群中的某个存储池,然后根据CRUSH算法完成数据对象的寻址,因此需要先创建测试用存储池。
]$ ceph osd pool create testpool 16pool 'testpool' created
使用rados命令上传issue文件到ceph中
]$ rados put issue /etc/issue --pool=testpool]$ rados ls --pool=testpoolissue
查看存储池中数据对象的具体位置信息
]$ ceph osd map testpool issueosdmap e28 pool 'testpool' (1) object 'issue' -> pg 1.651f88da (1.a) -> up ([5,4,0], p5) acting ([5,4,0], p5)
删除存储池
删除存储池会将存储池内所有数据删除,因此需要输入两次存储池名称和一长串的参数。
]$ ceph osd pool rm testpool testpool --yes-i-really-really-mean-itError EPERM: pool deletion is disabled; you must first set the mon_allow_pool_delete config option to true before you can destroy a pool
即便如此也会提示删除失败,如果一定要删除,需要先修改配置文件,添加允许删除配置。
]$ cd ceph-cluster # 管理节点执行]$ echo "mon_allow_pool_delete = true" >> ceph.conf]$ ceph-deploy --overwrite-conf config push ceph-mon{1..3}]$ for i in {1..3}; do ssh ceph-mon${i} "\sudo systemctl restart ceph-mon.target"; done
5、扩展Ceph集群
5.1、扩展MON监视器节点
Monitor节点在一个集群中,为实现高可用性,一般需要部署3个或以上,推荐奇数个。
]$ ceph-deploy mon add ceph-mon3
扩展完成后可以在使用ceph quorum_status —format json-pretty查看监视器及选举的相关状态。
5.2、扩展MGR节点
Manager节点在集群中,以Active/Standby模式运行,因此为保证高可用性,一般需要2个或以上。
]$ ceph-deploy mgr create ceph-mon3
添加完成后,再次通过ceph -s查看集群状态
]$ ceph -s
cluster:
id: 817bb5ff-1b92-4734-baa8-f21ede4cb9c2
health: HEALTH_OK
services:
mon: 3 daemons, quorum ceph-mon1,ceph-mon2,ceph-mon3 (age 46m)
mgr: ceph-mon1(active, since 36m), standbys: ceph-mon2
osd: 6 osds: 6 up (since 16m), 6 in (since 16m)
data:
pools: 1 pools, 16 pgs
objects: 1 objects, 23 B
usage: 6.0 GiB used, 378 GiB / 384 GiB avail
pgs: 16 active+clean
6、Ceph配置文件
6.1、Ceph配置文件加载顺序
- $CEPH_CONF
- -c path/to/config
- /etc/ceph/ceph.conf
- ~/.ceph/config
-
6.2、Ceph配置文件可引用的变量
Ceph集群中引入了元变量,元变量极大的简化了Ceph存储集群的配置,在配置值中设置元变量后,ceph将元变量扩展为具体值。ceph的元变量和Shell脚本中的变量类似:
$cluster:当前Ceph集群的名称
- $type:当前服务的类型名称,可能会展开为osd或mon
- $id:进程的标识符,如对osd.0来说,标识符为0
- $host:守护进程所在主机的主机名
-
7、停止或重启Ceph集群
7.1、停止集群顺序
告知ceph集群不要将OSD标记位out
]$ ceph osd set noout按照一下顺序停止守护进程和节点
按照以下顺序启动守护进程和节点
- 各节点mon守护进程
- 各节点mgr守护进程
- 各节点OSD守护进程
- 元数据服务器
- 网关
- 存储客户端守护进程(radosgw,mds)
清楚noout标志
]$ ceph osd unset noout8、启用Ceph集群访问接口
8.1、启用块设备接口RBD
Ceph Rados块设备接口,是基于Rados存储支持超配,可伸缩条带化数据存储系统,通过librbd库与OSD交互,RBD为KVM等虚拟化技术提供高性能和无限扩展的存储后端,这些系统使用libvirt和QEMU与RBD进行集成。
客户端基于librbd库即可将RADOS存储集群用作块设备,不过,用于rbd的存储池需要事先启用rbd功能并进行初始化。创建一个名为rbddata的存储池,在启用rbd功能后对其进行初始化:
]$ ceph osd pool create rbddata 64 ]$ ceph osd pool application enable rbddata rbd ]$ rbd pool init -p rbddata不过,rbd存储池并不能直接用于块设备,而是需要事先在其中按需创建映像(image),并把映像文件作为块设备使用。
创建一个名为img1的映像:
]$ rbd create img1 --size 1024 --pool rbddata映像的相关的信息则可以使用“rbd info”命令获取:
]$ rbd --image img1 --pool rbddata info rbd image 'img1': size 1 GiB in 256 objects order 22 (4 MiB objects) snapshot_count: 0 id: 5e405878315d block_name_prefix: rbd_data.5e405878315d format: 2 features: layering, exclusive-lock, object-map, fast-diff, deep-flatten op_features: flags: create_timestamp: Sun Aug 15 12:35:58 2021 access_timestamp: Sun Aug 15 12:35:58 2021 modify_timestamp: Sun Aug 15 12:35:58 2021在客户端主机上,用户通过内核级的rbd驱动识别相关的设备,即可对其进行分区、创建文件系统并挂载使用。
8.2、启动对象存储接口RGW
RGW并非必须的接口,仅在需要用到与S3和Swift兼容的RESTful接口时才需要部署RGW实例,
把mon2和mon3部署为rgw主机:
]$ ceph-deploy rgw create ceph-mon1 ceph-mon2部署完成后会在rgw节点上启动radosgw进程,同时可以使用以下命令进行重启
]$ sudo systemctl start ceph-radosgw@rgw.ceph-mon2默认情况下,RGW实例监听于TCP协议的7480端口,如需修改,可以通过在运行RGW的节点上编辑其主配置文件ceph.conf进行修改:
[client] rgw_frontends = "civetweb port=8080"RGW会在RADOS集群上创建以下存储池
]$ ceph osd pool ls .rgw.root default.rgw.control default.rgw.meta default.rgw.logRGW提供的是REST接口,客户端通过http与其进行交互,完成数据的增删改查等管理操作。
8.3、启用文件系统接口CephFS
CephFS需要至少运行一个元数据服务器(MDS)守护进程(ceph-mds),此进程管理与CephFS上存储的文件相关的元数据,并协调对Ceph存储集群的访问。
在mon1上启用MDS
]$ ceph-deploy mds create ceph-mon1部署完成后会在mds节点上启动ceph-mds进程,同时可以使用以下命令进行重启
]$ sudo systemctl start ceph-mds@ceph-mon1查看MDS的相关状态可以发现,刚添加的MDS处于Standby模式
]$ ceph mds stat 1 up:standby使用CephFS之前需要事先于集群中创建一个文件系统,并为其分别指定元数据和数据相关的存储池。
创建一个名为cephfs的文件系统用于测试,它使用cephfs-metadata为元数据存储池,使用cephfs-data为数据存储池
]$ ceph osd pool create cephfs-metadata 32 ]$ ceph osd pool create cephfs-data 32 ]$ ceph fs new cephfs cephfs-metadata cephfs-data可使用如下命令“ceph fs status ”查看文件系统的相关状态
]$ ceph fs status cephfs cephfs - 0 clients ====== +------+--------+-----------+---------------+-------+-------+ | Rank | State | MDS | Activity | dns | inos | +------+--------+-----------+---------------+-------+-------+ | 0 | active | ceph-mon1 | Reqs: 0 /s | 10 | 13 | +------+--------+-----------+---------------+-------+-------+ +-----------------+----------+-------+-------+ | Pool | type | used | avail | +-----------------+----------+-------+-------+ | cephfs-metadata | metadata | 96.0k | 119G | | cephfs-data | data | 0 | 119G | +-----------------+----------+-------+-------+ +-------------+ | Standby MDS | +-------------+ +-------------+ ]$ ceph mds stat cephfs:1 {0=ceph-mon1=up:active}客户端通过内核中的cephfs文件系统接口即可挂载使用cephfs文件系统,或者通过FUSE接口与文件系统进行交互。
获取集群的运行状态 ```bash
查看PG状态
]$ ceph pg stat 16 pgs: 16 active+clean; 23 B data, 1.4 MiB used, 378 GiB / 384 GiB avail
查看存储池状态
]$ ceph osd pool stats pool testpool id 1 nothing is going on
查看ceph存储空间用量
]$ ceph df RAW STORAGE: CLASS SIZE AVAIL USED RAW USED %RAW USED ssd 384 GiB 378 GiB 1.4 MiB 6.0 GiB 1.56 TOTAL 384 GiB 378 GiB 1.4 MiB 6.0 GiB 1.56
POOLS: POOL ID PGS STORED OBJECTS USED %USED MAX AVAIL testpool 1 16 23 B 1 12 KiB 0 120 GiB ```
- ceph df输出由两端内容:Global和Pools
- Global:存储量概览
- Pools:存储池列表和每个存储池的理论用量,但不反映副本、克隆数据和快照
- Global段
- SIZE:集群的整体存储空间
- AVAIL:集群中可以使用的空间容量
- RAW USED:已用的原始存储量
- %RAW USED:已用的原始存储量百分比
