集群环境准备
准备工作:
准备四台服务器,需要能上外网,IP静态固定 (除client外每台最少加1个磁盘,不用分区);
1, 配置主机名和主机名绑定(所有节点都要绑定)
# hostnamectl set-hostname --static node1
# vim /etc/hosts
10.1.1.11 node1
10.1.1.12 node2
10.1.1.13 node3
10.1.1.14 client
2, 关闭防火墙,selinux(使用iptables -F清一下规则)
# systemctl stop firewalld
# systemctl disable firewalld
# iptables -F
# setenforce 0
3, 时间同步(启动ntpd服务并确认所有节点时间一致)
# systemctl restart ntpd
# systemctl enable ntpd
4, 配置yum源(所有节点都要配置,包括client)
需要centos7默认的公网源+ceph本地源我这里把源放在/root/ceph_soft目录
[local_ceph]
name=local_ceph
baseurl=file:///root/ceph_soft
gpgcheck=0
enabled=1
一,集群部署过程
1, 配置ssh免密
以node1为部署配置节点,在node1上配置ssh等效性(要求ssh node1,node2,node3 ,client都要免密码)
[root@node1 ~]# ssh-keygen
[root@node1 ~]# ssh-copy-id node1
[root@node1 ~]# ssh-copy-id node2
[root@node1 ~]# ssh-copy-id node3
[root@node1 ~]# ssh-copy-id client
2, 在node1上安装部署工具
[root@node1 ~]# yum install ceph-deploy -y
3, ceph集群节点安装ceph
前面准备环境时已经准备好了yum源,在这里所有集群节点(不包括client)都安装软件
# yum install ceph ceph-radosgw -y
# ceph -v
ceph version 13.2.6 (02899bfda814146b021136e9d8e80eba494e1126) mimic (stable)
4, 客户端安装ceph-common
[root@client ~]# yum install ceph-common -y
5, 在node1上创建集群
建立一个集群配置目录
注意: 后面的大部分操作都会在此目录,所以需要cd进去操作=
[root@node1 ~]# mkdir /etc/ceph # 有些版本可能已经创建好了,请直接cd进去操作即可
[root@node1 ~]# cd /etc/ceph
创建一个ceph集群
[root@node1 ceph]# ceph-deploy new node1
[root@node1 ceph]# ls
ceph.conf ceph-deploy-ceph.log ceph.mon.keyring
6, 创建mon
增加public网络用于监控,网段为ceph集群的IP段
在[global]配置段里添加下面一句(直接放到最后一行)
[root@node1 ceph]# vim /etc/ceph/ceph.conf
public network = 10.1.1.0/24 监控网络
监控节点初始化,并同步配置到所有节点(node1,node2,node3,不包括client)
[root@node1 ceph]# ceph-deploy mon create-initial
[root@node1 ceph]# ceph health
HEALTH_OK 状态health(健康)
将配置文件信息同步到所有节点
[root@node1 ceph]# ceph-deploy admin node1 node2 node3
查看集群健康状态
因为ceph集群要求较高,请在后续的各种操作前都尽量确认一下集群状态为OK再进行操作*
[root@node1 ceph]# ceph -s
cluster:
id: c05c1f28-ea78-41b7-b674-a069d90553ac
health: HEALTH_OK 健康状态为OK
services:
mon: 1 daemons, quorum node1 1个监控
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单点故障,你可以加多个mon节点
[root@node1 ceph]# ceph-deploy mon add node2
[root@node1 ceph]# ceph-deploy mon add node3
[root@node1 ceph]# ceph -s
cluster:
id: c05c1f28-ea78-41b7-b674-a069d90553ac
health: HEALTH_OK 健康状态为OK
services:
mon: 3 daemons, quorum node1,node2,node3 3个监控,quorum为仲裁
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:
7, 时间同步问题解决
ceph状态因为时间问题为HEALTH_WARN 解决办法
a, 调大时间警告的阈值
[root@node1 ceph]# vim ceph.conf
[global] 在global参数组里添加以下两行
......
mon clock drift allowed = 2 # monitor间的时钟滴答数(默认0.5秒)
mon clock drift warn backoff = 30 # 调大时钟允许的偏移量(默认为5)
b, 同步到所有节点
[root@node1 ceph]# ceph-deploy --overwrite-conf admin node1 node2 node3
c, 所有ceph集群节点上重启ceph-mon.target服务
# systemctl restart ceph-mon.target
8, 创建mgr
[root@node1 ceph]# ceph-deploy mgr create node1
[root@node1 ceph]# ceph -s
cluster:
id: c05c1f28-ea78-41b7-b674-a069d90553ac
health: HEALTH_OK
services:
mon: 3 daemons, quorum node1,node2,node3
mgr: node1(active) node1为mgr
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:
9, 创建osd
[root@node1 ceph]# ceph-deploy disk --help
[root@node1 ceph]# ceph-deploy osd --help
列表所有节点的磁盘,都有sda和sdb两个盘,sdb为我们要加入分布式存储的盘
列表查看节点上的磁盘
[root@node1 ceph]# ceph-deploy disk list node1
[root@node1 ceph]# ceph-deploy disk list node2
[root@node1 ceph]# ceph-deploy disk list node3
zap表示干掉磁盘上的数据,相当于格式化
[root@node1 ceph]# ceph-deploy disk zap node1 /dev/sdb
[root@node1 ceph]# ceph-deploy disk zap node2 /dev/sdb
[root@node1 ceph]# ceph-deploy disk zap node3 /dev/sdb
将磁盘创建为osd
[root@node1 ceph]# ceph-deploy osd create --data /dev/sdb node1
[root@node1 ceph]# ceph-deploy osd create --data /dev/sdb node2
[root@node1 ceph]# ceph-deploy osd create --data /dev/sdb node3
[root@node1 ceph]# ceph -s
cluster:
id: c05c1f28-ea78-41b7-b674-a069d90553ac
health: HEALTH_OK
services:
mon: 3 daemons, quorum node1,node2,node3
mgr: node1(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:
二、创建Ceph文件存储
第1步: 在node1部署节点上同步配置文件,并创建mds服务
[root@node1 ceph]# ceph-deploy mds create node1 node2 node3
我这里做三个mds
第2步: 一个Ceph文件系统需要至少两个RADOS存储池,一个用于数据,一个用于元数据。所以我们创建它们。
[root@node1 ceph]# ceph osd pool create cephfs_pool 128
pool 'cephfs_pool' created
[root@node1 ceph]# ceph osd pool create cephfs_metadata 64
pool 'cephfs_metadata' created
[root@node1 ceph]# ceph osd pool ls |grep cephfs
cephfs_pool
cephfs_metadata
第3步: 创建Ceph文件系统,并确认客户端访问的节点
[root@node1 ceph]# ceph fs new cephfs cephfs_metadata cephfs_pool
[root@node1 ceph]# ceph fs ls
name: cephfs, metadata pool: cephfs_metadata, data pools: [cephfs_pool ]
[root@node1 ceph]# ceph mds stat
cephfs-1/1/1 up {0=ceph_node3=up:active}, 2 up:standby 这里看到node3为up状态
第4步: 客户端准备验证key文件
在集群节点(node1,node2,node3)上任意一台查看密钥字符串
[root@node1 ~]# cat /etc/ceph/ceph.client.admin.keyring
[client.admin]
key = AQDEKlJdiLlKAxAARx/PXR3glQqtvFFMhlhPmw== 后面的字符串就是验证需要的
caps mds = "allow *"
caps mgr = "allow *"
caps mon = "allow *"
caps osd = "allow *"
在客户端上创建一个文件记录密钥字符串
[root@client ~]# vim admin.key # 创建一个密钥文件,复制粘贴上面得到的字符串
AQDEKlJdiLlKAxAARx/PXR3glQqtvFFMhlhPmw==
第5步: 客户端挂载(挂载ceph集群中跑了mon监控的节点, mon监控为6789端口)
[root@client ~]# mount -t ceph node1:6789:/ /mnt -o name=admin,secretfile=/root/admin.key
第6步: 验证
[root@client ~]# df -h |tail -1
node1:6789:/ 3.8G 0 3.8G 0% /mnt
三、创建Ceph块存储
第1步: 在node1上同步配置文件到client
[root@node1 ceph]# ceph-deploy admin client
第2步:建立存储池,并初始化
注意:在客户端操作
[root@client ~]# ceph osd pool create rbd_pool 128
pool 'rbd_pool' created
[root@client ~]# rbd pool init rbd_pool
第3步:创建一个存储卷
[root@client ~]# rbd create volume1 --pool rbd_pool --size 5000
[root@client ~]# rbd ls rbd_pool
volume1
[root@client ~]# rbd info volume1 -p rbd_pool
rbd image 'volume1':
size 4.9 GiB in 1250 objects
order 22 (4 MiB objects)
id: 149256b8b4567
block_name_prefix: rbd_data.149256b8b4567
format: 2
features: layering, exclusive-lock, object-map, fast-diff, deep-flatten
op_features:
flags:
create_timestamp: Sat Aug 17 19:47:51 2019
第4步: 将创建的卷映射成块设备
因为rbd镜像的一些特性,OS kernel并不支持,所以映射报错
[root@client ~]# rbd map rbd_pool/volume1
rbd: sysfs write failed
RBD image feature set mismatch. You can disable features unsupported by the kernel with “rbd feature disable rbd_pool/volume1 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
解决方法: disable掉相关特性
[root@client ~]# rbd feature disable rbd_pool/volume1 exclusive-lock object-map fast-diff deep-flatten
再次映射
[root@client ~]# rbd map rbd_pool/volume1
/dev/rbd0
第5步: 格式化,挂载
[root@client ~]# mkfs.xfs /dev/rbd0
[root@client ~]# mount /dev/rbd0 /mnt/
[root@client ~]# df -h |tail -1
/dev/rbd0 4.9G 33M 4.9G 1% /mnt
四、Ceph对象存储
对象网关即为对象存储开放的接口。我这里在node1上创建rgw
[root@node1 ceph]# ceph-deploy rgw create node1
验证
[root@node1 ceph]# lsof -i:7480
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
radosgw 6748 ceph 40u IPv4 49601 0t0 TCP *:7480 (LISTEN)
[root@node1 ceph]# ceph osd pool ls
.rgw.root
default.rgw.control
default.rgw.meta
default.rgw.log
可以看到创建对象存储网关会自动帮助我们建立了以上4个pool
2, 客户端创建连接用户
创建用户
[root@client ~]# radosgw-admin user create --uid="testuser" --display-name="First User"
{
"user_id": "testuser",
"display_name": "First User",
"email": "",
...
...
3, 保存客户端连接key
创建用户的一大段信息中,主要有用的为access_key与secret_key(需要保存好),用于客户端连接对象存储
[root@client ~]# radosgw-admin user create --uid='testuser' --display-name='First User' |grep -E 'access_key|secret_key'
"access_key": "36ROCI84S5NSP4BPYL01",
"secret_key": "jBOKH0v6J79bn8jaAF2oaWU7JvqTxqb4gjerWOFW"
4, 客户端安装s3
AmazonS3是一种面向Internet的对象存储服务.客户端需要安装s3cmd工具
[root@client ~]# yum install s3cmd
5, 客户端创建连接文件
创建并编写下面的文件
[root@client ~]# vim /root/.s3cfg
[default]
access_key = 36ROCI84S5NSP4BPYL01
secret_key = jBOKH0v6J79bn8jaAF2oaWU7JvqTxqb4gjerWOFW
host_base = 10.1.1.11:7480
host_bucket = 10.1.1.11:7480/%(bucket)
cloudfront_host = 10.1.1.11:7480
use_https = False
6, 测试
[root@client ~]# s3cmd ls
建一个桶
[root@client ~]# s3cmd mb s3://test_bucket
上传文件到桶
[root@client ~]# s3cmd put /etc/fstab s3://test_bucket
upload: '/etc/fstab' -> 's3://test_bucket/fstab' [1 of 1]
501 of 501 100% in 1s 303.34 B/s done
下载到当前目录
[root@client ~]# s3cmd get s3://test_bucket/fstab