ceph搭建及使用详解
第1章 ceph介绍
1.1 Ceph的主要特点
统一存储
无任何单点故障
数据多份冗余
存储容量可扩展
自动容错及故障自愈
1.2 Ceph三大角色组件及其作用
在Ceph存储集群中,包含了三大角色组件,他们在Ceph存储集群中表现为3个守护进程,分别是Ceph OSD、Monitor、MDS。当然还有其他的功能组件,但是最主要的是这三个。
Ceph OSD
Ceph的OSD(Object Storage Device)守护进程。主要功能包括:存储数据、副本数据处理、数据恢复、数据回补、平衡数据分布,并将数据相关的一些监控信息提供给Ceph Moniter,以便Ceph Moniter来检查其他OSD的心跳状态。一个Ceph OSD存储集群,要求至少两个Ceph OSD,才能有效的保存两份数据。注意,这里的两个Ceph OSD是指运行在两台物理服务器上,并不是在一台物理服务器上运行两个Ceph OSD的守护进程。通常,冗余和高可用性至少需要3个Ceph OSD。
Monitor
Ceph的Monitor守护进程,主要功能是维护集群状态的表组,这个表组中包含了多张表,其中有Moniter map、OSD map、PG(Placement Group) map、CRUSH map。 这些映射是Ceph守护进程之间相互协调的关键簇状态。 监视器还负责管理守护进程和客户端之间的身份验证。 通常需要至少三个监视器来实现冗余和高可用性。
MDS
Ceph的MDS(Metadata Server)守护进程,主要保存的是Ceph文件系统的元数据。注意,对于Ceph的块设备和Ceph对象存储都不需要Ceph MDS守护进程。Ceph MDS为基于POSIX文件系统的用户提供了一些基础命令的执行,比如ls、find等,这样可以很大程度降低Ceph存储集群的压力。
Managers
Ceph的Managers(Ceph Manager),守护进程(ceph-mgr)负责跟踪运行时间指标和Ceph群集的当前状态,包括存储利用率,当前性能指标和系统负载。 Ceph Manager守护程序还托管基于python的插件来管理和公开Ceph集群信息,包括基于Web的仪表板和REST API。 通常,至少有两名Manager需要高可用性。
Ceph的术语表:
http://docs.ceph.com/docs/master/glossary/#term-ceph-storage-cluster
1.3 Ceph的架构及应用场景
文档连接:
http://docs.ceph.com/docs/master/architecture/
Ceph的架构主要分成底层数据分布及上层应用接口,下面是官网架构图:
A library…and PHP #LIBRADOS库允许应用程序可以直接访问Ceph底层的对象存储,它支持的有C、C++、Java、Python、Ruby及PHP语言。
A bucket-based…and Swift #一套基于RESTful协议的网关,并兼容S3和Swift。
A reliable…QEMU/KVM driver #通过Linux内核客户端及QEMU/KVM驱动,来提供一个可靠且完全分布的块设备。
A POSIX-compliant…for FUSE #通过Linux内核客户端结合FUSE,来提供一个兼容POSIX文件结构系统。
A reliable,autonomous…storage nodes #以其具备的自愈功能、自管理、智能存储节点特性,来提供一个可靠、自动、分布式的对象存储。
1.4 RADOS
Ceph的底层核心是RADOS(Reliable, Autonomic Distributed Object Store),Ceph的本质是一个对象存储。RADOS由两个组件组成:OSD和Monitor。OSD主要提供存储资源,每一个disk、SSD、RAID group或者一个分区都可以成为一个OSD,而每个OSD还将负责向该对象的复杂节点分发和恢复;Monitor维护Ceph集群并监控Ceph集群的全局状态,提供一致性的决策。
RADOS分发策略依赖于名为CRUSH(Controlled Replication Under Scalable Hashing)的算法(基于可扩展哈希算法的可控复制)
1.5 应用场景
Ceph的应用场景主要由它的架构确定,Ceph提供对象存储、块存储和文件存储,主要由4种应用:
第一类:LIBRADOS应用
通俗的说,Librados提供了应用程序对RADOS的直接访问,目前Librados已经提供了对C、C++、Java、Python、Ruby和PHP的支持。它支持单个单项的原子操作,如同时更新数据和属性、CAS操作,同时有对象粒度的快照操作。它的实现是基于RADOS的插件API,也就是在RADOS上运行的封装库。
第二类:RADOSGW应用
这类应用基于Librados之上,增加了HTTP协议,提供RESTful接口并且兼容S3、Swfit接口。RADOSGW将Ceph集群作为分布式对象存储,对外提供服务。
第三类:RBD应用
这类应用也是基于Librados之上的,细分为下面两种应用场景。
第一种应用场景为虚拟机提供块设备。通过Librbd可以创建一个块设备(Container),然后通过QEMU/KVM附加到VM上。通过Container和VM的解耦,使得块设备可以被绑定到不同的VM上。
第二种应用场景为主机提供块设备。这种场景是传统意义上的理解的块存储。
以上两种方式都是将一个虚拟的块设备分片存储在RADOS中,都会利用数据条带化提高数据并行传输,都支持块设备的快照、COW(Copy-On-Write)克隆。最重要的是RBD还支持Live migration。
第四类:CephFS(Ceph文件系统)应用
这类应用是基于RADOS实现的PB级分布式文件系统,其中引入MDS(Meta Date Server),它主要为兼容POSIX文件系统提供元数据,比如文件目录和文件元数据。同时MDS会将元数据存储在RADOS中,这样元数据本身也达到了并行化,可以大大加快文件操作的速度。MDS本身不为Client提供数据文件,只为Client提供对元数据的操作。当Client打开一个文件时,会查询并更新MDS相应的元数据(如文件包括的对象信息),然后再根据提供的对象信息直接从RADOS中得到文件数据。**
1.6 本文档没有安装MDS
Ceph 分布式存储集群有三大组件组成,分为:Ceph Monitor、Ceph OSD、Ceph MDS,后边使用对象存储和块存储时,MDS 非必须安装,只有当使用 Cephfs 文件存储时,才需要安装。这里我们暂时不安装 MDS。
1.7 ceph-deploy 常用命令详解
命令 描述
ceph-deploy new [mon-node ...] 指定node(s)为monitor,开始部署一个新的ceph集群,并且在当前目录创建ceph.conf和keyring文件,一共创建了3个文件:ceph.conf、ceph-deploy-ceph.log 和 ceph.mon.keyring. 生成的ceph.conf 文件里包含了命令行的monitor参数,内容为mon_initial_members=[monitor]
ceph-deploy install [host …] 在指定的远程host(admin-node/osd-node/mon-node)上安装Ceph相关的包,如果安装找不到stable 的 ceph 版本,需要手动修改admin-node节点上的/etc/apt/sources.list.d/ceph.list文件
ceph-deploy mon [CMD …] 进行ceph monitor daemon 管理
ceph-deploy mon create-initial 部署并初始化已经定义好的mon_initial_members=[monitor]成员,并等待他们形成仲裁,然后收集密钥keys,会在当前目录下生成几个key,报告进程中monitor的状态。如果monitor不构成仲裁,命令最终将超时。
ceph-deploy osd
使用路径,先prepare 后 activate
prepare [node:/dir …]
从管理节点(admin-node)执行 ceph-deploy 来准备 OSD 。
参数可以是文件或者磁盘,
例如,文件:ceph-deploy osd prepare node1:/var/local/osd0
磁盘:ceph-deploy osd prepare node1:sdb1:sdc
activate [node:/dir …]
激活已经准备好的 OSD。
参数可以是文件或者磁盘,
例如,文件:ceph-deploy osd activate node1:/var/local/osd0
磁盘:ceph-deploy osd activate node1:sdb1:sdc
使用磁盘或者日志,用 `create` 参数将 自动完成prepare 和 activate
create
例1:使用filestore采用journal模式(每个节点数据盘需要两块盘或两个分区)
1)创建逻辑卷.
vgcreate data /dev/sdb
lvcreate --size 00G --name log data
2)创建OSD
ceph-deploy osd create --filestore --fs-type xfs --data /dev/sdc --journal data/log storage1
例2:使用bluestore
1)创建逻辑卷
vgcreate cache /dev/sdb
lvcreate --size 100G --name db-lv-0 cache
vgcreate cache /dev/sdb
lvcreate --size 100G --name wal-lv-0 cache
2)创建OSD
--block-db 对应配置参数:bluestore_block_db_path
--block-wal对应配置参数bluestore_block_wal_path
ceph-deploy osd create --bluestore storage1 --data /dev/sdc --block-db cache/db-lv-0 --block-wal cache/wal-lv-0
ceph-deploy admin [admin- node] [osd-node mon-node …]
把配置文件和 admin 密钥拷贝到管理节点(admin-node)和 Ceph 节点(monitor/osd)的/etc/ceph/目录下
ceph-deploy mgr create [node]
指定node为部署ceph-mgr节点的hostname,并开始mgr 部署。
ceph-deploy disk zap [osd-node]:[disk-name}
擦除指定node的磁盘分区表及其内容,实际上它是调用sgdisk –zap-all来销毁GPT和MBR, 所以磁盘可以被重新分区。可以配合命令ceph-deploy osd prepare/active一起使用
ceph-deploy mds create {host-name}[:{daemon-name}][{host-name}[:{daemon-name}]...]
例如:ceph-deploy --overwrite-conf mds create server1:mds-daemon-1,在server1上创建名为mds-daemon-1的mds后台进程,即server1为CephFS元数据服务器
ceph-deploy --overwrite-conf admin {mon} {osd}
更新mon及osd的ceph.conf配置文件
ceph-deploy --overwrite-conf admin ubuntu-sebre ubuntu
sudo chmod +066 /etc/ceph/ceph.client.admin.keyring
重启服务才能生效 sudo systemctl restart ceph\*.target //重启所有
也可以重启指定的部分sudo systemctl restart ceph-mon.target ceph-osd.target
1.8 ceph命令
命令 描述
ceph -s 查看ceph 集群的状态
ceph df
ceph osd tree
ceph osd pool create {pool-name} {pg-num} [{pgp-num}] [replicated][crush-rule-name] [expected-num-objects]
例如,ceph osd pool create rbd 256,创建名为rbd的ceph pool,等同于命令:rados mkpool pool
通常在创建pool之前,需要覆盖默认的pg_num,官方推荐:
若少于5个OSD, 设置pg_num为128。
5~10个OSD,设置pg_num为512。
10~50个OSD,设置pg_num为4096。
超过50个OSD,可以参考pgcalc计算。
ceph osd pool create {pool-name} {pg-num} {pgp-num} erasure [erasure-code-profile] [crush-rule-name] [expected_num_objects] 同上,提供的是EC容错
ceph osd lspools 查看集群的pools
ceph osd pool ls detail 查看pool的详细信息,例如:ceph> osd pool ls detail pool 14 'rbd' replicated size 1 min_size 1 crush_rule 0 object_hash rjenkins pg_num 128 pgp_num 128 last_change 125 flags hashpspool stripe_width 0
ceph osd pool set {pool-name} size {num} 设置指定pool的副本数为{num}。例如,sudo ceph osd pool set rbd size 1
sudo ceph osd pool set rbd min_size 1
ceph osd pool get {pool-name} size
查看指定pool的副本数,
例如:$ ceph osd pool get rbd size size: 3。
其详细命令:
osd pool get <poolname> size|min_size|crash_replay_interval|pg_num|pgp_num|crush_rule|hashpspool|nodelete|nopgchange| get pool parameter <var>
nosizechange|write_fadvise_dontneed|noscrub|nodeep-scrub|hit_set_type|hit_set_period|hit_set_count|hit_set_fpp|use_
gmt_hitset|auid|target_max_objects|target_max_bytes|cache_target_dirty_ratio|cache_target_dirty_high_ratio|cache_
target_full_ratio|cache_min_flush_age|cache_min_evict_age|erasure_code_profile|min_read_recency_for_promote|all|min_
write_recency_for_promote|fast_read|hit_set_grade_decay_rate|hit_set_search_last_n|scrub_min_interval|scrub_max_
interval|deep_scrub_interval|recovery_priority|recovery_op_priority|scrub_priority|compression_mode|compression_
algorithm|compression_required_ratio|compression_max_blob_size|compression_min_blob_size|csum_type|csum_min_block|
csum_max_block|allow_ec_overwrites
ceph osd pool delete {pool-name} {pool-name} --yes-i-really-really-mean-it
删除某个pool,需要配置/etc/ceph/ceph.conf的[mon] mon allow pool delete = true。
然后重启ceph mon,命令:sudo systemctl restart ceph-mon.target
再删除命令,ceph osd pool delete rbd rbd --yes-i-really-really-mean-it
ceph osd dump | grep 'replicated size'
查看OSD日志,例如:$ceph osd dump | grep 'replicated size'
pool 9 'rbd' replicated size 1 min_size 1 crush_rule 0 object_hash rjenkins pg_num 100 pgp_num 100 last_change 68 flags hashpspool stripe_width 0
ceph osd set noscrub
设置不做scrub一致性检查,防止影响性能。设置不做深度scrub检查:ceph osd set nodeep-scrub
ceph osd getcrushmap -o {compiled-crushmap-filename}
将集群的CRUSH Map输出到指定文件,该文件是编译过的文件
crushtool -d {compiled-crushmap-filename} -o {decompiled-crushmap-filename}
反编译集群里导出的 CRUSH Map 文件,反编译后为文本文件
crushtool -c {decompiled-crushmap-filename} -o {compiled-crushmap-filename}
编译 CRUSH Map 文本文件
ceph -n {nodename.id} –show-config
显示当前的ceph节点的配置,可以指定某个节点,例如:
ceph -n osd.0 --show-config
ceph -n mon.node1 --show-config
ceph mds stat
查看CephFS元数据服务器运行状态
ceph fs new <fs_name> <metadata_pool> <data_pool>
用指定的元数据池和数据池新建一个CephFS文件系统
ceph fs ls
查看cephfs列表,$ sudo ceph fs ls
name: test_cephfs1, metadata pool: cephfs_metadata, data pools: [cephfs_data ]
ceph daemon <mon/osd/mds>.<id> config set <参数名> <参数值>
动态调整参数命令,只能在本地设置本地实例的参数
ceph tell <mon/osd/mds>.<id> injectargs '--<参数名> <参数值>'
动态调整参数命令,可以通过'*'的方式设置所有的实例的参数
参考:
http://docs.ceph.com/docs/master/rados/operations/pools/
1.9 ceph-conf命令
命令 描述
ceph-conf --name mon.node1 --show-config-value log_file
查看ceph monitor 的日志路径。
例如:~$ ceph-conf --name mon.node1 --show-config-value log_file
/var/log/ceph/ceph-mon.node1.log。
其实monitor节点的/var/log/ceph/目录下有很多类型的log,ceph-mgr、ceph-mon、ceph、ceph-client、ceph.audit
ceph-conf --name osd.0 --show-config-value log_file \
查看ceph osd 的日志路径
1.10 rados命令
命令 描述
rados lspools 查看ceph 集群的pool
rados mkpool <pool-name> 创建名为<pool-name>的ceph pool
rados ls 列出叫rbd的pool里的objects
1.11 rbd命令
命令 描述
rbd create image1 --size 60G
默认在rbd pool下创建一个名为image1, 大小为1G的image,等同于
rbd create rbd/image1 --size 60G --image-format 2
rbd list
列出所有的块设备image
rbd info image1
查看某个具体的image的信息。例如:
$ rbd info image1
rbd image 'image1':
size 1GiB in 256 objects
order 22 (4MiB objects)
block_name_prefix: rbd_data.10356b8b4567
format: 2
features: layering, exclusive-lock, object-map, fast-diff, deep-flatten
flags:
create_timestamp: Wed Jun 19 16:05:40 2019
rbd feature disable image1 exclusive-lock, object-map, fast-diff, deep-flatten
关掉image1的一些feature
rbd map image1
把test_image块设备映射到操作系统,
例如:h$ sudo rbd map image1
/dev/rbd0
rbd showmapped
显示已经映射的块设备,
例如:$ rbd showmapped
id pool image snap device
0 rbd image1 - /dev/rbd0
rbd unmap image1 取消映射
rbd rm image 删除一个rbd image
参考网址
https://blog.csdn.net/don_chiang709/article/details/91952060
第2章 搭建ceph
2.1 中文官网地址
http://docs.ceph.org.cn/start/quick-start-preflight/
2.2 环境
Centos 7系列
本文档环境
CentOS Linux release 7.6.1810 (Core)
2.3 ceph-deploy版本
ceph-deploy --version
1.5.39
2.4 主机要求
3台服务器(1核cpu,2G内存,新加一块20G的磁盘)
2.5 修改主机名
#在对应的主机上操作
hostnamectl set-hostname ceph01
hostnamectl set-hostname ceph02
hostnamectl set-hostname ceph03
2.6 关闭防火墙和selinux
所有节点
systemctl disable firewalld
systemctl stop firewalld
setenforce 0
2.7 修改主机名解析
#ceph01节点操作,然后复制到其他节点
cat /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.56.4 ceph01
192.168.56.5 ceph02
192.168.56.6 ceph03
#复制主机名解析文件到其他节点
scp /etc/hosts ceph02:/etc/
scp /etc/hosts ceph03:/etc/
2.8 安装授时服务
#在所有节点安装配置chrony
yum -y install chrony
vim /etc/chrony.conf
server ntp1.aliyun.com iburst
systemctl enable chronyd
systemctl restart chronyd
2.9 安装epel源
Ceph 提供了部署工具 ceph-deploy 来方便安装 Ceph 集群,我们只需要在 ceph-deploy 节点上安装即可,这里对应的就是 ceph01 节点。把 Ceph 仓库添加到 ceph-deploy 管理节点,然后安装 ceph-deploy。
yum install -y yum-utils && yum-config-manager --add-repo https://dl.fedoraproject.org/pub/epel/7/x86_64/ && yum install --nogpgcheck -y epel-release && rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-7 && rm /etc/yum.repos.d/dl.fedoraproject.org*
2.10 配置yum源
需要特别注意的是,Ceph的安装过程还需要第三方组件依赖,其中一些第三方组件在CentOS yum.repo Base等官方源中是没有的(例如LevelDB),所以读者在安装过程中会有一定的几率遇到各种依赖关系异常,并要求先行安装XXX第三方组件的提示(例如提示先安装liblevel.so)。虽然我们后文将会介绍的Ceph辅助部署工具,Ceph-deploy的工作本质还是通过yum命令去安装管理组件,但是既然CentOS yum.repo Base官方源中并没有某些需要依赖的第三方组件,所以一旦遇到类似的组件依赖问题安装过程就没法自动继续了。解决这个问题,本示例中建议引入CentOS的第三方扩展源epel。(我在这上面坑了很久才走出来)。#在每个节点都执行
首先引入第三方扩展源:
wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
2.11 添加官网的ceph源
#在每个节点都执行
cat> /etc/yum.repos.d/ceph.repo<<eof
[Ceph]
name=Ceph packages for $basearch
baseurl=http://download.ceph.com/rpm-jewel/el7/$basearch
enabled=1
gpgcheck=1
type=rpm-md
gpgkey=https://download.ceph.com/keys/release.asc
priority=1
[Ceph-noarch]
name=Ceph noarch packages
baseurl=http://download.ceph.com/rpm-jewel/el7/noarch
enabled=1
gpgcheck=1
type=rpm-md
gpgkey=https://download.ceph.com/keys/release.asc
priority=1
[ceph-source]
name=Ceph source packages
baseurl=http://download.ceph.com/rpm-jewel/el7/SRPMS
enabled=1
gpgcheck=1
type=rpm-md
gpgkey=https://download.ceph.com/keys/release.asc
priority=1
eof
说明:baseurl中的rpm-jewel为ceph版本。这个源很慢,可以用阿里云的源替换。
yum clean all && yum makecache
2.12 添加阿里云的ceph源
#在每个节点都执行
cat >/etc/yum.repos.d/ceph.repo<<eof
[Ceph-SRPMS]
name=Ceph SRPMS packages
baseurl=https://mirrors.aliyun.com/ceph/rpm-jewel/el7/SRPMS/
enabled=1
gpgcheck=0
type=rpm-md
[Ceph-aarch64]
name=Ceph aarch64 packages
baseurl=https://mirrors.aliyun.com/ceph/rpm-jewel/el7/aarch64/
enabled=1
gpgcheck=0
type=rpm-md
[Ceph-noarch]
name=Ceph noarch packages
baseurl=https://mirrors.aliyun.com/ceph/rpm-jewel/el7/noarch/
enabled=1
gpgcheck=0
type=rpm-md
[Ceph-x86_64]
name=Ceph x86_64 packages
baseurl=https://mirrors.aliyun.com/ceph/rpm-jewel/el7/x86_64/
enabled=1
gpgcheck=0
type=rpm-md
eof
yum clean all && yum makecache
2.13 添加网易的ceph源
#在每个节点都执行
cat> /etc/yum.repos.d/ceph.repo <<eof
[Ceph]
name=Ceph packages for $basearch
baseurl=http:// mirrors.163.com/ceph /rpm-jewel/el7/$basearch
enabled=1
gpgcheck=1
type=rpm-md
gpgkey=https:// mirrors.163.com/ceph /keys/release.asc
priority=1
[Ceph-noarch]
name=Ceph noarch packages
baseurl=http:// mirrors.163.com/ceph /rpm-jewel/el7/noarch
enabled=1
gpgcheck=1
type=rpm-md
gpgkey=https:// mirrors.163.com/ceph /keys/release.asc
priority=1
[ceph-source]
name=Ceph source packages
baseurl=http:// mirrors.163.com/ceph /rpm-jewel/el7/SRPMS
enabled=1
gpgcheck=1
type=rpm-md
gpgkey=https:// mirrors.163.com/ceph /keys/release.asc
priority=1
eof
yum clean all && yum makecache
2.14 安装ceph-deploy及相关工具
#ceph01节点执行
yum update && yum install ceph-deploy
2.15 创建部署ceph的用户
注意用户名不能是ceph
所有节点操作
useradd -d /home/cephd -m cephd
passwd cephd
确保各节点上新创建的用户都有 sudo 权限。
echo "cephd ALL = (root) NOPASSWD:ALL" | sudo tee /etc/sudoers.d/cephd
chmod 0440 /etc/sudoers.d/cephd
2.16 允许cephd无密码 SSH 登录
正因为 ceph-deploy 不支持输入密码,你必须在管理节点上生成 SSH 密钥并把其公钥分发到各 Ceph 节点。 ceph-deploy 会尝试给初始 monitors 生成 SSH 密钥对。
生成 SSH 密钥对,但不要用 sudo 或 root 用户。提示 “Enter passphrase” 时,直接回车,口令即为空:
su - cephd
ssh-keygen #一直回车
#把公钥拷贝到各 Ceph 节点
ssh-copy-id cephd@ceph01
ssh-copy-id cephd@ceph02
ssh-copy-id cephd@ceph03
2.17 修改/home/cephd/.ssh/config文件
这个文件是新建的
这样 ceph-deploy 就能用你所建的用户名登录 Ceph 节点了,而无需每次执行 ceph-deploy 都要指定 --username {username} 。这样做同时也简化了 ssh 和 scp 的用法。把 {username} 替换成你创建的用户名。
cat >/home/cephd/.ssh/config <<eof
Host ceph01
Hostname ceph01
User cephd
Host ceph02
Hostname ceph02
User cephd
Host ceph03
Hostname ceph03
User cephd
eof
#授权
chmod 600 /home/cephd/.ssh/config
2.18 开放所需端口
Ceph Monitors 之间默认使用 6789 端口通信, OSD 之间默认用 6800:7300 这个范围内的端口通信。详情见网络配置参考http://docs.ceph.org.cn/rados/configuration/network-config-ref/。 Ceph OSD 能利用多个网络连接进行与客户端、monitors、其他 OSD 间的复制和心跳的通信。
某些发行版(如 RHEL )的默认防火墙配置非常严格,你可能需要调整防火墙,允许相应的入站请求,这样客户端才能与 Ceph 节点上的守护进程通信。
对于 RHEL 7 上的 firewalld ,要对公共域开放 Ceph Monitors 使用的 6789 端口和 OSD 使用的 6800:7300 端口范围,并且要配置为永久规则,这样重启后规则仍有效。例如:
sudo firewall-cmd --zone=public --add-port=6789/tcp --permanent
若使用 iptables ,要开放 Ceph Monitors 使用的 6789 端口和 OSD 使用的 6800:7300 端口范围,命令如下:
sudo iptables -A INPUT -i {iface} -p tcp -s {ip-address}/{netmask} --dport 6789 -j ACCEPT
在每个节点上配置好 iptables 之后要一定要保存,这样重启之后才依然有效。例如:
/sbin/service iptables save
2.19 创建执行目录
#ceph01节点操作
su - cephd
mkdir /home/cephd/ceph-cluster && cd /home/cephd/ceph-cluster
2.20 创建集群
#ceph01节点操作
su - cephd
cd /home/cephd/ceph-cluster
sudo ceph-deploy new ceph01 ceph02 ceph03 #多个mon节点 集群方式
此时,我们会发现 ceph-deploy 会在 ceph-cluster 目录下生成几个文件,ceph.conf 为 ceph 配置文件,ceph-deploy-ceph.log 为 ceph-deploy 日志文件,ceph.mon.keyring 为 ceph monitor 的密钥环。
把 Ceph 配置文件里的默认副本数从 3 改成 2 ,这样只有两个 OSD 也可以达到 active + clean 状态。把下面这行加入 [global] 段:
修改下 ceph.conf 配置文件,增加副本数为 2。
增加如下配置
sudo vim /home/cephd/ceph-cluster/ceph.conf
osd pool default size = 2 #增加默认副本数为 2
如果你有多个网卡,可以把 public network 写入 Ceph 配置文件的 [global] 段下。详情见
http://docs.ceph.org.cn/rados/configuration/network-config-ref/
官网建议使用xfs格式化硬盘作为ceph的osd存储数据的目录,这里用的是ext4格式化的,所以要加如下配置,否则会报错。
osd max object name len = 256
osd max object namespace len = 64
2.21 安装 ceph
#ceph01节点操作
su - cephd
cd /home/cephd/ceph-cluster
sudo ceph-deploy install ceph01 ceph02 ceph03
2.23 初始化mon节点并收集所有秘钥
#ceph01节点操作
ceph-deploy mon create-initial
完成上述操作后,当前目录里应该会出现这些密钥环:
ceph.bootstrap-mds.keyring
ceph.bootstrap-mgr.keyring
ceph.bootstrap-osd.keyring
ceph.bootstrap-rgw.keyring
ceph.client.admin.keyring
2.24 查看ceph集群状态
第3章 硬盘添加osd
3.1 添加osd节点
#接下来需要创建 OSD 了,OSD 是最终数据存储的地方,这里我们准备了3个 OSD 节点。官方建议为 OSD 及其日志使用独立硬盘或分区作为存储空间,也可以使用目录的方式创建。
#给node01,node02,node03 分别添加一块20G硬盘,创建分区/dev/sdb1,格式化为ext4 文件系统
#每个节点都执行
fdisk /dev/sdb #这里根据情况执行,不一定是/dev/sdb
mkfs.xfs /dev/sdb1
chown -R ceph:ceph /dev/sdb1
mkdir /osd
3.2 准备OSD
#ceph01节点操作执行 prepare OSD 操作,目的是分别在各个 OSD 节点上创建一些后边激活 OSD 需要的信息。
cd /home/cephd/ceph-cluster/
ceph-deploy --overwrite-conf osd prepare ceph01:/osd ceph02:/osd ceph03:/osd
3.3 激活OSD
#ceph01节点操作
cd /home/cephd/ceph-cluster/
chown -R ceph.ceph /osd/
ceph-deploy osd activate ceph01:/osd ceph02:/osd ceph03:/osd
注意:目录不能是/home
#node02和node03操作
授权osd挂载目录,这里是/osd/
chown -R ceph.ceph /osd/
3.4 查看ceph集群状态
第4章 分发配置文件
用 ceph-deploy 把配置文件和 admin 密钥拷贝到管理节点和 Ceph 节点,这样你每次执行 Ceph 命令行时就无需指定 monitor 地址和 ceph.client.admin.keyring 了。
#ceph01节点执行
ceph-deploy admin ceph01 ceph02 ceph03
4.1 授权
#ceph01,ceph02,ceph03节点操作
chmod +r /etc/ceph/ceph.client.admin.keyring
4.2 集群健康监测
ceph health
HEALTH_OK #这是正确输出
第5章 报错及解决
5.1 创建集群遇到的问题及解决
sudo ceph-deploy new ceph01 ceph02 ceph03遇到的问题及解决方法如下
遇到的问题1
ceph-deploy new ceph01
Traceback (most recent call last):
File "/bin/ceph-deploy", line 5, in <module>
from pkg_resources import load_entry_point
ImportError: No module named pkg_resources
解决:
重新安装python的distribution:
下载 distribution : https://pypi.python.org/pypi/distribute
cd distribution-0.7.3/
sudo python setup.py install
distribution下载地址:
https://files.pythonhosted.org/packages/5f/ad/1fde06877a8d7d5c9b60eff7de2d452f639916ae1d48f0b8f97bf97e570a/distribute-0.7.3.zip
遇到的问题2
sudo ceph-deploy new ceph01
[ceph_deploy.conf][DEBUG ] found configuration file at: /root/.cephdeploy.conf
[ceph_deploy.cli][INFO ] Invoked (1.5.25): /bin/ceph-deploy new ceph01
[ceph_deploy.new][DEBUG ] Creating new cluster named ceph
[ceph_deploy.new][INFO ] making sure passwordless SSH succeeds
[ceph_deploy][ERROR ] Traceback (most recent call last):
[ceph_deploy][ERROR ] File "/usr/lib/python2.7/site-packages/ceph_deploy/util/decorators.py", line 69, in newfunc
[ceph_deploy][ERROR ] return f(*a, **kw)
[ceph_deploy][ERROR ] File "/usr/lib/python2.7/site-packages/ceph_deploy/cli.py", line 162, in _main
[ceph_deploy][ERROR ] return args.func(args)
[ceph_deploy][ERROR ] File "/usr/lib/python2.7/site-packages/ceph_deploy/new.py", line 141, in new
[ceph_deploy][ERROR ] ssh_copy_keys(host, args.username)
[ceph_deploy][ERROR ] File "/usr/lib/python2.7/site-packages/ceph_deploy/new.py", line 35, in ssh_copy_keys
[ceph_deploy][ERROR ] if ssh.can_connect_passwordless(hostname):
[ceph_deploy][ERROR ] File "/usr/lib/python2.7/site-packages/ceph_deploy/util/ssh.py", line 15, in can_connect_passwordless
[ceph_deploy][ERROR ] if not remoto.connection.needs_ssh(hostname):
[ceph_deploy][ERROR ] AttributeError: 'module' object has no attribute 'needs_ssh'
[ceph_deploy][ERROR ]
问题原因:和ceph-deploy版本有关系ceph-deploy.noarch 0:1.5.25-1.el7版本会报这个问题,即使把这个问题按照如下方法解决了,执行sudo ceph-deploy install ceph01 ceph02 ceph03还会报其他错误,所以根本解决方法是更换ceph-deploy版本
解决:
sudo ceph-deploy new ceph01 --no-ssh-copykey
遇到的问题3
CentOS 7 quick start fails with RuntimeError: NoSectionError: No section: ‘ceph’
解决:
sudo mv /etc/yum.repos.d/ceph.repo /etc/yum.repos.d/ceph-deploy.repo
RuntimeError: connecting to host: node03 resulted in errors: IOError cannot send (already closed?)
解决:
sudo:抱歉,您必须拥有一个终端来执行 sudo
解决
所有节点执行
将/etc/sudoers文件中的下面那行注释掉
Defaults requiretty
遇到的问题4
[ceph01][ERROR ] RuntimeError: command returned non-zero exit status: 1
[ceph_deploy][ERROR ] RuntimeError: Failed to execute command: yum -y install epel-release
解决:
进入/etc/yum.repos.d中删除epel.repo和epel-testing.repo
5.2 安装ceph遇到的问题及解决
执行sudo ceph-deploy install ceph01 ceph02 ceph03遇到的问题及解决方法如下
遇到的问题1
[ceph_deploy][ERROR ] RuntimeError: NoSectionError: No section: 'ceph'
解决:
sudo yum remove ceph-release
5.3 初始化mon报错及解决
执行ceph-deploy mon create-initial遇到的问题及解决方法如下
遇到的问题1
ERROR ] RuntimeError: config file /etc/ceph/ceph.conf exists with different content; use --overwrite-conf to overwrite
[ceph_deploy][ERROR ] GenericError: Failed to create 1 monitors
解决:
ceph-deploy --overwrite-conf mon create-initial
到此,ceph monitor 已经成功启动了。
5.4 检查集群状态报错及解决
ceph -s
2019-09-22 20:28:34.888971 7f5272f01700 -1 auth: unable to find a keyring on /etc/ceph/ceph.client.admin.keyring,/etc/ceph/ceph.keyring,/etc/ceph/keyring,/etc/ceph/keyring.bin: (2) No such file or directory
2019-09-22 20:28:34.888987 7f5272f01700 -1 monclient(hunting): ERROR: missing keyring, cannot use cephx for authentication
2019-09-22 20:28:34.888989 7f5272f01700 0 librados: client.admin initialization error (2) No such file or directory
Error connecting to cluster: ObjectNotFound
解决
sudo ln -s /home/cephd/ceph-cluster/ceph.client.admin.keyring /etc/ceph/
5.5 ceph安装时报错RuntimeError: NoSectionError
安装ceph时出错
[ceph_deploy][ERROR ] RuntimeError: NoSectionError: No section: 'ceph'
解决办法:
yum remove ceph-release
把这个东西卸了,应该是这个的版本不兼容 亲测有效。
第6章 操作集群
6.1 ceph相关服务
ll /usr/lib/systemd/system/|grep cep
-rw-r–r-- 1 root root 317 7月 10 2018 ceph-create-keys@.service
-rw-r–r-- 1 root root 327 7月 10 2018 ceph-disk@.service
-rw-r–r-- 1 root root 617 7月 10 2018 ceph-mds@.service
-rw-r–r-- 1 root root 181 7月 10 2018 ceph-mds.target
-rw-r–r-- 1 root root 858 7月 10 2018 ceph-mon@.service
-rw-r–r-- 1 root root 181 7月 10 2018 ceph-mon.target
-rw-r–r-- 1 root root 706 7月 10 2018 ceph-osd@.service
-rw-r–r-- 1 root root 181 7月 10 2018 ceph-osd.target
-rw-r–r-- 1 root root 128 7月 10 2018 ceph.target
## 6.2 清除集群
如果在某些地方碰到麻烦,想从头再来,可以用下列命令清除配置:
ceph-deploy purgedata {ceph-node} [{ceph-node}]
ceph-deploy forgetkeys
用下列命令可以连 Ceph 安装包一起清除:
ceph-deploy purge {ceph-node} [{ceph-node}]
如果执行了 purge ,你必须重新安装 Ceph 。
## 6.3 添加osd
这里把目录而非整个硬盘用于 OSD 守护进程
登录到 Ceph 节点、并给 OSD 守护进程创建一个目录。
#在ceph01节点执行
mkdir /var/local/osd1 -p
准备 OSD
ceph-deploy osd prepare ceph01:/var/local/osd1
chown -R ceph.ceph /var/local/osd1/ #不授权会报错
激活OSD
ceph-deploy osd activate ceph01:/var/local/osd1
一旦你新加了 OSD , Ceph 集群就开始重均衡,把归置组迁移到新 OSD 。可以用下面的 ceph 命令观察此过程:
ceph -w
## 6.4 添加元数据服务器
至少需要一个元数据服务器才能使用 CephFS ,执行下列命令创建元数据服务器:
#在ceph01节点执行,这里选择在ceph01添加。
ceph-deploy mds create ceph01
当前生产环境下的 Ceph 只能运行一个元数据服务器。你可以配置多个,但现在我们还不会为多个元数据服务器的集群提供商业支持。
## 6.5 添加 MONITORS
Ceph 存储集群需要至少一个 Monitor 才能运行。为达到高可用,典型的 Ceph 存储集群会运行多个 Monitors,这样在单个 Monitor 失败时不会影响 Ceph 存储集群的可用性。Ceph 使用 PASOX 算法,此算法要求有多半 monitors(即 1 、 2:3 、 3:4 、 3:5 、 4:6 等 )形成法定人数。
新增两个监视器到 Ceph 集群。
ceph-deploy mon add ceph02
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200929101318337.png#pic_center)
public network是公共网络,是osd之间通信的网络,该项建议设置,如果不设置,后面可能执行命令的时候有警告信息,该参数其实就是你的mon节点IP最后一项改为0,然后加上/24。
解决:
vim /home/cephd/ceph-cluster/ceph.conf
public network = 192.168.56.0/24
ceph-deploy --overwrite-conf config push ceph02
不推送直接执行ceph-deploy mon add ceph02会报错如下
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200929101329627.png#pic_center)
推送过去的配置存在节点的/etc/ceph/ceph.conf目录下
## 6.6 推送配置
在有ceph-deploy改完配置后推送到各个节点
ceph-deploy --overwrite-conf config push {node主机名}
## 6.7 添加 RGW 例程
要使用 Ceph 的 Ceph 对象网关组件,必须部署 RGW 例程。用下列方法创建新 RGW 例程:
yum -y install ceph-radosgw
ceph-deploy rgw create ceph01
注意:这个功能是从 Hammer 版和 ceph-deploy v1.5.23 才开始有的。
RGW 例程默认会监听 7480 端口,可以更改该节点 ceph.conf 内与 RGW 相关的配置,如下:
[client]
rgw frontends = civetweb port=80
用的是 IPv6 地址的话:
[client]
rgw frontends = civetweb port=[::]:80
推送配置
ceph-deploy --overwrite-conf config push ceph01
## 6.8 ceph osd 删除
一般情况下,osd 是不需要进行删除操作的,但是凡事无绝对;很多时候还是需要进行删除操作(例如,对已经部署好的存储集群重新进行方案的调整,就需要对osd进行删除操作,重新进行调整)
#查看需要删除的osd的id
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200929101433472.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MDU0ODE4Mg==,size_16,color_FFFFFF,t_70#pic_center)
#将osd out
#reweight 会被置为 0,集群会进行数据迁移,相当于进行 "ceph osd reweight <osdname (id|osd.id)> <float[0.0-1.0]>" 操作,当 "reweight" 为 0 时,该 osd节点 不纳入 "in" 计数。
ceph osd out {osd_id}
#关闭 osd节点的守护进程,在关闭守护进程之前,需要等待 out 之后的数据迁移结束,该节点的守护进程不纳入 "up" 计数。
systemctl stop ceph-osd@{osd_id}.service
#remove osd,weight 变为 0,则会更改 crush 算法的权重
ceph osd crush remove osd.{osd_id}
#aut del osd,删除 osd 节点相关的权限信息
ceph auth del osd.{osd_id}
#rm osd,删除 osd 节点 id号
ceph osd rm {osd_id}
## 第7章 ceph命令详解
## 7.1 集群管理
ceph –s 检查集群状况
ceph health 集群健康状态检查
## 7.2 存储管理
ceph df 查看存储使用情况
ceph osd pool ls 查看存储池
ceph osd pool create volumes 128 创建存储池
ceph osd pool delete 存储池名字 --yes-i-really-really-mean-it 删除存储池,删除存储池需要先改配置文件,改完后重启mon服务
cat /etc/ceph/ceph.conf
[mon] #添加配置
mon_allow_pool_delete = true
systemctl restart ceph-mon@serverce 重启monitor服务
systemctl restart ceph-mon.target 重启monitor服务
说明:centos7系统,系统的启动文件放在/usr/lib/systemd/system/目录下,如果不确定进程的名字,可以ll /usr/lib/systemd/system/|grep ceph查看
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200929101612322.png#pic_center)
## 7.3 Ceph用户管理
Ceph授权
Ceph把数据以对象的形式存于个存储池中,Ceph用户必须具有访问存储池的权限能够读写数据
Ceph用caps来描述给用户的授权,这样才能使用Mon,OSD和MDS的功能
caps也用于限制对某一存储池内的数据或某个命名空间的访问
Ceph管理用户可在创建或更新普通用户是赋予其相应的caps
Ceph常用权限说明:
r:赋予用户读数据的权限,如果我们需要访问集群的任何信息,都需要先具有monitor的读权限
w:赋予用户写数据的权限,如果需要在osd上存储或修改数据就需要为OSD授予写权限
x:赋予用户调用对象方法的权限,包括读和写,以及在monitor上执行用户身份验证的权限
class-read:x的子集,允许用户调用类的read方法,通常用于rbd类型的池
class-write:x的子集,允许用户调用类的write方法,通常用于rbd类型的池
*:将一个指定存储池的完整权限(r、w和x)以及执行管理命令的权限授予用户
profile osd:授权一个用户以OSD身份连接其它OSD或者Monitor,用于OSD心跳和状态报告
profile mds:授权一个用户以MDS身份连接其他MDS或者Monitor
profile bootstrap-osd:允许用户引导OSD。比如ceph-deploy和ceph-disk工具都使用client.bootstrap-osd用户,该用户有权给OSD添加密钥和启动加载程序
profile bootstrap-mds:允许用户引导MDS。比如ceph-deploy工具使用了client.bootstrap-mds用户,该用户有权给MDS添加密钥和启动加载程序
创建用户
ceph auth add client.ning mon ‘allow r’ osd ‘allow rw pool=testpool’ #当用户不存在,则创建用户并授权;当用户存在,当权限不变,则不进行任何输出;当用户存在,不支持修改权限
参数说明:
client.ning 用户名字
mon ‘allow r’ 容许读mon
osd ‘allow rw pool=testpool’ 容许读写osd的testpool存储池
ceph auth get-or-create client.joy mon ‘allow r’ osd ‘allow rw pool=mytestpool’ #当用户不存在,则创建用户并授权并返回用户和key,当用户存在,权限不变,返回用户和key,当用户存在,权限修改,则返回报错
删除用户
ceph auth del client.xxx #删除xxx用户
导出用户
ceph auth get-or-create client.ning -o ./ceph.client.ning.keyring
导入用户
ceph auth export client.ning -o /etc/ceph/ceph.client.ning-1.keyring
查看用户权限
ceph auth get client.joy
添加用户权限
ceph auth caps client.joy mon ‘allow r’ osd ‘allow rw pool=mytestpool,allow rw pool=testpool’ #对用户joy添加对testpool这个池的权限
推送用户
创建的用户主要用于客户端授权,所以需要将创建的用户推送至客户端。如果需要向同一个客户端推送多个用户,可以将多个用户的信息写入同一个文件,然后直接推送该文件
ceph-authtool -C /etc/ceph/ceph.keyring #创建一个秘钥文件
creating /etc/ceph/ceph.keyring
ceph-authtool ceph.keyring --import-keyring ceph.client.ning.keyring #把用户client.ning添加进秘钥文件
importing contents of ceph.client.ning.keyring into ceph.keyring
cat ceph.keyring #查看
[client.ning]
key = AQAcBY5coY/rLxAAvq99xcSOrwLI1ip0WAw2Sw==
ceph-authtool ceph.keyring --import-keyring ceph.client.joy.keyring #把用户client.ning添加进秘钥文件
importing contents of ceph.client.joy.keyring into ceph.keyring
cat ceph.keyring #查看有两个用户,可以把这文件推送给客户端,就可以使用这两个用户的权限
[client.joy]
key = AQBiBY5cJ2gBLBAA/ZCGDdp6JWkPuuU0YaLsrw==
[client.ning]
key = AQAcBY5coY/rLxAAvq99xcSOrwLI1ip0WAw2Sw==
用户被删除,恢复用户
cat ceph.client.ning.keyring #秘钥环没有权限信息
[client.ning]
key = AQAcBY5coY/rLxAAvq99xcSOrwLI1ip0WAw2Sw==
ceph auth del client.ning #删除这个用户
updated
ll /etc/ceph/ceph.client.ning.keyring #在客户端,秘钥环依然存在
-rw-r–r-- 1 root root 62 Mar 17 16:40 /etc/ceph/ceph.client.ning.keyring
ceph -s --name client.ning #秘钥环的用户被删除,无效
2019-03-17 17:49:13.896609 7f841eb27700 0 librados: client.ning authentication error (1) Operation not permitted
[errno 1] error connecting to the cluster
ceph auth import -i ./ceph.client.ning-1.keyring #使用ning-1.keyring恢复
imported keyring
ceph auth list |grep ning #用户恢复
installed auth entries:
client.ning
ceph osd pool ls --name client.ning #客户端验证,秘钥生效
testpool
EC-pool
本文地址:https://blog.csdn.net/weixin_40548182/article/details/108862031