主机名 | 角色 | IP地址 |
---|---|---|
ceph-admin | ceph-deploy | 192.168.92.21 |
ceph-node1 | mon、mgr、osd | 192.168.92.22 |
ceph-node2 | mon、mgr、osd | 192.168.92.23 |
ceph-node3 | mon、mgr、osd | 192.168.92.24 |
对全部机器配置 epel 仓库、基础软件包仓库、ceph 软件包仓库,全部的镜像仓库地址可到阿里云开源镜像站中查找,地址:https://developer.aliyun.com/mirror/,配置步骤以下:node
wget http://mirrors.aliyun.com/repo/epel-7.repo -O /etc/yum.repos.d/epel-7.repo
wget http://mirrors.aliyun.com/repo/Centos-7.repo -O /etc/yum.repos.d/CentOS7-Base-ali.repo sed -i 's/$releasever/7/g' /etc/yum.repos.d/CentOS7-Base-ali.repo
cat >> /etc/yum.repos.d/ceph.repo << EOF [noarch] name=ceph-noarch baseurl=https://mirrors.aliyun.com/ceph/rpm-nautilus/el7/noarch/ enable=1 gpgcheck=0 [ceph] name=ceph baseurl=https://mirrors.aliyun.com/ceph/rpm-nautilus/el7/x86_64/ enable=1 gpgcheck=0 EOF
为了保证 ceph 集群 mon 组件通讯正常,须要对每一个节点的时间进行同步,这里对管理节点和 osd 节点进行时间同步,首先在全部服务器中安装 chrony 用于系统时间同步,步骤以下:python
安装 chrony 服务linux
yum -y install chrony
设置系统时区web
timedatectl set-timezone Asia/Shanghai
设置系统时钟同步,输出如下内容表明同步正常算法
[root@ceph-admin ~]# systemctl enable chronyd && systemctl start chronyd [root@ceph-admin ~]# timedatectl status Local time: 一 2020-07-27 14:52:14 CST Universal time: 一 2020-07-27 06:52:14 UTC RTC time: 一 2020-07-27 06:52:15 Time zone: Asia/Shanghai (CST, +0800) NTP enabled: yes NTP synchronized: yes RTC in local TZ: no DST active: n/a
将当前的 UTC 时间写入硬件时钟,并重启依赖于系统时间的服务json
timedatectl set-local-rtc 0 systemctl restart rsyslog && systemctl restart crond
使用 ceph-deploy 部署集群时,须要经过主机名来查找主机 IP 地址,因此要在本地 hosts 文件中配置地址解析:bootstrap
cat >> /etc/hosts << EOF 192.168.92.21 ceph-admin 192.168.92.22 ceph-node1 192.168.92.23 ceph-node2 192.168.92.24 ceph-node3 EOF
闭系统防火墙并禁止开机启动,清理防火墙规则并设置默认转发策略swift
systemctl stop firewalld.service && systemctl disable firewalld.service iptables -F && iptables -X && iptables -F -t nat && iptables -X -t nat iptables -P FORWARD ACCEPT
永久关闭selinuxcentos
setenforce 0 && sed -i 's/^SELINUX=.*/SELINUX=disabled/' /etc/selinux/config
在 ceph-admin 节点执行 ceph-deploy 命令时,须要经过 ssh 方式链接到各个 osd 节点中运行指令,因此须要配置 ceph-admin 节点到其余 osd 节点的 ssh 免密认证(如下操做只须要在 ceph-admin 节点中进行),须要注意的是,若是须要非 root 用户部署 ceph 集群,须要针对该用户配置免密认证:安全
在各个机器上生成密钥对
ssh-keygen -t rsa -f ~/.ssh/id_rsa -N ''
将各节点的主机信息(host key)写入control_node的~/.ssh/known_hosts文件
for host in 192.168.92.{21..24} ceph-admin ceph-node{1..3}; do ssh-keyscan $host >>~/.ssh/known_hosts 2>/dev/null; done
将公钥分发给各个机器(需提早安装 sshpass)
for host in ceph-admin ceph-node{1..3}; do sshpass -p'123456' ssh-copy-id root@$host &>/dev/null; done
ceph-deploy 工具只须要安装在 ceph-admin 节点中,命令以下:
yum -y install python-setuptools ceph-deploy ceph
安装 ceph 包的目的是为了之后能在 ceph-admin 节点中查看 ceph 集群的状态
在 ceph-admin 节点中建立集群的工做目录,该目录中会存放 ceph-deploy 执行指令时生成的日志和秘钥信息等:
mkdir -p /opt/ops-ceph-cluster
在 ceph-admin 节点上进入 /opt/ops-ceph-cluster 目录下,执行 ceph-deploy 命令初始化集群设置,初始化要求指定节点做为 mon,命令以下:
ceph-deploy new --public-network 192.168.92.0/24 --cluster-network 192.168.92.0/24 ceph-node1
--public-network 表明 ceph 集群对外提供调用的网络,--cluster-network 表明用于集群内部通讯的网络。通常状况下 ceph 集群中须要有两个网络,这样能够保证 ceph 集群的安全性。因为这次搭建的环境中只有一个网络,因此此处两个配置项填写同一个网段的地址。
上面的命令执行完成后会将 ceph-node1 节点配置为 mon,而且会在 /opt/ops-ceph-cluster 目录下生成集群的配置文件、key 文件(用于身份验证)、日志文件等:
[root@ceph-admin ops-ceph-cluster]# ll 总用量 12 -rw-r--r--. 1 root root 268 7月 27 14:58 ceph.conf -rw-r--r--. 1 root root 3248 7月 27 14:58 ceph-deploy-ceph.log -rw-------. 1 root root 73 7月 27 14:58 ceph.mon.keyring
配置文件 ceph.conf 内容以下:
[root@ceph-admin ops-ceph-cluster]# cat ceph.conf [global] fsid = f52099ba-cec0-4c77-bd92-3a21ad224be3 public_network = 192.168.92.0/24 cluster_network = 192.168.92.0/24 mon_initial_members = ceph-node1 mon_host = 192.168.92.22 auth_cluster_required = cephx auth_service_required = cephx auth_client_required = cephx
接下来须要在各个 osd 节点安装 ceph 组件包:
yum -y install ceph ceph-mon ceph-mgr ceph-mds ceph-radosgw
在初始化集群的过程当中已经指定了 mon 的节点,如今须要对 mon 进行初始化,在 ceph-admin 节点的 /opt/ops-ceph-cluster 目录下执行以下命令进行初始化:
ceph-deploy mon create-initial
初始化完成后,会在当前目录下生成各个组件须要的 key 文件:
[root@ceph-admin ops-ceph-cluster]# ll 总用量 44 -rw-------. 1 root root 113 7月 27 15:16 ceph.bootstrap-mds.keyring -rw-------. 1 root root 113 7月 27 15:16 ceph.bootstrap-mgr.keyring -rw-------. 1 root root 113 7月 27 15:16 ceph.bootstrap-osd.keyring -rw-------. 1 root root 113 7月 27 15:16 ceph.bootstrap-rgw.keyring -rw-------. 1 root root 151 7月 27 15:16 ceph.client.admin.keyring -rw-r--r--. 1 root root 268 7月 27 14:58 ceph.conf -rw-r--r--. 1 root root 16375 7月 27 15:16 ceph-deploy-ceph.log -rw-------. 1 root root 73 7月 27 14:58 ceph.mon.keyring
接下来将 admin用户的 key 文件拷贝给各个 osd 节点,若是为了在 ceph-admin 节点中使用 ceph 命令查看集群状态,那么也须要将 key 文件拷贝给 ceph-admin 节点(ceph-admin节点须要安装 ceph 包)
ceph-deploy admin ceph-admin ceph-node1 ceph-node2 ceph-node3
拷贝完成后执行 ceph -s
命令能够查看到当前集群的状态:
[root@ceph-admin ops-ceph-cluster]# ceph -s cluster: id: f52099ba-cec0-4c77-bd92-3a21ad224be3 health: HEALTH_OK services: mon: 1 daemons, quorum ceph-node1 (age 7m) mgr: no daemons 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:
能够看到当前集群中已经有一个 mon 节点。
配置 ceph-node1 节点做为 mgr,在 ceph-admin 节点的 /opt/ops-ceph-cluster 目录下执行以下命令:
ceph-deploy mgr create ceph-node1
查看集群状态,能够看到启动了一个 mgr daemon:
[root@ceph-admin ops-ceph-cluster]# ceph -s cluster: id: f52099ba-cec0-4c77-bd92-3a21ad224be3 health: HEALTH_WARN OSD count 0 < osd_pool_default_size 3 services: mon: 1 daemons, quorum ceph-node1 (age 11m) mgr: ceph-node1(active, since 33s) 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:
当前环境中,每一个 OSD 节点都有两块磁盘 sdb 和 sdc,信息以下:
[root@ceph-node1 ~]# lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sda 8:0 0 100G 0 disk ├─sda1 8:1 0 200M 0 part /boot └─sda2 8:2 0 99.8G 0 part ├─centos-root 253:0 0 95.8G 0 lvm / └─centos-swap 253:1 0 4G 0 lvm [SWAP] sdb 8:16 0 20G 0 disk sdc 8:32 0 20G 0 disk sr0 11:0 1 4.4G 0 rom
接下来将每一个 OSD 节点中的 sdb 磁盘加入到 ceph 集群中,命令以下:
for host in 1 2 3 do ceph-deploy disk zap ceph-node${host} /dev/sdb ceph-deploy osd create ceph-node${host} --data /dev/sdb done
ceph-deploy disk zap 命令用于将目标磁盘的分区表和内容擦除,实际上它是调用 /bin/dd if=/dev/zero of=/dev/sdb bs=1M count=10 conv=fsync 命令来销毁 GPT 和 MBR 。若是目标磁盘是未被分区的,能够不使用该命令
此时查看 ceph 集群的状态,能够看到有三个 OSD 已经被加入到集群中:
[root@ceph-admin ops-ceph-cluster]# ceph -s cluster: id: f52099ba-cec0-4c77-bd92-3a21ad224be3 health: HEALTH_OK services: mon: 1 daemons, quorum ceph-node1 (age 21m) mgr: ceph-node1(active, since 10m) osd: 3 osds: 3 up (since 2m), 3 in (since 2m) data: pools: 0 pools, 0 pgs objects: 0 objects, 0 B usage: 3.0 GiB used, 57 GiB / 60 GiB avail pgs:
mon 和 mgr 是 ceph 集群中很是重要的组件,其中 mon 做为整个集群的控制中心,里面存放着集群的信息,因此须要确保 mon 和 mgr 处于高可用的状态,为了保证选举正常,节点数要为奇数。
首先将 ceph-node2 和 ceph-node3 扩容为 mon 节点:
ceph-deploy mon add ceph-node2 ceph-deploy mon add ceph-node3
扩容完成后查看集群状态:
[root@ceph-admin ops-ceph-cluster]# ceph -s cluster: id: f52099ba-cec0-4c77-bd92-3a21ad224be3 health: HEALTH_OK services: mon: 3 daemons, quorum ceph-node1,ceph-node2,ceph-node3 (age 27s) mgr: ceph-node1(active, since 15m) osd: 3 osds: 3 up (since 7m), 3 in (since 7m) data: pools: 0 pools, 0 pgs objects: 0 objects, 0 B usage: 3.0 GiB used, 57 GiB / 60 GiB avail pgs:
集群信息中显示当前的 mon 节点已经为 3 个,使用以下命令查看 mon 节点的选举状态:
[root@ceph-admin ops-ceph-cluster]# ceph quorum_status --format json-pretty { "election_epoch": 12, "quorum": [ 0, 1, 2 ], "quorum_names": [ "ceph-node1", "ceph-node2", "ceph-node3" ], "quorum_leader_name": "ceph-node1", "quorum_age": 88,
能够看到当前已经能够正常选举,leader 为 ceph-node1 节点上的 mon。也可使用 ceph mon stat 命令查看 mon 的信息:
[root@ceph-admin ops-ceph-cluster]# ceph mon stat e3: 3 mons at {ceph-node1=[v2:192.168.92.22:3300/0,v1:192.168.92.22:6789/0],ceph-node2=[v2:192.168.92.23:3300/0,v1:192.168.92.23:6789/0],ceph-node3=[v2:192.168.92.24:3300/0,v1:192.168.92.24:6789/0]}, election epoch 12, leader 0 ceph-node1, quorum 0,1,2 ceph-node1,ceph-node2,ceph-node3
或者使用 ceph mon dump 命令查看详细的信息:
[root@ceph-admin ops-ceph-cluster]# ceph mon dump dumped monmap epoch 3 epoch 3 fsid f52099ba-cec0-4c77-bd92-3a21ad224be3 last_changed 2020-07-27 15:42:02.273752 created 2020-07-27 15:16:09.870184 min_mon_release 14 (nautilus) 0: [v2:192.168.92.22:3300/0,v1:192.168.92.22:6789/0] mon.ceph-node1 1: [v2:192.168.92.23:3300/0,v1:192.168.92.23:6789/0] mon.ceph-node2 2: [v2:192.168.92.24:3300/0,v1:192.168.92.24:6789/0] mon.ceph-node3
接下来扩容 mgr 节点,命令以下:
ceph-deploy mgr create ceph-node2 ceph-node3
查看集群信息:
[root@ceph-admin ops-ceph-cluster]# ceph -s cluster: id: f52099ba-cec0-4c77-bd92-3a21ad224be3 health: HEALTH_OK services: mon: 3 daemons, quorum ceph-node1,ceph-node2,ceph-node3 (age 11m) mgr: ceph-node1(active, since 26m), standbys: ceph-node2, ceph-node3 osd: 3 osds: 3 up (since 18m), 3 in (since 18m) data: pools: 0 pools, 0 pgs objects: 0 objects, 0 B usage: 3.0 GiB used, 57 GiB / 60 GiB avail pgs:
能够看到 mgr 变为 3 个节点,其中两个节点处于 standby 状态。
在 ceph-admin 节点中执行以下命令建立 pool:
ceph osd pool create ops-pool 64 64
第一个 64 表明设置的 pg 数量,第二个 64 表明设置的 pgp 数量
使用以下命令查看当前已有的 pool:
[root@ceph-admin ~]# ceph osd lspools 1 ops-pool
查看指定 pool 中的 pg 和 pgp 数量:
[root@ceph-admin ~]# ceph osd pool get ops-pool pg_num pg_num: 64 [root@ceph-admin ~]# ceph osd pool get ops-pool pgp_num pgp_num: 64
查看指定 pool 中的副本数(副本数默认为3):
[root@ceph-admin ~]# ceph osd pool get ops-pool size size: 3
查看指定 pool 的调度算法(默认为replicated_rule):
[root@ceph-admin ~]# ceph osd pool get ops-pool crush_rule crush_rule: replicated_rule
调整指定 pool 的 pg 和 pgp 数量:
ceph osd pool set ops-pool pg_num 128 ceph osd pool set ops-pool pgp_num 128
调整指定 pool 的副本数:
ceph osd pool set ops-pool size 2
通常来讲,建立 pool 后,须要对这个 pool 进行初始化,例如用于 rbd 块存储的 pool 使用 rbd pool init 命令就能够将指定 pool 初始化为 rbd 类型的 application。若是不进行这个初始化的操做,不会影响存储的使用,可是会在集群信息中显示报警信息。后面会对于该报警信息和解决办法进行说明。
使用以下命令建立一个块存储的 image:
rbd create -p ops-pool --image ops-rbd.img --size 5G
上面的命令也能够写为以下形式:
rbd create ops-pool/ops-rbd-1.img --size 5G
查看指定 pool 中的 image:
[root@ceph-admin ~]# rbd -p ops-pool ls ops-rbd-1.img ops-rbd.img
查看指定 image 的信息:
[root@ceph-admin ~]# rbd info ops-pool/ops-rbd.img rbd image 'ops-rbd.img': size 5 GiB in 1280 objects order 22 (4 MiB objects) snapshot_count: 0 id: 11cd172302e2 block_name_prefix: rbd_data.11cd172302e2 format: 2 features: layering, exclusive-lock, object-map, fast-diff, deep-flatten op_features: flags: create_timestamp: Mon Jul 27 16:36:25 2020 access_timestamp: Mon Jul 27 16:36:25 2020 modify_timestamp: Mon Jul 27 16:36:25 2020
其中 features 项中表明当前 rbd 中启用的一些内核特性,有些内核不支持启用这些特性,因此在挂载的 rbd 的时候会报错,后面的内容会说明如何禁用已启用的内核特性
删除 pool 中指定的 image:
rbd rm -p ops-pool --image ops-rbd-1.img
使用以下命令将 image 映射到当前机器上:
rbd map ops-pool/ops-rbd.img
执行命令后会看到有以下报错:
rbd: sysfs write failed RBD image feature set mismatch. You can disable features unsupported by the kernel with "rbd feature disable ops-pool/ops-rbd.img object-map fast-diff deep-flatten". In some cases useful info is found in syslog - try "dmesg | tail". rbd: map failed: (6) No such device or address
报错内容就是上面提到的,因为 rbd 默认启用了一些内核特性,而当前机器中的内核版本不支持这些内核特性,因此须要提早将这些特性给禁用掉,命令以下:
for i in deep-flatten fast-diff object-map exclusive-lock; do rbd feature disable ops-pool/ops-rbd.img ${i}; done
操做完成后从新执行上面的 map 命令便可完成映射,命令执行完成后能够看到已经将 ops-rbd.img 映射到本地的一个块设备名称:
[root@ceph-admin ~]# rbd map ops-pool/ops-rbd.img /dev/rbd0
经过以下命令能够查看到设备映射的信息:
[root@ceph-admin ~]# rbd device list id pool namespace image snap device 0 ops-pool ops-rbd.img - /dev/rbd0 [root@ceph-admin ~]# fdisk -l | grep -A3 /dev/rbd0 磁盘 /dev/rbd0:5368 MB, 5368709120 字节,10485760 个扇区 Units = 扇区 of 1 * 512 = 512 bytes 扇区大小(逻辑/物理):512 字节 / 512 字节 I/O 大小(最小/最佳):4194304 字节 / 4194304 字节
将 /dev/vdb0 格式化为 ext4,并挂载到 /media 目录下:
mkfs.ext4 /dev/rbd0 && mount /dev/rbd0 /media
此时就能够向该存储中写入数据:
[root@ceph-admin media]# echo "message" > testfile [root@ceph-admin media]# cat testfile message
上面已经建立了一个大小为 5G 的块设备,若是须要给块设备进行扩容,例如扩大到 10G,可使用以下命令:
rbd resize ops-pool/ops-rbd.img --size 10G
扩容完成后查看块设备的信息:
[root@ceph-admin ~]# rbd info ops-pool/ops-rbd.img rbd image 'ops-rbd.img': size 10 GiB in 2560 objects order 22 (4 MiB objects) snapshot_count: 0 id: 11cd172302e2 block_name_prefix: rbd_data.11cd172302e2 format: 2 features: layering op_features: flags: create_timestamp: Mon Jul 27 16:36:25 2020 access_timestamp: Mon Jul 27 16:36:25 2020 modify_timestamp: Mon Jul 27 16:36:25 2020
能够看到存储已经调整为 10G,可是查看挂载目录的大小仍是 5G:
[root@ceph-admin ~]# df -Th /media 文件系统 类型 容量 已用 可用 已用% 挂载点 /dev/rbd0 ext4 4.8G 20M 4.6G 1% /media
因此须要使文件系统也识别到扩容的空间,这个存储设备使用的 ext4 格式,因此使用 resize2fs 命令便可完成识别:
resize2fs /dev/rbd0
而后再次查看文件系统大小以下:
[root@ceph-admin ~]# df -Th /media 文件系统 类型 容量 已用 可用 已用% 挂载点 /dev/rbd0 ext4 9.8G 23M 9.3G 1% /media
上面说到了若是没有对 pool 进行初始化,会触发告警信息,经过查看集群信息能够看到相应的告警:
[root@ceph-admin ~]# ceph -s cluster: id: f52099ba-cec0-4c77-bd92-3a21ad224be3 health: HEALTH_WARN application not enabled on 1 pool(s)
能够看到在健康检查中告警"未在 pool 中启用 application"。使用以下命令能够查看到告警的详细信息:
[root@ceph-admin ~]# ceph health detail HEALTH_WARN application not enabled on 1 pool(s) POOL_APP_NOT_ENABLED application not enabled on 1 pool(s) application not enabled on pool 'ops-pool' use 'ceph osd pool application enable <pool-name> <app-name>', where <app-name> is 'cephfs', 'rbd', 'rgw', or freeform for custom applications.
接下来使用告警信息中给出的命令来设置这个 pool 启用 application,并将类型设置为 rbd:
ceph osd pool application enable ops-pool rbd
此时再次查看集群状态信息,能够看到告警已经恢复,健康状态检查正常:
[root@ceph-admin ~]# ceph -s cluster: id: f52099ba-cec0-4c77-bd92-3a21ad224be3 health: HEALTH_OK
经过以下命令能够查看到 pool 中已启用的 application:
[root@ceph-admin ~]# ceph osd pool application get ops-pool { "rbd": {} }
在 ceph-admin 节点中的 /opt/ops-ceph-cluster 目录下执行以下命令建立 RGW:
ceph-deploy rgw create ceph-node1
执行完成后查看集群信息,能够看到已经启用了一个 RGW:
[root@ceph-admin ops-ceph-cluster]# ceph -s cluster: id: f52099ba-cec0-4c77-bd92-3a21ad224be3 health: HEALTH_WARN application not enabled on 1 pool(s) services: mon: 3 daemons, quorum ceph-node1,ceph-node2,ceph-node3 (age 117m) mgr: ceph-node1(active, since 2h), standbys: ceph-node2, ceph-node3 osd: 3 osds: 3 up (since 2h), 3 in (since 2h) rgw: 1 daemon active (ceph-node1) task status: data: pools: 5 pools, 256 pgs objects: 240 objects, 143 MiB usage: 3.3 GiB used, 57 GiB / 60 GiB avail pgs: 256 active+clean
在 ceph-node1 节点中查看 RGW 监听的端口(默认为 7480):
[root@ceph-node1 ~]# netstat -anplut | grep 7480 tcp 0 0 0.0.0.0:7480 0.0.0.0:* LISTEN 19986/radosgw tcp6 0 0 :::7480 :::* LISTEN 19986/radosgw
首先更改 ceph-admin 节点中 /opt/ops-ceph-cluster 目录下 ceph.conf 文件的内容,添加以下配置:
[client.rgw.ceph-node1] rgw_frontends = "civetweb port=80"
注意
[client.rgw.ceph-node1]
中要将 client.rgw. 后面的部分改成部署了 RGW 机器的主机名
文件修改完成后将配置文件 push 到其余 OSD 节点中去:
ceph-deploy --overwrite-conf config push ceph-admin ceph-node1 ceph-node2 ceph-node3
在 ceph-node1 节点中重启 RGW 服务:
systemctl restart ceph-radosgw.target
查看 RGW 服务当前监听的端口:
[root@ceph-node1 ~]# netstat -anplut | grep radosgw | grep LISTEN tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 20929/radosgw
建立的用户有两种,一种是兼容 S3 风格的,还有一种是 Swift 风格。
使用以下命令建立一个用于访问 S3 的用户:
radosgw-admin user create --uid ops-s3-user --display-name "Ops S3 User Demo"
命令执行后会输出以下结果:
{ "user_id": "ops-s3-user", "display_name": "Ops S3 User Demo", "email": "", "suspended": 0, "max_buckets": 1000, "subusers": [], "keys": [ { "user": "ops-s3-user", "access_key": "JV54B80DTZ8VQ2P4IYD4", "secret_key": "GKURUiaXt2cf7B2O5cl7kmCvWWHDnAl7U6CGtPb2" } ], "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": [] }
上面的内容中显示了用户的 key 信息以及一些用户的配额信息。以上的信息也能够经过以下命令再次输出:
radosgw-admin user info --uid ops-s3-user
须要使用一个 python 程序来测试 s3 接口的访问,首先安装一个 python 包,名称为:python-boto:
yum -y install python-boto
建立一个名为 s3test.py 的文件,内容以下:
import boto.s3.connection access_key = 'JV54B80DTZ8VQ2P4IYD4' secret_key = 'GKURUiaXt2cf7B2O5cl7kmCvWWHDnAl7U6CGtPb2' conn = boto.connect_s3( aws_access_key_id=access_key, aws_secret_access_key=secret_key, host='192.168.92.22', port=80, is_secure=False, calling_format=boto.s3.connection.OrdinaryCallingFormat(), ) bucket = conn.create_bucket('my-new-bucket') for bucket in conn.get_all_buckets(): print "{name} {created}".format( name=bucket.name, created=bucket.creation_date, )
须要注意的是,要将程序中的 access_key 和 secret_key 修改成前面生成用户的相关信息。host 须要修改成 RGW 服务器的地址,port 修改成相应的端口。
执行这个 python 程序,会输出以下信息:
[root@ceph-admin ~]# python s3test.py my-new-bucket 2020-07-27T10:30:40.473Z
这表明成功建立了一个 bucket。
在命令行中调用 s3 接口来管理对象存储,首先须要安装 s3cmd 软件包:
yum -y install s3cmd
安装完成后须要对 s3cmd 进行配置,配置过程以下:
[root@ceph-admin ~]# 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: JV54B80DTZ8VQ2P4IYD4 # 设置访问用户的 Access Key Secret Key: GKURUiaXt2cf7B2O5cl7kmCvWWHDnAl7U6CGtPb2 # 设置访问用户的 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.92.22:80 # 设置 RWG 的地址和端口 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.92.22:80/%(bucket)s # 设置 bucket 的名称(能够将IP地址更换为域名) Encryption password is used to protect your files from reading by unauthorized persons while in transfer to S3 Encryption password: # 不设置密码 Path to GPG program [/usr/bin/gpg]: # 使用 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: JV54B80DTZ8VQ2P4IYD4 Secret Key: GKURUiaXt2cf7B2O5cl7kmCvWWHDnAl7U6CGtPb2 Default Region: US S3 Endpoint: 192.168.92.22:80 DNS-style bucket+hostname:port template for accessing a bucket: 192.168.92.22:80/%(bucket)s Encryption password: Path to GPG program: /usr/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'
配置完成后,配置文件存储在 /root/.s3cfg 文件中,须要将该文件中的 signature_v2 配置项改成 True,不然在后续执行命令的时候会触发 ERROR: S3 error: 403 (SignatureDoesNotMatch) 报错:
signature_v2 = True
保存退出后,就可使用 s3cmd 命令来管理对象存储,首先使用以下命令查看当前的 bucket:
[root@ceph-admin ~]# s3cmd ls 2020-07-27 10:30 s3://my-new-bucket
建立一个新的 bucket:
[root@ceph-admin ~]# s3cmd mb s3://ops-s3-demo Bucket 's3://ops-s3-demo/' created [root@ceph-admin ~]# s3cmd ls 2020-07-27 10:30 s3://my-new-bucket 2020-07-28 02:20 s3://ops-s3-demo
将本地的 /etc/fstab 文件上传到对象存储中,并将存储的名称修改成 fstab-demo:
[root@ceph-admin ~]# s3cmd put /etc/fstab s3://ops-s3-demo/fstab-demo upload: '/etc/fstab' -> 's3://ops-s3-demo/fstab-demo' [1 of 1] 465 of 465 100% in 1s 266.57 B/s done
若是上传文件时出现报错信息:ERROR: S3 error: 416 (InvalidRange)
,可按照以下步骤进行处理:
rgw_init_ioctx ERROR: librados::Rados::pool_create returned (34) Numerical result out of range (this can be due to a pool or placement group misconfiguration, e.g. pg_num < pgp_num or mon_max_pg_per_osd exceeded)
[global] fsid = f52099ba-cec0-4c77-bd92-3a21ad224be3 public_network = 192.168.92.0/24 cluster_network = 192.168.92.0/24 mon_initial_members = ceph-node1 mon_host = 192.168.92.22 auth_cluster_required = cephx auth_service_required = cephx auth_client_required = cephx mon_max_pg_per_osd = 1000 [client.rgw.ceph-node1] rgw_frontends = "civetweb port=80"
ceph-deploy --overwrite-conf config push ceph-admin ceph-node1 ceph-node2 ceph-node3
systemctl restart ceph-mgr@ceph-node1 systemctl restart ceph-mon@ceph-node1 systemctl restart ceph-mgr@ceph-node2 systemctl restart ceph-mon@ceph-node2 systemctl restart ceph-mgr@ceph-node3 systemctl restart ceph-mon@ceph-node3
配置完成后便可实现文件上传。文件上传后使用以下命令查看 bucket 中的文件:
[root@ceph-admin ~]# s3cmd ls s3://ops-s3-demo 2020-07-28 02:37 465 s3://ops-s3-demo/fstab-demo
将本地的 /opt 目录上传到 bucket 中,命令以下:
s3cmd put /opt/ s3://ops-s3-demo/opt/ --recursive
查看 bucket 中的目录:
[root@ceph-admin ~]# s3cmd ls s3://ops-s3-demo DIR s3://ops-s3-demo/opt/ 2020-07-28 02:37 465 s3://ops-s3-demo/fstab-demo [root@ceph-admin ~]# s3cmd ls s3://ops-s3-demo/opt/ DIR s3://ops-s3-demo/opt/ops-ceph-cluster/ [root@ceph-admin ~]# s3cmd ls s3://ops-s3-demo/opt/ops-ceph-cluster/ 2020-07-28 02:49 109928 s3://ops-s3-demo/opt/ops-ceph-cluster/ceph-deploy-ceph.log 2020-07-28 02:49 113 s3://ops-s3-demo/opt/ops-ceph-cluster/ceph.bootstrap-mds.keyring 2020-07-28 02:49 113 s3://ops-s3-demo/opt/ops-ceph-cluster/ceph.bootstrap-mgr.keyring 2020-07-28 02:49 113 s3://ops-s3-demo/opt/ops-ceph-cluster/ceph.bootstrap-osd.keyring 2020-07-28 02:49 113 s3://ops-s3-demo/opt/ops-ceph-cluster/ceph.bootstrap-rgw.keyring 2020-07-28 02:49 151 s3://ops-s3-demo/opt/ops-ceph-cluster/ceph.client.admin.keyring 2020-07-28 02:49 353 s3://ops-s3-demo/opt/ops-ceph-cluster/ceph.conf 2020-07-28 02:49 73 s3://ops-s3-demo/opt/ops-ceph-cluster/ceph.mon.keyring
将 s3://ops-s3-demo/opt/ops-ceph-cluster/ceph.conf 文件下载到本地,并重命名为 ceph.conf-download,命令以下:
s3cmd get s3://ops-s3-demo/opt/ops-ceph-cluster/ceph.conf ceph.conf-download
将 s3://ops-s3-demo/fstab-demo 文件删除,命令以下:
s3cmd rm s3://ops-s3-demo/fstab-demo
将 s3://ops-s3-demo/opt/ 目录删除,命令以下:
s3cmd rm s3://ops-s3-demo/opt/ --recursive
此时查看资源池信息,会发现资源池中多了几个与 rgw 相关的资源池:
[root@ceph-admin ~]# ceph osd lspools 1 ops-pool 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
其中 2 3 4 5 是以前建立 RGW 后就自动生成的,而 6 是在调用 s3 接口建立 bucket 后生成的。7 是在调用接口上传文件后生成的,因为刚才已经将删除的文件删除,因此 default.rgw.buckets.data 当前没有数据。如今从新上传一个文件进行测试,例如将 /etc/fstab 文件上传到 bucket:
[root@ceph-admin ~]# s3cmd put /etc/fstab s3://ops-s3-demo/fstab upload: '/etc/fstab' -> 's3://ops-s3-demo/fstab' [1 of 1] 465 of 465 100% in 0s 7.27 KB/s done
此时查看一下资源池 default.rgw.buckets.data 中的信息:
[root@ceph-admin ~]# rados -p default.rgw.buckets.data ls 9ad04f74-dd9d-4dac-abdd-77bf20241f53.4818.3_fstab
能够看到有一个以 index + fstab 的数据,实际上刚才上传的 fstab 文件就是存储在这个资源池里,而这个数据前面的索引信息是存储在 default.rgw.buckets.index 资源池中:
[root@ceph-admin ~]# rados -p default.rgw.buckets.index ls .dir.9ad04f74-dd9d-4dac-abdd-77bf20241f53.4818.1 .dir.9ad04f74-dd9d-4dac-abdd-77bf20241f53.4818.3
建立 Swift 风格的用户须要基于已经建立用于访问 S3 接口的用户至上来实现,前面已经建立一个用户 ops-s3-user,因此基于这个用户的建立命令以下:
radosgw-admin subuser create --uid ops-s3-user --subuser=ops-s3-user:swift --access=full
命令执行完成后会输出如下信息:
{ "user_id": "ops-s3-user", "display_name": "Ops S3 User Demo", "email": "", "suspended": 0, "max_buckets": 1000, "subusers": [ { "id": "ops-s3-user:swift", "permissions": "full-control" } ], "keys": [ { "user": "ops-s3-user", "access_key": "JV54B80DTZ8VQ2P4IYD4", "secret_key": "GKURUiaXt2cf7B2O5cl7kmCvWWHDnAl7U6CGtPb2" } ], "swift_keys": [ { "user": "ops-s3-user:swift", "secret_key": "ZHaXnUFfX0MOjpM925tCEfRRKeandVXDlo1V4bjM" } ], "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": [] }
若是在 swift_keys 中没有为 ops-s3-user:swift 用户生成 secret_key,能够手动为其生成一个,命令以下:
radosgw-admin key create --subuser=ops-s3-user:swift --key-type=swift --gen-secret
使用 swift 方式访问存储,首先须要提早安装好 swift 客户端,命令以下:
yum -y install python-setuptools python-pip pip install --upgrade setuptools -i https://mirrors.aliyun.com/pypi/simple/ pip install --upgrade python-swiftclient -i https://mirrors.aliyun.com/pypi/simple/
使用 swift 命令查看 pool 中的 bucket:
swift -A http://192.168.92.22:80/auth -U ops-s3-user:swift -K ZHaXnUFfX0MOjpM925tCEfRRKeandVXDlo1V4bjM list
输入结果以下:
my-new-bucket ops-s3-demo
查询结果与使用 s3 接口查询一致。可是上面的命令使用起来比较麻烦,swift 也支持使用环境变量的方式:
[root@ceph-admin ~]# swift list Auth version 1.0 requires ST_AUTH, ST_USER, and ST_KEY environment variables to be set or overridden with -A, -U, or -K. Auth version 2.0 requires OS_AUTH_URL, OS_USERNAME, OS_PASSWORD, and OS_TENANT_NAME OS_TENANT_ID to be set or overridden with --os-auth-url, --os-username, --os-password, --os-tenant-name or os-tenant-id. Note: adding "-V 2" is necessary for this.
从帮助信息中能够看到,Auth version 1.0 版本能够设置 ST_AUTH, ST_USER, ST_KEY 环境变量来使用:
export ST_AUTH=http://192.168.92.22:80/auth export ST_USER=ops-s3-user:swift export ST_KEY=ZHaXnUFfX0MOjpM925tCEfRRKeandVXDlo1V4bjM
这样就能够直接使用 swift 指令:
[root@ceph-admin ~]# swift list my-new-bucket ops-s3-demo
使用 swift 命令在 pool 中建立 bucket,命令以下:
swift post swift-demo
查看当前有哪些 bucket:
[root@ceph-admin ~]# swift list my-new-bucket ops-s3-demo swift-demo
将 /etc/passwd 文件上传到 swift-demo 中,命令以下:
swift upload swift-demo /etc/passwd
将 /opt 目录上传到 swift-demo 中,命令以下:
swift upload swift-demo /opt/
[root@ceph-admin ~]# swift list swift-demo etc/passwd opt/ops-ceph-cluster/ceph-deploy-ceph.log opt/ops-ceph-cluster/ceph.bootstrap-mds.keyring opt/ops-ceph-cluster/ceph.bootstrap-mgr.keyring opt/ops-ceph-cluster/ceph.bootstrap-osd.keyring opt/ops-ceph-cluster/ceph.bootstrap-rgw.keyring opt/ops-ceph-cluster/ceph.client.admin.keyring opt/ops-ceph-cluster/ceph.conf opt/ops-ceph-cluster/ceph.mon.keyring
将 passwd 文件下载到本地:
swift download swift-demo etc/passwd
首先在 ceph-admin 节点的 /opt/ops-ceph-cluster 目录中执行以下命令,在 ceph-node1 节点中部署 MDS服务:
ceph-deploy --overwrite-conf mds create ceph-node1
部署完成后查看集群信息,能够看到有一个 mds 节点是 up 状态:
[root@ceph-admin ops-ceph-cluster]# ceph -s cluster: id: f52099ba-cec0-4c77-bd92-3a21ad224be3 health: HEALTH_OK services: mon: 3 daemons, quorum ceph-node1,ceph-node2,ceph-node3 (age 4h) mgr: ceph-node1(active, since 4h), standbys: ceph-node2, ceph-node3 mds: 1 up:standby osd: 3 osds: 3 up (since 23h), 3 in (since 23h) rgw: 1 daemon active (ceph-node1) task status: data: pools: 7 pools, 320 pgs objects: 295 objects, 143 MiB usage: 3.3 GiB used, 57 GiB / 60 GiB avail pgs: 320 active+clean
在 ceph-admin 节点的 /opt/ops-ceph-cluster 目录中执行以下命令,将另外两个节点服务器中部署 MDS 服务:
ceph-deploy --overwrite-conf mds create ceph-node2 ceph-deploy --overwrite-conf mds create ceph-node3
再次查看集群状态,能够看到三个节点均为 standby 状态,这是因为当前还未建立文件系统的缘由:
[root@ceph-admin ops-ceph-cluster]# ceph -s cluster: id: f52099ba-cec0-4c77-bd92-3a21ad224be3 health: HEALTH_OK services: mon: 3 daemons, quorum ceph-node1,ceph-node2,ceph-node3 (age 4h) mgr: ceph-node1(active, since 4h), standbys: ceph-node2, ceph-node3 mds: 3 up:standby osd: 3 osds: 3 up (since 23h), 3 in (since 23h) rgw: 1 daemon active (ceph-node1) task status: data: pools: 7 pools, 320 pgs objects: 295 objects, 143 MiB usage: 3.3 GiB used, 57 GiB / 60 GiB avail pgs: 320 active+clean
也可使用以下命令查看 mds 的状态:
[root@ceph-admin ops-ceph-cluster]# ceph mds stat 3 up:standby
建立文件系统以前须要建立两个 pool,其中一个用于存放数据,另外一个用于存放元数据(pg 和 pgp 数量均设为 16):
ceph osd pool create cephfs_metadata 16 16 ceph osd pool create cephfs_data 16 16
接下来建立一个文件系统,并制定数据 pool 和元数据 pool,这样能够将两个 pool 与文件系统进行关联:
ceph fs new cephfs-demo cephfs_metadata cephfs_data
查看当前已有的文件系统:
[root@ceph-admin ~]# ceph fs ls name: cephfs-demo, metadata pool: cephfs_metadata, data pools: [cephfs_data ]
查看当前的集群状态信息,能够看到有一个 mds 为 up 状态,另外两个 mds 为 standby 状态:
[root@ceph-admin ~]# ceph -s cluster: id: f52099ba-cec0-4c77-bd92-3a21ad224be3 health: HEALTH_OK services: mon: 3 daemons, quorum ceph-node1,ceph-node2,ceph-node3 (age 4h) mgr: ceph-node1(active, since 4h), standbys: ceph-node2, ceph-node3 mds: cephfs-demo:1 {0=ceph-node1=up:active} 2 up:standby osd: 3 osds: 3 up (since 23h), 3 in (since 23h) rgw: 1 daemon active (ceph-node1) task status: scrub status: mds.ceph-node1: idle data: pools: 9 pools, 352 pgs objects: 317 objects, 143 MiB usage: 3.3 GiB used, 57 GiB / 60 GiB avail pgs: 352 active+clean
首先在须要挂载文件系统的机器上建立一个挂载点,这里选择挂载到 /media 目录下,挂载的机器中须要安装 ceph-common 软件包。使用以下命令进行挂载:
mount -t ceph 192.168.92.22:6789,192.168.92.23:6789,192.168.92.24:6789:/ /media -o name=admin
查看挂载信息:
[root@ceph-admin ~]# df -Th /media 文件系统 类型 容量 已用 可用 已用% 挂载点 192.168.92.22:6789:/ ceph 18G 0 18G 0% /media
此时文件系统就能够正常使用了,而且支持多个机器同时挂载,达到数据共享的目的:
[root@ceph-admin media]# echo "This is a message" > testfile [root@ceph-admin media]# ll 总用量 1 -rw-r--r-- 1 root root 18 7月 28 15:08 testfile
查看当前的内核信息,能够看到文件系统挂载后,是自动将模块加载到内核中:
[root@ceph-admin ~]# lsmod | grep ceph ceph 358802 1
若是内核版本不支持加载 ceph 模块,可使用用户空间的挂载方式,首先须要安装 ceph-fuse 软件包:
yum -y install ceph-fuse
安装完成后,开始进行挂载。在挂载以前首先将已经挂载的文件系统 umount。而后使用以下命令再次挂载到 /media 目录下:
ceph-fuse -n client.admin -m 192.168.92.22:6789,192.168.92.23:6789,192.168.92.24:6789 /media
命令中指定了三个 mon 的地址,这是为了确保一个 mon 挂掉了,还能够经过另外两个 mon 查询到信息。若是不指定 mon 的话,ceph-fuse 也会默认自动到 /etc/ceph/ceph.conf 配置文件中查找 mon 信息。
查看挂载状态:
[root@ceph-admin ~]# df -Th /media 文件系统 类型 容量 已用 可用 已用% 挂载点 ceph-fuse fuse.ceph-fuse 18G 0 18G 0% /media
在 /media 目录下能够看到以前写入的文件和内容:
[root@ceph-admin ~]# ll /media/ 总用量 1 -rw-r--r--. 1 root root 18 7月 28 15:08 testfile [root@ceph-admin ~]# cat /media/testfile This is a message