很多场景下,我们的ceph是不打算跑在容器内,而是单独找服务器做成ceph集群,往往只是跑ceph集群不运行其它应用。 本次就以ceph-deploy工具作为介绍,使用ceph-deploy快速构建ceph集群并创建块存储、文件系统、以及对象存储。
文章目录
一、Ceph原理
Ceph基础知识和基础架构
新闻联播老司机
二、环境准备
文档没有标注哪台节点执行,默认情况下就是所有节点执行的命令!
集群信息
192.168.31.20 | ceph01、NTP Server |
192.168.31.21 | ceph02 |
192.168.31.22 | ceph03 |
主机名需要和host设置相同,必须设置否则无法初始化,后续也有问题!
首先我们需要添加NTP服务器
#NTP SERVER (ntp server 与阿里与ntp时间服务器进行同步) #首先我们配置ntp server,我这里在ceph01上面配置 yum install -y ntp [root@ceph-01 ~]# systemctl start ntpd [root@ceph-01 ~]# systemctl enable ntpd [root@ceph-01 ~]# timedatectl set-timezone Asia/Shanghai #将当前的 UTC 时间写入硬件时钟 [root@ceph-01 ~]# timedatectl set-local-rtc 0 #重启依赖于系统时间的服务 [root@ceph-01 ~]# systemctl restart rsyslog [root@ceph-01 ~]# systemctl restart crond #这样我们的ntp server自动连接到外网,进行同步 (时间同步完成在IP前面会有一个*号) [root@ceph-01 ~]# ntpq -pn remote refid st t when poll reach delay offset jitter ============================================================================== 120.25.115.20 10.137.53.7 2 u 8 64 17 40.203 -24.837 0.253 *203.107.6.88 100.107.25.114 2 u 8 64 17 14.998 -22.611 0.186 #NTP Agent (ntp agent同步ntp server时间) ntp agent需要修改ntp server的地址 [root@ceph-02 ~]# vim /etc/ntp.conf server 192.168.31.20 iburst #server 0.centos.pool.ntp.org iburst #server 1.centos.pool.ntp.org iburst #server 2.centos.pool.ntp.org iburst #server 3.centos.pool.ntp.org iburst #注释默认的server,添加一条我们ntp server的地址 [root@ceph-02 ~]# systemctl restart ntpd [root@ceph-02 ~]# systemctl enable ntpd #等待几分钟出现*号代表同步完成 [root@ceph-02 ~]# ntpq -pn remote refid st t when poll reach delay offset jitter ============================================================================== *192.168.31.20 120.25.115.20 3 u 13 64 1 0.125 -19.095 0.095 #ceph-03节点操作相同
在ntp_agent节点添加定时同步任务
$ crontab -e */5 * * * * /usr/sbin/ntpdate 192.168.31.20
ntp时间服务器设置完成后在所有节点修改时区以及写入硬件
timedatectl set-timezone Asia/Shanghai #将当前的 UTC 时间写入硬件时钟 timedatectl set-local-rtc 0 #重启依赖于系统时间的服务 systemctl restart rsyslog systemctl restart crond
校对时间
[root@ceph-01 ~]# date Tue Sep 8 17:35:43 CST 2020 [root@ceph-02 ~]# date Tue Sep 8 17:35:46 CST 2020 [root@ceph-03 ~]# date Tue Sep 8 17:35:47 CST 2020
如果时间不同步,osd创建完成后会有error提示
添加host (所有节点)
cat >>/etc/hosts <<EOF 192.168.31.20 ceph-01 192.168.31.21 ceph-02 192.168.31.22 ceph-03 EOF
ceph01 设置免密
ssh-keygen -t rsa -P "" -f /root/.ssh/id_rsa for i in ceph-01 ceph-02 ceph-03 ;do expect -c " spawn ssh-copy-id -i /root/.ssh/id_rsa.pub root@$i expect { "*yes/no*" {send "yesr"; exp_continue} "*password*" {send "123456r"; exp_continue} "*Password*" {send "123456r";} } " done #123456为密码
所有节点关闭防火墙selinux
systemctl stop firewalld systemctl disable firewalld iptables -F && iptables -X && iptables -F -t nat && iptables -X -t nat iptables -P FORWARD ACCEPT setenforce 0 sed -i 's/^SELINUX=.*/SELINUX=disabled/' /etc/selinux/config
ceph yum源配置
#配置centos、epeo、ceph源 curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo wget -O /etc/yum.repos.d/ceph.repo http://down.i4t.com/ceph/ceph.repo yum clean all yum makecache
所有工作完成后建议所有节点重启一下服务器
reboot
ceph-01部署节点安装依赖包以及ceph部署工具ceph-deploy
[root@ceph-01 ~]# yum install -y python-setuptools [root@ceph-01 ~]# yum install -y ceph-deploy
执行ceph-deploy可以看到ceph的版本
[root@ceph-01 ~]# ceph-deploy usage: ceph-deploy [-h] [-v | -q] [--version] [--username USERNAME] [--overwrite-conf] [--ceph-conf CEPH_CONF] COMMAND ... Easy Ceph deployment -^- / |O o| ceph-deploy v2.0.1 ).-.( '/|||` | '|` | '|`
三、ceph部署
下面先运行单节点的monitor
3.1 部署monitor
接下来为ceph创建一个配置目录,后面操作需要在这个目录下进行
mkdir /root/ceph-deploy cd /root/ceph-deploy
创建monitor
[root@ceph-01 ceph-deploy]# ceph-deploy new ceph-01 --public-network 192.168.31.0/24 #ceph-01代表部署monitor节点 #参数设置 --cluster-network 集群对外的网络 --public-network 集群内通信的网络 #--public-network建议添加,否则后面添加monitor节点会提示错误
执行完毕后我们可以看到在/root/ceph-deploy目录会有为我们生成的一些文件
[root@ceph-01 ceph-deploy]# ls /root/ceph-deploy ceph.conf ceph-deploy-ceph.log ceph.mon.keyring ceph配置文件 ceph日志文件 keyring主要做身份验证 #我们可以根据自身需要修改ceph.conf文件,比如上面创建集群中添加的网络,在这里也可以添加
添加ceph时间配置
#添加允许ceph时间偏移 echo "mon clock drift allowed = 2" >>/root/ceph-deploy/ceph.conf echo "mon clock drift warn backoff = 30" >>/root/ceph-deploy/ceph.conf
在所有节点安装ceph相关软件包
yum install -y ceph ceph-mon ceph-mgr ceph-radosgw ceph-mds #当然如果你不在乎网络问题,也可以使用官方推荐的安装方式,下面的方式会重新给我们配置yum源,这里不太推荐 ceph-deploy install ceph-01 ceph-02 ceph-03
接下来我们需要初始化monitor
[root@ceph-01 ~]# cd /root/ceph-deploy [root@ceph-01 ceph-deploy]# ceph-deploy mon create-initial #需要进入到我们之前创建的ceph目录中
接下来我们在/root/ceph-deploy下面可以看到刚刚生成的一些文件
[root@ceph-01 ceph-deploy]# ll total 44 -rw-------. 1 root root 113 Sep 9 11:51 ceph.bootstrap-mds.keyring -rw-------. 1 root root 113 Sep 9 11:51 ceph.bootstrap-mgr.keyring -rw-------. 1 root root 113 Sep 9 11:51 ceph.bootstrap-osd.keyring -rw-------. 1 root root 113 Sep 9 11:51 ceph.bootstrap-rgw.keyring -rw-------. 1 root root 151 Sep 9 11:51 ceph.client.admin.keyring -rw-r--r--. 1 root root 196 Sep 9 02:23 ceph.conf -rw-r--r--. 1 root root 15628 Sep 9 11:51 ceph-deploy-ceph.log -rw-------. 1 root root 73 Sep 9 02:23 ceph.mon.keyring #ceph.bootstrap-*为我们初始化的秘钥文件,包括osd、mds、mgr
将我们刚刚生成的文件拷贝到所有的节点上 (拷贝完成后就可以使用ceph -s参数)
[root@ceph-01 ceph-deploy]# ceph-deploy admin ceph-01 ceph-02 ceph-03 #把配置文件和admin密钥分发到各个节点
禁用不安全模式
ceph config set mon auth_allow_insecure_global_id_reclaim false
接下来我们执行ceph -s就可以看到已经初始化完毕
[root@ceph-01 ceph-deploy]# ceph -s cluster: id: f0060344-e237-426f-87f3-9e1fac373fcb health: HEALTH_OK services: mon: 1 daemons, quorum ceph-01 (age 6m) #这里是包含一个monitor mgr: no daemons active #我们还没有创建mgr osd: 0 osds: 0 up, 0 in #当然osd也没有的 data: #资源池我们还没有添加 pools: 0 pools, 0 pgs objects: 0 objects, 0 B usage: 0 B used, 0 B / 0 B avail pgs: #我们可以看到cluster.health后面的状态为OK
创建 manager daemon (主要用于监控)
#这里我们只是将ceph-01作为manager daemon节点 [root@ceph-01 ceph-deploy]# ceph-deploy mgr create ceph-01
接下来我们在执行ceph -s就会看到有一个刚添加的好的mgr节点
[root@ceph-01 ceph-deploy]# ceph -s cluster: id: f0060344-e237-426f-87f3-9e1fac373fcb health: HEALTH_WARN OSD count 0 < osd_pool_default_size 3 services: mon: 1 daemons, quorum ceph-01 (age 10m) mgr: ceph-01(active, since 32s) <<添加完毕后,mgr在ceph-01节点上,节点状态为active 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:
3.2 部署OSD
OSD负责相应客户端请求返回具体数据的进程,一个Ceph集群一般都有很多个OSD
OSD实际上就是存储我们数据的地方,所以我们的服务器需要添加一块硬盘作为数据存储,我这里3台节点都添加50G的数据,一共150G作为演示。这里我使用ESXI进行演示,与VMware操作相同。如果是物理服务器添加硬盘即可
点击编辑
添加一个50G的数据
添加完毕后我们开机
接下来我们在每台节点查看磁盘信息
因为我这里一共就只有2个硬盘,所以命名全部都是sdb (具体命名请根据实际的情况选择)
#ceph-01 [root@ceph-01 ceph-deploy]# lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sda 8:0 0 50G 0 disk ├─sda1 8:1 0 2M 0 part ├─sda2 8:2 0 200M 0 part /boot └─sda3 8:3 0 49.8G 0 part / sdb 8:16 0 50G 0 disk #sdb就是我们添加了一个50G的硬盘 sr0 11:0 1 1024M 0 rom #ceph-02 [root@ceph-02 ~]# lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sda 8:0 0 50G 0 disk ├─sda1 8:1 0 2M 0 part ├─sda2 8:2 0 200M 0 part /boot └─sda3 8:3 0 49.8G 0 part / sdb 8:16 0 50G 0 disk sr0 11:0 1 1024M 0 rom #ceph-03 [root@ceph-03 yum.repos.d]# lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sda 8:0 0 50G 0 disk ├─sda1 8:1 0 2M 0 part ├─sda2 8:2 0 200M 0 part /boot └─sda3 8:3 0 49.8G 0 part / sdb 8:16 0 50G 0 disk sr0 11:0 1 1024M 0 rom
接下来我们来创建osd
#这里添加三台osd集群 [root@ceph-01 ceph-deploy]# cd /root/ceph-deploy/ [root@ceph-01 ceph-deploy]# ceph-deploy osd create ceph-01 --data /dev/sdb [root@ceph-01 ceph-deploy]# ceph-deploy osd create ceph-02 --data /dev/sdb [root@ceph-01 ceph-deploy]# ceph-deploy osd create ceph-03 --data /dev/sdb
接下来我们在查看ceph osd就可以看到有3台osd节点
[root@ceph-01 ceph-deploy]# ceph -s cluster: id: c8ae7537-8693-40df-8943-733f82049642 health: HEALTH_OK services: mon: 1 daemons, quorum ceph-01 (age 5m) mgr: ceph-01(active, since 3m) osd: 3 osds: 3 up (since 82s), 3 in (since 82s) data: pools: 0 pools, 0 pgs objects: 0 objects, 0 B usage: 3.0 GiB used, 147 GiB / 150 GiB avail pgs:
温馨提示: 只有health状态为OK,证明集群同步正常
同样查看ceph osd的状态命令也有很多
[root@ceph-01 ceph-deploy]# ceph osd tree ID CLASS WEIGHT TYPE NAME STATUS REWEIGHT PRI-AFF -1 0.14639 root default -3 0.04880 host ceph-01 0 hdd 0.04880 osd.0 up 1.00000 1.00000 -5 0.04880 host ceph-02 1 hdd 0.04880 osd.1 up 1.00000 1.00000 -7 0.04880 host ceph-03 2 hdd 0.04880 osd.2 up 1.00000 1.00000
到这里我们就把ceph完毕3个osd。并且数据总大小为150G
如果期间我们有需要修改cpeh.conf的操作,只需要在ceph-01上修改,使用下面的命令同步到其他节点上
[root@ceph-01 ceph-deploy]# ceph-deploy --overwrite-conf config push ceph-01 ceph-02 ceph-03
四、集群部署
4.1 部署monitor
接下来我们部署一个monitor高可用
扩展monitor
monitor负责保存OSD的元数据,所以monitor当然也需要高可用。 这里的monitor推荐使用奇数节点进行部署,我这里以3台节点部署
当我们添加上3个monitor节点后,monitor会自动进行选举,自动进行高可用添加monitor
[root@ceph-01 ceph-deploy]# cd /root/ceph-deploy [root@ceph-01 ceph-deploy]# ceph-deploy mon add ceph-02 --address 192.168.31.21 [root@ceph-01 ceph-deploy]# ceph-deploy mon add ceph-03 --address 192.168.31.22 #没有提示红色的error,证明monitor添加成功
这个时候我们可以看到monitor节点已经添加成功
[root@ceph-01 ceph-deploy]# ceph -s cluster: id: c8ae7537-8693-40df-8943-733f82049642 health: HEALTH_OK services: mon: 3 daemons, quorum ceph-01,ceph-02,ceph-03 (age 1.51402s) #已经将monitor节点信息显示出来 mgr: ceph-01(active, since 5m) osd: 3 osds: 3 up (since 3m), 3 in (since 3m) data: pools: 0 pools, 0 pgs objects: 0 objects, 0 B usage: 3.0 GiB used, 147 GiB / 150 GiB avail pgs:
我们还可以使用ceph自带的命令,查看monitor选举情况,以及集群的健康状态
[root@ceph-01 ~]# ceph quorum_status --format json-pretty { "election_epoch": 12, "quorum": [ 0, 1, 2 ], "quorum_names": [ "ceph-01", #集群节点信息 "ceph-02", "ceph-03" ], "quorum_leader_name": "ceph-01", #当前leader节点 "quorum_age": 151, "monmap": { "epoch": 3, #monitor节点数量 "fsid": "f0060344-e237-426f-87f3-9e1fac373fcb", "modified": "2020-09-09 12:18:08.869325", "created": "2020-09-09 11:51:11.201509", "min_mon_release": 14, "min_mon_release_name": "nautilus", "features": { "persistent": [ "kraken", "luminous", "mimic", "osdmap-prune", "nautilus" ], "optional": [] }, "mons": [ { "rank": 0, "name": "ceph-01", "public_addrs": { "addrvec": [ { "type": "v2", #下面就可以看到我们每一个monitor的节点信息 "addr": "192.168.31.20:3300", "nonce": 0 }, { "type": "v1", "addr": "192.168.31.20:6789", "nonce": 0 } ] }, "addr": "10.4.81.120:6789/0", "public_addr": "192.168.31.20:6789/0" }, { "rank": 1, "name": "ceph-02", "public_addrs": { "addrvec": [ { "type": "v2", "addr": "192.168.31.21:3300", "nonce": 0 }, { "type": "v1", "addr": "192.168.31.21:6789", "nonce": 0 } ] }, "addr": "192.168.31.21:6789/0", "public_addr": "192.168.31.21:6789/0" }, { "rank": 2, "name": "ceph-03", "public_addrs": { "addrvec": [ { "type": "v2", "addr": "192.168.31.22:3300", "nonce": 0 }, { "type": "v1", "addr": "192.168.31.22:6789", "nonce": 0 } ] }, "addr": "192.168.31.22:6789/0", "public_addr": "192.168.31.22:6789/0" } ] } }
同样查看monitor还可以通过下面的命令,直接查看monitor的map
e3: 3 mons at {ceph-01=[v2:192.168.31.20:3300/0,v1:192.168.31.20:6789/0],ceph-02=[v2:192.168.31.21:3300/0,v1:192.168.31.21:6789/0],ceph-03=[v2:192.168.31.80:3300/0,v1:192.168.31.80:6789/0]}, election epoch 12, leader 0 ceph-01, quorum 0,1,2 ceph-01,ceph-02,ceph-03
还可以使用dump参数查看关于monitor更细的信息
[root@ceph-01 ~]# ceph mon dump dumped monmap epoch 3 epoch 3 fsid f0060344-e237-426f-87f3-9e1fac373fcb last_changed 2020-09-09 12:18:08.869325 created 2020-09-09 11:51:11.201509 min_mon_release 14 (nautilus) 0: [v2:10.4.81.120:3300/0,v1:10.4.81.120:6789/0] mon.ceph-01 1: [v2:10.4.81.121:3300/0,v1:10.4.81.121:6789/0] mon.ceph-02 2: [v2:10.4.81.122:3300/0,v1:10.4.81.122:6789/0] mon.ceph-03 #更多关于monitor的信息可以使用ceph mon -h查看到
4.3 部署manager daemon
扩展manager daemonCeph-MGR目前的主要功能是把集群的一些指标暴露给外界使用
mgr集群只有一个节点为active状态,其它的节点都为standby。只有当主节点出现故障后,standby节点才会去接管,并且状态变更为active
这里扩展mgr的方法与monitor方法类似
[root@ceph-01 ~]# cd /root/ceph-deploy [root@ceph-01 ceph-deploy]# ceph-deploy mgr create ceph-02 ceph-03 #create 后面为ceph节点的名称
我们查看一下ceph状态
[root@ceph-01 ceph-deploy]# ceph -s cluster: id: c8ae7537-8693-40df-8943-733f82049642 health: HEALTH_OK services: mon: 3 daemons, quorum ceph-01,ceph-02,ceph-03 (age 2m) mgr: ceph-01(active, since 7m), standbys: ceph-02, ceph-03 osd: 3 osds: 3 up (since 5m), 3 in (since 5m) data: pools: 0 pools, 0 pgs objects: 0 objects, 0 B usage: 3.0 GiB used, 147 GiB / 150 GiB avail pgs: #这里已经看到mgr已经添加上去,只有ceph-01节点为active,其余节点均为standbys
四、RBD 块存储
块存储是存储区域网络中使用的一个数据存储类型。在这种类型中,数据以块的形式存储在卷里,卷会挂载到节点上。可以为应用程序提供更大的存储容量,并且可靠性和性能都更高。
RBD协议,也就是Ceph块设备 (Ceph Block Device)。RBD除了可靠性和性能之外,还支持完整和增量式快照,精简的配置,写时复制(copy-on-write)式克隆。并且支持全内存式缓存。
目前CEPH RBD支持的最大镜像为16EB,镜像可以直接作为磁盘映射到物理裸机,虚拟机或者其他主机使用,KVM和Xen完全支持RBD,VMware等云厂商也支持RBD模式
RBD数据写入流程
创建资源池Pool
[root@ceph-01 ~]# ceph osd pool create abcdocker 64 64 pool 'abcdocker' created #abcdocker为pool名称 #pg为64个 (pg和pgp数量需要一致) #pgp为64个 #我们不需要指定副本,默认就为三个副本
我们可以查看到pool
[root@ceph-01 ~]# ceph osd lspools 1 abcdocker
可以通过下面的命令获取到pool详细状态
#下面是可以查看的参数,不比如我们就看一下刚刚创建的pg数量还有pgp的数量 [root@ceph-01 ~]# ceph osd pool get abcdocker Invalid command: missing required parameter var(size|min_size|pg_num|pgp_num|crush_rule|hashpspool|nodelete|nopgchange|nosizechange|write_fadvise_dontneed|noscrub|nodeep-scrub|hit_set_type|hit_set_period|hit_set_count|hit_set_fpp|use_gmt_hitset|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|fingerprint_algorithm|pg_autoscale_mode|pg_autoscale_bias|pg_num_min|target_size_bytes|target_size_ratio) [root@ceph-01 ~]# ceph osd pool get abcdocker pg_num pg_num: 64 [root@ceph-01 ~]# ceph osd pool get abcdocker pgp_num pgp_num: 64
还可以查看一下副本数量
默认情况下pool会为我们找到3个osd副本,保证高可用
[root@ceph-01 ~]# ceph osd pool get abcdocker size size: 3
当然这些默认的参数也是可以修改的,比如我们修改一下osd副本数量
[root@ceph-01 ~]# ceph osd pool set abcdocker size 2 set pool 1 size to 2 [root@ceph-01 ~]# ceph osd pool get abcdocker size size: 2
RBD创建和映射
在创建镜像前我们还需要修改一下features值
在Centos7内核上,rbd很多特性都不兼容,目前3.0内核仅支持layering。所以我们需要删除其他特性
关闭不支持的特性一种是通过命令的方式修改,还有一种是在ceph.conf中添加rbd_default_features = 1来设置默认 features(数值仅是 layering 对应的 bit 码所对应的整数值)。
features编码如下
例如需要开启layering和striping,rbd_default_features = 3 (1+2)
属性 BIT码 layering 1 striping 2 exclusive-lock 4 object-map 8 fast-diff 16 deep-flatten 32
动态关闭
[root@ceph-01 ~]# cd /root/ceph-deploy [root@ceph-01 ceph-deploy]# echo "rbd_default_features = 1" >>ceph.conf [root@ceph-01 ceph-deploy]# ceph-deploy --overwrite-conf config push ceph-01 ceph-02 ceph-03 #当然也在rbd创建后手动删除,这种方式设置是临时性,一旦image删除或者创建新的image 时,还会恢复默认值。 rbd feature disable abcdocker/abcdocker-rbd.img deep-flatten rbd feature disable abcdocker/abcdocker-rbd.img fast-diff rbd feature disable abcdocker/abcdocker-rbd.img object-map rbd feature disable abcdocker/abcdocker-rbd.img exclusive-lock #需要按照从后往前的顺序,一条条删除
RBD创建就是通过rbd命令来进行创建,例子如下
#这里我们使用ceph-01进行演示,创建rbd需要使用key,可以使用-k参数进行指定,我这里已经默认使用了admin的key,所以不需要指定 [root@ceph-01 ~]# rbd create -p abcdocker --image abcdocker-rbd.img --size 15G #-p pool名称 #--image 镜像名称(相当于块设备在ceph名称) #--size 镜像大小 (块大小) #创建rbd设备还可以通过下面的方式简写 [root@ceph-01 ~]# rbd create abcdocker/abcdocker-rbd-1.img --size 15G #省略-p和--image参数
查看rbd
[root@ceph-01 ~]# rbd -p abcdocker ls abcdocker-rbd-1.img abcdocker-rbd.img
删除rbd
[root@ceph-01 ~]# rbd rm abcdocker/abcdocker-rbd-1.img Removing image: 100% complete...done. #同样,删除rbd也可以简写,或者加入-p和--image
我们可以通过info查看rbd信息
#第一种查看方式 [root@ceph-01 ~]# rbd info -p abcdocker --image abcdocker-rbd.img rbd image 'abcdocker-rbd.img': size 15 GiB in 3840 objects #可以看到空间大小,和有多少个object order 22 (4 MiB objects) #每个object大小 snapshot_count: 0 id: 1e687dd7cfb9 block_name_prefix: rbd_data.1e687dd7cfb9 #id号 format: 2 features: layering, exclusive-lock, object-map, fast-diff, deep-flatten #如果前面我们设置features 为1,这里只可以看到一个layering op_features: flags: create_timestamp: Thu Sep 10 16:19:44 2020 access_timestamp: Thu Sep 10 16:19:44 2020 modify_timestamp: Thu Sep 10 16:19:44 2020 #第二种查看方式 [root@ceph-01 ~]# rbd info abcdocker/abcdocker-rbd.img rbd image 'abcdocker-rbd.img': size 15 GiB in 3840 objects order 22 (4 MiB objects) snapshot_count: 0 id: 1e687dd7cfb9 block_name_prefix: rbd_data.1e687dd7cfb9 format: 2 features: layering op_features: flags: create_timestamp: Thu Sep 10 16:19:44 2020 access_timestamp: Thu Sep 10 16:19:44 2020 modify_timestamp: Thu Sep 10 16:19:44 2020
块文件挂载接下来我们要进行rbd的挂载 (这里不建议分区,如果分区,后续扩容比较麻烦,容易存在丢数据的情况。在分区不够的情况下建议多块rbd)
[root@ceph-01 ceph-deploy]# rbd map abcdocker/abcdocker-rbd.img /dev/rbd0 #abcdocker 为pool名称,当然可以通过-p #abcdocker-rbd.img 为rbd文件名称
上面已经生成了块设备,我们还可以通过下面的命令进行查看
[root@ceph-01 ceph-deploy]# rbd device list id pool namespace image snap device 0 abcdocker abcdocker-rbd.img - /dev/rbd0 #可以看到pool名称,img名称,以及设备信息
同样我们可以通过fdisk命令看到,现在块设备就相当于我们在服务器上插入了一块硬盘,挂载即可使用
在下面我们可以看到一个磁盘/dev/rbd0 大小16G的硬盘
[root@ceph-01 ceph-deploy]# fdisk -l 磁盘 /dev/sda:53.7 GB, 53687091200 字节,104857600 个扇区 Units = 扇区 of 1 * 512 = 512 bytes 扇区大小(逻辑/物理):512 字节 / 512 字节 I/O 大小(最小/最佳):512 字节 / 512 字节 磁盘标签类型:dos 磁盘标识符:0x0009e898 设备 Boot Start End Blocks Id System /dev/sda1 2048 6143 2048 83 Linux /dev/sda2 * 6144 415743 204800 83 Linux /dev/sda3 415744 104857599 52220928 83 Linux 磁盘 /dev/sdb:53.7 GB, 53687091200 字节,104857600 个扇区 Units = 扇区 of 1 * 512 = 512 bytes 扇区大小(逻辑/物理):512 字节 / 512 字节 I/O 大小(最小/最佳):512 字节 / 512 字节 磁盘 /dev/mapper/ceph--1fde1a1c--f1e7--4ce7--927a--06b7599e5cb5-osd--block--76ee00a5--6fa5--4865--ac39--aa12d5dc3623:53.7 GB, 53682896896 字节,104849408 个扇区 Units = 扇区 of 1 * 512 = 512 bytes 扇区大小(逻辑/物理):512 字节 / 512 字节 I/O 大小(最小/最佳):512 字节 / 512 字节 磁盘 /dev/rbd0:16.1 GB, 16106127360 字节,31457280 个扇区 Units = 扇区 of 1 * 512 = 512 bytes 扇区大小(逻辑/物理):512 字节 / 512 字节 I/O 大小(最小/最佳):4194304 字节 / 4194304 字节
这里不建议进行分区
接下来进行格式化操作
[root@ceph-01 ceph-deploy]# mkfs.ext4 /dev/rbd0 mke2fs 1.42.9 (28-Dec-2013) Discarding device blocks: 完成 文件系统标签= OS type: Linux 块大小=4096 (log=2) 分块大小=4096 (log=2) Stride=1024 blocks, Stripe width=1024 blocks 983040 inodes, 3932160 blocks 196608 blocks (5.00%) reserved for the super user 第一个数据块=0 Maximum filesystem blocks=2151677952 120 block groups 32768 blocks per group, 32768 fragments per group 8192 inodes per group Superblock backups stored on blocks: 32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208 Allocating group tables: 完成 正在写入inode表: 完成 Creating journal (32768 blocks): 完成 Writing superblocks and filesystem accounting information: 完成
现在就可以进行挂载使用了
[root@ceph-01 ceph-deploy]# mkdir /mnt/abcdocker [root@ceph-01 ceph-deploy]# mount /dev/rbd0 /mnt/abcdocker/ [root@ceph-01 ceph-deploy]# df -h 文件系统 容量 已用 可用 已用% 挂载点 devtmpfs 909M 0 909M 0% /dev tmpfs 920M 0 920M 0% /dev/shm tmpfs 920M 8.9M 911M 1% /run tmpfs 920M 0 920M 0% /sys/fs/cgroup /dev/sda3 50G 2.4G 48G 5% / /dev/sda2 197M 147M 51M 75% /boot tmpfs 920M 24K 920M 1% /var/lib/ceph/osd/ceph-0 tmpfs 184M 0 184M 0% /run/user/0 /dev/rbd0 15G 41M 14G 1% /mnt/abcdocker [root@ceph-01 ceph-deploy]# [root@ceph-01 ceph-deploy]# cd /mnt/abcdocker/ [root@ceph-01 abcdocker]# ls lost+found [root@ceph-01 abcdocker]# touch abcdocker [root@ceph-01 abcdocker]# echo "123" >abcdocker [root@ceph-01 abcdocker]# cat abcdocker 123
RBD扩容
目前我们的rbd大小为15个G,这里我们演示将它扩展到30G。在不丢数据的情况下
[root@ceph-01 ~]# rbd -p abcdocker ls abcdocker-rbd.img [root@ceph-01 ~]# rbd info abcdocker/abcdocker-rbd.img rbd image 'abcdocker-rbd.img': size 15 GiB in 3840 objects order 22 (4 MiB objects) snapshot_count: 0 id: 1e789f433420d block_name_prefix: rbd_data.1e789f433420d format: 2 features: layering op_features: flags: create_timestamp: Thu Sep 10 16:57:59 2020 access_timestamp: Thu Sep 10 16:57:59 2020 modify_timestamp: Thu Sep 10 16:57:59 2020 [root@ceph-01 ~]# df -h 文件系统 容量 已用 可用 已用% 挂载点 devtmpfs 909M 0 909M 0% /dev tmpfs 920M 0 920M 0% /dev/shm tmpfs 920M 8.9M 911M 1% /run tmpfs 920M 0 920M 0% /sys/fs/cgroup /dev/sda3 50G 2.4G 48G 5% / /dev/sda2 197M 147M 51M 75% /boot tmpfs 920M 24K 920M 1% /var/lib/ceph/osd/ceph-0 /dev/rbd0 15G 41M 14G 1% /mnt/abcdocker
接下来使用resize参数进行扩容
[root@ceph-01 ~]# rbd resize abcdocker/abcdocker-rbd.img --size 30G Resizing image: 100% complete...done. #abcdocker为pool名称 #abcdocker-rbd.img为镜像文件 #--size 为扩容后镜像大小
现在我们可以在查看一下abcdocker-rbd.img镜像大小
#下面我们可以看到我们的size大小已经修改为30G,对应的object也已经成了7680 [root@ceph-01 ~]# rbd info abcdocker/abcdocker-rbd.img rbd image 'abcdocker-rbd.img': size 30 GiB in 7680 objects order 22 (4 MiB objects) snapshot_count: 0 id: 1e789f433420d block_name_prefix: rbd_data.1e789f433420d format: 2 features: layering op_features: flags: create_timestamp: Thu Sep 10 16:57:59 2020 access_timestamp: Thu Sep 10 16:57:59 2020 modify_timestamp: Thu Sep 10 16:57:59 2020
扩容之后我们的设备是已经扩容上去,但是我们的文件系统并没有扩容上
接下来我们需要使用resize2fs对文件系统进行扩容
关于resize2fs解释:调整ext2ext3ext4文件系统的大小,它可以放大或者缩小没有挂载的文件系统的大小。如果文件系统已经挂载,它可以扩大文件系统的大小,前提是内核支持在线调整大小此命令的适用范围:RedHat、RHEL、Ubuntu、CentOS、SUSE、openSUSE、Fedora。
只需要执行resize2fs加上文件系统的地址即可,扩容完毕我们就可以看到/dev/rbd0大小为28G
[root@ceph-01 ~]# resize2fs /dev/rbd0
我们可以到挂载的目录进行查看,之前创建的数据也还在
[root@ceph-01 ~]# ls /mnt/abcdocker/ abcdocker lost+found [root@ceph-01 ~]# cat /mnt/abcdocker/abcdocker 123
对于扩容一般会涉及三方面的内容: 1.底层存储(rbd resize) 2.磁盘分区的扩容 (例如mbr分区) 3.Linux文件系统的扩容所以这里不建议在rbd块设备进行分区
CEPH警告处理
当我们osd有数据写入时,我们在查看ceph集群。发现ceph集群目前有警告这时候我们就需要处理这些警告
[root@ceph-01 ~]# ceph -s cluster: id: 0d2ca51e-38cd-4d34-b73d-2ae26f7e2ffd health: HEALTH_WARN application not enabled on 1 pool(s) 1 daemons have recently crashed services: mon: 3 daemons, quorum ceph-01,ceph-02,ceph-03 (age 7h) mgr: ceph-01(active, since 2d), standbys: ceph-02, ceph-03 osd: 3 osds: 3 up (since 2d), 3 in (since 2d) rgw: 1 daemon active (ceph-01) task status: data: pools: 5 pools, 192 pgs objects: 348 objects, 382 MiB usage: 4.1 GiB used, 146 GiB / 150 GiB avail pgs: 192 active+clean
当我们创建pool资源池后,必须制定它使用ceph应用的类型 (ceph块设备、ceph对象网关、ceph文件系统)如果我们不指定类型,集群health会提示HEALTH_WARN
#我们可以通过ceph health detail命令查看ceph健康详情的信息 [root@ceph-01 ~]# ceph health detail HEALTH_WARN application not enabled on 1 pool(s); 1 daemons have recently crashed POOL_APP_NOT_ENABLED application not enabled on 1 pool(s) application not enabled on pool 'abcdocker' use 'ceph osd pool application enable <pool-name> <app-name>', where <app-name> is 'cephfs', 'rbd', 'rgw', or freeform for custom applications.
接下来我们将这个pool资源池进行分类,将abcdocker pool标示为rbd类型
[root@ceph-01 ~]# ceph osd pool application enable abcdocker rbd enabled application 'rbd' on pool 'abcdocker'
如果我们在创建pool进行初始化后,就不会提示这个报错rbd pool init <pool-name>
当我们初始化后,rbd会将我们的pool修改为rbd格式。 健康状态自然就不会报错
设置完毕后,我们通过下面的命令可以看到pool目前的类型属于rbd类型
[root@ceph-01 ~]# ceph osd pool application get abcdocker { "rbd": {} }
处理完application告警,我们继续查看ceph健康信息
[root@ceph-01 ~]# ceph health detail HEALTH_WARN 1 daemons have recently crashed RECENT_CRASH 1 daemons have recently crashed mon.ceph-01 crashed on host ceph-01 at 2020-09-11 12:01:02.351322Z
这里我们发现monitor ceph-01节点有告警,大致意思是ceph-01节点有一个crashed守护进程崩溃了。
官方解释如下One or more Ceph daemons has crashed recently, and the crash has not yet been archived (acknowledged) by the administrator. This may indicate a software bug, a hardware problem (e.g., a failing disk), or some other problem.一个或多个Ceph守护进程最近崩溃,管理员尚未存档(确认)崩溃。这可能表示软件错误、硬件问题(例如,磁盘故障)或其他问题。
这个报错并不影响我们,我们可以通过下面的命令看到crashed进程 (只要我们其他组件都是正常的,那么这一条就多半是误报。生产环境中处理这个故障还是要根据实际情况进行处理,不可以盲目的删除告警)
[root@ceph-01 ~]# ceph crash ls-new ID ENTITY NEW 2020-09-11_12:01:02.351322Z_eacf8b0d-f25c-4b2d-9d14-aa9a7fa9c6d4 mon.ceph-01 *
同时还可以使用ceph crash info [ID]查看进程详细信息
那么如何处理这个警告呢第一种方法 (适合处理单个告警)
ceph crash archive <ID>
第二种方法 (将所有的crashed打包归档)
[root@ceph-01 ~]# ceph crash archive-all [root@ceph-01 ~]# ceph crash ls-new
我们再次查看状态就已经恢复
[root@ceph-01 ~]# ceph -s cluster: id: 0d2ca51e-38cd-4d34-b73d-2ae26f7e2ffd health: HEALTH_OK services: mon: 3 daemons, quorum ceph-01,ceph-02,ceph-03 (age 7h) mgr: ceph-01(active, since 2d), standbys: ceph-02, ceph-03 osd: 3 osds: 3 up (since 2d), 3 in (since 2d) rgw: 1 daemon active (ceph-01) task status: data: pools: 5 pools, 192 pgs objects: 348 objects, 382 MiB usage: 4.1 GiB used, 146 GiB / 150 GiB avail pgs: 192 active+clean
五、RGW 对象存储
对象存储是什么?可以理解是一个海量的存储空间,可以通过API在任何时间、任何地点访问对象存储里面的数据。我们常用的阿里云OSS、七牛云存储以及百度网盘、私有网盘等都属于对象存储。
Cpeh是一个分布式对象存储系统,通过它的对象网关(object gateway),也就是RADOS网关(radosgw)提供对象存储接口。RADOS网关利用librgw (RADOS网关库)和librados这些库,允许应用程序跟CEPH对象存储建立连接。Ceph通过RESTful API提供可访问且最稳定的多租户对象存储解决方案之一。
RADOS网关提供RESTful接口让用户的应用程序将数据存储到CEPH集群中。RADOS网关接口满足以下特点;
除了上述的特点,对象存储还有以下特点
对象存储网关架构讲解
5.1 部署RGW存储网关
使用ceph对象存储我们需要安装对象存储网关(RADOSGW)
ceph-radosgw软件包我们之前是已经安装过了,这里可以检查一下
[root@ceph-01 ~]# rpm -qa|grep ceph-radosgw ceph-radosgw-14.2.11-0.el7.x86_64 #如果没有安装可以通过yum install ceph-radosgw安装
部署对象存储网关这里我使用ceph-01当做存储网关来使用
[root@ceph-01 ~]# cd /root/ceph-deploy [root@ceph-01 ceph-deploy]# ceph-deploy rgw create ceph-01
创建完毕后我们可以查看一下,这里rgw只有一个服务器,那就是ceph-01
[root@ceph-01 ceph-deploy]# ceph -s|grep rgw rgw: 1 daemon active (ceph-01)
并且radosgw监听7480端口
[root@ceph-01 ceph-deploy]# netstat -lntup|grep 7480 tcp 0 0 0.0.0.0:7480 0.0.0.0:* LISTEN 21851/radosgw tcp6 0 0 :::7480 :::* LISTEN 21851/radosgw
到这里我们已经安装完毕
接下来我们进行修改一下端口,默认是7480;这里我们将端口修改为80端口
vim /root/ceph-deploy/ceph.conf [client.rgw.ceph-01] rgw_frontends = "civetweb port=80" #client.rgw.[主机名] 这里需要注意修改的主机名 #还需要注意修改的目录 (这里修改的目录是/root/ceph.conf)
修改完毕后,我们将配置分发下去;要让集群的主机都生效
[root@ceph-01 ceph-deploy]# ceph-deploy --overwrite-conf config push ceph-01 ceph-02 ceph-03 #这里其实只需要复制到rgw网关节点就行,但是为了配置统一,我们将配置文件分发到集群的各个节点
push到各个机器后并没有生效,push相当于scp。文件没有生效,所以还需要重启rgw
[root@ceph-01 ceph-deploy]# systemctl restart ceph-radosgw.target
检查配置这里我们可以看到80端口对应的服务是radosgw
[root@ceph-01 ceph-deploy]# netstat -lntup|grep 80 tcp 0 0 10.4.81.120:6806 0.0.0.0:* LISTEN 1335/ceph-osd tcp 0 0 10.4.81.120:6807 0.0.0.0:* LISTEN 1335/ceph-osd tcp 0 0 10.4.81.120:6808 0.0.0.0:* LISTEN 878/ceph-mgr tcp 0 0 10.4.81.120:6809 0.0.0.0:* LISTEN 878/ceph-mgr tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 22673/radosgw tcp 0 0 10.4.81.120:6800 0.0.0.0:* LISTEN 1335/ceph-osd tcp 0 0 10.4.81.120:6801 0.0.0.0:* LISTEN 1335/ceph-osd tcp 0 0 10.4.81.120:6802 0.0.0.0:* LISTEN 1335/ceph-osd tcp 0 0 10.4.81.120:6803 0.0.0.0:* LISTEN 1335/ceph-osd tcp 0 0 10.4.81.120:6804 0.0.0.0:* LISTEN 1335/ceph-osd tcp 0 0 10.4.81.120:6805 0.0.0.0:* LISTEN 1335/ceph-osd
如果你想让http支持https也是在ceph配置文件中添加参数
#例子如下 (这里我没有测试,这里是官方文档的参数) [client.rgw.ceph-01] rgw_frontends = civetweb port=443s ssl_certificate=/etc/ceph/keyandcert.pem
5.2 调用对象存储网关
我们先创建一个s3的用户,获取到key之后访问对象存储
[root@ceph-01 ~]# cd /root/ceph-deploy/ [root@ceph-01 ceph-deploy]# radosgw-admin user create --uid ceph-s3-user --display-name "Ceph S3 User Demo abcdocker" { "user_id": "ceph-s3-user", #uid名称 "display_name": "Ceph S3 User Demo abcdocker", #名称 "email": "", "suspended": 0, "max_buckets": 1000, #默认创建有1000个backets配额 "subusers": [], "keys": [ { "user": "ceph-s3-user", "access_key": "35T0JSZ0CXMX646CW7LD", #这里的key是我们后期访问radosgw的认证,如果忘记了可以通过radosgw-admin user info --uid ceph-s3-user查看 "secret_key": "bbRpqDC2VlDko8nCD5JBgg4o0HBCeIbvTb1CziFc" } ], "swift_keys": [], "caps": [], "op_mask": "read, write, delete", "default_placement": "", "default_storage_class": "", "placement_tags": [], "bucket_quota": { "enabled": false, "check_on_raw": false, "max_size": -1, "max_size_kb": 0, "max_objects": -1 }, "user_quota": { "enabled": false, "check_on_raw": false, "max_size": -1, "max_size_kb": 0, "max_objects": -1 }, "temp_url_keys": [], "type": "rgw", "mfa_ids": [] } --uid 指定一个uid名称 --display-name 指定一个全名
这里的key我们已经获取到了,接下来我们使用s3的接口进行访问
首先安装python-bot包
yum install python-boto
编写Python sdk脚本
import boto import boto.s3.connection access_key = '35T0JSZ0CXMX646CW7LD' #这里需要替换我们创建的key secret_key = 'bbRpqDC2VlDko8nCD5JBgg4o0HBCeIbvTb1CziFc' #这里也需要替换 conn = boto.connect_s3( aws_access_key_id = access_key, aws_secret_access_key = secret_key, host = '192.168.31.20', port = 80, is_secure=False, calling_format = boto.s3.connection.OrdinaryCallingFormat(), ) bucket = conn.create_bucket('ceph-s3-bucket') for bucket in conn.get_all_buckets(): print "{name}".format( name = bucket.name, created = bucket.creation_date, ) #执行脚本 [root@ceph-01 ~]# python s3.py ceph-s3-bucket
执行完Python脚本,我们可以看到在pool创建了一个default.rgw.backets.index的索引
[root@ceph-01 ~]# ceph osd lspools 1 abcdocker 2 .rgw.root 3 default.rgw.control 4 default.rgw.meta 5 default.rgw.log 6 default.rgw.buckets.index
命令行调用
SDK调用方式不太适合运维操作,运维更倾向于命令行操作。下面我们进行命令行操作调用
这里使用s3cmd工具来进行配置
# 首先我们yum 安装s3cmd [root@ceph-01 ~]# yum install -y s3cmd # 针对s3cmd我们需要修改一些配置参数 [root@ceph-01 ~]# s3cmd --configure Enter new values or accept defaults in brackets with Enter. Refer to user manual for detailed description of all options. Access key and Secret key are your identifiers for Amazon S3. Leave them empty for using the env variables. Access Key: 35T0JSZ0CXMX646CW7LD #这里填写我们的key Secret Key: bbRpqDC2VlDko8nCD5JBgg4o0HBCeIbvTb1CziFc #secret key填写 Default Region [US]: Use "s3.amazonaws.com" for S3 Endpoint and not modify it to the target Amazon S3. S3 Endpoint [s3.amazonaws.com]: 192.168.31.20:80 #s3地址 Use "%(bucket)s.s3.amazonaws.com" to the target Amazon S3. "%(bucket)s" and "%(location)s" vars can be used if the target S3 system supports dns based buckets. DNS-style bucket+hostname:port template for accessing a bucket [%(bucket)s.s3.amazonaws.com]: 192.168.31.20:80/%(bucket)s #s3访问格式 Encryption password is used to protect your files from reading by unauthorized persons while in transfer to S3 Encryption password: #没有设置密码 Path to GPG program [/bin/gpg]: When using secure HTTPS protocol all communication with Amazon S3 servers is protected from 3rd party eavesdropping. This method is slower than plain HTTP, and can only be proxied with Python 2.7 or newer Use HTTPS protocol [Yes]: no #不开启https On some networks all internet access must go through a HTTP proxy. Try setting it here if you can't connect to S3 directly HTTP Proxy server name: #没有设置代理名称 New settings: Access Key: 35T0JSZ0CXMX646CW7LD Secret Key: bbRpqDC2VlDko8nCD5JBgg4o0HBCeIbvTb1CziFc Default Region: US S3 Endpoint: 192.168.31.20:80 DNS-style bucket+hostname:port template for accessing a bucket: 192.168.31.20:80/%(bucket)s Encryption password: Path to GPG program: /bin/gpg Use HTTPS protocol: False HTTP Proxy server name: HTTP Proxy server port: 0 Test access with supplied credentials? [Y/n] Y #是否测试访问权限 Please wait, attempting to list all buckets... Success. Your access key and secret key worked fine :-) Now verifying that encryption works... Not configured. Never mind. Save settings? [y/N] Y #保存配置 Configuration saved to '/root/.s3cfg' #配置保存路径 # 需要将signature_v2 改成true [root@ceph-01 ~]# sed -i 's/signature_v2 = False/signature_v2 = True/g' /root/.s3cfg
s3cmd 目前支持两种认真的方式一种是 v2,一种是 v4,而 s3cmd 2.x 版本默认用的是 v4,而 1.x 版本默认用的是 v2,这两种认证方式是有区别的,简单来说就是 v4 除了像 v2,那样需要S3桶的 accesskey 和 secretkey,还需要如 date 等信息来签名,然后放到 http request 的 Header 上,而 s3cmd 2.x 版本支持通过在 .s3cfg 配置文件,增加选项 signature_v2 = True 来修改认证方式,所以说,如果想快速解决这个403的问题,让用户加上这个选项就可以了
s3cmd使用
[root@ceph-01 ~]# s3cmd ls #查看bucket 2022-01-27 07:31 s3://ceph-s3-bucket [root@ceph-01 ~]# s3cmd mb s3://s3cmd-abcdocker-demo #创建bucket Bucket 's3://s3cmd-abcdocker-demo/' created [root@ceph-01 ~]# s3cmd ls #查看bucket 2022-01-27 07:31 s3://ceph-s3-bucket 2022-01-27 10:07 s3://s3cmd-abcdocker-demo 查看s3cmd-abcdocker-demo内容 [root@ceph-01 ~]# s3cmd ls s3://ceph-s3-bucket #目前是空文件
s3cmd 上传
[root@ceph-01 ~]# s3cmd put /etc/ s3://ceph-s3-bucket/etc/ --recursive #上传/etc目录到s3中的/etc目录 #--recursive 递归上传 #查看 [root@ceph-01 ~]# s3cmd ls s3://ceph-s3-bucket DIR s3://ceph-s3-bucket/etc/ [root@ceph-01 ~]# s3cmd ls s3://ceph-s3-bucket/etc/ DIR s3://ceph-s3-bucket/etc/NetworkManager/ DIR s3://ceph-s3-bucket/etc/X11/ DIR s3://ceph-s3-bucket/etc/audisp/ DIR s3://ceph-s3-bucket/etc/audit/ DIR s3://ceph-s3-bucket/etc/bash_completion.d/ DIR s3://ceph-s3-bucket/etc/ceph/ DIR s3://ceph-s3-bucket/etc/cron.d/
如果put提示ERROR: S3 error: 416 (InvalidRange)需要将ceph.conf配置文件进行修改,添加mon_max_pg_per_osd = 1000重启ceph-mon (systemctl restart ceph-mon@ceph-01 -->ceph-03)
s3cmd 下载
[root@ceph-01 ~]# s3cmd get s3://ceph-s3-bucket/etc/profile proxy-s3 download: 's3://ceph-s3-bucket/etc/profile' -> 'proxy-s3' [1 of 1] 1795 of 1795 100% in 0s 21.78 KB/s done [root@ceph-01 ~]# head proxy-s3 # /etc/profile ... #s3cmd下载的命令和上传的一样,只需要把put改成get即可
s3cmd 删除
[root@ceph-01 ~]# s3cmd del s3://ceph-s3-bucket/etc/profile delete: 's3://ceph-s3-bucket/etc/profile' [root@ceph-01 ~]# s3cmd ls s3://ceph-s3-bucket/etc/profile DIR s3://ceph-s3-bucket/etc/profile.d/ #删除整个目录,需要添加--recursive递归 [root@ceph-01 ~]# s3cmd del s3://ceph-s3-bucket/etc/ --recursive [root@ceph-01 ~]# s3cmd ls s3://ceph-s3-bucket
最终我们数据会在pools里面生成
[root@ceph-01 ~]# ceph osd lspools 1 abcdocker 2 .rgw.root 3 default.rgw.control 4 default.rgw.meta 5 default.rgw.log 6 default.rgw.buckets.index 7 default.rgw.buckets.data [root@ceph-01 ~]# rados -p default.rgw.buckets.data ls 3ce98ebd-9642-4c30-bc3d-4dc972cb9081.4704.1__shadow_.m3QCkEFEsSz-i-AeUgua4FkwMGCmcRx_1 [root@ceph-01 ~]# rados -p default.rgw.buckets.index ls .dir.3ce98ebd-9642-4c30-bc3d-4dc972cb9081.4704.1 .dir.3ce98ebd-9642-4c30-bc3d-4dc972cb9081.4704.3 #index为索引,data为数据
六、CephFS 文件系统
6.1 CephFS介绍
6.2 CephFS安装
为什么需要使用CephFS由于RBD不可以多个主机共享同一块磁盘,出现很多客户端需要写入数据的问题,这时就需要CephFS文件系统
我们使用高可用安装mds
[root@ceph-01 ceph-deploy]# ceph-deploy mds create ceph-01 ceph-02 ceph-03 #这里我们将ceph-01 ceph-02 ceph-03都加入到集群中来
接下来我们可以看到,已经有mds了,数量为3个,状态为启动等待的状态
[root@ceph-01 ceph-deploy]# ceph -s|grep mds mds: 3 up:standby
因为没有文件系统,所以3个节点状态是启动,但是后面为等待的状态
6.3 创建pool
一个Ceph文件系统至少需要连个RADOS池,一个用于数据,一个用于元数据。
创建存储池,数据data,元数据metadata
[root@ceph-01 ~]# ceph osd pool create cephfs_data 64 64 #创建名称为cephfs_data 的pool, pg数量为64 pool 'cephfs_data' created [root@ceph-01 ~]# ceph osd pool create cephfs_metadata 64 64 pool 'cephfs_metadata' created [root@ceph-01 ~]# [root@ceph-01 ~]# ceph osd pool ls .. cephfs_data cephfs_metadata
通常,元数据池最多有几GB的数据,建议使用比较小的PG数,64或者128常用于大型集群
6.4 创建文件系统
接下来需要创建文件系统,将刚刚创建的pool关联起来
[root@ceph-01 ~]# ceph fs new cephfs-abcdocker cephfs_metadata cephfs_data new fs with metadata pool 9 and data pool 8 #cephfs-abcdocker为文件系统名称 #cephfs_metadata 为元数据的pool #cephfs_data 为数据pool
创建完毕后可以通过下面的命令进行查看
[root@ceph-01 ~]# ceph fs ls name: cephfs-abcdocker, metadata pool: cephfs_metadata, data pools: [cephfs_data ]
此时,我们查看mds状态,已经有一个状态为active,另外2个为standb状态
[root@ceph-01 ~]# ceph -s cluster: id: c8ae7537-8693-40df-8943-733f82049642 health: HEALTH_OK services: mon: 3 daemons, quorum ceph-01,ceph-02,ceph-03 (age 34h) mgr: ceph-03(active, since 7d), standbys: ceph-02, ceph-01 mds: cephfs-abcdocker:1 {0=ceph-02=up:active} 2 up:standby ##ceph-02的状态为active,选举出一个当做工作节点 osd: 3 osds: 3 up (since 7d), 3 in (since 5w) rgw: 1 daemon active (ceph-01) task status: data: pools: 9 pools, 384 pgs objects: 318 objects, 141 MiB usage: 3.4 GiB used, 147 GiB / 150 GiB avail pgs: 384 active+clean
6.5 使用cephfs
内核驱动挂载
创建挂载点
mkdir /abcdocker
执行挂载命令
[root@ceph-01 ~]# mount -t ceph ceph-01:6789:/ /abcdocker -o name=admin #ceph-01为mon节点ip,/为挂载/目录 /abcdocker 挂载点地址,name=admin,使用admin用户的权限 [root@ceph-01 ~]# df -h Filesystem Size Used Avail Use% Mounted on /dev/sda3 50G 2.3G 48G 5% / devtmpfs 1.9G 0 1.9G 0% /dev tmpfs 1.9G 0 1.9G 0% /dev/shm tmpfs 1.9G 8.6M 1.9G 1% /run tmpfs 1.9G 0 1.9G 0% /sys/fs/cgroup tmpfs 1.9G 24K 1.9G 1% /var/lib/ceph/osd/ceph-0 tmpfs 380M 0 380M 0% /run/user/0 tmpfs 380M 0 380M 0% /run/user/1000 192.168.31.20:6789:/ 150G 3.5G 147G 3% /abcdocker #这里分配的空间是整个ceph的空间大小
我们可以看到,挂载完linux内核会自动加载ceph模块
[root@ceph-01 abcdocker]# lsmod |grep ceph ceph 335973 1 libceph 282661 1 ceph dns_resolver 13140 1 libceph libcrc32c 12644 2 xfs,libceph
在内核中挂载性能会比较高一点,但是有一些场景内核可能不太支持,所以可以使用用户FUSE挂载
用户空间FUSE挂载
用户空间挂载主要使用的是ceph-fuse客户端,我们需要单独安装这个客户端
[root@ceph-01 abcdocker]# yum install ceph-fuse -y
接下来创建本地的挂载点
[root@ceph-01 abcdocker]# mkdir /mnt/abcdocker
使用ceph-fuse进行挂载
[root@ceph-01 abcdocker]# ceph-fuse -n client.admin -m 192.168.31.20:6789 /mnt/abcdocker/ 2022-02-15 14:46:52.094 7f3d4b7bdf80 -1 init, newargv = 0x5588e55bb6f0 newargc=9 ceph-fuse[13140]: starting ceph client ceph-fuse[13140]: starting fuse
如果我们不指定mon,默认找的是/etc/ceph/ceph.conf里面的配置文件
挂在完成后我们就可以使用df -h看一下挂载点的状态
[root@ceph-01 abcdocker]# df -h Filesystem Size Used Avail Use% Mounted on /dev/sda3 50G 2.3G 48G 5% / devtmpfs 1.9G 0 1.9G 0% /dev tmpfs 1.9G 0 1.9G 0% /dev/shm tmpfs 1.9G 8.6M 1.9G 1% /run tmpfs 1.9G 0 1.9G 0% /sys/fs/cgroup tmpfs 1.9G 24K 1.9G 1% /var/lib/ceph/osd/ceph-0 tmpfs 380M 0 380M 0% /run/user/0 tmpfs 380M 0 380M 0% /run/user/1000 192.168.31.20:6789:/ 150G 3.5G 147G 3% /abcdocker ceph-fuse 47G 0 47G 0% /mnt/abcdocker #用户空间的配置 [root@ceph-01 abcdocker]# cat /mnt/abcdocker/123
相关文章:
- Ceph OSD扩容与缩容
- CentOS 7 ETCD集群配置大全
- Kubernetes 1.14 二进制集群安装
- Kuerbernetes 1.11 集群二进制安装