下载需要的rpm包
以下操作在搭建的虚拟机中
现在有网络的地方,创建一个和生产一样的虚拟机。然后用yum install downloadonly下载依赖
yum install –downloadonly –downloaddir=./rpms
先添加rpm源,我用的是163的镜像
1 | [Ceph] |
首先下载下面的依赖
• 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 | cd rpms |
主机安装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
3chukou-1 10.148.0.3
chukou-2 10.148.0.4
chukou-3 10.148.0.4
部署前准备
每台osd主机上,需要准备一个空闲分区,作为数据分区。
在每台主机上,将以上的hostname ip对应关系,写入 /etc/hosts中1
2
3chukou-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 | [global] |
创建mon密钥1
ceph-authtool --create-keyring /tmp/ceph.mon.keyring --gen-key -n mon. --cap mon 'allow *'
创建管理密钥1
2
3sudo 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
2sudo 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 map1
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
创建mon1
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 | chown ceph:ceph /etc/ceph/* |
运行 ceph -s 查看状态
1 | cluster: |
部署其他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
创建mon1
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
创建mon1
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
2rgw_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 | .rgw |
ceph osd pool create .rgw 8 8 等等,再重新启动
http://docs.ceph.com/docs/giant/radosgw/config/
创建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 |