centos7离线搭建Ceph块存储和对象存储

下载需要的rpm包

以下操作在搭建的虚拟机中
现在有网络的地方,创建一个和生产一样的虚拟机。然后用yum install downloadonly下载依赖
yum install –downloadonly –downloaddir=./rpms
先添加rpm源,我用的是163的镜像

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
[Ceph]
name=Ceph packages for $basearch
baseurl=http://mirrors.163.com/ceph/rpm-luminous/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://mirrors.163.com/ceph/rpm-luminous/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://mirrors.163.com/ceph/rpm-luminous/el7/SRPMS
enabled=1
gpgcheck=1
type=rpm-md
gpgkey=https://download.ceph.com/keys/release.asc

首先下载下面的依赖
• snappy
• leveldb
• gdisk
• python-argparse
• gperftools-libs

1
yum   --downloadonly --downloaddir=./rpms install snappy leveldb gdisk python-argparse gperftools-libs

一个个yum就行了,然后再yum –downloadonly –downloaddir=./rpms ceph ceph-radosgw 下载ceph相关的包。其中,有些依赖需要epel的,请提前将epel的源加入,这个有很多教程了

将上面下载的rpm包,上传到某一台内网服务器(repo server中),

搭建自己离线的yum源

这一节的命令在repo server中操作

我们这里用createrepo和python simple httpserver

1
2
3
4
cd rpms
yum install createrepo
createrepo ./
python -m SimpleHTTPServer 8888

主机安装ceph相关rpm包

ceph相关主机添加内网yum源

将以下文文件加入到 /etc/yum.repos.d/ceph-local.repo中

1
2
3
4
5
6
7
8
[local]
name=Ceph packages for $basearch
baseurl=http://192.168.56.100:8888/
enabled=1
gpgcheck=0
type=rpm-md
#gpgkey=https://download.ceph.com/keys/release.asc
priority=1

然后运行

1
yum install ceph  ceph-radosgw

实现离线安装

部署ceph

网上的大部分资料都是用ceph-deploy部署,在内网中不太适用,也不方便理解各个模块,我们这里手动安装各个模块。

以下是这次部署的主机,三台主机,都同时作为 mon和 osd, 并且,admin node放在chukou-1上

1
2
3
chukou-1   10.148.0.3
chukou-2 10.148.0.4
chukou-3 10.148.0.4

部署前准备

每台osd主机上,需要准备一个空闲分区,作为数据分区。
在每台主机上,将以上的hostname ip对应关系,写入 /etc/hosts中

1
2
3
chukou-1   10.148.0.3
chukou-2 10.148.0.4
chukou-3 10.148.0.4

mon部署

部署admin node

首先创建个集群id
执行
uuidgen 生成一个uuid 例如 ee741368-4233-4cbc-8607-5d36ab314dab

将以下内容,写入
/etc/ceph/ceph.conf

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[global]
fsid = ee741368-4233-4cbc-8607-5d36ab314dab #上面生成的uuid
mon_initial_members = chukou-1,chukou-2,chukou-3 #mon的hostname
mon_host = 10.148.0.3,10.148.0.4,10.148.0.5 #mon的ip地址
auth_cluster_required = cephx
auth_service_required = cephx
auth_client_required = cephx
filestore_xattr_use_omap = true
osd_pool_default_size = 3 #默认2份复制
osd_pool_default_min_size = 2 #处于异常状态可以2份复制
osd_pool_default_pg_num = 8
osd_pool_default_pgp_num = 8
osd_crush_chooseleaf_type = 1

[mon]
mon allow pool delete = true #允许删除pool

创建mon密钥

1
ceph-authtool --create-keyring /tmp/ceph.mon.keyring --gen-key -n mon. --cap mon 'allow *'

创建管理密钥

1
2
3
sudo ceph-authtool --create-keyring /etc/ceph/ceph.client.admin.keyring --gen-key -n client.admin --cap mon 'allow *' --cap osd 'allow *' --cap mds 'allow *' --cap mgr 'allow *'

sudo -u ceph ceph-authtool --create-keyring /var/lib/ceph/bootstrap-osd/ceph.keyring --gen-key -n client.bootstrap-osd --cap mon 'profile bootstrap-osd'

把密钥都导入到mon密钥中

1
2
sudo ceph-authtool /tmp/ceph.mon.keyring --import-keyring /etc/ceph/ceph.client.admin.keyring
sudo ceph-authtool /tmp/ceph.mon.keyring --import-keyring /var/lib/ceph/bootstrap-osd/ceph.keyring

创建monitor map

1
monmaptool --create --add chukou-1 10.148.0.3 --add chukou-2 10.148.0.4 --add chukou-3 10.148.0.5 --fsid ee741368-4233-4cbc-8607-5d36ab314dab /tmp/monmap

创建mon的目录

1
sudo -u ceph mkdir /var/lib/ceph/mon/ceph-chukou-1  #chukou-1要换成实际的hostname

创建mon

1
sudo -u ceph ceph-mon --mkfs -i chukou-1--monmap /tmp/monmap --keyring /tmp/ceph.mon.keyring

如果上一部报错,可能是因为权限问题。
先执行 sudo chown ceph:ceph /tmp/monmap /tmp/ceph.mon.keyring 将文件归属改了。

然后就可以用systemd启动了

sudo systemctl start ceph-mon@chukou-1 #chukou-1要换成实际的hostname

如果运行失败,先解决权限问题

1
2
chown ceph:ceph /etc/ceph/*
chown -R ceph:ceph /var/lib/ceph

运行 ceph -s 查看状态

1
2
3
4
5
6
7
8
9
10
11
12
cluster:
id: a7f64266-0894-4f1e-a635-d0aeaca0e993
health: HEALTH_OK
services:
mon: 1 daemons, quorum chukou-1
mgr: chukou-1(active)
osd: 0 osds: 0 up, 0 in
data:
pools: 0 pools, 0 pgs
objects: 0 objects, 0 bytes
usage: 0 kB used, 0 kB / 0 kB avail
pgs:

部署其他mon节点

/tmp/monmap /tmp/ceph.mon.keyring /var/lib/ceph/bootstrap-osd/ceph.keyring 复制到其他mon主机

创建mon的目录

1
sudo -u ceph mkdir /var/lib/ceph/mon/ceph-chukou-2

创建mon

1
sudo -u ceph ceph-mon --mkfs -i chukou-2--monmap /tmp/monmap --keyring /tmp/ceph.mon.keyring

创建mon的目录

1
sudo -u ceph mkdir /var/lib/ceph/mon/ceph-chukou-3

创建mon

1
sudo -u ceph ceph-mon --mkfs -i chukou-3--monmap /tmp/monmap --keyring /tmp/ceph.mon.keyring

http://docs.ceph.com/docs/master/install/manual-deployment/#monitor-bootstrapping
http://docs.ceph.com/docs/giant/radosgw/config/

osd部署

直接创建osd
sudo ceph-volume lvm create –data /dev/sdb
如果运行报错,检查/var/lib/ceph/bootstrap-osd/ceph.keyring
sudo -u ceph ls /var/lib/ceph/osd/
里面会有ceph-0 ceph-1这样的文件夹。 注意检查文件的归属,应当属于ceph用户

用 sudo systemctl status ceph-osd@0 查看进程是否起来了,没有就手动启动下
sudo systemctl startceph-osd@0

如果手动启动失败,查看屏幕上的错误提示, 同时用
ceph auth list 检查, osd.0这样的密钥是不是已经生成了

启动完毕后,用ceph -s可以看到osd 的运行
http://docs.ceph.com/docs/master/install/manual-deployment/#manager-daemon-configuration

mgr部署

创建密钥

1
sudo ceph auth get-or-create mgr.0 mon 'allow profile mgr' osd 'allow *' mds 'allow *'

将控制台显示的内容,写入到 sudo -u ceph vim /var/lib/ceph/mgr/ceph-0/keyring 中

启动

1
sudo systemctl start ceph-mgr@0

用ceph -s 可以看到
mgr: 0(active)


ceph mgr module ls

可以查看模块

http://docs.ceph.com/docs/master/mgr/administrator/

radosgw

radosgw可能没有和 ceph一起安装,先手动确认下安装

1
sudo yum install ceph-radosgw -y

确认部署的机器上已经有,下面的文件,没有就复制过去
/etc/ceph/ceph.conf

生成密钥

1
ceph auth get-or-create client.rgw.`hostname -s` osd 'allow rwx' mon 'allow rw'

将控制台输出结果写入 sudo -u ceph vim /var/lib/ceph/radosgw/ceph-rgw.hostname -s/keyring 中

然后启动

1
sudo systemctl start ceph-radosgw@rgw.chukou-1

注意, rgw的instance名称 必须是 rgw. 开头的

如果启动失败 查看日只 /var/log/ceph/ceph-client.rgw.chukou-1.log 可能会有以下内容

1
2
rgw_init_ioctx ERROR: librados::Rados::pool_create returned (34) Nu
merical 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)

这是因为,radosgw会创建一些pool来存数据。如果ceph.conf中设置的pg_num设置的过大,那么就会发现超过最大值mon_max_pg_per_osd exceeded的问题。
一个pool需要 pg_num * 拷贝份数 的pg,而系统中,每个osd默认情况下只能有200个pg

这种情况下可以先删掉所有的pool,然后自己手动创建以下pool
for p in ceph osd pool ls;do ceph osd pool rm $p $p –yes-i-really-really-mean-it;done

注意,上面的名利会删除集群里的全部pool,确保集群中没有rgw以外的pool,不然还是一个个手动删除。

1
2
3
4
5
6
7
8
9
10
11
12
13
.rgw
.rgw.root
.rgw.control
.rgw.gc
.rgw.buckets
.rgw.buckets.index
.log
.intent-log
.usage
.users
.users.email
.users.swift
.users.uid

ceph osd pool create .rgw 8 8 等等,再重新启动

http://docs.ceph.com/docs/giant/radosgw/config/

https://access.redhat.com/documentation/en-us/red_hat_ceph_storage/3/html/installation_guide_for_red_hat_enterprise_linux/manually-installing-ceph-object-gateway

创建s3用户

1
radosgw-admin user create --uid=johndoe --display-name="John Doe" --email=john@example.com

注意将屏幕输出的结果保存起来,里面有key

创建swift用户

1
radosgw-admin key create --subuser=johndoe:swift --key-type=swift --gen-secret

就可以用python测试了

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#!/usr/bin/python
import boto
import boto.s3.connection
from boto.s3.key import Key

access_key = '0IZ0J75NQLZG8XKEJSOZ'
secret_key = 'it7P1QVJPzbXegRojVSNTLuO1uItW3qXIRdpxePc'

conn = boto.connect_s3(
aws_access_key_id = access_key,
aws_secret_access_key = secret_key,
host='127.0.0.1',port=7480,
is_secure=False, # uncomment if you are not using ssl
calling_format = boto.s3.connection.OrdinaryCallingFormat(),
)
for bucket in conn.get_all_buckets():
print "{name}\t{created}".format(
name = bucket.name,
created = bucket.creation_date,
)
print "----------"
#bucket = conn.create_bucket('my-new-bucket2')
bucket = conn.get_bucket('my-new-bucket2')

k = Key(bucket)
k.key = 'test_file'
filename = './s3.txt'
k.set_contents_from_filename(filename)

for key in bucket.list():
print "{name}\t{size}\t{modified}".format(
name = key.name,
size = key.size,
modified = key.last_modified,
)

for bucket in conn.get_all_buckets():
print "{name}\t{created}".format(
name = bucket.name,
created = bucket.creation_date,
)

上传成功的话,可以看到 在default.rgw.buckets.data会有上传的文件的对象了

1
rados ls -p default.rgw.buckets.data