阅读本文前,需要熟悉ceph基本架构,以及基本的网元,什么是monitor,mds,osd,rbd等知识
建议先阅读:
http://www.ibm.com/developerworks/cn/linux/l-ceph/
http://www.infoq.com/cn/news/2014/01/ceph-overview
http://ceph.com/docs/master/start/quick-ceph-deploy/
http://www.alidata.org/archives/1589
http://ceph.com/docs/master/start/quick-rbd/
http://www.jamescoyle.net/how-to/1244-create-a-3-node-ceph-storage-cluster
本文的目的是,通过手动配置安装一个带有: 1个monitor + 2个osd的rbd ceph集群,无mds节点,因此不支持cephFS。
个人的心得是,用ceph-deploy工具自动安装会产生很多莫名其妙的问题,无法迅速定位问题,而手动安装会加深理解,熟悉每个步骤执行的命令.
本文参考的文档为:
https://github.com/gc3-uzh-ch/ansible-playbooks/blob/master/roles/ceph.notes-on-deployment.rst,此文非常经典。其他参考文档可以用于熟悉ceph环境安装和ceph-deploy命令:
http://www.virtualtothecore.com/en/adventures-with-ceph-storage-part-6-mount-ceph-as-a-block-device-on-linux-machines/
http://www.jamescoyle.net/how-to/1244-create-a-3-node-ceph-storage-cluster
1.ceph网络主机准备
host: mon1 IP: 192.168.18.205, 用途:安装ceph monitor和用做ceph admin(管理设备)
host: osd1 IP: 192.168.18.204, 用途: 安装ceph-osd,包含有osd硬盘,设备为/dev/sdb
host: osd2 IP: 192.168.18.203, 用途: 安装ceph-osd包含有osd硬盘, 设备为/dev/sdb
在3台设备上停止iptables服务和selinux:
chkconfig iptables --level 3 off
chkconfig iptables --level 5 off
vi /etc/sysconfig/selinux
修改为disabled
2.修改mon1的/etc/hosts
新增以下hosts记录:
69.195.83.87 www.elrepo.org
208.113.241.137 ceph.com
67.205.20.229 git.ceph.com
192.168.18.205 mon1
192.168.18.203 osd2
192.168.18.204 osd1
3. 在主机mon1上,执行以下命令,生成ssh登录密钥,并报密钥文件id_rsa.pub拷贝至osd1和osd2
ssh-keygen -t rsa
cat /root/.ssh/id_rsa.pub | ssh root@osd1 “cat >> ~/.ssh/authorized_keys”
cat /root/.ssh/id_rsa.pub | ssh root@osd2 “cat >> ~/.ssh/authorized_keys”
以上过程需要分别输入osd1和osd2的root用户密码,但后面的过程就不需要再输入密码
4.把mon1的/etc/hosts上传至osd1和osd2的/etc/hosts下
scp -p /etc/hosts root@osd1:/etc/
scp -p /etc/hosts root@osd2:/etc/
5.在mon1,osd1,osd2中安装最新版的内核,包含有ceph需要的rbd设备驱动
rpm -ivh http://www.elrepo.org/elrepo-release-6-6.el6.elrepo.noarch.rpm
yum –enablerepo=elrepo-kernel install kernel-ml -y
修改/etc/grub.conf,修改启动项为default 0,从新安装的内核启动
安装内核后,需要重启系统
6.新增文件/etc/yum.repos.d/ceph.repo,如下,使用ceph版本为firefly,如果换用其他版本,把firefly替换为其他的ceph版本名即可
[Ceph]
name=Ceph packages for $basearch
baseurl=http://ceph.com/rpm-firefly/el6/$basearch
enabled=1
gpgcheck=1
type=rpm-md
gpgkey=https://ceph.com/git/?p=ceph.git;a=blob_plain;f=keys/release.asc
[Ceph-noarch]
name=Ceph noarch packages
baseurl=http://ceph.com/rpm-firefly/el6/noarch
enabled=1
gpgcheck=1
type=rpm-md
gpgkey=https://ceph.com/git/?p=ceph.git;a=blob_plain;f=keys/release.asc
[ceph-source]
name=Ceph source packages
baseurl=http://ceph.com/rpm-firefly/el6/SRPMS
enabled=1
gpgcheck=1
type=rpm-md
7.在每台设备上安装ceph必要的软件包
yum -y install yum-utils redhat-lsb
yum -y install ceph-deploy ceph ceph-common ceph-radosgw
yum -y install xfs*
yum -y ntp ntpupdate
这里建议配置好mon1,osd1,osd2的ntp,确保3台设备时间同步。
我是把mon1作为ntp server,osd1,osd2运行ntpupdate跟mon1同步时间
8.在mon1上,安装monitor
cd /root
mkdir ceph-admin
cd ceph-admin
8.1 新建mon1,执行以下命令
ceph-deploy new mon1
8.2 修改生成的ceph.conf,注释掉以下2行,如果不注释掉,会导致8.4节无法正确生成monmap文件
#mon_host = 192.168.18.205
#mon_initial_members = mon1
再新增以下行在文件末尾:
[mon.0]
host = mon1
mon addr = 192.168.18.205:6789
mon data = /var/lib/ceph/mon/ceph-0
[osd]
osd journal size = 128 #这里缺省是1024M,我测试用的是虚拟机,磁盘空间有限,所以改为128M
osd mkfs type = xfs
journal block align = true
journal dio = true
journal aio = false
journal max write bytes = 1024000 #这里按需要可增大,缺省是10M,我这里只设置了1M
osd pool default size = 2
osd pool default min size = 1
osd pool default pg num = 128
osd pool default pgp num = 128
osd crush chooseleaf type = 1
osd crush update on start = true
[osd.0]
host = osd1
devs = /dev/sdb1
osd addr = 192.168.18.204:6789
osd data = /var/lib/ceph/osd/ceph-0
[osd.1]
host = osd2
devs = /dev/sdb1
osd addr = 192.168.18.203:6789
osd data = /var/lib/ceph/osd/ceph-1
8.3. 拷贝文件至/etc/ceph/
mkdir -p /etc/ceph/
cp ./ceph.conf /etc/ceph/
8.4.根据第1步的网络图,生成以下脚本
vi create_keyring.sh
osdlist="0 \
1"
#注意,我这里mds为空,如果有则可以设置mds列表:0,1,3..., 类似前面的osdlist变量
mdslist=""
mkdir -p /etc/ceph/
ceph-authtool /etc/ceph/ceph.mon.keyring --create-keyring \
--gen-key -n mon. \
--cap mon 'allow *'
ceph-authtool /etc/ceph/ceph.mon.keyring --gen-key \
-n client.admin \
--cap mon 'allow *' \
--cap osd 'allow *' \
--cap mds 'allow *'
for mdsname in $mdslist
do
ceph-authtool /etc/ceph/ceph.mon.keyring --gen-key \
-n mds.$mdsname \
--cap mds 'allow *' \
--cap osd 'allow *' \
--cap mon 'allow rwx'
done
for osdname in $osdlist
do
ceph-authtool /etc/ceph/ceph.mon.keyring --gen-key \
-n osd.$osdname \
--cap osd 'allow *' \
--cap mon 'allow rwx'
done
保存后执行该脚本,即可生成/etc/ceph/ceph.mon.keyring文件
chmod u+x create_keyring.sh
./create_keyring.sh
查看文件
cat /etc/ceph/ceph.mon.keyring
8.5 生成/etc/ceph/ceph.client.admin.keyring
把8.4节生成的/etc/ceph/ceph.mon.keyring文件中的文本段[client.admin]拷贝,粘贴入文件即可
我这里生成的内容为
key = AQDPIqpV+Mk/OhAAiSfy/ym99C47RdqRi+Bvcg==
caps mds = "allow *"
caps mon = "allow *"
caps osd = "allow *"
8.6 创建monmap文件
monmaptool: monmap file /tmp/monmap.right
monmaptool: set fsid to 00baac7a-0ad4-4ab7-9d5e-fdaf7d122aee
monmaptool: writing epoch 0 to /tmp/monmap.right (3 monitors)
这里需要打印查看生成的monmap.right,host信息是否正确:
monmaptool –print /tmp/monmap.right
monmaptool: monmap file /tmp/monmap.right
epoch 0
fsid 00baac7a-0ad4-4ab7-9d5e-fdaf7d122aee
last_changed 2015-07-19 21:20:41.032373
created 2015-07-19 21:20:41.032373
0: 192.168.18.205:6789/0 mon.0
如果记录里的名称不是mon.0,而是mon.noname-a,则说明8.2中的2行记录未被注释掉,需要修改注释掉,重新生成monmap.right
校验无误,则拷贝至/etc/ceph/
mv /tmp/monmap.right /etc/ceph/
8.7 执行monitor初始化
注意这里有一个变量$monname,为mon的id:0,1,2等
cp /etc/ceph/ceph.mon.keyring /var/lib/ceph/mon/ceph-$monname/keyring
ceph-mon --mkfs -i $monname --monmap /etc/ceph/monmap \
--keyring /etc/ceph/ceph.mon.keyring
我这里的$monname为0,唯一的一个mon,有多个mon时,可为1,2等其他mon ID值,每个monitor上相应执行:
cp /etc/ceph/ceph.mon.keyring /var/lib/ceph/mon/ceph-0/keyring
ceph-mon --mkfs -i 0 --monmap /etc/ceph/monmap \
--keyring /etc/ceph/ceph.mon.keyring
8.8 运行mon1上的monitor
service ceph restart
8.9 查查monitor mon1的状态
ceph status
ceph health detail
9. 安装osd1和osd2
在osd1和osd2主机上,新建目录
mkdir -p /etc/ceph/
9.1 在mon1主机上拷贝必要的文件至osd1和osd2
cd /etc/ceph
scp -p ceph.conf ceph.mon.keyring ceph.client.admin.keyring root@osd1:/etc/ceph
scp -p ceph.conf ceph.mon.keyring ceph.client.admin.keyring root@osd2:/etc/ceph
9.2 在osd1上执行以下命令
ceph-disk-prepare --zap-disk /dev/sdb
#命令可能有报错信息,可以忽略
ceph-osd -i 0 -c /etc/ceph/ceph.conf --mkfs --mkjournal
#命令可能有报错信息,可以忽略
把ceph.mon.keyring文件中的[osd.0]键和键值,拷贝至新生成的文件/var/lib/ceph/osd/ceph-0/keyring
chkconfig ceph --level 3 on
chkconfig ceph --level 5 on
ps ax |grep ceph-osd查看进程是否存在,存在则表示运行正常
9.3 在osd2上执行以下命令
ceph-disk-prepare --zap-disk /dev/sdb
#命令可能有报错信息,可以忽略
ceph-osd -i 1 -c /etc/ceph/ceph.conf --mkfs --mkjournal
#命令可能有报错信息,可以忽略
把ceph.mon.keyring文件中的[osd.1]键和键值,拷贝至新生成的文件/var/lib/ceph/osd/ceph-1/keyring
chkconfig ceph --level 3 on
chkconfig ceph --level 5 on
ps ax |grep ceph-osd查看进程是否存在,存在则表示运行正常
9.4 再在mon1中执行
/etc/init.d/ceph -a restart osd.0
/etc/init.d/ceph -a restart osd.1
chkconfig ceph --level 3 on
chkconfig ceph --level 5 on
9.5查看ceph集群的状态
ceph status
如果最后1行状态为192 active+clean,说明运行正常,如果不带active字段,则说明集群未正常工作
ceph health detail
如果没有正常运行,可以执行以下命令:
crushtool -i /tmp/crush --enable-unsafe-tunables \
--set-choose-local-tries 0 --set-choose-local-fallback-tries 0 \
--set-choose-total-tries 50 -o /tmp/crush.new
再不行,可执行以下命令后重启:
ceph osd pool set metadata size 2
ceph osd pool set rbd size 2
ceph osd pool set data min_size 1
ceph osd pool set rbd min_size 1
ceph osd pool set metadata min_size 1
ceph osd pool set data crush_ruleset 0
ceph osd pool set metadata crush_ruleset 0
ceph osd pool set rbd crush_ruleset 0
10.在mon1上新建rbd块设备,进行测试
-k /etc/ceph/ceph.client.admin.keyring
rbd map testdevice --pool rbd --name client.admin \
-m 192.168.18.205 -k /etc/ceph/ceph.client.admin.keyring
这里的–size 3600是3600MB大小,由于我是用3台虚拟机,磁盘空间有限
vi /etc/ceph/rbdmap 增加记录:
rbd/testdevice id=admin,keyring=/etc/ceph/ceph.client.admin.keyring
保存以上的文件,然后新建目录:
mkdir -p /mnt/test
增加自动启动rbdmap服务:
chkconfig rbdmap --level 3 on
chkconfig rbdmap --level 5 on
增加自动挂载rbd设备:
vi /etc/fstab 增加自动挂载记录:
/dev/rbd/rbd/testdevice /mnt/test xfs defaults,noatime,_netdev 0 0
重启mon1主机
10.1 对rbd挂载目录进行简单测试
rbd list
mount
cd /mnt/test
写1GB大小的文件,对rbd块设备进行性能测试:
dd if=/dev/zero bs=1024 count=1000000 of=1GB